From 959edbe10b59a76d2935a4c3e6f05cc68bcdc0b8 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Wed, 10 Nov 2010 15:44:59 +0100
Subject: [PATCH] Introduced a simple incremental lexer for GLSL.

---
 src/libs/glsl/glsl-lib.pri                    |    2 +-
 src/libs/glsl/glsl.g                          |   89 +
 src/libs/glsl/glsl.h                          |   45 +
 src/libs/glsl/glsl.pro                        |    3 +-
 src/libs/glsl/glslast.cpp                     |   28 +
 src/libs/glsl/glslast.h                       |   28 +
 src/libs/glsl/glsldelete.cpp                  |   28 +
 src/libs/glsl/glsldump.cpp                    |   28 +
 src/libs/glsl/glslkeywords.cpp                |   29 +
 src/libs/glsl/glsllexer.cpp                   |   98 +-
 src/libs/glsl/glsllexer.h                     |   48 +-
 src/libs/glsl/glslparser.cpp                  |   29 +
 src/libs/glsl/glslparser.h                    |   29 +
 src/libs/glsl/glslparsertable.cpp             | 1737 +++++++++--------
 src/libs/glsl/glslparsertable_p.h             |   67 +-
 src/libs/glsl/make-parser.sh                  |    2 +-
 src/libs/glsl/specs/glsl.g.in                 |   89 +
 .../glsleditor/GLSLEditor.mimetypes.xml       |    3 +
 .../glsleditor/GLSLEditor.pluginspec.in       |    2 +-
 src/plugins/glsleditor/glsleditor.cpp         |   12 +-
 src/plugins/glsleditor/glsleditor.pro         |    7 +-
 src/plugins/glsleditor/glslhighlighter.cpp    |   74 +
 src/plugins/glsleditor/glslhighlighter.h      |   72 +
 23 files changed, 1669 insertions(+), 880 deletions(-)
 create mode 100644 src/libs/glsl/glsl.h
 create mode 100644 src/plugins/glsleditor/glslhighlighter.cpp
 create mode 100644 src/plugins/glsleditor/glslhighlighter.h

diff --git a/src/libs/glsl/glsl-lib.pri b/src/libs/glsl/glsl-lib.pri
index cd39d5777b5..0422945a868 100644
--- a/src/libs/glsl/glsl-lib.pri
+++ b/src/libs/glsl/glsl-lib.pri
@@ -1,4 +1,4 @@
-HEADERS += $$PWD/glsllexer.h $$PWD/glslparser.h glslparsertable_p.h $$PWD/glslast.h
+HEADERS += $$PWD/glsl.h $$PWD/glsllexer.h $$PWD/glslparser.h glslparsertable_p.h $$PWD/glslast.h
 SOURCES += $$PWD/glslkeywords.cpp $$PWD/glslparser.cpp $$PWD/glslparsertable.cpp \
     $$PWD/glsllexer.cpp $$PWD/glslast.cpp $$PWD/glsldump.cpp $$PWD/glsldelete.cpp
 
diff --git a/src/libs/glsl/glsl.g b/src/libs/glsl/glsl.g
index a7ddeec428f..cd4fc0388b4 100644
--- a/src/libs/glsl/glsl.g
+++ b/src/libs/glsl/glsl.g
@@ -1,3 +1,32 @@
+---------------------------------------------------------------------------
+--
+-- This file is part of Qt Creator
+--
+-- Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+--
+-- Contact: Nokia Corporation (qt-info@nokia.com)
+--
+-- Commercial Usage
+--
+-- Licensees holding valid Qt Commercial licenses may use this file in
+-- accordance with the Qt Commercial License Agreement provided with the
+-- Software or, alternatively, in accordance with the terms contained in
+-- a written agreement between you and Nokia.
+--
+-- GNU Lesser General Public License Usage
+--
+-- Alternatively, this file may be used under the terms of the GNU Lesser
+-- General Public License version 2.1 as published by the Free Software
+-- Foundation and appearing in the file LICENSE.LGPL included in the
+-- packaging of this file.  Please review the following information to
+-- ensure the GNU Lesser General Public License version 2.1 requirements
+-- will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+--
+-- If you are unsure which license is appropriate for your use, please
+-- contact the sales department at http://qt.nokia.com/contact.
+---------------------------------------------------------------------------
+
+--
 -- todo:
 --    spelling of XOR_OP and CARET
 
@@ -174,11 +203,42 @@
 %token XOR_OP "^"
 %token TRUE "true"
 %token FALSE "false"
+%token PREPROC "preprocessor directive"
+%token COMMENT "comment"
 %token ERROR "error"
 
 %start translation_unit
 
 /:
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
 #include "$header"
 #include "glsllexer.h"
 #include "glslast.h"
@@ -214,6 +274,35 @@ private:
 :/
 
 /.
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
 #include "glslparser.h"
 #include <iostream>
 
diff --git a/src/libs/glsl/glsl.h b/src/libs/glsl/glsl.h
new file mode 100644
index 00000000000..457f44ba6e2
--- /dev/null
+++ b/src/libs/glsl/glsl.h
@@ -0,0 +1,45 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef GLSL_H
+#define GLSL_H
+
+#include <QtCore/qglobal.h>
+#include <cstdlib>
+#include <cstddef>
+
+#if defined(GLSL_BUILD_LIB)
+#  define GLSL_EXPORT Q_DECL_EXPORT
+#elif defined(GLSL_BUILD_STATIC_LIB)
+#  define GLSL_EXPORT
+#else
+#  define GLSL_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif // GLSL_H
diff --git a/src/libs/glsl/glsl.pro b/src/libs/glsl/glsl.pro
index 758e2d613e4..3041ec1d65f 100644
--- a/src/libs/glsl/glsl.pro
+++ b/src/libs/glsl/glsl.pro
@@ -1,9 +1,8 @@
 TEMPLATE = lib
 CONFIG += dll
 TARGET = GLSL
-DEFINES += GLSL_BUILD_DIR QT_CREATOR
+DEFINES += GLSL_BUILD_LIB QT_CREATOR
 
 include(../../qtcreatorlibrary.pri)
 include(glsl-lib.pri)
 include(../utils/utils.pri)
-
diff --git a/src/libs/glsl/glslast.cpp b/src/libs/glsl/glslast.cpp
index c4914f39538..c873ea655a5 100644
--- a/src/libs/glsl/glslast.cpp
+++ b/src/libs/glsl/glslast.cpp
@@ -1,3 +1,31 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
 #include "glslast.h"
 
 using namespace GLSL;
diff --git a/src/libs/glsl/glslast.h b/src/libs/glsl/glslast.h
index 0ceb56be337..e273055cf39 100644
--- a/src/libs/glsl/glslast.h
+++ b/src/libs/glsl/glslast.h
@@ -1,3 +1,31 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
 #ifndef GLSLAST_H
 #define GLSLAST_H
 
diff --git a/src/libs/glsl/glsldelete.cpp b/src/libs/glsl/glsldelete.cpp
index 93288cb7e61..6406f022b23 100644
--- a/src/libs/glsl/glsldelete.cpp
+++ b/src/libs/glsl/glsldelete.cpp
@@ -1,3 +1,31 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
 
 #include "glslast.h"
 
diff --git a/src/libs/glsl/glsldump.cpp b/src/libs/glsl/glsldump.cpp
index 28c7b44bb4b..50bfa06c9d2 100644
--- a/src/libs/glsl/glsldump.cpp
+++ b/src/libs/glsl/glsldump.cpp
@@ -1,3 +1,31 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
 
 #include "glslast.h"
 
diff --git a/src/libs/glsl/glslkeywords.cpp b/src/libs/glsl/glslkeywords.cpp
index a992c9508e6..58a41e2879a 100644
--- a/src/libs/glsl/glslkeywords.cpp
+++ b/src/libs/glsl/glslkeywords.cpp
@@ -1,3 +1,32 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
 #include "glsllexer.h"
 #include "glslparser.h"
 
diff --git a/src/libs/glsl/glsllexer.cpp b/src/libs/glsl/glsllexer.cpp
index 5490c10dfc8..eb160fddb83 100644
--- a/src/libs/glsl/glsllexer.cpp
+++ b/src/libs/glsl/glsllexer.cpp
@@ -1,3 +1,31 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
 
 #include "glsllexer.h"
 #include "glslparser.h"
@@ -13,7 +41,10 @@ Lexer::Lexer(const char *source, unsigned size)
       _size(size),
       _yychar('\n'),
       _lineno(0),
-      _variant(Variant_Mask & ~Variant_Reserved) // everything except reserved
+      _state(0),
+      _variant(Variant_Mask & ~Variant_Reserved), // everything except reserved
+      _scanKeywords(true),
+      _scanComments(false)
 {
 }
 
@@ -23,12 +54,9 @@ Lexer::~Lexer()
 
 void Lexer::yyinp()
 {
-    if (_it != _end) {
-        _yychar = *_it++;
-        if (_yychar == '\n')
-            ++_lineno;
-    } else
-        _yychar = 0;
+    _yychar = (unsigned char) *_it++;
+    if (_yychar == '\n')
+        ++_lineno;
 }
 
 int Lexer::yylex(Token *tk)
@@ -44,6 +72,11 @@ int Lexer::yylex(Token *tk)
     return kind;
 }
 
+enum {
+    State_normal,
+    State_comment
+};
+
 int Lexer::yylex_helper(const char **position, int *line)
 {
 again:
@@ -56,6 +89,22 @@ again:
     if (_yychar == 0)
         return Parser::EOF_SYMBOL;
 
+    if (_state == State_comment) {
+        while (_yychar) {
+            if (_yychar == '*') {
+                yyinp();
+                if (_yychar == '/') {
+                    yyinp();
+                    _state = State_normal;
+                    break;
+                }
+            } else {
+                yyinp();
+            }
+        }
+        return Parser::T_COMMENT;
+    }
+
     const int ch = _yychar;
     yyinp();
 
@@ -171,6 +220,8 @@ again:
                 if (_yychar == '\n')
                     break;
             }
+            if (_scanComments)
+                return Parser::T_COMMENT;
             goto again;
         } else if (_yychar == '*') {
             yyinp();
@@ -179,12 +230,18 @@ again:
                     yyinp();
                     if (_yychar == '/') {
                         yyinp();
+                        if (_scanComments)
+                            return Parser::T_COMMENT;
                         goto again;
                     }
                 } else {
                     yyinp();
                 }
             }
+            if (_scanComments) {
+                _state = State_comment;
+                return Parser::T_COMMENT;
+            }
             goto again;
         } else if (_yychar == '=') {
             yyinp();
@@ -302,16 +359,9 @@ again:
             while (std::isalnum(_yychar) || _yychar == '_') {
                 yyinp();
             }
-            int t = classify(word, _it - word -1);
-            if (!(t & Variant_Mask))
-                return t;
-            if ((_variant & t & Variant_Mask) == 0) {
-                // TODO: issue a proper error for the unsupported keyword
-                std::string keyword(word, _it - word -1);
-                fprintf(stderr, "unsupported keyword `%s' at line %d\n",
-                        keyword.c_str(), _lineno);
-            }
-            return t & ~Variant_Mask;
+            if (_scanKeywords)
+                return findKeyword(word, _it - word - 1);
+            return Parser::T_IDENTIFIER;
         } else if (std::isdigit(ch)) {
             while (std::isalnum(_yychar) || _yychar == '.') {
                 yyinp();
@@ -323,3 +373,17 @@ again:
 
     return Parser::T_ERROR;
 }
+
+int Lexer::findKeyword(const char *word, int length) const
+{
+    int t = classify(word, length);
+    if (!(t & Variant_Mask))
+        return t;
+    if ((_variant & t & Variant_Mask) == 0) {
+        // TODO: issue a proper error for the unsupported keyword
+        std::string keyword(word, length);
+        fprintf(stderr, "unsupported keyword `%s' at line %d\n",
+                keyword.c_str(), _lineno);
+    }
+    return t & ~Variant_Mask;
+}
diff --git a/src/libs/glsl/glsllexer.h b/src/libs/glsl/glsllexer.h
index fbb8217d62b..d155d23e986 100644
--- a/src/libs/glsl/glsllexer.h
+++ b/src/libs/glsl/glsllexer.h
@@ -1,9 +1,40 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
 #ifndef GLSLLEXER_H
 #define GLSLLEXER_H
 
+#include "glsl.h"
+
 namespace GLSL {
 
-class Token
+class GLSL_EXPORT Token
 {
 public:
     int kind;
@@ -23,7 +54,7 @@ public:
     bool isNot(int k) const { return k != kind; }
 };
 
-class Lexer
+class GLSL_EXPORT Lexer
 {
 public:
     Lexer(const char *source, unsigned size);
@@ -44,10 +75,20 @@ public:
         Variant_Mask                = 0xFFFF0000
     };
 
+    int state() const { return _state; }
+    void setState(int state) { _state = state; }
+
     int variant() const { return _variant; }
     void setVariant(int flags) { _variant = flags; }
 
+    bool scanKeywords() const { return _scanKeywords; }
+    void setScanKeywords(bool scanKeywords) { _scanKeywords = scanKeywords; }
+
+    bool scanComments() const { return _scanComments; }
+    void setScanComments(bool scanComments) { _scanComments = scanComments; }
+
     int yylex(Token *tk);
+    int findKeyword(const char *word, int length) const;
 
 private:
     static int classify(const char *s, int len);
@@ -62,7 +103,10 @@ private:
     int _size;
     int _yychar;
     int _lineno;
+    int _state;
     int _variant;
+    unsigned _scanKeywords: 1;
+    unsigned _scanComments: 1;
 };
 
 } // end of namespace GLSL
diff --git a/src/libs/glsl/glslparser.cpp b/src/libs/glsl/glslparser.cpp
index cb55b54ce9b..7cd4d6cbbdc 100644
--- a/src/libs/glsl/glslparser.cpp
+++ b/src/libs/glsl/glslparser.cpp
@@ -1,4 +1,33 @@
 
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
 #include "glslparser.h"
 #include <iostream>
 
diff --git a/src/libs/glsl/glslparser.h b/src/libs/glsl/glslparser.h
index b01eff4200a..f2761f2c32b 100644
--- a/src/libs/glsl/glslparser.h
+++ b/src/libs/glsl/glslparser.h
@@ -1,4 +1,33 @@
 
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
 #include "glslparsertable_p.h"
 #include "glsllexer.h"
 #include "glslast.h"
diff --git a/src/libs/glsl/glslparsertable.cpp b/src/libs/glsl/glslparsertable.cpp
index 35494fcdcd7..a4ace3a1f2c 100644
--- a/src/libs/glsl/glslparsertable.cpp
+++ b/src/libs/glsl/glslparsertable.cpp
@@ -1,6 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 // This file was generated by qlalr - DO NOT EDIT!
 #include "glslparsertable_p.h"
 
+QT_BEGIN_NAMESPACE
+
 const char *const GLSLParserTable::spell [] = {
   "end of file", "+=", "&", "&=", "&&", "attribute", "!", "bool", "break", "bvec2", 
   "bvec3", "bvec4", "^", "case", "centroid", ":", ",", "const", "continue", "-", 
@@ -18,41 +61,42 @@ const char *const GLSLParserTable::spell [] = {
   "samplerCubeArrayShadow", "samplerCubeShadow", ";", "/", "smooth", "*", "struct", "subroutine", "-=", "switch", 
   "~", "type_name", "uint", "uniform", "usampler1D", "usampler1DArray", "usampler2D", "usampler2DArray", "usampler2DMS", "usampler2DMSarray", 
   "usampler2DRect", "usampler3D", "usamplerBuffer", "usamplerCube", "usamplerCubeArray", "uvec2", "uvec3", "uvec4", "varying", "vec2", 
-  "vec3", "vec4", "|", "void", "while", "^=", "^", "true", "false", "error"};
+  "vec3", "vec4", "|", "void", "while", "^=", "^", "true", "false", "preprocessor directive", 
+  "comment", "error"};
 
 const short GLSLParserTable::lhs [] = {
-  171, 172, 172, 172, 172, 172, 174, 174, 174, 174, 
-  174, 174, 175, 176, 177, 177, 178, 178, 180, 180, 
-  179, 179, 181, 183, 183, 185, 185, 185, 185, 186, 
-  186, 186, 186, 187, 187, 187, 187, 188, 188, 188, 
-  189, 189, 189, 190, 190, 190, 190, 190, 191, 191, 
-  191, 192, 192, 193, 193, 194, 194, 195, 195, 196, 
-  196, 197, 197, 198, 198, 182, 182, 199, 199, 199, 
-  199, 199, 199, 199, 199, 199, 199, 199, 173, 173, 
-  200, 201, 201, 201, 201, 201, 201, 201, 201, 202, 
-  208, 208, 210, 210, 209, 213, 213, 211, 211, 211, 
-  211, 215, 215, 215, 215, 216, 203, 203, 203, 203, 
-  203, 203, 203, 217, 217, 217, 217, 217, 217, 217, 
-  217, 212, 212, 219, 220, 220, 220, 221, 222, 222, 
-  223, 223, 214, 206, 206, 206, 206, 206, 206, 206, 
-  206, 224, 224, 224, 224, 224, 224, 224, 224, 224, 
-  224, 224, 224, 224, 184, 184, 205, 205, 205, 225, 
-  225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 
-  225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 
-  225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 
-  225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 
-  225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 
-  225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 
-  225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 
-  225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 
-  225, 225, 225, 225, 225, 225, 204, 204, 204, 226, 
-  226, 207, 207, 227, 227, 228, 228, 229, 229, 229, 
-  218, 230, 231, 231, 233, 233, 233, 233, 233, 233, 
-  233, 232, 232, 241, 241, 242, 242, 240, 240, 234, 
-  234, 235, 243, 243, 244, 244, 236, 245, 245, 237, 
-  237, 238, 238, 238, 246, 246, 248, 248, 247, 247, 
-  239, 239, 239, 239, 239, 170, 170, 249, 249, 249, 
-  250, 251};
+  173, 174, 174, 174, 174, 174, 176, 176, 176, 176, 
+  176, 176, 177, 178, 179, 179, 180, 180, 182, 182, 
+  181, 181, 183, 185, 185, 187, 187, 187, 187, 188, 
+  188, 188, 188, 189, 189, 189, 189, 190, 190, 190, 
+  191, 191, 191, 192, 192, 192, 192, 192, 193, 193, 
+  193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 
+  198, 199, 199, 200, 200, 184, 184, 201, 201, 201, 
+  201, 201, 201, 201, 201, 201, 201, 201, 175, 175, 
+  202, 203, 203, 203, 203, 203, 203, 203, 203, 204, 
+  210, 210, 212, 212, 211, 215, 215, 213, 213, 213, 
+  213, 217, 217, 217, 217, 218, 205, 205, 205, 205, 
+  205, 205, 205, 219, 219, 219, 219, 219, 219, 219, 
+  219, 214, 214, 221, 222, 222, 222, 223, 224, 224, 
+  225, 225, 216, 208, 208, 208, 208, 208, 208, 208, 
+  208, 226, 226, 226, 226, 226, 226, 226, 226, 226, 
+  226, 226, 226, 226, 186, 186, 207, 207, 207, 227, 
+  227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 
+  227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 
+  227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 
+  227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 
+  227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 
+  227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 
+  227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 
+  227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 
+  227, 227, 227, 227, 227, 227, 206, 206, 206, 228, 
+  228, 209, 209, 229, 229, 230, 230, 231, 231, 231, 
+  220, 232, 233, 233, 235, 235, 235, 235, 235, 235, 
+  235, 234, 234, 243, 243, 244, 244, 242, 242, 236, 
+  236, 237, 245, 245, 246, 246, 238, 247, 247, 239, 
+  239, 240, 240, 240, 248, 248, 250, 250, 249, 249, 
+  241, 241, 241, 241, 241, 172, 172, 251, 251, 251, 
+  252, 253};
 
 const short GLSLParserTable::rhs [] = {
   1, 1, 1, 1, 1, 3, 1, 4, 1, 3, 
@@ -148,52 +192,52 @@ const short GLSLParserTable::goto_default [] = {
   111, 0};
 
 const short GLSLParserTable::action_index [] = {
-  3093, -170, -170, -170, -170, -170, 48, -170, -170, -170, 
-  -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, 
-  -170, -170, -170, -170, -170, -170, -170, -170, -170, 224, 
-  -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, 
-  -170, -170, -170, -170, -63, -170, -170, -170, -170, -170, 
-  -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, 
-  -170, 24, 70, 30, -170, -170, -170, -170, -170, -170, 
-  -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, 
-  -170, -170, -170, -170, 41, -170, -170, -170, -170, -170, 
-  -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, 
-  -170, -170, -170, -170, -170, -170, -170, -170, -170, -10, 
-  -81, -170, 128, 18, 1, 67, 304, 155, 304, 467, 
-  -170, -170, -170, 3263, 956, -170, -170, -24, -170, -170, 
-  -170, -170, -3, 5, -170, 64, -47, -170, -20, -170, 
-  -170, -170, -170, 467, -83, -170, -170, -170, -30, 2433, 
-  2433, 219, -170, 2763, 630, 7, -170, -170, 4, -17, 
-  -170, 71, 1612, -170, -170, 1120, -170, -31, 1120, 1120, 
-  -170, -170, -170, -170, -170, 53, 33, -170, -74, 45, 
-  21, -170, -170, 1284, -75, 54, -170, -35, -121, 39, 
-  -1, -127, 44, 133, -170, 120, 16, -170, -170, 1120, 
-  -170, -170, -170, -170, -170, 78, 209, 1120, -170, -170, 
-  -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, 
-  -170, 1120, -170, 1120, 1120, 6, 1120, 1120, 1120, -170, 
-  -170, -170, 3, 1120, 49, 1120, 1120, 95, 1120, 1120, 
-  1120, 1120, 31, 1120, 1120, 82, 55, 26, 23, 10, 
-  116, -170, 1120, 66, -52, -170, -170, 1120, -170, -170, 
-  -170, 1120, 52, 1120, -100, 1120, 1120, -103, 1120, 51, 
-  69, 1120, -170, -170, 793, -170, 1120, -8, -170, 139, 
-  -44, -170, -170, 9, -170, -170, 65, -170, 2598, -170, 
-  75, 1120, 2268, -170, -170, -170, -39, -107, 1120, -170, 
-  -18, 1120, -170, -170, -170, -170, -170, -170, -170, 630, 
-  59, -170, -170, -32, -56, 1120, -94, -170, 630, -170, 
-  -170, -41, 109, -170, 4583, -170, -170, -104, 1120, -126, 
-  -15, -130, 3758, -69, -72, 4088, 1448, -170, -170, -48, 
-  -55, -170, -170, -170, -170, 57, -170, -117, -170, -170, 
-  -170, -170, -170, 4418, -170, -70, -170, 62, -170, -170, 
-  -170, -170, -151, -60, 1120, 72, -112, -170, 3593, -170, 
-  -170, 3428, -50, -170, -106, 139, -88, -40, 630, 1120, 
-  139, 3923, -170, -170, -170, -42, 1120, -170, -170, 1120, 
-  63, 3758, -170, -21, 3758, -170, -170, 4253, -170, -170, 
-  -170, 79, -170, 1120, 81, -51, 3758, 3758, -97, -170, 
-  3428, -101, 3923, -170, -170, -170, 11, -170, 28, 1120, 
-  1940, -170, 22, -43, 1120, -170, -11, 1120, -170, -170, 
-  304, -170, -170, -170, -170, -170, -170, -36, -170, 2433, 
-  2928, 46, 15, -170, 1776, -170, -87, -58, -170, -79, 
-  -170, 2104, -170, -54, -170, 
+  3116, -172, -172, -172, -172, -172, 48, -172, -172, -172, 
+  -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, 
+  -172, -172, -172, -172, -172, -172, -172, -172, -172, 232, 
+  -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, 
+  -172, -172, -172, -172, -63, -172, -172, -172, -172, -172, 
+  -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, 
+  -172, 24, 70, 30, -172, -172, -172, -172, -172, -172, 
+  -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, 
+  -172, -172, -172, -172, 41, -172, -172, -172, -172, -172, 
+  -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, 
+  -172, -172, -172, -172, -172, -172, -172, -172, -172, -10, 
+  -81, -172, 118, 18, 1, 67, 160, 214, 196, 458, 
+  -172, -172, -172, 3288, 953, -172, -172, -24, -172, -172, 
+  -172, -172, -3, 5, -172, 64, -47, -172, -20, -172, 
+  -172, -172, -172, 458, -83, -172, -172, -172, -30, 2448, 
+  2448, 224, -172, 2782, 623, 7, -172, -172, 4, -17, 
+  -172, 71, 1617, -172, -172, 1119, -172, -31, 1119, 1119, 
+  -172, -172, -172, -172, -172, 53, 33, -172, -74, 45, 
+  21, -172, -172, 1285, -75, 54, -172, -35, -121, 39, 
+  -1, -127, 20, 293, -172, 120, 16, -172, -172, 1119, 
+  -172, -172, -172, -172, -172, 78, 213, 1119, -172, -172, 
+  -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, 
+  -172, 1119, -172, 1119, 1119, 6, 1119, 1119, 1119, -172, 
+  -172, -172, 3, 1119, 49, 1119, 1119, 95, 1119, 1119, 
+  1119, 1119, 31, 1119, 1119, 82, 55, 26, 23, 10, 
+  116, -172, 1119, 66, -52, -172, -172, 1119, -172, -172, 
+  -172, 1119, 52, 1119, -100, 1119, 1119, -103, 1119, 51, 
+  69, 1119, -172, -172, 788, -172, 1119, -8, -172, 141, 
+  -44, -172, -172, 9, -172, -172, 65, -172, 2615, -172, 
+  75, 1119, 2281, -172, -172, -172, -39, -107, 1119, -172, 
+  -18, 1119, -172, -172, -172, -172, -172, -172, -172, 623, 
+  59, -172, -172, -32, -56, 1119, -94, -172, 623, -172, 
+  -172, -41, 109, -172, 4624, -172, -172, -104, 1119, -126, 
+  -15, -130, 3789, -69, -72, 4123, 1451, -172, -172, -48, 
+  -55, -172, -172, -172, -172, 57, -172, -117, -172, -172, 
+  -172, -172, -172, 4457, -172, -70, -172, 62, -172, -172, 
+  -172, -172, -151, -60, 1119, 72, -112, -172, 3622, -172, 
+  -172, 3455, -50, -172, -106, 141, -88, -40, 623, 1119, 
+  141, 3956, -172, -172, -172, -42, 1119, -172, -172, 1119, 
+  63, 3789, -172, -21, 3789, -172, -172, 4290, -172, -172, 
+  -172, 79, -172, 1119, 81, -51, 3789, 3789, -97, -172, 
+  3455, -101, 3956, -172, -172, -172, 11, -172, 28, 1119, 
+  1949, -172, 22, -43, 1119, -172, -11, 1119, -172, -172, 
+  191, -172, -172, -172, -172, -172, -172, -36, -172, 2448, 
+  2949, 46, 15, -172, 1783, -172, -87, -58, -172, -79, 
+  -172, 2115, -172, -54, -172, 
 
   119, -82, -82, -82, -82, -82, -82, -82, -82, -82, 
   -82, -82, -82, -82, -82, -82, -82, -82, -82, -82, 
@@ -255,79 +299,62 @@ const short GLSLParserTable::action_info [] = {
   444, 148, 243, 235, 207, 207, 442, 207, 265, 243, 
   128, 223, 243, 420, 266, 226, 0, 243, 226, 0, 
   0, 305, 0, 306, 0, 149, 0, 0, 291, 26, 
-  0, 244, 0, 0, 142, 0, 304, 244, 0, 0, 
-  147, 0, 0, 325, 244, 0, 227, 244, 228, 227, 
-  236, 228, 244, 238, 236, 304, 226, 445, 129, 45, 
-  292, 0, 293, 273, 0, 207, 224, 0, 224, 307, 
-  1, 305, 58, 306, 238, 0, 258, 239, 238, 6, 
-  274, 0, 7, 240, 0, 391, 139, 227, 443, 228, 
-  305, 0, 306, 0, 366, 224, 275, 0, 239, 414, 
-  208, 0, 239, 405, 240, 0, 0, 287, 240, 417, 
-  24, 0, 241, 284, 0, 0, 130, 27, 276, 307, 
-  210, 402, 211, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 241, -124, 0, 0, 241, 307, -124, 
-  0, 0, 212, -124, 0, 0, -124, 0, -124, 0, 
-  -91, -124, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 59, 213, 0, 0, 60, 61, 0, 0, 0, 
-  0, 0, 0, 0, -124, 0, 0, 0, 63, -124, 
-  0, -124, 0, 0, 131, 0, -124, 0, 0, 0, 
-  0, 0, 214, 0, 0, 0, 0, 0, 0, 83, 
-  0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 
-  0, 0, 215, 216, 0, 0, 0, 217, 0, 1, 
-  0, 0, 0, 102, 0, -124, 0, 218, 6, -124, 
-  -124, 7, 0, 0, -124, -124, 0, 0, 0, 0, 
-  0, 0, -124, 0, 0, 0, 0, -124, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 
-  0, 0, 0, -124, 0, 0, 27, 0, -124, 0, 
-  0, 0, -124, 0, 0, 0, 0, -124, 0, 0, 
-  0, 0, 0, 0, 220, 0, 0, -124, 0, 0, 
+  0, 244, 226, 0, 142, 0, 304, 244, 0, 0, 
+  147, 0, 0, 325, 244, 304, 227, 244, 228, 227, 
+  236, 228, 244, 238, 236, 0, 0, 445, 129, 45, 
+  292, 0, 293, 227, 0, 228, 224, 207, 224, 307, 
+  0, 305, 58, 306, 238, 1, 258, 239, 238, 0, 
+  305, 0, 306, 240, 6, 391, 139, 7, 443, 0, 
+  0, 0, 0, 0, 366, 224, 0, 0, 239, 414, 
+  208, 0, 239, 405, 240, 0, 1, 287, 240, 417, 
+  0, 1, 241, 284, 0, 6, 130, 0, 7, 307, 
+  6, 402, 27, 7, 210, 0, 211, 0, 307, 1, 
+  0, 0, 0, 241, 0, 0, 0, 241, 6, -124, 
+  -91, 7, 0, 0, 0, 0, 212, -124, -124, 0, 
+  0, -124, 0, 27, 0, 0, -124, 0, 27, -124, 
+  0, 0, 0, 0, 0, 0, 213, 0, 0, 24, 
+  60, 61, 0, 0, 0, 0, 27, 0, 0, -124, 
+  0, 0, 0, 63, 0, 0, -124, -124, 0, 0, 
+  0, 0, 131, 0, -124, 0, 214, 0, 0, 0, 
+  0, 60, 61, 0, 0, 0, 60, 61, 0, 0, 
+  0, 0, 0, 87, 63, 0, 215, 216, 0, 63, 
+  59, 217, 0, 273, 60, 61, 0, 0, 102, 0, 
+  -124, 218, 0, 0, -124, -124, 0, 63, -124, 0, 
+  274, 0, -124, -124, 87, 0, 0, -124, 0, 87, 
+  0, 0, 0, 0, 0, -124, 275, 0, 83, 102, 
+  0, 219, 0, 0, 102, 0, 0, 87, -124, 0, 
+  0, 0, 0, 0, 0, 0, -124, -124, 276, 0, 
+  0, 0, 102, 0, 0, -124, 0, 0, 220, 0, 
   0, 0, -124, 0, 0, 0, 0, 0, 0, 0, 
+  -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 2, 0, 3, 4, 5, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
-  17, 18, 19, 0, 0, 20, 21, 22, 23, 0, 
-  0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 
-  0, 0, 28, 0, 30, 31, 32, 33, 34, 35, 
-  36, 37, 38, 39, 40, 41, 42, 43, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 46, 47, 48, 
-  49, 50, 51, 52, 53, 54, 55, 56, 57, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 2, 0, 3, 4, 5, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 64, 65, 66, 67, 68, 69, 70, 71, 72, 
-  73, 74, 75, 76, 77, 78, 79, 80, 81, 0, 
-  0, 0, 0, 84, 0, 0, 0, 0, 85, 86, 
-  0, 88, 89, 90, 91, 92, 93, 94, 95, 96, 
-  97, 98, 99, 100, 101, 0, 103, 104, 105, 0, 
-  106, 0, 0, 0, 0, 0, 0, 2, 0, 3, 
-  4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 8, 9, 10, 11, 12, 13, 
-  14, 15, 16, 17, 18, 19, 0, 0, 20, 21, 
-  22, 23, 0, 0, 0, 0, 25, 0, 0, 26, 
-  0, 0, 0, 0, 0, 28, 0, 30, 31, 32, 
-  33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 
-  43, 0, 0, 0, 0, 0, 0, 0, 0, 45, 
-  46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 
-  56, 57, 58, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 
+  16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 
+  0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 
+  0, 0, 0, 28, 0, 30, 31, 32, 33, 34, 
+  35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 
+  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 64, 65, 66, 67, 68, 69, 
-  70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 
-  80, 81, 0, 0, 0, 0, 84, 0, 0, 0, 
-  0, 85, 86, 0, 88, 89, 90, 91, 92, 93, 
-  94, 95, 96, 97, 98, 99, 100, 101, 0, 103, 
-  104, 105, 0, 106, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 64, 65, 66, 67, 68, 69, 70, 71, 
+  72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 
+  0, 0, 0, 0, 84, 0, 0, 0, 0, 85, 
+  86, 0, 88, 89, 90, 91, 92, 93, 94, 95, 
+  96, 97, 98, 99, 100, 101, 0, 103, 104, 105, 
+  0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 
   2, 0, 3, 4, 5, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 8, 9, 10, 
   11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 
   0, 20, 21, 22, 23, 0, 0, 0, 0, 25, 
-  0, 0, 26, 277, 0, 0, 0, 0, 28, 0, 
+  0, 0, 26, 0, 0, 0, 0, 0, 28, 0, 
   30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
   40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 
   0, 0, 45, 46, 47, 48, 49, 50, 51, 52, 
@@ -339,170 +366,172 @@ const short GLSLParserTable::action_info [] = {
   0, 0, 0, 0, 85, 86, 0, 88, 89, 90, 
   91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 
   101, 0, 103, 104, 105, 0, 106, 0, 0, 0, 
-  0, 0, 0, 2, 0, 3, 4, 5, 0, 0, 
+  0, 0, 0, 0, 0, 2, 0, 3, 4, 5, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
-  18, 19, 0, 0, 20, 21, 22, 23, 0, 0, 
-  0, 0, 25, 0, 0, 26, 437, 0, 0, 0, 
-  0, 28, 0, 30, 31, 32, 33, 34, 35, 36, 
-  37, 38, 39, 40, 41, 42, 43, 0, 0, 0, 
-  0, 0, 0, 0, 0, 45, 46, 47, 48, 49, 
-  50, 51, 52, 53, 54, 55, 56, 57, 58, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 
-  74, 75, 76, 77, 78, 79, 80, 81, 438, 0, 
-  0, 0, 84, 0, 0, 0, 0, 85, 86, 0, 
-  88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 
-  98, 99, 100, 101, 0, 103, 104, 105, 0, 106, 
-  0, 0, 0, 0, 0, 0, 163, 2, 0, 3, 
-  4, 5, 0, 0, 0, 0, 0, 0, 0, 164, 
-  165, 0, 0, 0, 8, 9, 10, 11, 12, 13, 
-  14, 15, 16, 17, 18, 19, 0, 0, 20, 21, 
-  22, 23, 0, 0, 0, 0, 25, 0, 0, 26, 
-  167, 0, 0, 168, 0, 28, 0, 30, 31, 32, 
-  33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 
-  43, 0, 0, 0, 0, 0, 0, 169, 0, 45, 
-  46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 
-  56, 57, 58, 0, 0, 0, 0, 170, 0, 0, 
-  0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 64, 65, 66, 67, 68, 69, 
-  70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 
-  80, 81, 0, 0, 0, 0, 84, 0, 0, 0, 
-  173, 85, 86, 0, 88, 89, 90, 91, 92, 93, 
-  94, 95, 96, 97, 98, 99, 100, 101, 0, 103, 
-  104, 105, 0, 106, 0, 0, 0, 174, 166, 0, 
-  163, 2, 0, 3, 4, 5, 0, 0, 0, 0, 
-  0, 0, 0, 164, 165, 0, 0, 0, 8, 9, 
-  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
-  0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 
-  25, 0, 0, 26, 167, 0, 0, 168, 0, 28, 
-  0, 30, 31, 32, 33, 34, 35, 36, 37, 38, 
-  39, 40, 41, 42, 43, 0, 0, 0, 0, 0, 
-  0, 169, 0, 45, 46, 47, 48, 49, 50, 51, 
-  52, 53, 54, 55, 56, 57, 58, 0, 0, 0, 
-  0, 170, 0, 0, 0, 0, 0, 171, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 
-  66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 
-  76, 77, 78, 79, 80, 81, 0, 0, 0, 0, 
-  84, 0, 0, 0, 173, 85, 86, 0, 88, 89, 
-  90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 
-  100, 101, 0, 103, 104, 105, 0, 254, 0, 0, 
-  0, 174, 166, 0, 163, 2, 0, 3, 4, 5, 
-  0, 0, 0, 0, 0, 0, 0, 164, 165, 0, 
   0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 
   16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 
-  0, 0, 0, 0, 25, 0, 0, 26, 167, 0, 
-  0, 168, 0, 28, 0, 30, 31, 32, 33, 34, 
+  0, 0, 0, 0, 25, 0, 0, 26, 277, 0, 
+  0, 0, 0, 28, 0, 30, 31, 32, 33, 34, 
   35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 
-  0, 0, 0, 0, 0, 169, 0, 45, 46, 47, 
-  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
-  58, 0, 0, 0, 0, 170, 0, 0, 0, 0, 
-  0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 64, 65, 66, 67, 68, 69, 70, 71, 
-  72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 
-  400, 0, 0, 0, 84, 0, 0, 0, 173, 85, 
-  86, 0, 88, 89, 90, 91, 92, 93, 94, 95, 
-  96, 97, 98, 99, 100, 101, 0, 103, 104, 105, 
-  0, 106, 0, 0, 0, 174, 166, 0, 163, 2, 
-  0, 3, 4, 5, 0, 0, 0, 0, 0, 0, 
-  0, 164, 165, 0, 0, 0, 8, 9, 10, 11, 
-  12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 
-  20, 21, 22, 23, 0, 0, 0, 0, 25, 0, 
-  0, 26, 167, 0, 0, 168, 0, 28, 0, 30, 
-  31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 
-  41, 42, 43, 0, 0, 0, 0, 0, 0, 169, 
-  0, 45, 46, 47, 48, 49, 50, 51, 52, 53, 
-  54, 55, 56, 57, 58, 0, 0, 0, 0, 170, 
-  0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 
-  0, 0, 172, 0, 0, 0, 64, 65, 66, 67, 
-  68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 
-  78, 79, 80, 81, 0, 0, 0, 0, 84, 0, 
-  0, 0, 173, 85, 86, 0, 88, 89, 90, 91, 
-  92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 
-  0, 103, 104, 105, 0, 106, 0, 0, 0, 174, 
-  166, 0, 163, 2, 0, 3, 4, 5, 0, 0, 
-  0, 0, 0, 0, 0, 164, 165, 0, 0, 0, 
-  8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
-  18, 19, 0, 0, 20, 21, 22, 23, 0, 0, 
-  0, 0, 25, 0, 0, 26, 167, 0, 0, 168, 
-  0, 28, 0, 30, 31, 32, 33, 34, 35, 36, 
-  37, 38, 39, 40, 41, 42, 43, 0, 0, 0, 
-  0, 0, 0, 169, 0, 45, 46, 47, 48, 49, 
-  50, 51, 52, 53, 54, 55, 56, 57, 58, 0, 
-  0, 0, 0, 170, 0, 0, 0, 0, 0, 171, 
-  0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 
-  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 
-  74, 75, 76, 77, 78, 79, 80, 81, 0, 0, 
-  0, 0, 84, 0, 0, 0, 173, 85, 86, 0, 
-  88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 
-  98, 99, 100, 101, 0, 103, 104, 105, 0, 106, 
-  0, 0, 0, 174, 166, 0, 163, 2, 0, 3, 
-  4, 5, 0, 0, 0, 0, 0, 0, 0, 164, 
-  165, 0, 0, 0, 8, 9, 10, 11, 12, 13, 
-  14, 15, 16, 17, 18, 19, 0, 0, 20, 21, 
-  22, 23, 0, 0, 0, 0, 25, 0, 0, 26, 
-  167, 0, 0, 168, 0, 28, 0, 30, 31, 32, 
-  33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 
-  43, 0, 0, 0, 0, 0, 0, 169, 0, 45, 
-  46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 
-  56, 57, 58, 0, 0, 0, 0, 170, 0, 0, 
-  0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 
-  422, 0, 0, 0, 64, 65, 66, 67, 68, 69, 
-  70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 
-  80, 81, 0, 0, 0, 0, 84, 0, 0, 0, 
-  173, 85, 86, 0, 88, 89, 90, 91, 92, 93, 
-  94, 95, 96, 97, 98, 99, 100, 101, 0, 103, 
-  104, 105, 0, 106, 0, 0, 0, 174, 166, 0, 
-  163, 2, 0, 3, 4, 5, 0, 0, 0, 0, 
-  0, 0, 0, 164, 165, 0, 0, 0, 8, 9, 
-  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
-  0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 
-  25, 0, 0, 26, 167, 0, 0, 168, 0, 28, 
-  0, 30, 31, 32, 33, 34, 35, 36, 37, 38, 
-  39, 40, 41, 42, 43, 0, 0, 0, 0, 0, 
-  0, 169, 0, 45, 46, 47, 48, 49, 50, 51, 
-  52, 53, 54, 55, 56, 57, 58, 0, 0, 0, 
-  0, 170, 0, 0, 0, 0, 0, 171, 0, 0, 
-  0, 0, 0, 0, 452, 0, 0, 0, 64, 65, 
-  66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 
-  76, 77, 78, 79, 80, 81, 0, 0, 0, 0, 
-  84, 0, 0, 0, 173, 85, 86, 0, 88, 89, 
-  90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 
-  100, 101, 0, 103, 104, 105, 0, 106, 0, 0, 
-  0, 174, 166, 0, 163, 2, 0, 3, 4, 5, 
-  0, 0, 0, 0, 0, 0, 0, 164, 165, 0, 
-  0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 
-  16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 
-  0, 0, 0, 0, 25, 0, 0, 26, 167, 0, 
-  0, 168, 0, 28, 0, 30, 31, 32, 33, 34, 
-  35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 
-  0, 0, 0, 0, 0, 169, 0, 45, 46, 47, 
+  0, 0, 0, 0, 0, 0, 0, 45, 46, 47, 
   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
-  58, 0, 0, 0, 0, 170, 0, 0, 0, 0, 
-  0, 171, 0, 0, 0, 0, 0, 0, 296, 0, 
+  58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 64, 65, 66, 67, 68, 69, 70, 71, 
   72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 
-  0, 0, 0, 0, 84, 0, 0, 0, 173, 85, 
+  0, 0, 0, 0, 84, 0, 0, 0, 0, 85, 
   86, 0, 88, 89, 90, 91, 92, 93, 94, 95, 
   96, 97, 98, 99, 100, 101, 0, 103, 104, 105, 
-  0, 106, 0, 0, 0, 174, 166, 0, 1, 0, 
-  2, 0, 3, 4, 5, 0, 0, 6, 0, 0, 
-  7, 0, 0, 0, 0, 0, 0, 8, 9, 10, 
+  0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 
+  2, 0, 3, 4, 5, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 8, 9, 10, 
   11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 
-  0, 20, 21, 22, 23, 0, 0, 0, 24, 25, 
-  0, 0, 26, 0, 0, 27, 0, 0, 28, 151, 
+  0, 20, 21, 22, 23, 0, 0, 0, 0, 25, 
+  0, 0, 26, 437, 0, 0, 0, 0, 28, 0, 
   30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
-  40, 41, 42, 43, 44, 0, 0, 0, 0, 0, 
+  40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 
   0, 0, 45, 46, 47, 48, 49, 50, 51, 52, 
-  53, 54, 55, 56, 57, 58, 0, 0, 0, 59, 
-  0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 
+  53, 54, 55, 56, 57, 58, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 64, 65, 66, 
+  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
+  77, 78, 79, 80, 81, 438, 0, 0, 0, 84, 
+  0, 0, 0, 0, 85, 86, 0, 88, 89, 90, 
+  91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 
+  101, 0, 103, 104, 105, 0, 106, 0, 0, 0, 
+  0, 0, 0, 0, 0, 163, 2, 0, 3, 4, 
+  5, 0, 0, 0, 0, 0, 0, 0, 164, 165, 
+  0, 0, 0, 8, 9, 10, 11, 12, 13, 14, 
+  15, 16, 17, 18, 19, 0, 0, 20, 21, 22, 
+  23, 0, 0, 0, 0, 25, 0, 0, 26, 167, 
+  0, 0, 168, 0, 28, 0, 30, 31, 32, 33, 
+  34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 
+  0, 0, 0, 0, 0, 0, 169, 0, 45, 46, 
+  47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 
+  57, 58, 0, 0, 0, 0, 170, 0, 0, 0, 
+  0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 64, 65, 66, 67, 68, 69, 70, 
+  71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 
+  81, 0, 0, 0, 0, 84, 0, 0, 0, 173, 
+  85, 86, 0, 88, 89, 90, 91, 92, 93, 94, 
+  95, 96, 97, 98, 99, 100, 101, 0, 103, 104, 
+  105, 0, 106, 0, 0, 0, 174, 166, 0, 0, 
+  0, 163, 2, 0, 3, 4, 5, 0, 0, 0, 
+  0, 0, 0, 0, 164, 165, 0, 0, 0, 8, 
+  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
+  19, 0, 0, 20, 21, 22, 23, 0, 0, 0, 
+  0, 25, 0, 0, 26, 167, 0, 0, 168, 0, 
+  28, 0, 30, 31, 32, 33, 34, 35, 36, 37, 
+  38, 39, 40, 41, 42, 43, 0, 0, 0, 0, 
+  0, 0, 169, 0, 45, 46, 47, 48, 49, 50, 
+  51, 52, 53, 54, 55, 56, 57, 58, 0, 0, 
+  0, 0, 170, 0, 0, 0, 0, 0, 171, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 
+  65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 
+  75, 76, 77, 78, 79, 80, 81, 0, 0, 0, 
+  0, 84, 0, 0, 0, 173, 85, 86, 0, 88, 
+  89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 
+  99, 100, 101, 0, 103, 104, 105, 0, 254, 0, 
+  0, 0, 174, 166, 0, 0, 0, 163, 2, 0, 
+  3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 
+  164, 165, 0, 0, 0, 8, 9, 10, 11, 12, 
+  13, 14, 15, 16, 17, 18, 19, 0, 0, 20, 
+  21, 22, 23, 0, 0, 0, 0, 25, 0, 0, 
+  26, 167, 0, 0, 168, 0, 28, 0, 30, 31, 
+  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 
+  42, 43, 0, 0, 0, 0, 0, 0, 169, 0, 
+  45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 
+  55, 56, 57, 58, 0, 0, 0, 0, 170, 0, 
+  0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 64, 65, 66, 67, 68, 
+  69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 
+  79, 80, 81, 400, 0, 0, 0, 84, 0, 0, 
+  0, 173, 85, 86, 0, 88, 89, 90, 91, 92, 
+  93, 94, 95, 96, 97, 98, 99, 100, 101, 0, 
+  103, 104, 105, 0, 106, 0, 0, 0, 174, 166, 
+  0, 0, 0, 163, 2, 0, 3, 4, 5, 0, 
+  0, 0, 0, 0, 0, 0, 164, 165, 0, 0, 
+  0, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
+  17, 18, 19, 0, 0, 20, 21, 22, 23, 0, 
+  0, 0, 0, 25, 0, 0, 26, 167, 0, 0, 
+  168, 0, 28, 0, 30, 31, 32, 33, 34, 35, 
+  36, 37, 38, 39, 40, 41, 42, 43, 0, 0, 
+  0, 0, 0, 0, 169, 0, 45, 46, 47, 48, 
+  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 
+  0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 
+  171, 0, 0, 0, 0, 0, 0, 172, 0, 0, 
+  0, 64, 65, 66, 67, 68, 69, 70, 71, 72, 
+  73, 74, 75, 76, 77, 78, 79, 80, 81, 0, 
+  0, 0, 0, 84, 0, 0, 0, 173, 85, 86, 
+  0, 88, 89, 90, 91, 92, 93, 94, 95, 96, 
+  97, 98, 99, 100, 101, 0, 103, 104, 105, 0, 
+  106, 0, 0, 0, 174, 166, 0, 0, 0, 163, 
+  2, 0, 3, 4, 5, 0, 0, 0, 0, 0, 
+  0, 0, 164, 165, 0, 0, 0, 8, 9, 10, 
+  11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 
+  0, 20, 21, 22, 23, 0, 0, 0, 0, 25, 
+  0, 0, 26, 167, 0, 0, 168, 0, 28, 0, 
+  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
+  40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 
+  169, 0, 45, 46, 47, 48, 49, 50, 51, 52, 
+  53, 54, 55, 56, 57, 58, 0, 0, 0, 0, 
+  170, 0, 0, 0, 0, 0, 171, 0, 0, 0, 
+  0, 0, 0, 446, 0, 0, 0, 64, 65, 66, 
   67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
-  77, 78, 79, 80, 81, 0, 0, 83, 0, 84, 
-  0, 0, 0, 0, 85, 86, 87, 88, 89, 90, 
+  77, 78, 79, 80, 81, 0, 0, 0, 0, 84, 
+  0, 0, 0, 173, 85, 86, 0, 88, 89, 90, 
   91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 
-  101, 102, 103, 104, 105, 0, 106, 0, 0, 0, 
+  101, 0, 103, 104, 105, 0, 106, 0, 0, 0, 
+  174, 166, 0, 0, 0, 163, 2, 0, 3, 4, 
+  5, 0, 0, 0, 0, 0, 0, 0, 164, 165, 
+  0, 0, 0, 8, 9, 10, 11, 12, 13, 14, 
+  15, 16, 17, 18, 19, 0, 0, 20, 21, 22, 
+  23, 0, 0, 0, 0, 25, 0, 0, 26, 167, 
+  0, 0, 168, 0, 28, 0, 30, 31, 32, 33, 
+  34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 
+  0, 0, 0, 0, 0, 0, 169, 0, 45, 46, 
+  47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 
+  57, 58, 0, 0, 0, 0, 170, 0, 0, 0, 
+  0, 0, 171, 0, 0, 0, 0, 0, 0, 422, 
+  0, 0, 0, 64, 65, 66, 67, 68, 69, 70, 
+  71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 
+  81, 0, 0, 0, 0, 84, 0, 0, 0, 173, 
+  85, 86, 0, 88, 89, 90, 91, 92, 93, 94, 
+  95, 96, 97, 98, 99, 100, 101, 0, 103, 104, 
+  105, 0, 106, 0, 0, 0, 174, 166, 0, 0, 
+  0, 163, 2, 0, 3, 4, 5, 0, 0, 0, 
+  0, 0, 0, 0, 164, 165, 0, 0, 0, 8, 
+  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
+  19, 0, 0, 20, 21, 22, 23, 0, 0, 0, 
+  0, 25, 0, 0, 26, 167, 0, 0, 168, 0, 
+  28, 0, 30, 31, 32, 33, 34, 35, 36, 37, 
+  38, 39, 40, 41, 42, 43, 0, 0, 0, 0, 
+  0, 0, 169, 0, 45, 46, 47, 48, 49, 50, 
+  51, 52, 53, 54, 55, 56, 57, 58, 0, 0, 
+  0, 0, 170, 0, 0, 0, 0, 0, 171, 0, 
+  0, 0, 0, 0, 0, 452, 0, 0, 0, 64, 
+  65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 
+  75, 76, 77, 78, 79, 80, 81, 0, 0, 0, 
+  0, 84, 0, 0, 0, 173, 85, 86, 0, 88, 
+  89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 
+  99, 100, 101, 0, 103, 104, 105, 0, 106, 0, 
+  0, 0, 174, 166, 0, 0, 0, 163, 2, 0, 
+  3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 
+  164, 165, 0, 0, 0, 8, 9, 10, 11, 12, 
+  13, 14, 15, 16, 17, 18, 19, 0, 0, 20, 
+  21, 22, 23, 0, 0, 0, 0, 25, 0, 0, 
+  26, 167, 0, 0, 168, 0, 28, 0, 30, 31, 
+  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 
+  42, 43, 0, 0, 0, 0, 0, 0, 169, 0, 
+  45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 
+  55, 56, 57, 58, 0, 0, 0, 0, 170, 0, 
+  0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 
+  0, 296, 0, 0, 0, 64, 65, 66, 67, 68, 
+  69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 
+  79, 80, 81, 0, 0, 0, 0, 84, 0, 0, 
+  0, 173, 85, 86, 0, 88, 89, 90, 91, 92, 
+  93, 94, 95, 96, 97, 98, 99, 100, 101, 0, 
+  103, 104, 105, 0, 106, 0, 0, 0, 174, 166, 
   0, 0, 0, 1, 0, 2, 0, 3, 4, 5, 
   0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 
   0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 
@@ -513,195 +542,164 @@ const short GLSLParserTable::action_info [] = {
   0, 0, 0, 0, 0, 0, 0, 45, 46, 47, 
   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
   58, 0, 0, 0, 59, 0, 0, 0, 60, 61, 
-  0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 63, 64, 65, 66, 67, 68, 69, 70, 71, 
   72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 
   0, 0, 83, 0, 84, 0, 0, 0, 0, 85, 
   86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 
   96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 
-  0, 106, 0, 0, 0, 0, 0, 0, 1, 0, 
-  2, 0, 3, 4, 5, 0, 0, 6, 0, 0, 
-  7, 0, 0, 0, 0, 0, 0, 8, 9, 10, 
-  11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 
-  0, 20, 21, 22, 23, 0, 0, 0, 24, 25, 
-  0, 0, 26, 0, 0, 27, 0, 0, 28, 151, 
-  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
-  40, 41, 42, 43, 44, 0, 0, 0, 0, 0, 
-  0, 0, 45, 46, 47, 48, 49, 50, 51, 52, 
-  53, 54, 55, 56, 57, 58, 0, 0, 0, 59, 
-  0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 
-  0, 0, 156, 0, 0, 0, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
-  77, 78, 79, 80, 81, 0, 0, 83, 0, 84, 
-  0, 0, 0, 0, 85, 86, 87, 88, 89, 90, 
-  91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 
-  101, 102, 103, 104, 105, 0, 106, 0, 0, 0, 
+  0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 
+  1, 0, 2, 0, 3, 4, 5, 0, 0, 6, 
+  0, 0, 7, 0, 0, 0, 0, 0, 0, 8, 
+  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
+  19, 0, 0, 20, 21, 22, 23, 0, 0, 0, 
+  24, 25, 0, 0, 26, 0, 0, 27, 0, 0, 
+  28, 151, 30, 31, 32, 33, 34, 35, 36, 37, 
+  38, 39, 40, 41, 42, 43, 44, 0, 0, 0, 
+  0, 0, 0, 0, 45, 46, 47, 48, 49, 50, 
+  51, 52, 53, 54, 55, 56, 57, 58, 0, 0, 
+  0, 59, 0, 0, 0, 60, 61, 0, 0, 0, 
+  0, 0, 0, 0, 289, 0, 0, 0, 63, 64, 
+  65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 
+  75, 76, 77, 78, 79, 80, 81, 0, 0, 83, 
+  0, 84, 0, 0, 0, 0, 85, 86, 87, 88, 
+  89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 
+  99, 100, 101, 102, 103, 104, 105, 0, 106, 0, 
+  0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 
+  0, 3, 4, 5, 0, 0, 6, 0, 0, 7, 
+  0, 0, 0, 0, 0, 0, 8, 9, 10, 11, 
+  12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 
+  20, 21, 22, 23, 0, 0, 0, 24, 25, 0, 
+  0, 26, 0, 0, 27, 0, 0, 28, 151, 30, 
+  31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 
+  41, 42, 43, 44, 0, 0, 0, 0, 0, 0, 
+  0, 45, 46, 47, 48, 49, 50, 51, 52, 53, 
+  54, 55, 56, 57, 58, 0, 0, 0, 59, 0, 
+  0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 
+  0, 156, 0, 0, 0, 63, 64, 65, 66, 67, 
+  68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 
+  78, 79, 80, 81, 0, 0, 83, 0, 84, 0, 
+  0, 0, 0, 85, 86, 87, 88, 89, 90, 91, 
+  92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 
+  102, 103, 104, 105, 0, 106, 0, 0, 0, 0, 
+  0, 0, 0, 0, 1, 0, 2, 0, 3, 4, 
+  5, 0, 0, 6, 0, 0, 7, 0, 0, 0, 
+  0, 0, 0, 8, 9, 10, 11, 12, 13, 14, 
+  15, 16, 17, 18, 19, 0, 0, 20, 21, 22, 
+  23, 0, 0, 0, 24, 25, 0, 0, 26, 0, 
+  0, 27, 0, 0, 28, 151, 30, 31, 32, 33, 
+  34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 
+  44, 0, 0, 0, 0, 0, 0, 0, 45, 46, 
+  47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 
+  57, 58, 0, 0, 0, 59, 0, 0, 0, 60, 
+  61, 0, 0, 0, 0, 0, 0, 0, 441, 0, 
+  0, 0, 63, 64, 65, 66, 67, 68, 69, 70, 
+  71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 
+  81, 0, 0, 83, 0, 84, 0, 0, 0, 0, 
+  85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 
+  95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 
+  105, 0, 106, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1, 0, 2, 0, 3, 4, 5, 0, 0, 
+  6, 0, 0, 7, 0, 0, 0, 0, 0, 0, 
+  8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
+  18, 19, 0, 0, 20, 21, 22, 23, 0, 0, 
+  0, 24, 25, 0, 0, 26, 0, 0, 27, 0, 
+  0, 28, 29, 30, 31, 32, 33, 34, 35, 36, 
+  37, 38, 39, 40, 41, 42, 43, 44, 0, 0, 
+  0, 0, 0, 0, 0, 45, 46, 47, 48, 49, 
+  50, 51, 52, 53, 54, 55, 56, 57, 58, 0, 
+  0, 0, 59, 0, 0, 0, 60, 61, 0, 0, 
+  62, 0, 0, 0, 0, 0, 0, 0, 0, 63, 
+  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 
+  74, 75, 76, 77, 78, 79, 80, 81, 82, 0, 
+  83, 0, 84, 0, 0, 0, 0, 85, 86, 87, 
+  88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 
+  98, 99, 100, 101, 102, 103, 104, 105, 0, 106, 
+  0, 0, 0, 0, 0, 0, 0, 0, 435, 0, 
   0, 0, 0, 1, 0, 2, 0, 3, 4, 5, 
   0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 
   0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 
   16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 
   0, 0, 0, 24, 25, 0, 0, 26, 0, 0, 
-  27, 0, 0, 28, 151, 30, 31, 32, 33, 34, 
+  27, 0, 0, 28, 29, 30, 31, 32, 33, 34, 
   35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 
   0, 0, 0, 0, 0, 0, 0, 45, 46, 47, 
   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
   58, 0, 0, 0, 59, 0, 0, 0, 60, 61, 
-  0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 
-  0, 63, 64, 65, 66, 67, 68, 69, 70, 71, 
-  72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 
-  0, 0, 83, 0, 84, 0, 0, 0, 0, 85, 
-  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 
-  96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 
-  0, 106, 0, 0, 0, 0, 0, 0, 1, 0, 
-  2, 0, 3, 4, 5, 0, 0, 6, 0, 0, 
-  7, 0, 0, 0, 0, 0, 0, 8, 9, 10, 
-  11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 
-  0, 20, 21, 22, 23, 0, 0, 0, 24, 25, 
-  0, 0, 26, 0, 0, 27, 0, 0, 28, 29, 
-  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
-  40, 41, 42, 43, 44, 0, 0, 0, 0, 0, 
-  0, 0, 45, 46, 47, 48, 49, 50, 51, 52, 
-  53, 54, 55, 56, 57, 58, 0, 0, 0, 59, 
-  0, 0, 0, 60, 61, 0, 0, 62, 0, 0, 
-  0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
-  77, 78, 79, 80, 81, 82, 0, 83, 0, 84, 
-  0, 0, 0, 0, 85, 86, 87, 88, 89, 90, 
-  91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 
-  101, 102, 103, 104, 105, 0, 106, 0, 0, 0, 
-  0, 0, 0, 435, 0, 0, 0, 0, 1, 0, 
-  2, 0, 3, 4, 5, 0, 0, 6, 0, 0, 
-  7, 0, 0, 0, 0, 0, 0, 8, 9, 10, 
-  11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 
-  0, 20, 21, 22, 23, 0, 0, 0, 24, 25, 
-  0, 0, 26, 0, 0, 27, 0, 0, 28, 29, 
-  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
-  40, 41, 42, 43, 44, 0, 0, 0, 0, 0, 
-  0, 0, 45, 46, 47, 48, 49, 50, 51, 52, 
-  53, 54, 55, 56, 57, 58, 0, 0, 0, 59, 
-  0, 0, 0, 60, 61, 0, 0, 62, 0, 0, 
-  0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
-  77, 78, 79, 80, 81, 82, 0, 83, 0, 84, 
-  0, 0, 0, 0, 85, 86, 87, 88, 89, 90, 
-  91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 
-  101, 102, 103, 104, 105, 0, 106, 0, 0, 0, 
-  0, 0, 0, 1, 163, 2, 0, 3, 4, 5, 
-  0, 0, 6, 0, 0, 7, 0, 164, 165, 0, 
-  0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 
-  16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 
-  0, 0, 0, 24, 25, 0, 0, 26, 167, 0, 
-  27, 168, 0, 28, 151, 30, 31, 32, 33, 34, 
-  35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 
-  0, 0, 0, 0, 0, 169, 0, 45, 46, 47, 
-  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
-  58, 0, 0, 0, 59, 170, 0, 0, 60, 61, 
-  0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 63, 64, 65, 66, 67, 68, 69, 70, 71, 
-  72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 
-  0, 0, 83, 0, 84, 0, 0, 0, 173, 85, 
-  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 
-  96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 
-  0, 106, 0, 0, 0, 174, 166, 0, 1, 163, 
-  2, 0, 3, 4, 5, 0, 0, 6, 0, 0, 
-  7, 0, 164, 165, 0, 0, 0, 8, 9, 10, 
-  11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 
-  0, 20, 21, 22, 23, 0, 0, 0, 24, 25, 
-  0, 0, 26, 167, 0, 27, 168, 0, 28, 29, 
-  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
-  40, 41, 42, 43, 44, 0, 0, 0, 0, 0, 
-  169, 0, 45, 46, 47, 48, 49, 50, 51, 52, 
-  53, 54, 55, 56, 57, 58, 0, 0, 0, 59, 
-  170, 0, 0, 60, 61, 0, 171, 62, 0, 0, 
-  0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
-  77, 78, 79, 80, 81, 338, 0, 83, 0, 84, 
-  0, 0, 0, 173, 85, 86, 87, 88, 89, 90, 
-  91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 
-  101, 102, 103, 104, 105, 0, 106, 0, 0, 0, 
-  174, 166, 0, 1, 163, 2, 327, 3, 4, 5, 
-  0, 328, 6, 0, 0, 7, 329, 164, 165, 330, 
-  331, 0, 8, 9, 10, 11, 12, 13, 14, 15, 
-  16, 17, 18, 19, 332, 0, 20, 21, 22, 23, 
-  0, 0, 0, 24, 25, 333, 0, 26, 167, 334, 
-  27, 168, 0, 28, 29, 30, 31, 32, 33, 34, 
-  35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 
-  0, 0, 335, 0, 0, 169, 0, 45, 46, 47, 
-  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
-  58, 0, 0, 0, 59, 170, 0, 0, 60, 61, 
-  0, 171, 62, 0, 336, 0, 0, 0, 0, 0, 
-  0, 63, 64, 65, 66, 67, 68, 69, 70, 71, 
-  72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 
-  338, 0, 83, 0, 84, 0, 0, 339, 173, 85, 
-  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 
-  96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 
-  0, 106, 340, 0, 0, 174, 166, 0, 1, 163, 
-  2, 327, 3, 4, 5, 0, 328, 6, 0, 0, 
-  7, 329, 164, 165, 330, 331, 0, 8, 9, 10, 
-  11, 12, 13, 14, 15, 16, 17, 18, 19, 332, 
-  0, 20, 21, 22, 23, 0, 0, 0, 24, 25, 
-  333, 0, 26, 167, 334, 27, 168, 0, 28, 29, 
-  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
-  40, 41, 42, 43, 44, 0, 0, 324, 0, 0, 
-  169, 0, 45, 46, 47, 48, 49, 50, 51, 52, 
-  53, 54, 55, 56, 57, 58, 0, 0, 0, 59, 
-  170, 0, 0, 60, 61, 0, 171, 62, 0, 336, 
-  0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
-  77, 78, 79, 80, 81, 338, 0, 83, 0, 84, 
-  0, 0, 339, 173, 85, 86, 87, 88, 89, 90, 
-  91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 
-  101, 102, 103, 104, 105, 0, 106, 340, 0, 0, 
-  174, 166, 0, 1, 163, 2, 327, 3, 4, 5, 
-  0, 328, 6, 0, 0, 7, 329, 164, 165, 330, 
-  331, 0, 8, 9, 10, 11, 12, 13, 14, 15, 
-  16, 17, 18, 19, 332, 0, 20, 21, 22, 23, 
-  0, 0, 0, 24, 25, 333, 0, 26, 167, 334, 
-  27, 168, 0, 28, 29, 30, 31, 32, 33, 34, 
-  35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 
-  0, 0, 335, 0, 0, 169, 0, 45, 46, 47, 
-  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
-  58, 0, 0, 0, 59, 170, 0, 0, 60, 61, 
-  0, 171, 62, 0, 336, 0, 0, 396, 0, 0, 
-  0, 63, 64, 65, 66, 67, 68, 69, 70, 71, 
-  72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 
-  338, 0, 83, 0, 84, 0, 0, 339, 173, 85, 
-  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 
-  96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 
-  0, 106, 340, 0, 0, 174, 166, 0, 1, 163, 
-  2, 327, 3, 4, 5, 0, 328, 6, 0, 0, 
-  7, 329, 164, 165, 330, 331, 0, 8, 9, 10, 
-  11, 12, 13, 14, 15, 16, 17, 18, 19, 332, 
-  0, 20, 21, 22, 23, 0, 0, 0, 24, 25, 
-  333, 0, 26, 167, 334, 27, 168, 0, 28, 29, 
-  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
-  40, 41, 42, 43, 44, 0, 0, 335, 0, 0, 
-  169, 0, 45, 46, 47, 48, 49, 50, 51, 52, 
-  53, 54, 55, 56, 57, 58, 0, 0, 0, 59, 
-  170, 0, 0, 60, 61, 0, 171, 62, 0, 336, 
-  0, 0, 398, 0, 0, 0, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
-  77, 78, 79, 80, 81, 338, 0, 83, 0, 84, 
-  0, 0, 339, 173, 85, 86, 87, 88, 89, 90, 
-  91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 
-  101, 102, 103, 104, 105, 0, 106, 340, 0, 0, 
-  174, 166, 0, 1, 163, 2, 327, 3, 4, 5, 
-  0, 328, 6, 0, 0, 7, 329, 164, 165, 330, 
-  331, 0, 8, 9, 10, 11, 12, 13, 14, 15, 
-  16, 17, 18, 19, 332, 0, 20, 21, 22, 23, 
-  0, 0, 0, 24, 25, 333, 0, 26, 167, 334, 
-  27, 168, 0, 28, 29, 30, 31, 32, 33, 34, 
-  35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 
-  0, 0, 335, 0, 0, 169, 0, 45, 46, 47, 
-  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
-  58, 0, 0, 0, 59, 170, 0, 0, 60, 61, 
-  0, 171, 62, 0, 336, 0, 0, 415, 0, 0, 
+  0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 
   0, 63, 64, 65, 66, 67, 68, 69, 70, 71, 
   72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 
-  338, 0, 83, 0, 84, 0, 0, 339, 173, 85, 
+  82, 0, 83, 0, 84, 0, 0, 0, 0, 85, 
   86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 
   96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 
-  0, 106, 340, 0, 0, 174, 166, 0, 1, 163, 
+  0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 
+  1, 163, 2, 0, 3, 4, 5, 0, 0, 6, 
+  0, 0, 7, 0, 164, 165, 0, 0, 0, 8, 
+  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
+  19, 0, 0, 20, 21, 22, 23, 0, 0, 0, 
+  24, 25, 0, 0, 26, 167, 0, 27, 168, 0, 
+  28, 151, 30, 31, 32, 33, 34, 35, 36, 37, 
+  38, 39, 40, 41, 42, 43, 44, 0, 0, 0, 
+  0, 0, 169, 0, 45, 46, 47, 48, 49, 50, 
+  51, 52, 53, 54, 55, 56, 57, 58, 0, 0, 
+  0, 59, 170, 0, 0, 60, 61, 0, 171, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 
+  65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 
+  75, 76, 77, 78, 79, 80, 81, 0, 0, 83, 
+  0, 84, 0, 0, 0, 173, 85, 86, 87, 88, 
+  89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 
+  99, 100, 101, 102, 103, 104, 105, 0, 106, 0, 
+  0, 0, 174, 166, 0, 0, 0, 1, 163, 2, 
+  0, 3, 4, 5, 0, 0, 6, 0, 0, 7, 
+  0, 164, 165, 0, 0, 0, 8, 9, 10, 11, 
+  12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 
+  20, 21, 22, 23, 0, 0, 0, 24, 25, 0, 
+  0, 26, 167, 0, 27, 168, 0, 28, 29, 30, 
+  31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 
+  41, 42, 43, 44, 0, 0, 0, 0, 0, 169, 
+  0, 45, 46, 47, 48, 49, 50, 51, 52, 53, 
+  54, 55, 56, 57, 58, 0, 0, 0, 59, 170, 
+  0, 0, 60, 61, 0, 171, 62, 0, 0, 0, 
+  0, 0, 0, 0, 0, 63, 64, 65, 66, 67, 
+  68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 
+  78, 79, 80, 81, 338, 0, 83, 0, 84, 0, 
+  0, 0, 173, 85, 86, 87, 88, 89, 90, 91, 
+  92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 
+  102, 103, 104, 105, 0, 106, 0, 0, 0, 174, 
+  166, 0, 0, 0, 1, 163, 2, 327, 3, 4, 
+  5, 0, 328, 6, 0, 0, 7, 329, 164, 165, 
+  330, 331, 0, 8, 9, 10, 11, 12, 13, 14, 
+  15, 16, 17, 18, 19, 332, 0, 20, 21, 22, 
+  23, 0, 0, 0, 24, 25, 333, 0, 26, 167, 
+  334, 27, 168, 0, 28, 29, 30, 31, 32, 33, 
+  34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 
+  44, 0, 0, 335, 0, 0, 169, 0, 45, 46, 
+  47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 
+  57, 58, 0, 0, 0, 59, 170, 0, 0, 60, 
+  61, 0, 171, 62, 0, 336, 0, 0, 0, 0, 
+  0, 0, 63, 64, 65, 66, 67, 68, 69, 70, 
+  71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 
+  81, 338, 0, 83, 0, 84, 0, 0, 339, 173, 
+  85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 
+  95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 
+  105, 0, 106, 340, 0, 0, 174, 166, 0, 0, 
+  0, 1, 163, 2, 327, 3, 4, 5, 0, 328, 
+  6, 0, 0, 7, 329, 164, 165, 330, 331, 0, 
+  8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
+  18, 19, 332, 0, 20, 21, 22, 23, 0, 0, 
+  0, 24, 25, 333, 0, 26, 167, 334, 27, 168, 
+  0, 28, 29, 30, 31, 32, 33, 34, 35, 36, 
+  37, 38, 39, 40, 41, 42, 43, 44, 0, 0, 
+  324, 0, 0, 169, 0, 45, 46, 47, 48, 49, 
+  50, 51, 52, 53, 54, 55, 56, 57, 58, 0, 
+  0, 0, 59, 170, 0, 0, 60, 61, 0, 171, 
+  62, 0, 336, 0, 0, 0, 0, 0, 0, 63, 
+  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 
+  74, 75, 76, 77, 78, 79, 80, 81, 338, 0, 
+  83, 0, 84, 0, 0, 339, 173, 85, 86, 87, 
+  88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 
+  98, 99, 100, 101, 102, 103, 104, 105, 0, 106, 
+  340, 0, 0, 174, 166, 0, 0, 0, 1, 163, 
   2, 327, 3, 4, 5, 0, 328, 6, 0, 0, 
   7, 329, 164, 165, 330, 331, 0, 8, 9, 10, 
   11, 12, 13, 14, 15, 16, 17, 18, 19, 332, 
@@ -712,13 +710,63 @@ const short GLSLParserTable::action_info [] = {
   169, 0, 45, 46, 47, 48, 49, 50, 51, 52, 
   53, 54, 55, 56, 57, 58, 0, 0, 0, 59, 
   170, 0, 0, 60, 61, 0, 171, 62, 0, 336, 
-  0, 0, 337, 0, 0, 0, 63, 64, 65, 66, 
+  0, 0, 396, 0, 0, 0, 63, 64, 65, 66, 
   67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
   77, 78, 79, 80, 81, 338, 0, 83, 0, 84, 
   0, 0, 339, 173, 85, 86, 87, 88, 89, 90, 
   91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 
   101, 102, 103, 104, 105, 0, 106, 340, 0, 0, 
-  174, 166, 0, 
+  174, 166, 0, 0, 0, 1, 163, 2, 327, 3, 
+  4, 5, 0, 328, 6, 0, 0, 7, 329, 164, 
+  165, 330, 331, 0, 8, 9, 10, 11, 12, 13, 
+  14, 15, 16, 17, 18, 19, 332, 0, 20, 21, 
+  22, 23, 0, 0, 0, 24, 25, 333, 0, 26, 
+  167, 334, 27, 168, 0, 28, 29, 30, 31, 32, 
+  33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 
+  43, 44, 0, 0, 335, 0, 0, 169, 0, 45, 
+  46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 
+  56, 57, 58, 0, 0, 0, 59, 170, 0, 0, 
+  60, 61, 0, 171, 62, 0, 336, 0, 0, 398, 
+  0, 0, 0, 63, 64, 65, 66, 67, 68, 69, 
+  70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 
+  80, 81, 338, 0, 83, 0, 84, 0, 0, 339, 
+  173, 85, 86, 87, 88, 89, 90, 91, 92, 93, 
+  94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 
+  104, 105, 0, 106, 340, 0, 0, 174, 166, 0, 
+  0, 0, 1, 163, 2, 327, 3, 4, 5, 0, 
+  328, 6, 0, 0, 7, 329, 164, 165, 330, 331, 
+  0, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
+  17, 18, 19, 332, 0, 20, 21, 22, 23, 0, 
+  0, 0, 24, 25, 333, 0, 26, 167, 334, 27, 
+  168, 0, 28, 29, 30, 31, 32, 33, 34, 35, 
+  36, 37, 38, 39, 40, 41, 42, 43, 44, 0, 
+  0, 335, 0, 0, 169, 0, 45, 46, 47, 48, 
+  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 
+  0, 0, 0, 59, 170, 0, 0, 60, 61, 0, 
+  171, 62, 0, 336, 0, 0, 415, 0, 0, 0, 
+  63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 
+  73, 74, 75, 76, 77, 78, 79, 80, 81, 338, 
+  0, 83, 0, 84, 0, 0, 339, 173, 85, 86, 
+  87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 
+  97, 98, 99, 100, 101, 102, 103, 104, 105, 0, 
+  106, 340, 0, 0, 174, 166, 0, 0, 0, 1, 
+  163, 2, 327, 3, 4, 5, 0, 328, 6, 0, 
+  0, 7, 329, 164, 165, 330, 331, 0, 8, 9, 
+  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
+  332, 0, 20, 21, 22, 23, 0, 0, 0, 24, 
+  25, 333, 0, 26, 167, 334, 27, 168, 0, 28, 
+  29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 
+  39, 40, 41, 42, 43, 44, 0, 0, 335, 0, 
+  0, 169, 0, 45, 46, 47, 48, 49, 50, 51, 
+  52, 53, 54, 55, 56, 57, 58, 0, 0, 0, 
+  59, 170, 0, 0, 60, 61, 0, 171, 62, 0, 
+  336, 0, 0, 337, 0, 0, 0, 63, 64, 65, 
+  66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 
+  76, 77, 78, 79, 80, 81, 338, 0, 83, 0, 
+  84, 0, 0, 339, 173, 85, 86, 87, 88, 89, 
+  90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 
+  100, 101, 102, 103, 104, 105, 0, 106, 340, 0, 
+  0, 174, 166, 0, 0, 0, 
 
   390, 432, 388, 404, 230, 209, 279, 255, 434, 429, 
   294, 282, 278, 433, 231, 388, 270, 272, 357, 222, 
@@ -765,79 +813,62 @@ const short GLSLParserTable::action_check [] = {
   75, 50, 76, 44, 16, 16, 50, 16, 99, 76, 
   52, 19, 76, 75, 105, 102, -1, 76, 102, -1, 
   -1, 52, -1, 54, -1, 74, -1, -1, 43, 49, 
-  -1, 111, -1, -1, 100, -1, 17, 111, -1, -1, 
-  100, -1, -1, 132, 111, -1, 133, 111, 135, 133, 
-  95, 135, 111, 48, 95, 17, 102, 132, 100, 79, 
-  75, -1, 77, 20, -1, 16, 103, -1, 103, 100, 
-  5, 52, 92, 54, 48, -1, 112, 72, 48, 14, 
-  37, -1, 17, 78, -1, 112, 112, 133, 132, 135, 
-  52, -1, 54, -1, 112, 103, 53, -1, 72, 132, 
-  112, -1, 72, 112, 78, -1, -1, 132, 78, 132, 
-  45, -1, 107, 132, -1, -1, 158, 52, 75, 100, 
-  1, 132, 3, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 107, 5, -1, -1, 107, 100, 5, 
-  -1, -1, 23, 14, -1, -1, 17, -1, 14, -1, 
-  112, 17, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 96, 43, -1, -1, 100, 101, -1, -1, -1, 
-  -1, -1, -1, -1, 45, -1, -1, -1, 113, 45, 
-  -1, 52, -1, -1, 50, -1, 52, -1, -1, -1, 
-  -1, -1, 73, -1, -1, -1, -1, -1, -1, 134, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 143, -1, 
-  -1, -1, 93, 94, -1, -1, -1, 98, -1, 5, 
-  -1, -1, -1, 158, -1, 96, -1, 108, 14, 100, 
-  96, 17, -1, -1, 100, 101, -1, -1, -1, -1, 
-  -1, -1, 113, -1, -1, -1, -1, 113, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 138, -1, -1, 
-  -1, -1, -1, 134, -1, -1, 52, -1, 134, -1, 
-  -1, -1, 143, -1, -1, -1, -1, 143, -1, -1, 
-  -1, -1, -1, -1, 165, -1, -1, 158, -1, -1, 
+  -1, 111, 102, -1, 100, -1, 17, 111, -1, -1, 
+  100, -1, -1, 132, 111, 17, 133, 111, 135, 133, 
+  95, 135, 111, 48, 95, -1, -1, 132, 100, 79, 
+  75, -1, 77, 133, -1, 135, 103, 16, 103, 100, 
+  -1, 52, 92, 54, 48, 5, 112, 72, 48, -1, 
+  52, -1, 54, 78, 14, 112, 112, 17, 132, -1, 
+  -1, -1, -1, -1, 112, 103, -1, -1, 72, 132, 
+  112, -1, 72, 112, 78, -1, 5, 132, 78, 132, 
+  -1, 5, 107, 132, -1, 14, 158, -1, 17, 100, 
+  14, 132, 52, 17, 1, -1, 3, -1, 100, 5, 
+  -1, -1, -1, 107, -1, -1, -1, 107, 14, 5, 
+  112, 17, -1, -1, -1, -1, 23, 5, 14, -1, 
+  -1, 17, -1, 52, -1, -1, 14, -1, 52, 17, 
+  -1, -1, -1, -1, -1, -1, 43, -1, -1, 45, 
+  100, 101, -1, -1, -1, -1, 52, -1, -1, 45, 
+  -1, -1, -1, 113, -1, -1, 52, 45, -1, -1, 
+  -1, -1, 50, -1, 52, -1, 73, -1, -1, -1, 
+  -1, 100, 101, -1, -1, -1, 100, 101, -1, -1, 
+  -1, -1, -1, 143, 113, -1, 93, 94, -1, 113, 
+  96, 98, -1, 20, 100, 101, -1, -1, 158, -1, 
+  96, 108, -1, -1, 100, 101, -1, 113, 96, -1, 
+  37, -1, 100, 101, 143, -1, -1, 113, -1, 143, 
+  -1, -1, -1, -1, -1, 113, 53, -1, 134, 158, 
+  -1, 138, -1, -1, 158, -1, -1, 143, 134, -1, 
+  -1, -1, -1, -1, -1, -1, 134, 143, 75, -1, 
+  -1, -1, 158, -1, -1, 143, -1, -1, 165, -1, 
   -1, -1, 158, -1, -1, -1, -1, -1, -1, -1, 
+  158, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 100, 101, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 113, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 143, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 158, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 7, -1, 9, 10, 11, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, 
-  33, 34, 35, -1, -1, 38, 39, 40, 41, -1, 
-  -1, -1, -1, 46, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 55, -1, 57, 58, 59, 60, 61, 62, 
-  63, 64, 65, 66, 67, 68, 69, 70, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 80, 81, 82, 
-  83, 84, 85, 86, 87, 88, 89, 90, 91, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, 7, -1, 9, 10, 11, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 114, 115, 116, 117, 118, 119, 120, 121, 122, 
-  123, 124, 125, 126, 127, 128, 129, 130, 131, -1, 
-  -1, -1, -1, 136, -1, -1, -1, -1, 141, 142, 
-  -1, 144, 145, 146, 147, 148, 149, 150, 151, 152, 
-  153, 154, 155, 156, 157, -1, 159, 160, 161, -1, 
-  163, -1, -1, -1, -1, -1, -1, 7, -1, 9, 
-  10, 11, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 24, 25, 26, 27, 28, 29, 
-  30, 31, 32, 33, 34, 35, -1, -1, 38, 39, 
-  40, 41, -1, -1, -1, -1, 46, -1, -1, 49, 
-  -1, -1, -1, -1, -1, 55, -1, 57, 58, 59, 
-  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 
-  70, -1, -1, -1, -1, -1, -1, -1, -1, 79, 
-  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 
-  90, 91, 92, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, 
+  32, 33, 34, 35, -1, -1, 38, 39, 40, 41, 
+  -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, 
+  -1, -1, -1, 55, -1, 57, 58, 59, 60, 61, 
+  62, 63, 64, 65, 66, 67, 68, 69, 70, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, 80, 81, 
+  82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 114, 115, 116, 117, 118, 119, 
-  120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 
-  130, 131, -1, -1, -1, -1, 136, -1, -1, -1, 
-  -1, 141, 142, -1, 144, 145, 146, 147, 148, 149, 
-  150, 151, 152, 153, 154, 155, 156, 157, -1, 159, 
-  160, 161, -1, 163, -1, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, 114, 115, 116, 117, 118, 119, 120, 121, 
+  122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 
+  -1, -1, -1, -1, 136, -1, -1, -1, -1, 141, 
+  142, -1, 144, 145, 146, 147, 148, 149, 150, 151, 
+  152, 153, 154, 155, 156, 157, -1, 159, 160, 161, 
+  -1, 163, -1, -1, -1, -1, -1, -1, -1, -1, 
   7, -1, 9, 10, 11, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, 24, 25, 26, 
   27, 28, 29, 30, 31, 32, 33, 34, 35, -1, 
   -1, 38, 39, 40, 41, -1, -1, -1, -1, 46, 
-  -1, -1, 49, 50, -1, -1, -1, -1, 55, -1, 
+  -1, -1, 49, -1, -1, -1, -1, -1, 55, -1, 
   57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 
   67, 68, 69, 70, -1, -1, -1, -1, -1, -1, 
   -1, -1, 79, 80, 81, 82, 83, 84, 85, 86, 
@@ -849,170 +880,172 @@ const short GLSLParserTable::action_check [] = {
   -1, -1, -1, -1, 141, 142, -1, 144, 145, 146, 
   147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 
   157, -1, 159, 160, 161, -1, 163, -1, -1, -1, 
-  -1, -1, -1, 7, -1, 9, 10, 11, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 
-  34, 35, -1, -1, 38, 39, 40, 41, -1, -1, 
-  -1, -1, 46, -1, -1, 49, 50, -1, -1, -1, 
-  -1, 55, -1, 57, 58, 59, 60, 61, 62, 63, 
-  64, 65, 66, 67, 68, 69, 70, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 79, 80, 81, 82, 83, 
-  84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 
+  -1, -1, -1, -1, -1, 7, -1, 9, 10, 11, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 
-  124, 125, 126, 127, 128, 129, 130, 131, 132, -1, 
-  -1, -1, 136, -1, -1, -1, -1, 141, 142, -1, 
-  144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 
-  154, 155, 156, 157, -1, 159, 160, 161, -1, 163, 
-  -1, -1, -1, -1, -1, -1, 6, 7, -1, 9, 
-  10, 11, -1, -1, -1, -1, -1, -1, -1, 19, 
-  20, -1, -1, -1, 24, 25, 26, 27, 28, 29, 
-  30, 31, 32, 33, 34, 35, -1, -1, 38, 39, 
-  40, 41, -1, -1, -1, -1, 46, -1, -1, 49, 
-  50, -1, -1, 53, -1, 55, -1, 57, 58, 59, 
-  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 
-  70, -1, -1, -1, -1, -1, -1, 77, -1, 79, 
-  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 
-  90, 91, 92, -1, -1, -1, -1, 97, -1, -1, 
-  -1, -1, -1, 103, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 114, 115, 116, 117, 118, 119, 
-  120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 
-  130, 131, -1, -1, -1, -1, 136, -1, -1, -1, 
-  140, 141, 142, -1, 144, 145, 146, 147, 148, 149, 
-  150, 151, 152, 153, 154, 155, 156, 157, -1, 159, 
-  160, 161, -1, 163, -1, -1, -1, 167, 168, -1, 
-  6, 7, -1, 9, 10, 11, -1, -1, -1, -1, 
-  -1, -1, -1, 19, 20, -1, -1, -1, 24, 25, 
-  26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 
-  -1, -1, 38, 39, 40, 41, -1, -1, -1, -1, 
-  46, -1, -1, 49, 50, -1, -1, 53, -1, 55, 
-  -1, 57, 58, 59, 60, 61, 62, 63, 64, 65, 
-  66, 67, 68, 69, 70, -1, -1, -1, -1, -1, 
-  -1, 77, -1, 79, 80, 81, 82, 83, 84, 85, 
-  86, 87, 88, 89, 90, 91, 92, -1, -1, -1, 
-  -1, 97, -1, -1, -1, -1, -1, 103, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 114, 115, 
-  116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 
-  126, 127, 128, 129, 130, 131, -1, -1, -1, -1, 
-  136, -1, -1, -1, 140, 141, 142, -1, 144, 145, 
-  146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 
-  156, 157, -1, 159, 160, 161, -1, 163, -1, -1, 
-  -1, 167, 168, -1, 6, 7, -1, 9, 10, 11, 
-  -1, -1, -1, -1, -1, -1, -1, 19, 20, -1, 
-  -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, 
-  32, 33, 34, 35, -1, -1, 38, 39, 40, 41, 
-  -1, -1, -1, -1, 46, -1, -1, 49, 50, -1, 
-  -1, 53, -1, 55, -1, 57, 58, 59, 60, 61, 
-  62, 63, 64, 65, 66, 67, 68, 69, 70, -1, 
-  -1, -1, -1, -1, -1, 77, -1, 79, 80, 81, 
-  82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 
-  92, -1, -1, -1, -1, 97, -1, -1, -1, -1, 
-  -1, 103, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 114, 115, 116, 117, 118, 119, 120, 121, 
-  122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 
-  132, -1, -1, -1, 136, -1, -1, -1, 140, 141, 
-  142, -1, 144, 145, 146, 147, 148, 149, 150, 151, 
-  152, 153, 154, 155, 156, 157, -1, 159, 160, 161, 
-  -1, 163, -1, -1, -1, 167, 168, -1, 6, 7, 
-  -1, 9, 10, 11, -1, -1, -1, -1, -1, -1, 
-  -1, 19, 20, -1, -1, -1, 24, 25, 26, 27, 
-  28, 29, 30, 31, 32, 33, 34, 35, -1, -1, 
-  38, 39, 40, 41, -1, -1, -1, -1, 46, -1, 
-  -1, 49, 50, -1, -1, 53, -1, 55, -1, 57, 
-  58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 
-  68, 69, 70, -1, -1, -1, -1, -1, -1, 77, 
-  -1, 79, 80, 81, 82, 83, 84, 85, 86, 87, 
-  88, 89, 90, 91, 92, -1, -1, -1, -1, 97, 
-  -1, -1, -1, -1, -1, 103, -1, -1, -1, -1, 
-  -1, -1, 110, -1, -1, -1, 114, 115, 116, 117, 
-  118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 
-  128, 129, 130, 131, -1, -1, -1, -1, 136, -1, 
-  -1, -1, 140, 141, 142, -1, 144, 145, 146, 147, 
-  148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 
-  -1, 159, 160, 161, -1, 163, -1, -1, -1, 167, 
-  168, -1, 6, 7, -1, 9, 10, 11, -1, -1, 
-  -1, -1, -1, -1, -1, 19, 20, -1, -1, -1, 
-  24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 
-  34, 35, -1, -1, 38, 39, 40, 41, -1, -1, 
-  -1, -1, 46, -1, -1, 49, 50, -1, -1, 53, 
-  -1, 55, -1, 57, 58, 59, 60, 61, 62, 63, 
-  64, 65, 66, 67, 68, 69, 70, -1, -1, -1, 
-  -1, -1, -1, 77, -1, 79, 80, 81, 82, 83, 
-  84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 
-  -1, -1, -1, 97, -1, -1, -1, -1, -1, 103, 
-  -1, -1, -1, -1, -1, -1, 110, -1, -1, -1, 
-  114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 
-  124, 125, 126, 127, 128, 129, 130, 131, -1, -1, 
-  -1, -1, 136, -1, -1, -1, 140, 141, 142, -1, 
-  144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 
-  154, 155, 156, 157, -1, 159, 160, 161, -1, 163, 
-  -1, -1, -1, 167, 168, -1, 6, 7, -1, 9, 
-  10, 11, -1, -1, -1, -1, -1, -1, -1, 19, 
-  20, -1, -1, -1, 24, 25, 26, 27, 28, 29, 
-  30, 31, 32, 33, 34, 35, -1, -1, 38, 39, 
-  40, 41, -1, -1, -1, -1, 46, -1, -1, 49, 
-  50, -1, -1, 53, -1, 55, -1, 57, 58, 59, 
-  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 
-  70, -1, -1, -1, -1, -1, -1, 77, -1, 79, 
-  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 
-  90, 91, 92, -1, -1, -1, -1, 97, -1, -1, 
-  -1, -1, -1, 103, -1, -1, -1, -1, -1, -1, 
-  110, -1, -1, -1, 114, 115, 116, 117, 118, 119, 
-  120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 
-  130, 131, -1, -1, -1, -1, 136, -1, -1, -1, 
-  140, 141, 142, -1, 144, 145, 146, 147, 148, 149, 
-  150, 151, 152, 153, 154, 155, 156, 157, -1, 159, 
-  160, 161, -1, 163, -1, -1, -1, 167, 168, -1, 
-  6, 7, -1, 9, 10, 11, -1, -1, -1, -1, 
-  -1, -1, -1, 19, 20, -1, -1, -1, 24, 25, 
-  26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 
-  -1, -1, 38, 39, 40, 41, -1, -1, -1, -1, 
-  46, -1, -1, 49, 50, -1, -1, 53, -1, 55, 
-  -1, 57, 58, 59, 60, 61, 62, 63, 64, 65, 
-  66, 67, 68, 69, 70, -1, -1, -1, -1, -1, 
-  -1, 77, -1, 79, 80, 81, 82, 83, 84, 85, 
-  86, 87, 88, 89, 90, 91, 92, -1, -1, -1, 
-  -1, 97, -1, -1, -1, -1, -1, 103, -1, -1, 
-  -1, -1, -1, -1, 110, -1, -1, -1, 114, 115, 
-  116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 
-  126, 127, 128, 129, 130, 131, -1, -1, -1, -1, 
-  136, -1, -1, -1, 140, 141, 142, -1, 144, 145, 
-  146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 
-  156, 157, -1, 159, 160, 161, -1, 163, -1, -1, 
-  -1, 167, 168, -1, 6, 7, -1, 9, 10, 11, 
-  -1, -1, -1, -1, -1, -1, -1, 19, 20, -1, 
   -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, 
   32, 33, 34, 35, -1, -1, 38, 39, 40, 41, 
   -1, -1, -1, -1, 46, -1, -1, 49, 50, -1, 
-  -1, 53, -1, 55, -1, 57, 58, 59, 60, 61, 
+  -1, -1, -1, 55, -1, 57, 58, 59, 60, 61, 
   62, 63, 64, 65, 66, 67, 68, 69, 70, -1, 
-  -1, -1, -1, -1, -1, 77, -1, 79, 80, 81, 
+  -1, -1, -1, -1, -1, -1, -1, 79, 80, 81, 
   82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 
-  92, -1, -1, -1, -1, 97, -1, -1, -1, -1, 
-  -1, 103, -1, -1, -1, -1, -1, -1, 110, -1, 
+  92, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, 114, 115, 116, 117, 118, 119, 120, 121, 
   122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 
-  -1, -1, -1, -1, 136, -1, -1, -1, 140, 141, 
+  -1, -1, -1, -1, 136, -1, -1, -1, -1, 141, 
   142, -1, 144, 145, 146, 147, 148, 149, 150, 151, 
   152, 153, 154, 155, 156, 157, -1, 159, 160, 161, 
-  -1, 163, -1, -1, -1, 167, 168, -1, 5, -1, 
-  7, -1, 9, 10, 11, -1, -1, 14, -1, -1, 
-  17, -1, -1, -1, -1, -1, -1, 24, 25, 26, 
+  -1, 163, -1, -1, -1, -1, -1, -1, -1, -1, 
+  7, -1, 9, 10, 11, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, -1, -1, 24, 25, 26, 
   27, 28, 29, 30, 31, 32, 33, 34, 35, -1, 
-  -1, 38, 39, 40, 41, -1, -1, -1, 45, 46, 
-  -1, -1, 49, -1, -1, 52, -1, -1, 55, 56, 
+  -1, 38, 39, 40, 41, -1, -1, -1, -1, 46, 
+  -1, -1, 49, 50, -1, -1, -1, -1, 55, -1, 
   57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, -1, -1, -1, -1, -1, 
+  67, 68, 69, 70, -1, -1, -1, -1, -1, -1, 
   -1, -1, 79, 80, 81, 82, 83, 84, 85, 86, 
-  87, 88, 89, 90, 91, 92, -1, -1, -1, 96, 
-  -1, -1, -1, 100, 101, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 113, 114, 115, 116, 
+  87, 88, 89, 90, 91, 92, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, -1, -1, 114, 115, 116, 
+  117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 
+  127, 128, 129, 130, 131, 132, -1, -1, -1, 136, 
+  -1, -1, -1, -1, 141, 142, -1, 144, 145, 146, 
+  147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 
+  157, -1, 159, 160, 161, -1, 163, -1, -1, -1, 
+  -1, -1, -1, -1, -1, 6, 7, -1, 9, 10, 
+  11, -1, -1, -1, -1, -1, -1, -1, 19, 20, 
+  -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, 
+  31, 32, 33, 34, 35, -1, -1, 38, 39, 40, 
+  41, -1, -1, -1, -1, 46, -1, -1, 49, 50, 
+  -1, -1, 53, -1, 55, -1, 57, 58, 59, 60, 
+  61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 
+  -1, -1, -1, -1, -1, -1, 77, -1, 79, 80, 
+  81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 
+  91, 92, -1, -1, -1, -1, 97, -1, -1, -1, 
+  -1, -1, 103, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, -1, 114, 115, 116, 117, 118, 119, 120, 
+  121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 
+  131, -1, -1, -1, -1, 136, -1, -1, -1, 140, 
+  141, 142, -1, 144, 145, 146, 147, 148, 149, 150, 
+  151, 152, 153, 154, 155, 156, 157, -1, 159, 160, 
+  161, -1, 163, -1, -1, -1, 167, 168, -1, -1, 
+  -1, 6, 7, -1, 9, 10, 11, -1, -1, -1, 
+  -1, -1, -1, -1, 19, 20, -1, -1, -1, 24, 
+  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 
+  35, -1, -1, 38, 39, 40, 41, -1, -1, -1, 
+  -1, 46, -1, -1, 49, 50, -1, -1, 53, -1, 
+  55, -1, 57, 58, 59, 60, 61, 62, 63, 64, 
+  65, 66, 67, 68, 69, 70, -1, -1, -1, -1, 
+  -1, -1, 77, -1, 79, 80, 81, 82, 83, 84, 
+  85, 86, 87, 88, 89, 90, 91, 92, -1, -1, 
+  -1, -1, 97, -1, -1, -1, -1, -1, 103, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, 114, 
+  115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 
+  125, 126, 127, 128, 129, 130, 131, -1, -1, -1, 
+  -1, 136, -1, -1, -1, 140, 141, 142, -1, 144, 
+  145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 
+  155, 156, 157, -1, 159, 160, 161, -1, 163, -1, 
+  -1, -1, 167, 168, -1, -1, -1, 6, 7, -1, 
+  9, 10, 11, -1, -1, -1, -1, -1, -1, -1, 
+  19, 20, -1, -1, -1, 24, 25, 26, 27, 28, 
+  29, 30, 31, 32, 33, 34, 35, -1, -1, 38, 
+  39, 40, 41, -1, -1, -1, -1, 46, -1, -1, 
+  49, 50, -1, -1, 53, -1, 55, -1, 57, 58, 
+  59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 
+  69, 70, -1, -1, -1, -1, -1, -1, 77, -1, 
+  79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 
+  89, 90, 91, 92, -1, -1, -1, -1, 97, -1, 
+  -1, -1, -1, -1, 103, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, 114, 115, 116, 117, 118, 
+  119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 
+  129, 130, 131, 132, -1, -1, -1, 136, -1, -1, 
+  -1, 140, 141, 142, -1, 144, 145, 146, 147, 148, 
+  149, 150, 151, 152, 153, 154, 155, 156, 157, -1, 
+  159, 160, 161, -1, 163, -1, -1, -1, 167, 168, 
+  -1, -1, -1, 6, 7, -1, 9, 10, 11, -1, 
+  -1, -1, -1, -1, -1, -1, 19, 20, -1, -1, 
+  -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, 
+  33, 34, 35, -1, -1, 38, 39, 40, 41, -1, 
+  -1, -1, -1, 46, -1, -1, 49, 50, -1, -1, 
+  53, -1, 55, -1, 57, 58, 59, 60, 61, 62, 
+  63, 64, 65, 66, 67, 68, 69, 70, -1, -1, 
+  -1, -1, -1, -1, 77, -1, 79, 80, 81, 82, 
+  83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 
+  -1, -1, -1, -1, 97, -1, -1, -1, -1, -1, 
+  103, -1, -1, -1, -1, -1, -1, 110, -1, -1, 
+  -1, 114, 115, 116, 117, 118, 119, 120, 121, 122, 
+  123, 124, 125, 126, 127, 128, 129, 130, 131, -1, 
+  -1, -1, -1, 136, -1, -1, -1, 140, 141, 142, 
+  -1, 144, 145, 146, 147, 148, 149, 150, 151, 152, 
+  153, 154, 155, 156, 157, -1, 159, 160, 161, -1, 
+  163, -1, -1, -1, 167, 168, -1, -1, -1, 6, 
+  7, -1, 9, 10, 11, -1, -1, -1, -1, -1, 
+  -1, -1, 19, 20, -1, -1, -1, 24, 25, 26, 
+  27, 28, 29, 30, 31, 32, 33, 34, 35, -1, 
+  -1, 38, 39, 40, 41, -1, -1, -1, -1, 46, 
+  -1, -1, 49, 50, -1, -1, 53, -1, 55, -1, 
+  57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 
+  67, 68, 69, 70, -1, -1, -1, -1, -1, -1, 
+  77, -1, 79, 80, 81, 82, 83, 84, 85, 86, 
+  87, 88, 89, 90, 91, 92, -1, -1, -1, -1, 
+  97, -1, -1, -1, -1, -1, 103, -1, -1, -1, 
+  -1, -1, -1, 110, -1, -1, -1, 114, 115, 116, 
   117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 
-  127, 128, 129, 130, 131, -1, -1, 134, -1, 136, 
-  -1, -1, -1, -1, 141, 142, 143, 144, 145, 146, 
+  127, 128, 129, 130, 131, -1, -1, -1, -1, 136, 
+  -1, -1, -1, 140, 141, 142, -1, 144, 145, 146, 
   147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 
-  157, 158, 159, 160, 161, -1, 163, -1, -1, -1, 
+  157, -1, 159, 160, 161, -1, 163, -1, -1, -1, 
+  167, 168, -1, -1, -1, 6, 7, -1, 9, 10, 
+  11, -1, -1, -1, -1, -1, -1, -1, 19, 20, 
+  -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, 
+  31, 32, 33, 34, 35, -1, -1, 38, 39, 40, 
+  41, -1, -1, -1, -1, 46, -1, -1, 49, 50, 
+  -1, -1, 53, -1, 55, -1, 57, 58, 59, 60, 
+  61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 
+  -1, -1, -1, -1, -1, -1, 77, -1, 79, 80, 
+  81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 
+  91, 92, -1, -1, -1, -1, 97, -1, -1, -1, 
+  -1, -1, 103, -1, -1, -1, -1, -1, -1, 110, 
+  -1, -1, -1, 114, 115, 116, 117, 118, 119, 120, 
+  121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 
+  131, -1, -1, -1, -1, 136, -1, -1, -1, 140, 
+  141, 142, -1, 144, 145, 146, 147, 148, 149, 150, 
+  151, 152, 153, 154, 155, 156, 157, -1, 159, 160, 
+  161, -1, 163, -1, -1, -1, 167, 168, -1, -1, 
+  -1, 6, 7, -1, 9, 10, 11, -1, -1, -1, 
+  -1, -1, -1, -1, 19, 20, -1, -1, -1, 24, 
+  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 
+  35, -1, -1, 38, 39, 40, 41, -1, -1, -1, 
+  -1, 46, -1, -1, 49, 50, -1, -1, 53, -1, 
+  55, -1, 57, 58, 59, 60, 61, 62, 63, 64, 
+  65, 66, 67, 68, 69, 70, -1, -1, -1, -1, 
+  -1, -1, 77, -1, 79, 80, 81, 82, 83, 84, 
+  85, 86, 87, 88, 89, 90, 91, 92, -1, -1, 
+  -1, -1, 97, -1, -1, -1, -1, -1, 103, -1, 
+  -1, -1, -1, -1, -1, 110, -1, -1, -1, 114, 
+  115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 
+  125, 126, 127, 128, 129, 130, 131, -1, -1, -1, 
+  -1, 136, -1, -1, -1, 140, 141, 142, -1, 144, 
+  145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 
+  155, 156, 157, -1, 159, 160, 161, -1, 163, -1, 
+  -1, -1, 167, 168, -1, -1, -1, 6, 7, -1, 
+  9, 10, 11, -1, -1, -1, -1, -1, -1, -1, 
+  19, 20, -1, -1, -1, 24, 25, 26, 27, 28, 
+  29, 30, 31, 32, 33, 34, 35, -1, -1, 38, 
+  39, 40, 41, -1, -1, -1, -1, 46, -1, -1, 
+  49, 50, -1, -1, 53, -1, 55, -1, 57, 58, 
+  59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 
+  69, 70, -1, -1, -1, -1, -1, -1, 77, -1, 
+  79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 
+  89, 90, 91, 92, -1, -1, -1, -1, 97, -1, 
+  -1, -1, -1, -1, 103, -1, -1, -1, -1, -1, 
+  -1, 110, -1, -1, -1, 114, 115, 116, 117, 118, 
+  119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 
+  129, 130, 131, -1, -1, -1, -1, 136, -1, -1, 
+  -1, 140, 141, 142, -1, 144, 145, 146, 147, 148, 
+  149, 150, 151, 152, 153, 154, 155, 156, 157, -1, 
+  159, 160, 161, -1, 163, -1, -1, -1, 167, 168, 
   -1, -1, -1, 5, -1, 7, -1, 9, 10, 11, 
   -1, -1, 14, -1, -1, 17, -1, -1, -1, -1, 
   -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, 
@@ -1023,29 +1056,80 @@ const short GLSLParserTable::action_check [] = {
   -1, -1, -1, -1, -1, -1, -1, 79, 80, 81, 
   82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 
   92, -1, -1, -1, 96, -1, -1, -1, 100, 101, 
-  -1, -1, -1, -1, -1, -1, -1, 109, -1, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, 113, 114, 115, 116, 117, 118, 119, 120, 121, 
   122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 
   -1, -1, 134, -1, 136, -1, -1, -1, -1, 141, 
   142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 
   152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 
-  -1, 163, -1, -1, -1, -1, -1, -1, 5, -1, 
-  7, -1, 9, 10, 11, -1, -1, 14, -1, -1, 
-  17, -1, -1, -1, -1, -1, -1, 24, 25, 26, 
-  27, 28, 29, 30, 31, 32, 33, 34, 35, -1, 
-  -1, 38, 39, 40, 41, -1, -1, -1, 45, 46, 
-  -1, -1, 49, -1, -1, 52, -1, -1, 55, 56, 
-  57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, -1, -1, -1, -1, -1, 
-  -1, -1, 79, 80, 81, 82, 83, 84, 85, 86, 
-  87, 88, 89, 90, 91, 92, -1, -1, -1, 96, 
-  -1, -1, -1, 100, 101, -1, -1, -1, -1, -1, 
-  -1, -1, 109, -1, -1, -1, 113, 114, 115, 116, 
-  117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 
-  127, 128, 129, 130, 131, -1, -1, 134, -1, 136, 
-  -1, -1, -1, -1, 141, 142, 143, 144, 145, 146, 
-  147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 
-  157, 158, 159, 160, 161, -1, 163, -1, -1, -1, 
+  -1, 163, -1, -1, -1, -1, -1, -1, -1, -1, 
+  5, -1, 7, -1, 9, 10, 11, -1, -1, 14, 
+  -1, -1, 17, -1, -1, -1, -1, -1, -1, 24, 
+  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 
+  35, -1, -1, 38, 39, 40, 41, -1, -1, -1, 
+  45, 46, -1, -1, 49, -1, -1, 52, -1, -1, 
+  55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 
+  65, 66, 67, 68, 69, 70, 71, -1, -1, -1, 
+  -1, -1, -1, -1, 79, 80, 81, 82, 83, 84, 
+  85, 86, 87, 88, 89, 90, 91, 92, -1, -1, 
+  -1, 96, -1, -1, -1, 100, 101, -1, -1, -1, 
+  -1, -1, -1, -1, 109, -1, -1, -1, 113, 114, 
+  115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 
+  125, 126, 127, 128, 129, 130, 131, -1, -1, 134, 
+  -1, 136, -1, -1, -1, -1, 141, 142, 143, 144, 
+  145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 
+  155, 156, 157, 158, 159, 160, 161, -1, 163, -1, 
+  -1, -1, -1, -1, -1, -1, -1, 5, -1, 7, 
+  -1, 9, 10, 11, -1, -1, 14, -1, -1, 17, 
+  -1, -1, -1, -1, -1, -1, 24, 25, 26, 27, 
+  28, 29, 30, 31, 32, 33, 34, 35, -1, -1, 
+  38, 39, 40, 41, -1, -1, -1, 45, 46, -1, 
+  -1, 49, -1, -1, 52, -1, -1, 55, 56, 57, 
+  58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 
+  68, 69, 70, 71, -1, -1, -1, -1, -1, -1, 
+  -1, 79, 80, 81, 82, 83, 84, 85, 86, 87, 
+  88, 89, 90, 91, 92, -1, -1, -1, 96, -1, 
+  -1, -1, 100, 101, -1, -1, -1, -1, -1, -1, 
+  -1, 109, -1, -1, -1, 113, 114, 115, 116, 117, 
+  118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 
+  128, 129, 130, 131, -1, -1, 134, -1, 136, -1, 
+  -1, -1, -1, 141, 142, 143, 144, 145, 146, 147, 
+  148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 
+  158, 159, 160, 161, -1, 163, -1, -1, -1, -1, 
+  -1, -1, -1, -1, 5, -1, 7, -1, 9, 10, 
+  11, -1, -1, 14, -1, -1, 17, -1, -1, -1, 
+  -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, 
+  31, 32, 33, 34, 35, -1, -1, 38, 39, 40, 
+  41, -1, -1, -1, 45, 46, -1, -1, 49, -1, 
+  -1, 52, -1, -1, 55, 56, 57, 58, 59, 60, 
+  61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 
+  71, -1, -1, -1, -1, -1, -1, -1, 79, 80, 
+  81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 
+  91, 92, -1, -1, -1, 96, -1, -1, -1, 100, 
+  101, -1, -1, -1, -1, -1, -1, -1, 109, -1, 
+  -1, -1, 113, 114, 115, 116, 117, 118, 119, 120, 
+  121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 
+  131, -1, -1, 134, -1, 136, -1, -1, -1, -1, 
+  141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 
+  151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 
+  161, -1, 163, -1, -1, -1, -1, -1, -1, -1, 
+  -1, 5, -1, 7, -1, 9, 10, 11, -1, -1, 
+  14, -1, -1, 17, -1, -1, -1, -1, -1, -1, 
+  24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 
+  34, 35, -1, -1, 38, 39, 40, 41, -1, -1, 
+  -1, 45, 46, -1, -1, 49, -1, -1, 52, -1, 
+  -1, 55, 56, 57, 58, 59, 60, 61, 62, 63, 
+  64, 65, 66, 67, 68, 69, 70, 71, -1, -1, 
+  -1, -1, -1, -1, -1, 79, 80, 81, 82, 83, 
+  84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 
+  -1, -1, 96, -1, -1, -1, 100, 101, -1, -1, 
+  104, -1, -1, -1, -1, -1, -1, -1, -1, 113, 
+  114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 
+  124, 125, 126, 127, 128, 129, 130, 131, 132, -1, 
+  134, -1, 136, -1, -1, -1, -1, 141, 142, 143, 
+  144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 
+  154, 155, 156, 157, 158, 159, 160, 161, -1, 163, 
+  -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 
   -1, -1, -1, 5, -1, 7, -1, 9, 10, 11, 
   -1, -1, 14, -1, -1, 17, -1, -1, -1, -1, 
   -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, 
@@ -1056,162 +1140,80 @@ const short GLSLParserTable::action_check [] = {
   -1, -1, -1, -1, -1, -1, -1, 79, 80, 81, 
   82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 
   92, -1, -1, -1, 96, -1, -1, -1, 100, 101, 
-  -1, -1, -1, -1, -1, -1, -1, 109, -1, -1, 
-  -1, 113, 114, 115, 116, 117, 118, 119, 120, 121, 
-  122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 
-  -1, -1, 134, -1, 136, -1, -1, -1, -1, 141, 
-  142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 
-  152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 
-  -1, 163, -1, -1, -1, -1, -1, -1, 5, -1, 
-  7, -1, 9, 10, 11, -1, -1, 14, -1, -1, 
-  17, -1, -1, -1, -1, -1, -1, 24, 25, 26, 
-  27, 28, 29, 30, 31, 32, 33, 34, 35, -1, 
-  -1, 38, 39, 40, 41, -1, -1, -1, 45, 46, 
-  -1, -1, 49, -1, -1, 52, -1, -1, 55, 56, 
-  57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, -1, -1, -1, -1, -1, 
-  -1, -1, 79, 80, 81, 82, 83, 84, 85, 86, 
-  87, 88, 89, 90, 91, 92, -1, -1, -1, 96, 
-  -1, -1, -1, 100, 101, -1, -1, 104, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 113, 114, 115, 116, 
-  117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 
-  127, 128, 129, 130, 131, 132, -1, 134, -1, 136, 
-  -1, -1, -1, -1, 141, 142, 143, 144, 145, 146, 
-  147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 
-  157, 158, 159, 160, 161, -1, 163, -1, -1, -1, 
-  -1, -1, -1, 0, -1, -1, -1, -1, 5, -1, 
-  7, -1, 9, 10, 11, -1, -1, 14, -1, -1, 
-  17, -1, -1, -1, -1, -1, -1, 24, 25, 26, 
-  27, 28, 29, 30, 31, 32, 33, 34, 35, -1, 
-  -1, 38, 39, 40, 41, -1, -1, -1, 45, 46, 
-  -1, -1, 49, -1, -1, 52, -1, -1, 55, 56, 
-  57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, -1, -1, -1, -1, -1, 
-  -1, -1, 79, 80, 81, 82, 83, 84, 85, 86, 
-  87, 88, 89, 90, 91, 92, -1, -1, -1, 96, 
-  -1, -1, -1, 100, 101, -1, -1, 104, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 113, 114, 115, 116, 
-  117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 
-  127, 128, 129, 130, 131, 132, -1, 134, -1, 136, 
-  -1, -1, -1, -1, 141, 142, 143, 144, 145, 146, 
-  147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 
-  157, 158, 159, 160, 161, -1, 163, -1, -1, -1, 
-  -1, -1, -1, 5, 6, 7, -1, 9, 10, 11, 
-  -1, -1, 14, -1, -1, 17, -1, 19, 20, -1, 
-  -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, 
-  32, 33, 34, 35, -1, -1, 38, 39, 40, 41, 
-  -1, -1, -1, 45, 46, -1, -1, 49, 50, -1, 
-  52, 53, -1, 55, 56, 57, 58, 59, 60, 61, 
-  62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 
-  -1, -1, -1, -1, -1, 77, -1, 79, 80, 81, 
-  82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 
-  92, -1, -1, -1, 96, 97, -1, -1, 100, 101, 
-  -1, 103, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 113, 114, 115, 116, 117, 118, 119, 120, 121, 
-  122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 
-  -1, -1, 134, -1, 136, -1, -1, -1, 140, 141, 
-  142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 
-  152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 
-  -1, 163, -1, -1, -1, 167, 168, -1, 5, 6, 
-  7, -1, 9, 10, 11, -1, -1, 14, -1, -1, 
-  17, -1, 19, 20, -1, -1, -1, 24, 25, 26, 
-  27, 28, 29, 30, 31, 32, 33, 34, 35, -1, 
-  -1, 38, 39, 40, 41, -1, -1, -1, 45, 46, 
-  -1, -1, 49, 50, -1, 52, 53, -1, 55, 56, 
-  57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, -1, -1, -1, -1, -1, 
-  77, -1, 79, 80, 81, 82, 83, 84, 85, 86, 
-  87, 88, 89, 90, 91, 92, -1, -1, -1, 96, 
-  97, -1, -1, 100, 101, -1, 103, 104, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 113, 114, 115, 116, 
-  117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 
-  127, 128, 129, 130, 131, 132, -1, 134, -1, 136, 
-  -1, -1, -1, 140, 141, 142, 143, 144, 145, 146, 
-  147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 
-  157, 158, 159, 160, 161, -1, 163, -1, -1, -1, 
-  167, 168, -1, 5, 6, 7, 8, 9, 10, 11, 
-  -1, 13, 14, -1, -1, 17, 18, 19, 20, 21, 
-  22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 
-  32, 33, 34, 35, 36, -1, 38, 39, 40, 41, 
-  -1, -1, -1, 45, 46, 47, -1, 49, 50, 51, 
-  52, 53, -1, 55, 56, 57, 58, 59, 60, 61, 
-  62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 
-  -1, -1, 74, -1, -1, 77, -1, 79, 80, 81, 
-  82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 
-  92, -1, -1, -1, 96, 97, -1, -1, 100, 101, 
-  -1, 103, 104, -1, 106, -1, -1, -1, -1, -1, 
-  -1, 113, 114, 115, 116, 117, 118, 119, 120, 121, 
-  122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 
-  132, -1, 134, -1, 136, -1, -1, 139, 140, 141, 
-  142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 
-  152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 
-  -1, 163, 164, -1, -1, 167, 168, -1, 5, 6, 
-  7, 8, 9, 10, 11, -1, 13, 14, -1, -1, 
-  17, 18, 19, 20, 21, 22, -1, 24, 25, 26, 
-  27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 
-  -1, 38, 39, 40, 41, -1, -1, -1, 45, 46, 
-  47, -1, 49, 50, 51, 52, 53, -1, 55, 56, 
-  57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, -1, -1, 74, -1, -1, 
-  77, -1, 79, 80, 81, 82, 83, 84, 85, 86, 
-  87, 88, 89, 90, 91, 92, -1, -1, -1, 96, 
-  97, -1, -1, 100, 101, -1, 103, 104, -1, 106, 
-  -1, -1, -1, -1, -1, -1, 113, 114, 115, 116, 
-  117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 
-  127, 128, 129, 130, 131, 132, -1, 134, -1, 136, 
-  -1, -1, 139, 140, 141, 142, 143, 144, 145, 146, 
-  147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 
-  157, 158, 159, 160, 161, -1, 163, 164, -1, -1, 
-  167, 168, -1, 5, 6, 7, 8, 9, 10, 11, 
-  -1, 13, 14, -1, -1, 17, 18, 19, 20, 21, 
-  22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 
-  32, 33, 34, 35, 36, -1, 38, 39, 40, 41, 
-  -1, -1, -1, 45, 46, 47, -1, 49, 50, 51, 
-  52, 53, -1, 55, 56, 57, 58, 59, 60, 61, 
-  62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 
-  -1, -1, 74, -1, -1, 77, -1, 79, 80, 81, 
-  82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 
-  92, -1, -1, -1, 96, 97, -1, -1, 100, 101, 
-  -1, 103, 104, -1, 106, -1, -1, 109, -1, -1, 
-  -1, 113, 114, 115, 116, 117, 118, 119, 120, 121, 
-  122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 
-  132, -1, 134, -1, 136, -1, -1, 139, 140, 141, 
-  142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 
-  152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 
-  -1, 163, 164, -1, -1, 167, 168, -1, 5, 6, 
-  7, 8, 9, 10, 11, -1, 13, 14, -1, -1, 
-  17, 18, 19, 20, 21, 22, -1, 24, 25, 26, 
-  27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 
-  -1, 38, 39, 40, 41, -1, -1, -1, 45, 46, 
-  47, -1, 49, 50, 51, 52, 53, -1, 55, 56, 
-  57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 
-  67, 68, 69, 70, 71, -1, -1, 74, -1, -1, 
-  77, -1, 79, 80, 81, 82, 83, 84, 85, 86, 
-  87, 88, 89, 90, 91, 92, -1, -1, -1, 96, 
-  97, -1, -1, 100, 101, -1, 103, 104, -1, 106, 
-  -1, -1, 109, -1, -1, -1, 113, 114, 115, 116, 
-  117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 
-  127, 128, 129, 130, 131, 132, -1, 134, -1, 136, 
-  -1, -1, 139, 140, 141, 142, 143, 144, 145, 146, 
-  147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 
-  157, 158, 159, 160, 161, -1, 163, 164, -1, -1, 
-  167, 168, -1, 5, 6, 7, 8, 9, 10, 11, 
-  -1, 13, 14, -1, -1, 17, 18, 19, 20, 21, 
-  22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 
-  32, 33, 34, 35, 36, -1, 38, 39, 40, 41, 
-  -1, -1, -1, 45, 46, 47, -1, 49, 50, 51, 
-  52, 53, -1, 55, 56, 57, 58, 59, 60, 61, 
-  62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 
-  -1, -1, 74, -1, -1, 77, -1, 79, 80, 81, 
-  82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 
-  92, -1, -1, -1, 96, 97, -1, -1, 100, 101, 
-  -1, 103, 104, -1, 106, -1, -1, 109, -1, -1, 
+  -1, -1, 104, -1, -1, -1, -1, -1, -1, -1, 
   -1, 113, 114, 115, 116, 117, 118, 119, 120, 121, 
   122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 
-  132, -1, 134, -1, 136, -1, -1, 139, 140, 141, 
+  132, -1, 134, -1, 136, -1, -1, -1, -1, 141, 
   142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 
   152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 
-  -1, 163, 164, -1, -1, 167, 168, -1, 5, 6, 
+  -1, 163, -1, -1, -1, -1, -1, -1, -1, -1, 
+  5, 6, 7, -1, 9, 10, 11, -1, -1, 14, 
+  -1, -1, 17, -1, 19, 20, -1, -1, -1, 24, 
+  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 
+  35, -1, -1, 38, 39, 40, 41, -1, -1, -1, 
+  45, 46, -1, -1, 49, 50, -1, 52, 53, -1, 
+  55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 
+  65, 66, 67, 68, 69, 70, 71, -1, -1, -1, 
+  -1, -1, 77, -1, 79, 80, 81, 82, 83, 84, 
+  85, 86, 87, 88, 89, 90, 91, 92, -1, -1, 
+  -1, 96, 97, -1, -1, 100, 101, -1, 103, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, 113, 114, 
+  115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 
+  125, 126, 127, 128, 129, 130, 131, -1, -1, 134, 
+  -1, 136, -1, -1, -1, 140, 141, 142, 143, 144, 
+  145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 
+  155, 156, 157, 158, 159, 160, 161, -1, 163, -1, 
+  -1, -1, 167, 168, -1, -1, -1, 5, 6, 7, 
+  -1, 9, 10, 11, -1, -1, 14, -1, -1, 17, 
+  -1, 19, 20, -1, -1, -1, 24, 25, 26, 27, 
+  28, 29, 30, 31, 32, 33, 34, 35, -1, -1, 
+  38, 39, 40, 41, -1, -1, -1, 45, 46, -1, 
+  -1, 49, 50, -1, 52, 53, -1, 55, 56, 57, 
+  58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 
+  68, 69, 70, 71, -1, -1, -1, -1, -1, 77, 
+  -1, 79, 80, 81, 82, 83, 84, 85, 86, 87, 
+  88, 89, 90, 91, 92, -1, -1, -1, 96, 97, 
+  -1, -1, 100, 101, -1, 103, 104, -1, -1, -1, 
+  -1, -1, -1, -1, -1, 113, 114, 115, 116, 117, 
+  118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 
+  128, 129, 130, 131, 132, -1, 134, -1, 136, -1, 
+  -1, -1, 140, 141, 142, 143, 144, 145, 146, 147, 
+  148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 
+  158, 159, 160, 161, -1, 163, -1, -1, -1, 167, 
+  168, -1, -1, -1, 5, 6, 7, 8, 9, 10, 
+  11, -1, 13, 14, -1, -1, 17, 18, 19, 20, 
+  21, 22, -1, 24, 25, 26, 27, 28, 29, 30, 
+  31, 32, 33, 34, 35, 36, -1, 38, 39, 40, 
+  41, -1, -1, -1, 45, 46, 47, -1, 49, 50, 
+  51, 52, 53, -1, 55, 56, 57, 58, 59, 60, 
+  61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 
+  71, -1, -1, 74, -1, -1, 77, -1, 79, 80, 
+  81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 
+  91, 92, -1, -1, -1, 96, 97, -1, -1, 100, 
+  101, -1, 103, 104, -1, 106, -1, -1, -1, -1, 
+  -1, -1, 113, 114, 115, 116, 117, 118, 119, 120, 
+  121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 
+  131, 132, -1, 134, -1, 136, -1, -1, 139, 140, 
+  141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 
+  151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 
+  161, -1, 163, 164, -1, -1, 167, 168, -1, -1, 
+  -1, 5, 6, 7, 8, 9, 10, 11, -1, 13, 
+  14, -1, -1, 17, 18, 19, 20, 21, 22, -1, 
+  24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 
+  34, 35, 36, -1, 38, 39, 40, 41, -1, -1, 
+  -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 
+  -1, 55, 56, 57, 58, 59, 60, 61, 62, 63, 
+  64, 65, 66, 67, 68, 69, 70, 71, -1, -1, 
+  74, -1, -1, 77, -1, 79, 80, 81, 82, 83, 
+  84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 
+  -1, -1, 96, 97, -1, -1, 100, 101, -1, 103, 
+  104, -1, 106, -1, -1, -1, -1, -1, -1, 113, 
+  114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 
+  124, 125, 126, 127, 128, 129, 130, 131, 132, -1, 
+  134, -1, 136, -1, -1, 139, 140, 141, 142, 143, 
+  144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 
+  154, 155, 156, 157, 158, 159, 160, 161, -1, 163, 
+  164, -1, -1, 167, 168, -1, -1, -1, 5, 6, 
   7, 8, 9, 10, 11, -1, 13, 14, -1, -1, 
   17, 18, 19, 20, 21, 22, -1, 24, 25, 26, 
   27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 
@@ -1228,7 +1230,57 @@ const short GLSLParserTable::action_check [] = {
   -1, -1, 139, 140, 141, 142, 143, 144, 145, 146, 
   147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 
   157, 158, 159, 160, 161, -1, 163, 164, -1, -1, 
-  167, 168, -1, 
+  167, 168, -1, -1, -1, 5, 6, 7, 8, 9, 
+  10, 11, -1, 13, 14, -1, -1, 17, 18, 19, 
+  20, 21, 22, -1, 24, 25, 26, 27, 28, 29, 
+  30, 31, 32, 33, 34, 35, 36, -1, 38, 39, 
+  40, 41, -1, -1, -1, 45, 46, 47, -1, 49, 
+  50, 51, 52, 53, -1, 55, 56, 57, 58, 59, 
+  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 
+  70, 71, -1, -1, 74, -1, -1, 77, -1, 79, 
+  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 
+  90, 91, 92, -1, -1, -1, 96, 97, -1, -1, 
+  100, 101, -1, 103, 104, -1, 106, -1, -1, 109, 
+  -1, -1, -1, 113, 114, 115, 116, 117, 118, 119, 
+  120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 
+  130, 131, 132, -1, 134, -1, 136, -1, -1, 139, 
+  140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 
+  150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 
+  160, 161, -1, 163, 164, -1, -1, 167, 168, -1, 
+  -1, -1, 5, 6, 7, 8, 9, 10, 11, -1, 
+  13, 14, -1, -1, 17, 18, 19, 20, 21, 22, 
+  -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, 
+  33, 34, 35, 36, -1, 38, 39, 40, 41, -1, 
+  -1, -1, 45, 46, 47, -1, 49, 50, 51, 52, 
+  53, -1, 55, 56, 57, 58, 59, 60, 61, 62, 
+  63, 64, 65, 66, 67, 68, 69, 70, 71, -1, 
+  -1, 74, -1, -1, 77, -1, 79, 80, 81, 82, 
+  83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 
+  -1, -1, -1, 96, 97, -1, -1, 100, 101, -1, 
+  103, 104, -1, 106, -1, -1, 109, -1, -1, -1, 
+  113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 
+  123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 
+  -1, 134, -1, 136, -1, -1, 139, 140, 141, 142, 
+  143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 
+  153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 
+  163, 164, -1, -1, 167, 168, -1, -1, -1, 5, 
+  6, 7, 8, 9, 10, 11, -1, 13, 14, -1, 
+  -1, 17, 18, 19, 20, 21, 22, -1, 24, 25, 
+  26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 
+  36, -1, 38, 39, 40, 41, -1, -1, -1, 45, 
+  46, 47, -1, 49, 50, 51, 52, 53, -1, 55, 
+  56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 
+  66, 67, 68, 69, 70, 71, -1, -1, 74, -1, 
+  -1, 77, -1, 79, 80, 81, 82, 83, 84, 85, 
+  86, 87, 88, 89, 90, 91, 92, -1, -1, -1, 
+  96, 97, -1, -1, 100, 101, -1, 103, 104, -1, 
+  106, -1, -1, 109, -1, -1, -1, 113, 114, 115, 
+  116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 
+  126, 127, 128, 129, 130, 131, 132, -1, 134, -1, 
+  136, -1, -1, 139, 140, 141, 142, 143, 144, 145, 
+  146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 
+  156, 157, 158, 159, 160, 161, -1, 163, 164, -1, 
+  -1, 167, 168, -1, -1, -1, 
 
   3, 54, 14, 3, 15, 12, 3, 12, 35, 54, 
   12, 15, 8, 54, 15, 14, 3, 12, 3, 12, 
@@ -1262,3 +1314,4 @@ const short GLSLParserTable::action_check [] = {
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1};
 
+QT_END_NAMESPACE
diff --git a/src/libs/glsl/glslparsertable_p.h b/src/libs/glsl/glslparsertable_p.h
index cab2f07abe8..1d3f5790b87 100644
--- a/src/libs/glsl/glslparsertable_p.h
+++ b/src/libs/glsl/glslparsertable_p.h
@@ -1,7 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of other Qt classes.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
 // This file was generated by qlalr - DO NOT EDIT!
 #ifndef GLSLPARSERTABLE_P_H
 #define GLSLPARSERTABLE_P_H
 
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
 class GLSLParserTable
 {
 public:
@@ -23,6 +79,7 @@ public:
     T_CENTROID = 14,
     T_COLON = 15,
     T_COMMA = 16,
+    T_COMMENT = 170,
     T_CONST = 17,
     T_CONTINUE = 18,
     T_DASH = 19,
@@ -51,7 +108,7 @@ public:
     T_ELSE = 42,
     T_EQUAL = 43,
     T_EQ_OP = 44,
-    T_ERROR = 169,
+    T_ERROR = 171,
     T_FALSE = 168,
     T_FLAT = 45,
     T_FLOAT = 46,
@@ -113,6 +170,7 @@ public:
     T_PERCENT = 102,
     T_PLUS = 103,
     T_PRECISION = 104,
+    T_PREPROC = 169,
     T_QUESTION = 105,
     T_RETURN = 106,
     T_RIGHT_ANGLE = 107,
@@ -180,12 +238,12 @@ public:
     ACCEPT_STATE = 435,
     RULE_COUNT = 312,
     STATE_COUNT = 455,
-    TERMINAL_COUNT = 170,
+    TERMINAL_COUNT = 172,
     NON_TERMINAL_COUNT = 82,
 
     GOTO_INDEX_OFFSET = 455,
-    GOTO_INFO_OFFSET = 4753,
-    GOTO_CHECK_OFFSET = 4753
+    GOTO_INFO_OFFSET = 4796,
+    GOTO_CHECK_OFFSET = 4796
   };
 
   static const char  *const    spell [];
@@ -218,5 +276,6 @@ public:
 };
 
 
+QT_END_NAMESPACE
 #endif // GLSLPARSERTABLE_P_H
 
diff --git a/src/libs/glsl/make-parser.sh b/src/libs/glsl/make-parser.sh
index 9fc769e6aef..acd584f121f 100755
--- a/src/libs/glsl/make-parser.sh
+++ b/src/libs/glsl/make-parser.sh
@@ -2,5 +2,5 @@
 
 me=$(dirname $0)
 cat $me/specs/glsl.g.in $me/specs/grammar.txt > $me/glsl.g
-qlalr --no-lines --no-debug $me/glsl.g
+qlalr --qt --no-lines --no-debug $me/glsl.g
 
diff --git a/src/libs/glsl/specs/glsl.g.in b/src/libs/glsl/specs/glsl.g.in
index 44c753be9ff..fc7fad9817c 100644
--- a/src/libs/glsl/specs/glsl.g.in
+++ b/src/libs/glsl/specs/glsl.g.in
@@ -1,3 +1,32 @@
+---------------------------------------------------------------------------
+--
+-- This file is part of Qt Creator
+--
+-- Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+--
+-- Contact: Nokia Corporation (qt-info@nokia.com)
+--
+-- Commercial Usage
+--
+-- Licensees holding valid Qt Commercial licenses may use this file in
+-- accordance with the Qt Commercial License Agreement provided with the
+-- Software or, alternatively, in accordance with the terms contained in
+-- a written agreement between you and Nokia.
+--
+-- GNU Lesser General Public License Usage
+--
+-- Alternatively, this file may be used under the terms of the GNU Lesser
+-- General Public License version 2.1 as published by the Free Software
+-- Foundation and appearing in the file LICENSE.LGPL included in the
+-- packaging of this file.  Please review the following information to
+-- ensure the GNU Lesser General Public License version 2.1 requirements
+-- will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+--
+-- If you are unsure which license is appropriate for your use, please
+-- contact the sales department at http://qt.nokia.com/contact.
+---------------------------------------------------------------------------
+
+--
 -- todo:
 --    spelling of XOR_OP and CARET
 
@@ -174,11 +203,42 @@
 %token XOR_OP "^"
 %token TRUE "true"
 %token FALSE "false"
+%token PREPROC "preprocessor directive"
+%token COMMENT "comment"
 %token ERROR "error"
 
 %start translation_unit
 
 /:
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
 #include "$header"
 #include "glsllexer.h"
 #include "glslast.h"
@@ -214,6 +274,35 @@ private:
 :/
 
 /.
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
 #include "glslparser.h"
 #include <iostream>
 
diff --git a/src/plugins/glsleditor/GLSLEditor.mimetypes.xml b/src/plugins/glsleditor/GLSLEditor.mimetypes.xml
index 377ffa5af07..314dafdd301 100644
--- a/src/plugins/glsleditor/GLSLEditor.mimetypes.xml
+++ b/src/plugins/glsleditor/GLSLEditor.mimetypes.xml
@@ -5,5 +5,8 @@
         <sub-class-of type="text/plain"/>
         <comment>GLSL file</comment>
         <glob pattern="*.glsl"/>
+        <glob pattern="*.frag"/>
+        <glob pattern="*.fsh"/>
+        <glob pattern="*.vsh"/>
     </mime-type>
 </mime-info>
diff --git a/src/plugins/glsleditor/GLSLEditor.pluginspec.in b/src/plugins/glsleditor/GLSLEditor.pluginspec.in
index f6435dd4833..2d9be00ce45 100644
--- a/src/plugins/glsleditor/GLSLEditor.pluginspec.in
+++ b/src/plugins/glsleditor/GLSLEditor.pluginspec.in
@@ -1,4 +1,4 @@
-<plugin name=\"GLSLditor\" version=\"$$QTCREATOR_VERSION\" compatVersion=\"$$QTCREATOR_VERSION\">
+<plugin name=\"GLSLEditor\" version=\"$$QTCREATOR_VERSION\" compatVersion=\"$$QTCREATOR_VERSION\">
     <vendor>Nokia Corporation</vendor>
     <copyright>(C) 2010 Nokia Corporation</copyright>
     <license>
diff --git a/src/plugins/glsleditor/glsleditor.cpp b/src/plugins/glsleditor/glsleditor.cpp
index 4cee79db69f..8e583719810 100644
--- a/src/plugins/glsleditor/glsleditor.cpp
+++ b/src/plugins/glsleditor/glsleditor.cpp
@@ -31,6 +31,7 @@
 #include "glsleditoreditable.h"
 #include "glsleditorconstants.h"
 #include "glsleditorplugin.h"
+#include "glslhighlighter.h"
 
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/actionmanager/actioncontainer.h>
@@ -89,7 +90,7 @@ GLSLTextEditor::GLSLTextEditor(QWidget *parent) :
 
     connect(this, SIGNAL(textChanged()), this, SLOT(updateDocument()));
 
-//    baseTextDocument()->setSyntaxHighlighter(new Highlighter(document()));
+    baseTextDocument()->setSyntaxHighlighter(new Highlighter(document()));
 
 //    if (m_modelManager) {
 //        m_semanticHighlighter->setModelManager(m_modelManager);
@@ -147,8 +148,6 @@ Core::Context GLSLEditorEditable::context() const
 void GLSLTextEditor::setFontSettings(const TextEditor::FontSettings &fs)
 {
     TextEditor::BaseTextEditor::setFontSettings(fs);
-#warning set up the GLSL highlighter
-#if 0
     Highlighter *highlighter = qobject_cast<Highlighter*>(baseTextDocument()->syntaxHighlighter());
     if (!highlighter)
         return;
@@ -175,7 +174,6 @@ void GLSLTextEditor::setFontSettings(const TextEditor::FontSettings &fs)
 
     highlighter->setFormats(fs.toTextCharFormats(categories));
     highlighter->rehighlight();
-#endif
 }
 
 QString GLSLTextEditor::wordUnderCursor() const
@@ -202,7 +200,9 @@ void GLSLTextEditor::createToolBar(GLSLEditorEditable *editable)
 {
     m_outlineCombo = new QComboBox;
     m_outlineCombo->setMinimumContentsLength(22);
+#ifdef __GNUC__
 #warning set up the outline model
+#endif
     // m_outlineCombo->setModel(m_outlineModel);
 
     QTreeView *treeView = new QTreeView;
@@ -219,10 +219,6 @@ void GLSLTextEditor::createToolBar(GLSLEditorEditable *editable)
     policy.setHorizontalPolicy(QSizePolicy::Expanding);
     m_outlineCombo->setSizePolicy(policy);
 
-    connect(m_outlineCombo, SIGNAL(activated(int)), this, SLOT(jumpToOutlineElement(int)));
-
-    connect(file(), SIGNAL(changed()), this, SLOT(updateFileName()));
-
     QToolBar *toolBar = static_cast<QToolBar*>(editable->toolBar());
 
     QList<QAction*> actions = toolBar->actions();
diff --git a/src/plugins/glsleditor/glsleditor.pro b/src/plugins/glsleditor/glsleditor.pro
index ccb1786d969..6eb0334c2d2 100644
--- a/src/plugins/glsleditor/glsleditor.pro
+++ b/src/plugins/glsleditor/glsleditor.pro
@@ -14,13 +14,16 @@ glsleditoractionhandler.h \
 glsleditorconstants.h \
 glsleditoreditable.h \
 glsleditorfactory.h \
-glsleditorplugin.h
+glsleditorplugin.h \
+    glslhighlighter.h
 
 SOURCES += \
 glsleditor.cpp \
 glsleditoractionhandler.cpp \
 glsleditoreditable.cpp \
 glsleditorfactory.cpp \
-glsleditorplugin.cpp
+glsleditorplugin.cpp \
+    glslhighlighter.cpp
 
 OTHER_FILES += GLSLEditor.mimetypes.xml
+RESOURCES += glsleditor.qrc
diff --git a/src/plugins/glsleditor/glslhighlighter.cpp b/src/plugins/glsleditor/glslhighlighter.cpp
new file mode 100644
index 00000000000..bc9ec107b09
--- /dev/null
+++ b/src/plugins/glsleditor/glslhighlighter.cpp
@@ -0,0 +1,74 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+#include "glslhighlighter.h"
+#include <glsl/glsllexer.h>
+#include <glsl/glslparser.h>
+
+#include <QtCore/QDebug>
+
+using namespace GLSLEditor;
+using namespace GLSLEditor::Internal;
+
+Highlighter::Highlighter(QTextDocument *parent)
+    : TextEditor::SyntaxHighlighter(parent)
+{
+}
+
+Highlighter::~Highlighter()
+{
+
+}
+
+void Highlighter::setFormats(const QVector<QTextCharFormat> &formats)
+{
+    qCopy(formats.begin(), formats.end(), m_formats);
+}
+
+void Highlighter::highlightBlock(const QString &text)
+{
+    const QByteArray data = text.toLatin1();
+    GLSL::Lexer lex(data.constData(), data.size());
+    lex.setState(qMax(0, previousBlockState()));
+    lex.setScanKeywords(false);
+    lex.setScanComments(true);
+    GLSL::Token tk;
+    do {
+        lex.yylex(&tk);
+
+        if (tk.is(GLSL::Parser::T_NUMBER))
+            setFormat(tk.position, tk.length, m_formats[GLSLNumberFormat]);
+        else if (tk.is(GLSL::Parser::T_COMMENT))
+            setFormat(tk.position, tk.length, Qt::darkGreen); // ### FIXME: m_formats[GLSLCommentFormat]);
+        else if (tk.is(GLSL::Parser::T_IDENTIFIER)) {
+            if (lex.findKeyword(data.constData() + tk.position, tk.length) != GLSL::Parser::T_IDENTIFIER)
+                setFormat(tk.position, tk.length, m_formats[GLSLKeywordFormat]);
+        }
+    } while (tk.isNot(GLSL::Parser::EOF_SYMBOL));
+    setCurrentBlockState(lex.state());
+}
diff --git a/src/plugins/glsleditor/glslhighlighter.h b/src/plugins/glsleditor/glslhighlighter.h
new file mode 100644
index 00000000000..4971ff5bd1c
--- /dev/null
+++ b/src/plugins/glsleditor/glslhighlighter.h
@@ -0,0 +1,72 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+#ifndef GLSLHIGHLIGHTER_H
+#define GLSLHIGHLIGHTER_H
+
+#include <texteditor/syntaxhighlighter.h>
+
+namespace GLSLEditor {
+namespace Internal {
+
+class Highlighter : public TextEditor::SyntaxHighlighter
+{
+    Q_OBJECT
+
+public:
+    enum Formats {
+        GLSLNumberFormat,
+        GLSLStringFormat,
+        GLSLTypeFormat,
+        GLSLKeywordFormat,
+        GLSLOperatorFormat,
+        GLSLPreprocessorFormat,
+        GLSLLabelFormat,
+        GLSLCommentFormat,
+        GLSLDoxygenCommentFormat,
+        GLSLDoxygenTagFormat,
+        GLSLVisualWhitespace,
+        NumGLSLFormats
+    };
+
+    explicit Highlighter(QTextDocument *parent);
+    virtual ~Highlighter();
+
+    void setFormats(const QVector<QTextCharFormat> &formats);
+
+protected:
+    void highlightBlock(const QString &text);
+
+private:
+    QTextCharFormat m_formats[NumGLSLFormats];
+};
+
+} // namespace Internal
+} // namespace GLSLEditor
+
+#endif // GLSLHIGHLIGHTER_H
-- 
GitLab