text: // GLSL parser generated by pegjs - https://www.pegjs.org
  /*
   * Generated by PEG.js 0.10.0.
   *
   * http://pegjs.org/
   */
  (function(root) {
    "use strict";
  
    function peg$subclass(child, parent) {
      function ctor() { this.constructor = child; }
      ctor.prototype = parent.prototype;
      child.prototype = new ctor();
    }
  
    function peg$SyntaxError(message, expected, found, location) {
      this.message  = message;
      this.expected = expected;
      this.found    = found;
      this.location = location;
      this.name     = "SyntaxError";
  
      if (typeof Error.captureStackTrace === "function") {
        Error.captureStackTrace(this, peg$SyntaxError);
      }
    }
  
    peg$subclass(peg$SyntaxError, Error);
  
    peg$SyntaxError.buildMessage = function(expected, found) {
      var DESCRIBE_EXPECTATION_FNS = {
            literal: function(expectation) {
              return "\"" + literalEscape(expectation.text) + "\"";
            },
  
            "class": function(expectation) {
              var escapedParts = "",
                  i;
  
              for (i = 0; i < expectation.parts.length; i++) {
                escapedParts += expectation.parts[i] instanceof Array
                  ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1])
                  : classEscape(expectation.parts[i]);
              }
  
              return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
            },
  
            any: function(expectation) {
              return "any character";
            },
  
            end: function(expectation) {
              return "end of input";
            },
  
            other: function(expectation) {
              return expectation.description;
            }
          };
  
      function hex(ch) {
        return ch.charCodeAt(0).toString(16).toUpperCase();
      }
  
      function literalEscape(s) {
        return s
          .replace(/\\/g, '\\\\')
          .replace(/"/g,  '\\"')
          .replace(/\0/g, '\\0')
          .replace(/\t/g, '\\t')
          .replace(/\n/g, '\\n')
          .replace(/\r/g, '\\r')
          .replace(/[\x00-\x0F]/g,          function(ch) { return '\\x0' + hex(ch); })
          .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x'  + hex(ch); });
      }
  
      function classEscape(s) {
        return s
          .replace(/\\/g, '\\\\')
          .replace(/\]/g, '\\]')
          .replace(/\^/g, '\\^')
          .replace(/-/g,  '\\-')
          .replace(/\0/g, '\\0')
          .replace(/\t/g, '\\t')
          .replace(/\n/g, '\\n')
          .replace(/\r/g, '\\r')
          .replace(/[\x00-\x0F]/g,          function(ch) { return '\\x0' + hex(ch); })
          .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x'  + hex(ch); });
      }
  
      function describeExpectation(expectation) {
        return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
      }
  
      function describeExpected(expected) {
        var descriptions = new Array(expected.length),
            i, j;
  
        for (i = 0; i < expected.length; i++) {
          descriptions[i] = describeExpectation(expected[i]);
        }
  
        descriptions.sort();
  
        if (descriptions.length > 0) {
          for (i = 1, j = 1; i < descriptions.length; i++) {
            if (descriptions[i - 1] !== descriptions[i]) {
              descriptions[j] = descriptions[i];
              j++;
            }
          }
          descriptions.length = j;
        }
  
        switch (descriptions.length) {
          case 1:
            return descriptions[0];
  
          case 2:
            return descriptions[0] + " or " + descriptions[1];
  
          default:
            return descriptions.slice(0, -1).join(", ")
              + ", or "
              + descriptions[descriptions.length - 1];
        }
      }
  
      function describeFound(found) {
        return found ? "\"" + literalEscape(found) + "\"" : "end of input";
      }
  
      return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
    };
  
    function peg$parse(input, options) {
      options = options !== void 0 ? options : {};
  
      var peg$FAILED = {},
  
          peg$startRuleFunctions = { start: peg$parsestart },
          peg$startRuleFunction  = peg$parsestart,
  
          peg$c0 = function() {  shaderType = "vs"; return true; },
          peg$c1 = function(root) {
                return root;
              },
          peg$c2 = function() {  shaderType = "fs"; return true; },
          peg$c3 = /^[\n]/,
          peg$c4 = peg$classExpectation(["\n"], false, false),
          peg$c5 = function() {
              return "\n";
            },
          peg$c6 = peg$anyExpectation(),
          peg$c7 = peg$otherExpectation("whitespace"),
          peg$c8 = /^[\\\n]/,
          peg$c9 = peg$classExpectation(["\\", "\n"], false, false),
          peg$c10 = /^[\r\t\f\x0B ]/,
          peg$c11 = peg$classExpectation(["\r", "\t", "\f", "\x0B", " "], false, false),
          peg$c12 = "/*",
          peg$c13 = peg$literalExpectation("/*", false),
          peg$c14 = "*/",
          peg$c15 = peg$literalExpectation("*/", false),
          peg$c16 = "//",
          peg$c17 = peg$literalExpectation("//", false),
          peg$c18 = /^[^\n]/,
          peg$c19 = peg$classExpectation(["\n"], true, false),
          peg$c20 = peg$otherExpectation("comment"),
          peg$c21 = ";",
          peg$c22 = peg$literalExpectation(";", false),
          peg$c23 = ",",
          peg$c24 = peg$literalExpectation(",", false),
          peg$c25 = "[",
          peg$c26 = peg$literalExpectation("[", false),
          peg$c27 = "]",
          peg$c28 = peg$literalExpectation("]", false),
          peg$c29 = "=",
          peg$c30 = peg$literalExpectation("=", false),
          peg$c31 = "(",
          peg$c32 = peg$literalExpectation("(", false),
          peg$c33 = ")",
          peg$c34 = peg$literalExpectation(")", false),
          peg$c35 = "{",
          peg$c36 = peg$literalExpectation("{", false),
          peg$c37 = "}",
          peg$c38 = peg$literalExpectation("}", false),
          peg$c39 = function(statements) {
                // Skip blank statements.  These were either whitespace or
                var result = new node({
                  type: "root",
                  statements: []
                });
                for (var i = 0; i < statements.length; i++) {
                  if (statements[i]) {
                    result.statements = result.statements.concat(statements[i]);
                  }
                }
                return result;
              },
          peg$c40 = function(statement) { return statement; },
          peg$c41 = function() { return ""; },
          peg$c42 = "#",
          peg$c43 = peg$literalExpectation("#", false),
          peg$c44 = "undef",
          peg$c45 = peg$literalExpectation("undef", false),
          peg$c46 = "pragma",
          peg$c47 = peg$literalExpectation("pragma", false),
          peg$c48 = "version",
          peg$c49 = peg$literalExpectation("version", false),
          peg$c50 = "error",
          peg$c51 = peg$literalExpectation("error", false),
          peg$c52 = "extension",
          peg$c53 = peg$literalExpectation("extension", false),
          peg$c54 = "line",
          peg$c55 = peg$literalExpectation("line", false),
          peg$c56 = function(directive, defname) {return defname.join("")},
          peg$c57 = function(directive, value) {
              return new node({
                type: "preprocessor",
                directive: "#" + directive,
                value: value
              });
            },
          peg$c58 = /^[A-Za-z_]/,
          peg$c59 = peg$classExpectation([["A", "Z"], ["a", "z"], "_"], false, false),
          peg$c60 = /^[A-Za-z_0-9]/,
          peg$c61 = peg$classExpectation([["A", "Z"], ["a", "z"], "_", ["0", "9"]], false, false),
          peg$c62 = function(head, tail) {
               return new node({
                 type: "identifier",
                 name: head + tail.join("")
               });
            },
          peg$c63 = function(head, tail) {
              if (!head) {
                return [];
              }
              return [ head ].concat(tail.map(function(item) { return item[1]; }));
            },
          peg$c64 = /^[^()]/,
          peg$c65 = peg$classExpectation(["(", ")"], true, false),
          peg$c66 = function(head, paren, tail) {
              return head.join("") + paren + tail.join("");
            },
          peg$c67 = function(value) {
              return "(" + value + ")";
            },
          peg$c68 = /^[^,)]/,
          peg$c69 = peg$classExpectation([",", ")"], true, false),
          peg$c70 = function(value) {
              return value.join("");
            },
          peg$c71 = function(head, tail) {
              return [head].concat(tail.map(function(item) { return item[1]; }));
            },
          peg$c72 = function(macro_name, parameters) {
                var result = new node({
                  type: "macro_call",
                  macro_name: macro_name,
                  parameters: parameters
                });
                if (!parameters) {
                  result.parameters = [];
                }
                return result;
              },
          peg$c73 = function(head, tail) {
              return {
                macro_call: head,
                rest_of_line: tail.join('')
              }
            },
          peg$c74 = "define",
          peg$c75 = peg$literalExpectation("define", false),
          peg$c76 = /^[ \t]/,
          peg$c77 = peg$classExpectation([" ", "\t"], false, false),
          peg$c78 = function(identifier, parameters, defname) {return defname.join("")},
          peg$c79 = function(identifier, parameters, token_string) {
              return new node({
                   type: "preprocessor",
                   directive: "#define",
                   identifier: identifier.name,
                   token_string: token_string,
                   parameters: parameters || null
                 });
               },
          peg$c80 = "ifdef",
          peg$c81 = peg$literalExpectation("ifdef", false),
          peg$c82 = "ifndef",
          peg$c83 = peg$literalExpectation("ifndef", false),
          peg$c84 = "if",
          peg$c85 = peg$literalExpectation("if", false),
          peg$c86 = function(directive, value) {
                 return new node({
                   type: "preprocessor",
                   directive: "#" + directive,
                   value: value
                 });
               },
          peg$c87 = "elif",
          peg$c88 = peg$literalExpectation("elif", false),
          peg$c89 = function(defname) {return defname.join("")},
          peg$c90 = function(value) {
                return new node({
                  type: "preprocessor",
                  directive: "#elif",
                  value: value
                });
              },
          peg$c91 = "else",
          peg$c92 = peg$literalExpectation("else", false),
          peg$c93 = function() {
              return new node({
                type: "preprocessor",
                directive: "#else"
              });
            },
          peg$c94 = "endif",
          peg$c95 = peg$literalExpectation("endif", false),
          peg$c96 = function(if_directive, elif_directive, else_directive) {
                return preprocessor_branch(if_directive, elif_directive, else_directive);
              },
          peg$c97 = function(prototype, body) {
                var result = new node({
                  type: "function_declaration",
                  name: prototype.name,
                  returnType: prototype.returnType,
                  parameters: prototype.parameters,
                  body: body
                });
                return result;
            },
          peg$c98 = function(statements) {
                var result = new node({
                  type: "scope",
                  statements: []
                });
                if (statements && statements.statements) {
                  result.statements = statements.statements;
                }
                return result;
              },
          peg$c99 = function(list) {return {statements: list};},
          peg$c100 = function(statement) {
              return statement;
            },
          peg$c101 = function(condition, if_body, else_body) {
                 var result = new node({
                   type:"if_statement",
                   condition:condition,
                   body:if_body
                 });
                 if (else_body) {
                   result.elseBody = else_body[2];
                 }
                 return result;
               },
          peg$c102 = "for",
          peg$c103 = peg$literalExpectation("for", false),
          peg$c104 = function(initializer, condition, increment, body) {
                  return new node({
                    type:"for_statement",
                    initializer:initializer,
                    condition:condition,
                    increment:increment,
                    body:body
                  });
                },
          peg$c105 = "while",
          peg$c106 = peg$literalExpectation("while", false),
          peg$c107 = function(condition) {
                 return {
                   condition:condition
                 };
               },
          peg$c108 = function(w, body) {
                return new node({
                  type: "while_statement",
                  condition: w.condition,
                  body: body
                });
              },
          peg$c109 = "do",
          peg$c110 = peg$literalExpectation("do", false),
          peg$c111 = function(body, w) {
                 return new node({
                   type: "do_statement",
                   condition: w.condition,
                   body: body
                 });
               },
          peg$c112 = "return",
          peg$c113 = peg$literalExpectation("return", false),
          peg$c114 = function(expression) {
                return new node({
                  type: "return",
                  value: expression
                });
              },
          peg$c115 = "continue",
          peg$c116 = peg$literalExpectation("continue", false),
          peg$c117 = "break",
          peg$c118 = peg$literalExpectation("break", false),
          peg$c119 = function() { return shaderType == "fs" },
          peg$c120 = "discard",
          peg$c121 = peg$literalExpectation("discard", false),
          peg$c122 = function() {return "discard";},
          peg$c123 = function(type) {
                      return new node({
                        type:type[0]
                      });
                    },
          peg$c124 = function(e) {
                return new node({
                  type: "expression",
                  expression: e
                });
            },
          peg$c125 = peg$otherExpectation("declaration"),
          peg$c126 = function(function_prototype) {
                return function_prototype;
              },
          peg$c127 = function(type, declarators) {
                return new node({
                  type: "declarator",
                  typeAttribute: type,
                  declarators: declarators
                });
              },
          peg$c128 = function() { return shaderType == "vs"; },
          peg$c129 = "invariant",
          peg$c130 = peg$literalExpectation("invariant", false),
          peg$c131 = function(head, tail) {
                  var items = [ head ].concat(tail.map(function(item) {
                    return item[1]; }));
                  return new node({
                    type: "invariant",
                    identifiers: items
                  });
                },
          peg$c132 = "precision",
          peg$c133 = peg$literalExpectation("precision", false),
          peg$c134 = function(precission, type) {
                return new node({
                  type:"precision",
                  precision: precission,
                  typeName: type
                });
              },
          peg$c135 = function(type, declarators) {
              return new node({
                type: "declarator",
                typeAttribute: type,
                declarators: declarators
              });
            },
          peg$c136 = "void",
          peg$c137 = peg$literalExpectation("void", false),
          peg$c138 = function(head, tail) {
                return [ head ].concat(tail.map(function(item) { return item[1]; }));
              },
          peg$c139 = function(type, identifier, parameters) {
                var result = new node({
                  type:"function_prototype",
                  name: identifier.name,
                  returnType: type,
                  parameters: parameters
                });
                if (parameters == "void" || !parameters) {
                  result.parameters = [];
                }
                return result;
              },
          peg$c140 = "inout",
          peg$c141 = peg$literalExpectation("inout", false),
          peg$c142 = "in",
          peg$c143 = peg$literalExpectation("in", false),
          peg$c144 = "out",
          peg$c145 = peg$literalExpectation("out", false),
          peg$c146 = function(const_qualifier, parameter, precision, type_name, identifier, array_size) {
              var result = new node({
                type: "parameter",
                type_name: type_name,
                name: identifier.name
              });
              if (const_qualifier) result.typeQualifier = const_qualifier[0];
              if (parameter) result.parameterQualifier = parameter[0];
              if (precision) result.precision = precision[0];
              if (array_size) result.arraySize = array_size[1];
              // "const" is only legal on "in" parameter qualifiers.
              if (result.typeQualifier &&
                  result.parameterQualifier &&
                  result.parameterQualifier != "in") {
                return null;
              } else {
                return result;
              }
            },
          peg$c147 = function(head, tail) {
              return [ head ].concat(tail.map(function(item) { return item[1]; }));
            },
          peg$c148 = function(name) {
                return new node({
                  type: "declarator_item",
                  name:name
                });
              },
          peg$c149 = function(name, arraySize) {
                return new node({
                  type: "declarator_item",
                  name: name,
                  arraySize: arraySize,
                  isArray: true
                });
              },
          peg$c150 = function(name) {
                return new node({
                  type: "declarator_item",
                  name: name,
                  isArray: true
                });
              },
          peg$c151 = function(name, initializer) {
                return new node({
                  type: "declarator_item",
                  name: name,
                  initializer:initializer
                });
              },
          peg$c152 = function(declarators) {
               return declarators.map(function(item) {
                 return new node({
                   type: "declarator",
                   typeAttribute: item[0],
                   declarators: item[2]
                 })
                });
            },
          peg$c153 = "struct",
          peg$c154 = peg$literalExpectation("struct", false),
          peg$c155 = function(qualifier, identifier, members, declarators) {
                var result = new node({
                  type: "struct_definition",
                  members:members
                });
                if (qualifier) {
                  result.qualifier = qualifier[0];
                }
                if (identifier) {
                  result.name = identifier[1].name;
                  typeNames[result.name] = result;
                }
                if (declarators) {
                  result.declarators = declarators;
                }
                return result;
              },
          peg$c156 = function(precision, name) {
              var result = new node({
                type: "type",
                name: name
              });
              if (precision) result.precision = precision[0];
              return result;
            },
          peg$c157 = peg$otherExpectation("locally specified type"),
          peg$c158 = function(qualifier, type) {
              var result = type;
              if (qualifier) result.qualifier = qualifier[0];
              return result;
            },
          peg$c159 = "attribute",
          peg$c160 = peg$literalExpectation("attribute", false),
          peg$c161 = function() {
              return "attribute";
            },
          peg$c162 = function(qualifier, type) {
              var result = type;
              result.qualifier = qualifier;
              return result;
            },
          peg$c163 = peg$otherExpectation("fully specified type"),
          peg$c164 = peg$otherExpectation("precision qualifier"),
          peg$c165 = "highp",
          peg$c166 = peg$literalExpectation("highp", false),
          peg$c167 = "mediump",
          peg$c168 = peg$literalExpectation("mediump", false),
          peg$c169 = "lowp",
          peg$c170 = peg$literalExpectation("lowp", false),
          peg$c171 = "const",
          peg$c172 = peg$literalExpectation("const", false),
          peg$c173 = peg$otherExpectation("type qualifier"),
          peg$c174 = "varying",
          peg$c175 = peg$literalExpectation("varying", false),
          peg$c176 = function() { return "invariant varying"; },
          peg$c177 = "uniform",
          peg$c178 = peg$literalExpectation("uniform", false),
          peg$c179 = peg$otherExpectation("void"),
          peg$c180 = function() {
              return new node({
                type: "type",
                name: "void"
              })
            },
          peg$c181 = peg$otherExpectation("type name"),
          peg$c182 = "float",
          peg$c183 = peg$literalExpectation("float", false),
          peg$c184 = "int",
          peg$c185 = peg$literalExpectation("int", false),
          peg$c186 = "bool",
          peg$c187 = peg$literalExpectation("bool", false),
          peg$c188 = "sampler2D",
          peg$c189 = peg$literalExpectation("sampler2D", false),
          peg$c190 = "samplerCube",
          peg$c191 = peg$literalExpectation("samplerCube", false),
          peg$c192 = function(name) {
                if (name.name in typeNames) {
                   return name.name;
                } else {
                  return null;
                }
              },
          peg$c193 = peg$otherExpectation("identifier"),
          peg$c194 = /^[^A-Za-z_0-9]/,
          peg$c195 = peg$classExpectation([["A", "Z"], ["a", "z"], "_", ["0", "9"]], true, false),
          peg$c196 = peg$otherExpectation("keyword"),
          peg$c197 = "true",
          peg$c198 = peg$literalExpectation("true", false),
          peg$c199 = "false",
          peg$c200 = peg$literalExpectation("false", false),
          peg$c201 = /^[bi]/,
          peg$c202 = peg$classExpectation(["b", "i"], false, false),
          peg$c203 = "vec",
          peg$c204 = peg$literalExpectation("vec", false),
          peg$c205 = /^[234]/,
          peg$c206 = peg$classExpectation(["2", "3", "4"], false, false),
          peg$c207 = function(a) { return a.join(""); },
          peg$c208 = "mat",
          peg$c209 = peg$literalExpectation("mat", false),
          peg$c210 = peg$otherExpectation("reserved name"),
          peg$c211 = "__",
          peg$c212 = peg$literalExpectation("__", false),
          peg$c213 = /^[A-Za-z0-9]/,
          peg$c214 = peg$classExpectation([["A", "Z"], ["a", "z"], ["0", "9"]], false, false),
          peg$c215 = "_",
          peg$c216 = peg$literalExpectation("_", false),
          peg$c217 = /^[1-9]/,
          peg$c218 = peg$classExpectation([["1", "9"]], false, false),
          peg$c219 = /^[0-9]/,
          peg$c220 = peg$classExpectation([["0", "9"]], false, false),
          peg$c221 = function(head, tail) {
                return new node({
                  type: "int",
                  value: parseInt([head].concat(tail).join(""), 10)
                });
              },
          peg$c222 = "0",
          peg$c223 = peg$literalExpectation("0", false),
          peg$c224 = /^[Xx]/,
          peg$c225 = peg$classExpectation(["X", "x"], false, false),
          peg$c226 = /^[0-9A-Fa-f]/,
          peg$c227 = peg$classExpectation([["0", "9"], ["A", "F"], ["a", "f"]], false, false),
          peg$c228 = function(digits) {
                return new node({
                  type:"int",
                  value:parseInt(digits.join(""), 16)
                });
              },
          peg$c229 = /^[0-7]/,
          peg$c230 = peg$classExpectation([["0", "7"]], false, false),
          peg$c231 = function(digits) {
                return new node({
                  type:"int",
                  value:parseInt(digits.join(""), 8)
                });
              },
          peg$c232 = function() {
                return new node({
                  type: "int",
                  value: 0
                });
              },
          peg$c233 = ".",
          peg$c234 = peg$literalExpectation(".", false),
          peg$c235 = function(digits) {
                digits[0] = digits[0].join("");
                digits[2] = digits[2].join("");
                return new node({
                  type: "float",
                  value:parseFloat(digits.join(""))
                });
              },
          peg$c236 = function(digits) {
                return new node({
                  type: "float",
                  value: parseFloat(digits[0].join("") + digits[1])
                });
            },
          peg$c237 = /^[Ee]/,
          peg$c238 = peg$classExpectation(["E", "e"], false, false),
          peg$c239 = /^[+\-]/,
          peg$c240 = peg$classExpectation(["+", "-"], false, false),
          peg$c241 = function(sign, exponent) {
                return ["e", sign].concat(exponent).join("");
             },
          peg$c242 = function(expression) {
                return expression;
              },
          peg$c243 = function(value) {
              return new node({
                type: "bool",
                value: value == "true"
              });
            },
          peg$c244 = function(index) {
              return new node({
                type: "accessor",
                index: index
              });
            },
          peg$c245 = function(id) {
              return new node({
                type: "field_selector",
                selection: id.name
              })
            },
          peg$c246 = function(head, tail) {
                var result = head;
                for (var i = 0; i < tail.length; i++) {
                  result = new node({
                    type: "postfix",
                    operator: tail[i],
                    expression: result
                  })
                }
                return result;
              },
          peg$c247 = "++",
          peg$c248 = peg$literalExpectation("++", false),
          peg$c249 = "--",
          peg$c250 = peg$literalExpectation("--", false),
          peg$c251 = function(head, tail, rest) {
                var result = head;
                if(tail) {
                  result = new node({
                    type: "postfix",
                    operator: new node({
                      id: next_id++,
                      type: "operator",
                      operator: tail
                    }),
                    expression: result
                  })
                }
                for (var i = 0; i < rest.length; i++) {
                  result = new node({
                    type: "postfix",
                    operator: rest[i],
                    expression: result
                  })
                }
                return result;
              },
          peg$c252 = function() {return []; },
          peg$c253 = function(head, tail) {
                return [ head ].concat(tail.map(function(item) { return item[1] }));
              },
          peg$c254 = function(function_name, parameters) {
                var result = new node({
                  type: "function_call",
                  function_name: function_name,
                  parameters: parameters
                });
                if (!parameters) {
                  result.parameters = [];
                }
                return result;
              },
          peg$c255 = function(id) {return id.name;},
          peg$c256 = "!",
          peg$c257 = peg$literalExpectation("!", false),
          peg$c258 = "~",
          peg$c259 = peg$literalExpectation("~", false),
          peg$c260 = "+",
          peg$c261 = peg$literalExpectation("+", false),
          peg$c262 = "-",
          peg$c263 = peg$literalExpectation("-", false),
          peg$c264 = function(head, tail) {
                var result = tail
                if (head) {
                  result = new node({
                    type: "unary",
                    expression: result,
                    operator: new node({
                      type: "operator",
                      operator: head
                    })
                  });
                }
                return result;
              },
          peg$c265 = "*",
          peg$c266 = peg$literalExpectation("*", false),
          peg$c267 = "/",
          peg$c268 = peg$literalExpectation("/", false),
          peg$c269 = "%",
          peg$c270 = peg$literalExpectation("%", false),
          peg$c271 = function(operator) {
              return new node({
                type: "operator",
                operator: operator
              });
            },
          peg$c272 = function(head, tail) {
                return daisy_chain(head, tail);
              },
          peg$c273 = function() {
              return new node({
                type: "operator",
                operator: "+"
              });
            },
          peg$c274 = function() {
              return new node({
                type: "operator",
                operator: "-"
              });
            },
          peg$c275 = "<<",
          peg$c276 = peg$literalExpectation("<<", false),
          peg$c277 = ">>",
          peg$c278 = peg$literalExpectation(">>", false),
          peg$c279 = "<",
          peg$c280 = peg$literalExpectation("<", false),
          peg$c281 = function(equal) {
              return new node({
                type: "operator",
                operator: "<" + (equal || "")
              });
            },
          peg$c282 = ">",
          peg$c283 = peg$literalExpectation(">", false),
          peg$c284 = function(equal) {
              return new node({
                type: "operator",
                operator: ">" + (equal || "")
              });
            },
          peg$c285 = "==",
          peg$c286 = peg$literalExpectation("==", false),
          peg$c287 = "!=",
          peg$c288 = peg$literalExpectation("!=", false),
          peg$c289 = function(operator) {
               return new node({
                 type: "operator",
                 operator: operator
               });
             },
          peg$c290 = "&",
          peg$c291 = peg$literalExpectation("&", false),
          peg$c292 = function() {
               return new node({
                 type: "operator",
                 operator: "&"
               });
             },
          peg$c293 = "^",
          peg$c294 = peg$literalExpectation("^", false),
          peg$c295 = function() {
               return new node({
                 type: "operator",
                 operator: "^"
               });
             },
          peg$c296 = "|",
          peg$c297 = peg$literalExpectation("|", false),
          peg$c298 = function() {
               return new node({
                 type: "operator",
                 operator: "|"
               });
             },
          peg$c299 = "&&",
          peg$c300 = peg$literalExpectation("&&", false),
          peg$c301 = function() {
               return new node({
                 type: "operator",
                 operator: "&&"
               });
             },
          peg$c302 = "^^",
          peg$c303 = peg$literalExpectation("^^", false),
          peg$c304 = function() {
               return new node({
                 type: "operator",
                 operator: "^^"
               });
             },
          peg$c305 = "||",
          peg$c306 = peg$literalExpectation("||", false),
          peg$c307 = function() {
               return new node({
                 type: "operator",
                 operator: "||"
               });
             },
          peg$c308 = "?",
          peg$c309 = peg$literalExpectation("?", false),
          peg$c310 = ":",
          peg$c311 = peg$literalExpectation(":", false),
          peg$c312 = function(head, tail) {
                var result = head;
                if (tail) {
                  result = new node({
                    type: "ternary",
                    condition: head,
                    is_true: tail[3],
                    is_false: tail[7]
                  })
                }
                return result;
              },
          peg$c313 = "*=",
          peg$c314 = peg$literalExpectation("*=", false),
          peg$c315 = "/=",
          peg$c316 = peg$literalExpectation("/=", false),
          peg$c317 = "%=",
          peg$c318 = peg$literalExpectation("%=", false),
          peg$c319 = "+=",
          peg$c320 = peg$literalExpectation("+=", false),
          peg$c321 = "-=",
          peg$c322 = peg$literalExpectation("-=", false),
          peg$c323 = "<<=",
          peg$c324 = peg$literalExpectation("<<=", false),
          peg$c325 = ">>=",
          peg$c326 = peg$literalExpectation(">>=", false),
          peg$c327 = "&=",
          peg$c328 = peg$literalExpectation("&=", false),
          peg$c329 = "^=",
          peg$c330 = peg$literalExpectation("^=", false),
          peg$c331 = "|=",
          peg$c332 = peg$literalExpectation("|=", false),
          peg$c333 = function(variable, operator, expression) {
                return new node({
                  type: "binary",
                  operator: new node({
                    type: "operator",
                    operator: operator
                  }),
                  left: variable,
                  right: expression
                });
              },
  
          peg$currPos          = 0,
          peg$savedPos         = 0,
          peg$posDetailsCache  = [{ line: 1, column: 1 }],
          peg$maxFailPos       = 0,
          peg$maxFailExpected  = [],
          peg$silentFails      = 0,
  
          peg$result;
  
      if ("startRule" in options) {
        if (!(options.startRule in peg$startRuleFunctions)) {
          throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
        }
  
        peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
      }
  
      function text() {
        return input.substring(peg$savedPos, peg$currPos);
      }
  
      function location() {
        return peg$computeLocation(peg$savedPos, peg$currPos);
      }
  
      function expected(description, location) {
        location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
  
        throw peg$buildStructuredError(
          [peg$otherExpectation(description)],
          input.substring(peg$savedPos, peg$currPos),
          location
        );
      }
  
      function error(message, location) {
        location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
  
        throw peg$buildSimpleError(message, location);
      }
  
      function peg$literalExpectation(text, ignoreCase) {
        return { type: "literal", text: text, ignoreCase: ignoreCase };
      }
  
      function peg$classExpectation(parts, inverted, ignoreCase) {
        return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
      }
  
      function peg$anyExpectation() {
        return { type: "any" };
      }
  
      function peg$endExpectation() {
        return { type: "end" };
      }
  
      function peg$otherExpectation(description) {
        return { type: "other", description: description };
      }
  
      function peg$computePosDetails(pos) {
        var details = peg$posDetailsCache[pos], p;
  
        if (details) {
          return details;
        } else {
          p = pos - 1;
          while (!peg$posDetailsCache[p]) {
            p--;
          }
  
          details = peg$posDetailsCache[p];
          details = {
            line:   details.line,
            column: details.column
          };
  
          while (p < pos) {
            if (input.charCodeAt(p) === 10) {
              details.line++;
              details.column = 1;
            } else {
              details.column++;
            }
  
            p++;
          }
  
          peg$posDetailsCache[pos] = details;
          return details;
        }
      }
  
      function peg$computeLocation(startPos, endPos) {
        var startPosDetails = peg$computePosDetails(startPos),
            endPosDetails   = peg$computePosDetails(endPos);
  
        return {
          start: {
            offset: startPos,
            line:   startPosDetails.line,
            column: startPosDetails.column
          },
          end: {
            offset: endPos,
            line:   endPosDetails.line,
            column: endPosDetails.column
          }
        };
      }
  
      function peg$fail(expected) {
        if (peg$currPos < peg$maxFailPos) { return; }
  
        if (peg$currPos > peg$maxFailPos) {
          peg$maxFailPos = peg$currPos;
          peg$maxFailExpected = [];
        }
  
        peg$maxFailExpected.push(expected);
      }
  
      function peg$buildSimpleError(message, location) {
        return new peg$SyntaxError(message, null, null, location);
      }
  
      function peg$buildStructuredError(expected, found, location) {
        return new peg$SyntaxError(
          peg$SyntaxError.buildMessage(expected, found),
          expected,
          found,
          location
        );
      }
  
      function peg$parsestart() {
        var s0;
  
        s0 = peg$parseexternal_statement_list();
  
        return s0;
      }
  
      function peg$parsevertex_start() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        peg$savedPos = peg$currPos;
        s1 = peg$c0();
        if (s1) {
          s1 = void 0;
        } else {
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parseexternal_statement_list();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c1(s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsefragment_start() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        peg$savedPos = peg$currPos;
        s1 = peg$c2();
        if (s1) {
          s1 = void 0;
        } else {
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parseexternal_statement_list();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c1(s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsenewLine() {
        var s0, s1;
  
        s0 = peg$currPos;
        if (peg$c3.test(input.charAt(peg$currPos))) {
          s1 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c4); }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c5();
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseEOF() {
        var s0, s1;
  
        s0 = peg$currPos;
        peg$silentFails++;
        if (input.length > peg$currPos) {
          s1 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c6); }
        }
        peg$silentFails--;
        if (s1 === peg$FAILED) {
          s0 = void 0;
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parse_() {
        var s0, s1;
  
        peg$silentFails++;
        s0 = [];
        s1 = peg$parsenewLine();
        if (s1 === peg$FAILED) {
          if (peg$c8.test(input.charAt(peg$currPos))) {
            s1 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c9); }
          }
          if (s1 === peg$FAILED) {
            if (peg$c10.test(input.charAt(peg$currPos))) {
              s1 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s1 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c11); }
            }
            if (s1 === peg$FAILED) {
              s1 = peg$parsecomment();
            }
          }
        }
        if (s1 !== peg$FAILED) {
          while (s1 !== peg$FAILED) {
            s0.push(s1);
            s1 = peg$parsenewLine();
            if (s1 === peg$FAILED) {
              if (peg$c8.test(input.charAt(peg$currPos))) {
                s1 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s1 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c9); }
              }
              if (s1 === peg$FAILED) {
                if (peg$c10.test(input.charAt(peg$currPos))) {
                  s1 = input.charAt(peg$currPos);
                  peg$currPos++;
                } else {
                  s1 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c11); }
                }
                if (s1 === peg$FAILED) {
                  s1 = peg$parsecomment();
                }
              }
            }
          }
        } else {
          s0 = peg$FAILED;
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c7); }
        }
  
        return s0;
      }
  
      function peg$parsenoNewlineComment() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c12) {
          s1 = peg$c12;
          peg$currPos += 2;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c13); }
        }
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$currPos;
          peg$silentFails++;
          if (input.substr(peg$currPos, 2) === peg$c14) {
            s5 = peg$c14;
            peg$currPos += 2;
          } else {
            s5 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c15); }
          }
          peg$silentFails--;
          if (s5 === peg$FAILED) {
            s4 = void 0;
          } else {
            peg$currPos = s4;
            s4 = peg$FAILED;
          }
          if (s4 !== peg$FAILED) {
            if (input.length > peg$currPos) {
              s5 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s5 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c6); }
            }
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$currPos;
            peg$silentFails++;
            if (input.substr(peg$currPos, 2) === peg$c14) {
              s5 = peg$c14;
              peg$currPos += 2;
            } else {
              s5 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c15); }
            }
            peg$silentFails--;
            if (s5 === peg$FAILED) {
              s4 = void 0;
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
            if (s4 !== peg$FAILED) {
              if (input.length > peg$currPos) {
                s5 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s5 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c6); }
              }
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            if (input.substr(peg$currPos, 2) === peg$c14) {
              s3 = peg$c14;
              peg$currPos += 2;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c15); }
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          if (input.substr(peg$currPos, 2) === peg$c16) {
            s1 = peg$c16;
            peg$currPos += 2;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c17); }
          }
          if (s1 !== peg$FAILED) {
            s2 = [];
            if (peg$c18.test(input.charAt(peg$currPos))) {
              s3 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c19); }
            }
            while (s3 !== peg$FAILED) {
              s2.push(s3);
              if (peg$c18.test(input.charAt(peg$currPos))) {
                s3 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c19); }
              }
            }
            if (s2 !== peg$FAILED) {
              s1 = [s1, s2];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        }
  
        return s0;
      }
  
      function peg$parsenoNewlineWhitespace() {
        var s0, s1;
  
        s0 = [];
        if (peg$c10.test(input.charAt(peg$currPos))) {
          s1 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c11); }
        }
        if (s1 === peg$FAILED) {
          s1 = peg$parsenoNewlineComment();
        }
        if (s1 !== peg$FAILED) {
          while (s1 !== peg$FAILED) {
            s0.push(s1);
            if (peg$c10.test(input.charAt(peg$currPos))) {
              s1 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s1 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c11); }
            }
            if (s1 === peg$FAILED) {
              s1 = peg$parsenoNewlineComment();
            }
          }
        } else {
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsecomment() {
        var s0, s1, s2, s3, s4, s5;
  
        peg$silentFails++;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c12) {
          s1 = peg$c12;
          peg$currPos += 2;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c13); }
        }
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$currPos;
          peg$silentFails++;
          if (input.substr(peg$currPos, 2) === peg$c14) {
            s5 = peg$c14;
            peg$currPos += 2;
          } else {
            s5 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c15); }
          }
          peg$silentFails--;
          if (s5 === peg$FAILED) {
            s4 = void 0;
          } else {
            peg$currPos = s4;
            s4 = peg$FAILED;
          }
          if (s4 !== peg$FAILED) {
            if (input.length > peg$currPos) {
              s5 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s5 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c6); }
            }
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$currPos;
            peg$silentFails++;
            if (input.substr(peg$currPos, 2) === peg$c14) {
              s5 = peg$c14;
              peg$currPos += 2;
            } else {
              s5 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c15); }
            }
            peg$silentFails--;
            if (s5 === peg$FAILED) {
              s4 = void 0;
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
            if (s4 !== peg$FAILED) {
              if (input.length > peg$currPos) {
                s5 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s5 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c6); }
              }
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            if (input.substr(peg$currPos, 2) === peg$c14) {
              s3 = peg$c14;
              peg$currPos += 2;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c15); }
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          if (input.substr(peg$currPos, 2) === peg$c16) {
            s1 = peg$c16;
            peg$currPos += 2;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c17); }
          }
          if (s1 !== peg$FAILED) {
            s2 = [];
            if (peg$c18.test(input.charAt(peg$currPos))) {
              s3 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c19); }
            }
            while (s3 !== peg$FAILED) {
              s2.push(s3);
              if (peg$c18.test(input.charAt(peg$currPos))) {
                s3 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c19); }
              }
            }
            if (s2 !== peg$FAILED) {
              s3 = peg$parsenewLine();
              if (s3 === peg$FAILED) {
                s3 = peg$parseEOF();
              }
              if (s3 !== peg$FAILED) {
                s1 = [s1, s2, s3];
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c20); }
        }
  
        return s0;
      }
  
      function peg$parsesemicolon() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parse_();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 59) {
            s2 = peg$c21;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c22); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsecomma() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parse_();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 44) {
            s2 = peg$c23;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c24); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseleft_bracket() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parse_();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 91) {
            s2 = peg$c25;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c26); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseright_bracket() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parse_();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 93) {
            s2 = peg$c27;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c28); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseequals() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parse_();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 61) {
            s2 = peg$c29;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c30); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseleft_paren() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parse_();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 40) {
            s2 = peg$c31;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c32); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseright_paren() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parse_();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 41) {
            s2 = peg$c33;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c34); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseleft_brace() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parse_();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 123) {
            s2 = peg$c35;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c36); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseright_brace() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parse_();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 125) {
            s2 = peg$c37;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c38); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseexternal_statement_list() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = [];
        s2 = peg$parseexternal_statement();
        while (s2 !== peg$FAILED) {
          s1.push(s2);
          s2 = peg$parseexternal_statement();
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c39(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseexternal_statement() {
        var s0, s1;
  
        s0 = peg$currPos;
        s1 = peg$parsepreprocessor_external_branch();
        if (s1 === peg$FAILED) {
          s1 = peg$parseexternal_declaration();
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c40(s1);
        }
        s0 = s1;
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          s1 = peg$parse_();
          if (s1 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c41();
          }
          s0 = s1;
        }
  
        return s0;
      }
  
      function peg$parseexternal_declaration() {
        var s0;
  
        s0 = peg$parsefunction_definition();
        if (s0 === peg$FAILED) {
          s0 = peg$parseglobal_declaration();
          if (s0 === peg$FAILED) {
            s0 = peg$parsepreprocessor_define();
            if (s0 === peg$FAILED) {
              s0 = peg$parsepreprocessor_operator();
              if (s0 === peg$FAILED) {
                s0 = peg$parsestruct_definition();
                if (s0 === peg$FAILED) {
                  s0 = peg$parsemacro_call();
                }
              }
            }
          }
        }
  
        return s0;
      }
  
      function peg$parsepreprocessor_operator() {
        var s0, s1, s2, s3, s4, s5, s6;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 35) {
          s1 = peg$c42;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c43); }
        }
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c44) {
            s2 = peg$c44;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c45); }
          }
          if (s2 === peg$FAILED) {
            if (input.substr(peg$currPos, 6) === peg$c46) {
              s2 = peg$c46;
              peg$currPos += 6;
            } else {
              s2 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c47); }
            }
            if (s2 === peg$FAILED) {
              if (input.substr(peg$currPos, 7) === peg$c48) {
                s2 = peg$c48;
                peg$currPos += 7;
              } else {
                s2 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c49); }
              }
              if (s2 === peg$FAILED) {
                if (input.substr(peg$currPos, 5) === peg$c50) {
                  s2 = peg$c50;
                  peg$currPos += 5;
                } else {
                  s2 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c51); }
                }
                if (s2 === peg$FAILED) {
                  if (input.substr(peg$currPos, 9) === peg$c52) {
                    s2 = peg$c52;
                    peg$currPos += 9;
                  } else {
                    s2 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c53); }
                  }
                  if (s2 === peg$FAILED) {
                    if (input.substr(peg$currPos, 4) === peg$c54) {
                      s2 = peg$c54;
                      peg$currPos += 4;
                    } else {
                      s2 = peg$FAILED;
                      if (peg$silentFails === 0) { peg$fail(peg$c55); }
                    }
                  }
                }
              }
            }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 !== peg$FAILED) {
              s4 = peg$currPos;
              s5 = [];
              if (peg$c18.test(input.charAt(peg$currPos))) {
                s6 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s6 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c19); }
              }
              while (s6 !== peg$FAILED) {
                s5.push(s6);
                if (peg$c18.test(input.charAt(peg$currPos))) {
                  s6 = input.charAt(peg$currPos);
                  peg$currPos++;
                } else {
                  s6 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c19); }
                }
              }
              if (s5 !== peg$FAILED) {
                peg$savedPos = s4;
                s5 = peg$c56(s2, s5);
              }
              s4 = s5;
              if (s4 !== peg$FAILED) {
                s5 = peg$parsenewLine();
                if (s5 === peg$FAILED) {
                  s5 = peg$parseEOF();
                }
                if (s5 !== peg$FAILED) {
                  peg$savedPos = s0;
                  s1 = peg$c57(s2, s4);
                  s0 = s1;
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsemacro_identifier() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        if (peg$c58.test(input.charAt(peg$currPos))) {
          s1 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c59); }
        }
        if (s1 !== peg$FAILED) {
          s2 = [];
          if (peg$c60.test(input.charAt(peg$currPos))) {
            s3 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c61); }
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            if (peg$c60.test(input.charAt(peg$currPos))) {
              s3 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c61); }
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c62(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsepreprocessor_parameter_list() {
        var s0, s1, s2, s3, s4, s5, s6;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 40) {
          s1 = peg$c31;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c32); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parsemacro_identifier();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            s3 = [];
            s4 = peg$currPos;
            s5 = peg$parsecomma();
            if (s5 !== peg$FAILED) {
              s6 = peg$parsemacro_identifier();
              if (s6 !== peg$FAILED) {
                s5 = [s5, s6];
                s4 = s5;
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
            while (s4 !== peg$FAILED) {
              s3.push(s4);
              s4 = peg$currPos;
              s5 = peg$parsecomma();
              if (s5 !== peg$FAILED) {
                s6 = peg$parsemacro_identifier();
                if (s6 !== peg$FAILED) {
                  s5 = [s5, s6];
                  s4 = s5;
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parseright_paren();
              if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c63(s2, s3);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsemacro_paren_parameter() {
        var s0, s1, s2, s3, s4, s5, s6;
  
        s0 = peg$currPos;
        s1 = peg$parseleft_paren();
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          s3 = [];
          if (peg$c64.test(input.charAt(peg$currPos))) {
            s4 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s4 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c65); }
          }
          while (s4 !== peg$FAILED) {
            s3.push(s4);
            if (peg$c64.test(input.charAt(peg$currPos))) {
              s4 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s4 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c65); }
            }
          }
          if (s3 !== peg$FAILED) {
            s4 = peg$parsemacro_paren_parameter();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = [];
              if (peg$c64.test(input.charAt(peg$currPos))) {
                s6 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s6 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c65); }
              }
              while (s6 !== peg$FAILED) {
                s5.push(s6);
                if (peg$c64.test(input.charAt(peg$currPos))) {
                  s6 = input.charAt(peg$currPos);
                  peg$currPos++;
                } else {
                  s6 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c65); }
                }
              }
              if (s5 !== peg$FAILED) {
                peg$savedPos = s2;
                s3 = peg$c66(s3, s4, s5);
                s2 = s3;
              } else {
                peg$currPos = s2;
                s2 = peg$FAILED;
              }
            } else {
              peg$currPos = s2;
              s2 = peg$FAILED;
            }
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parseright_paren();
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c67(s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsemacro_call_parameter() {
        var s0, s1, s2;
  
        s0 = peg$parsemacro_paren_parameter();
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          s1 = [];
          if (peg$c68.test(input.charAt(peg$currPos))) {
            s2 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c69); }
          }
          while (s2 !== peg$FAILED) {
            s1.push(s2);
            if (peg$c68.test(input.charAt(peg$currPos))) {
              s2 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s2 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c69); }
            }
          }
          if (s1 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c70(s1);
          }
          s0 = s1;
        }
  
        return s0;
      }
  
      function peg$parsemacro_call_parameter_list() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$parsemacro_call_parameter();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parsecomma();
          if (s4 !== peg$FAILED) {
            s5 = peg$parsemacro_call_parameter();
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parsecomma();
            if (s4 !== peg$FAILED) {
              s5 = peg$parsemacro_call_parameter();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c71(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsemacro_call() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$parsemacro_identifier();
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parseleft_paren();
            if (s3 !== peg$FAILED) {
              s4 = peg$parseparameter_list();
              if (s4 === peg$FAILED) {
                s4 = null;
              }
              if (s4 !== peg$FAILED) {
                if (input.charCodeAt(peg$currPos) === 41) {
                  s5 = peg$c33;
                  peg$currPos++;
                } else {
                  s5 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c34); }
                }
                if (s5 !== peg$FAILED) {
                  peg$savedPos = s0;
                  s1 = peg$c72(s1, s4);
                  s0 = s1;
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsemacro_call_line() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parsemacro_call();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          s2 = [];
          if (peg$c18.test(input.charAt(peg$currPos))) {
            s3 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c19); }
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            if (peg$c18.test(input.charAt(peg$currPos))) {
              s3 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c19); }
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c73(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsepreprocessor_define() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 35) {
          s1 = peg$c42;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c43); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            if (input.substr(peg$currPos, 6) === peg$c74) {
              s3 = peg$c74;
              peg$currPos += 6;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c75); }
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parse_();
              if (s4 !== peg$FAILED) {
                s5 = peg$parsemacro_identifier();
                if (s5 !== peg$FAILED) {
                  s6 = peg$parsepreprocessor_parameter_list();
                  if (s6 === peg$FAILED) {
                    s6 = null;
                  }
                  if (s6 !== peg$FAILED) {
                    s7 = [];
                    if (peg$c76.test(input.charAt(peg$currPos))) {
                      s8 = input.charAt(peg$currPos);
                      peg$currPos++;
                    } else {
                      s8 = peg$FAILED;
                      if (peg$silentFails === 0) { peg$fail(peg$c77); }
                    }
                    while (s8 !== peg$FAILED) {
                      s7.push(s8);
                      if (peg$c76.test(input.charAt(peg$currPos))) {
                        s8 = input.charAt(peg$currPos);
                        peg$currPos++;
                      } else {
                        s8 = peg$FAILED;
                        if (peg$silentFails === 0) { peg$fail(peg$c77); }
                      }
                    }
                    if (s7 !== peg$FAILED) {
                      s8 = peg$currPos;
                      s9 = [];
                      if (peg$c18.test(input.charAt(peg$currPos))) {
                        s10 = input.charAt(peg$currPos);
                        peg$currPos++;
                      } else {
                        s10 = peg$FAILED;
                        if (peg$silentFails === 0) { peg$fail(peg$c19); }
                      }
                      while (s10 !== peg$FAILED) {
                        s9.push(s10);
                        if (peg$c18.test(input.charAt(peg$currPos))) {
                          s10 = input.charAt(peg$currPos);
                          peg$currPos++;
                        } else {
                          s10 = peg$FAILED;
                          if (peg$silentFails === 0) { peg$fail(peg$c19); }
                        }
                      }
                      if (s9 !== peg$FAILED) {
                        peg$savedPos = s8;
                        s9 = peg$c78(s5, s6, s9);
                      }
                      s8 = s9;
                      if (s8 !== peg$FAILED) {
                        s9 = peg$parsenewLine();
                        if (s9 === peg$FAILED) {
                          s9 = peg$parseEOF();
                        }
                        if (s9 !== peg$FAILED) {
                          peg$savedPos = s0;
                          s1 = peg$c79(s5, s6, s8);
                          s0 = s1;
                        } else {
                          peg$currPos = s0;
                          s0 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s0;
                        s0 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s0;
                      s0 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsepreprocessor_if() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 35) {
          s1 = peg$c42;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c43); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            if (input.substr(peg$currPos, 5) === peg$c80) {
              s3 = peg$c80;
              peg$currPos += 5;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c81); }
            }
            if (s3 === peg$FAILED) {
              if (input.substr(peg$currPos, 6) === peg$c82) {
                s3 = peg$c82;
                peg$currPos += 6;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c83); }
              }
              if (s3 === peg$FAILED) {
                if (input.substr(peg$currPos, 2) === peg$c84) {
                  s3 = peg$c84;
                  peg$currPos += 2;
                } else {
                  s3 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c85); }
                }
              }
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parse_();
              if (s4 !== peg$FAILED) {
                s5 = peg$currPos;
                s6 = [];
                if (peg$c18.test(input.charAt(peg$currPos))) {
                  s7 = input.charAt(peg$currPos);
                  peg$currPos++;
                } else {
                  s7 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c19); }
                }
                while (s7 !== peg$FAILED) {
                  s6.push(s7);
                  if (peg$c18.test(input.charAt(peg$currPos))) {
                    s7 = input.charAt(peg$currPos);
                    peg$currPos++;
                  } else {
                    s7 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c19); }
                  }
                }
                if (s6 !== peg$FAILED) {
                  peg$savedPos = s5;
                  s6 = peg$c56(s3, s6);
                }
                s5 = s6;
                if (s5 !== peg$FAILED) {
                  s6 = peg$parsenewLine();
                  if (s6 === peg$FAILED) {
                    s6 = peg$parseEOF();
                  }
                  if (s6 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s1 = peg$c86(s3, s5);
                    s0 = s1;
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsepreprocessor_else_if() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 35) {
          s1 = peg$c42;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c43); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            if (input.substr(peg$currPos, 4) === peg$c87) {
              s3 = peg$c87;
              peg$currPos += 4;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c88); }
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parse_();
              if (s4 !== peg$FAILED) {
                s5 = peg$currPos;
                s6 = [];
                if (peg$c18.test(input.charAt(peg$currPos))) {
                  s7 = input.charAt(peg$currPos);
                  peg$currPos++;
                } else {
                  s7 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c19); }
                }
                while (s7 !== peg$FAILED) {
                  s6.push(s7);
                  if (peg$c18.test(input.charAt(peg$currPos))) {
                    s7 = input.charAt(peg$currPos);
                    peg$currPos++;
                  } else {
                    s7 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c19); }
                  }
                }
                if (s6 !== peg$FAILED) {
                  peg$savedPos = s5;
                  s6 = peg$c89(s6);
                }
                s5 = s6;
                if (s5 !== peg$FAILED) {
                  s6 = peg$parsenewLine();
                  if (s6 === peg$FAILED) {
                    s6 = peg$parseEOF();
                  }
                  if (s6 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s1 = peg$c90(s5);
                    s0 = s1;
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsepreprocessor_else() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 35) {
          s1 = peg$c42;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c43); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            if (input.substr(peg$currPos, 4) === peg$c91) {
              s3 = peg$c91;
              peg$currPos += 4;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c92); }
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parsenoNewlineWhitespace();
              if (s4 === peg$FAILED) {
                s4 = null;
              }
              if (s4 !== peg$FAILED) {
                s5 = peg$parsenewLine();
                if (s5 !== peg$FAILED) {
                  peg$savedPos = s0;
                  s1 = peg$c93();
                  s0 = s1;
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsepreprocessor_end() {
        var s0, s1, s2, s3, s4, s5, s6;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 35) {
          s1 = peg$c42;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c43); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            if (input.substr(peg$currPos, 5) === peg$c94) {
              s3 = peg$c94;
              peg$currPos += 5;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c95); }
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parsenoNewlineWhitespace();
              if (s4 === peg$FAILED) {
                s4 = null;
              }
              if (s4 !== peg$FAILED) {
                s5 = peg$parsenewLine();
                if (s5 === peg$FAILED) {
                  s5 = peg$parseEOF();
                }
                if (s5 !== peg$FAILED) {
                  s6 = peg$parse_();
                  if (s6 === peg$FAILED) {
                    s6 = null;
                  }
                  if (s6 !== peg$FAILED) {
                    s1 = [s1, s2, s3, s4, s5, s6];
                    s0 = s1;
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsepreprocessor_external_branch() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsepreprocessor_if();
        if (s2 !== peg$FAILED) {
          s3 = peg$parseexternal_statement_list();
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parsepreprocessor_else_if();
          if (s4 !== peg$FAILED) {
            s5 = peg$parseexternal_statement_list();
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parsepreprocessor_else_if();
            if (s4 !== peg$FAILED) {
              s5 = peg$parseexternal_statement_list();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$currPos;
            s4 = peg$parsepreprocessor_else();
            if (s4 !== peg$FAILED) {
              s5 = peg$parseexternal_statement_list();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parsepreprocessor_end();
              if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c96(s1, s2, s3);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsepreprocessor_statement_branch() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsepreprocessor_if();
        if (s2 !== peg$FAILED) {
          s3 = peg$parsestatement_list();
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parsepreprocessor_else_if();
          if (s4 !== peg$FAILED) {
            s5 = peg$parsestatement_list();
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parsepreprocessor_else_if();
            if (s4 !== peg$FAILED) {
              s5 = peg$parsestatement_list();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$currPos;
            s4 = peg$parsepreprocessor_else();
            if (s4 !== peg$FAILED) {
              s5 = peg$parsestatement_list();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parsepreprocessor_end();
              if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c96(s1, s2, s3);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsefunction_definition() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsefunction_prototype();
        if (s1 !== peg$FAILED) {
          s2 = peg$parsecompound_statement();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c97(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsecompound_statement() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parseleft_brace();
        if (s1 !== peg$FAILED) {
          s2 = peg$parsestatement_list();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parseright_brace();
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c98(s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsestatement_list() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parse_();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$parsestatement_no_new_scope();
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$parsestatement_no_new_scope();
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parse_();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c99(s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsestatement_no_new_scope() {
        var s0;
  
        s0 = peg$parsecompound_statement();
        if (s0 === peg$FAILED) {
          s0 = peg$parsesimple_statement();
          if (s0 === peg$FAILED) {
            s0 = peg$parsepreprocessor_statement_branch();
          }
        }
  
        return s0;
      }
  
      function peg$parsestatement_with_scope() {
        var s0;
  
        s0 = peg$parsecompound_statement();
        if (s0 === peg$FAILED) {
          s0 = peg$parsesimple_statement();
          if (s0 === peg$FAILED) {
            s0 = peg$parsepreprocessor_statement_branch();
          }
        }
  
        return s0;
      }
  
      function peg$parsesimple_statement() {
        var s0, s1;
  
        s0 = peg$currPos;
        s1 = peg$parsedeclaration();
        if (s1 === peg$FAILED) {
          s1 = peg$parseexpression_statement();
          if (s1 === peg$FAILED) {
            s1 = peg$parseselection_statement();
            if (s1 === peg$FAILED) {
              s1 = peg$parseiteration_statement();
              if (s1 === peg$FAILED) {
                s1 = peg$parsejump_statement();
                if (s1 === peg$FAILED) {
                  s1 = peg$parsepreprocessor_define();
                  if (s1 === peg$FAILED) {
                    s1 = peg$parsepreprocessor_operator();
                    if (s1 === peg$FAILED) {
                      s1 = peg$parsemacro_call();
                    }
                  }
                }
              }
            }
          }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c100(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseselection_statement() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c84) {
          s1 = peg$c84;
          peg$currPos += 2;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c85); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parseleft_paren();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseassignment_expression();
            if (s3 !== peg$FAILED) {
              s4 = peg$parseright_paren();
              if (s4 !== peg$FAILED) {
                s5 = peg$parsestatement_with_scope();
                if (s5 !== peg$FAILED) {
                  s6 = peg$currPos;
                  if (input.substr(peg$currPos, 4) === peg$c91) {
                    s7 = peg$c91;
                    peg$currPos += 4;
                  } else {
                    s7 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c92); }
                  }
                  if (s7 !== peg$FAILED) {
                    s8 = peg$parse_();
                    if (s8 === peg$FAILED) {
                      s8 = null;
                    }
                    if (s8 !== peg$FAILED) {
                      s9 = peg$parsestatement_with_scope();
                      if (s9 !== peg$FAILED) {
                        s7 = [s7, s8, s9];
                        s6 = s7;
                      } else {
                        peg$currPos = s6;
                        s6 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s6;
                      s6 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s6;
                    s6 = peg$FAILED;
                  }
                  if (s6 === peg$FAILED) {
                    s6 = null;
                  }
                  if (s6 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s1 = peg$c101(s3, s5, s6);
                    s0 = s1;
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsefor_loop() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 3) === peg$c102) {
          s1 = peg$c102;
          peg$currPos += 3;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c103); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parseleft_paren();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseexpression_statement();
            if (s3 === peg$FAILED) {
              s3 = peg$parsedeclaration();
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parsecondition();
              if (s4 === peg$FAILED) {
                s4 = null;
              }
              if (s4 !== peg$FAILED) {
                s5 = peg$parsesemicolon();
                if (s5 !== peg$FAILED) {
                  s6 = peg$parseassignment_expression();
                  if (s6 === peg$FAILED) {
                    s6 = null;
                  }
                  if (s6 !== peg$FAILED) {
                    s7 = peg$parseright_paren();
                    if (s7 !== peg$FAILED) {
                      s8 = peg$parsestatement_no_new_scope();
                      if (s8 !== peg$FAILED) {
                        peg$savedPos = s0;
                        s1 = peg$c104(s3, s4, s6, s8);
                        s0 = s1;
                      } else {
                        peg$currPos = s0;
                        s0 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s0;
                      s0 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsewhile_statement() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 5) === peg$c105) {
          s1 = peg$c105;
          peg$currPos += 5;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c106); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parseleft_paren();
          if (s2 !== peg$FAILED) {
            s3 = peg$parsecondition();
            if (s3 !== peg$FAILED) {
              s4 = peg$parseright_paren();
              if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c107(s3);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsewhile_loop() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhile_statement();
        if (s1 !== peg$FAILED) {
          s2 = peg$parsestatement_no_new_scope();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c108(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsedo_while() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c109) {
          s1 = peg$c109;
          peg$currPos += 2;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c110); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parsestatement_with_scope();
          if (s2 !== peg$FAILED) {
            s3 = peg$parsewhile_statement();
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c111(s2, s3);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseiteration_statement() {
        var s0;
  
        s0 = peg$parsewhile_loop();
        if (s0 === peg$FAILED) {
          s0 = peg$parsedo_while();
          if (s0 === peg$FAILED) {
            s0 = peg$parsefor_loop();
          }
        }
  
        return s0;
      }
  
      function peg$parsejump_statement() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 6) === peg$c112) {
          s1 = peg$c112;
          peg$currPos += 6;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c113); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parseassignment_expression();
          if (s2 !== peg$FAILED) {
            s3 = peg$parsesemicolon();
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c114(s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          s1 = peg$currPos;
          if (input.substr(peg$currPos, 8) === peg$c115) {
            s2 = peg$c115;
            peg$currPos += 8;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c116); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parsesemicolon();
            if (s3 !== peg$FAILED) {
              s2 = [s2, s3];
              s1 = s2;
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
          if (s1 === peg$FAILED) {
            s1 = peg$currPos;
            if (input.substr(peg$currPos, 5) === peg$c117) {
              s2 = peg$c117;
              peg$currPos += 5;
            } else {
              s2 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c118); }
            }
            if (s2 !== peg$FAILED) {
              s3 = peg$parsesemicolon();
              if (s3 !== peg$FAILED) {
                s2 = [s2, s3];
                s1 = s2;
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
            if (s1 === peg$FAILED) {
              s1 = peg$currPos;
              if (input.substr(peg$currPos, 6) === peg$c112) {
                s2 = peg$c112;
                peg$currPos += 6;
              } else {
                s2 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c113); }
              }
              if (s2 !== peg$FAILED) {
                s3 = peg$parsesemicolon();
                if (s3 !== peg$FAILED) {
                  s2 = [s2, s3];
                  s1 = s2;
                } else {
                  peg$currPos = s1;
                  s1 = peg$FAILED;
                }
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
              if (s1 === peg$FAILED) {
                s1 = peg$currPos;
                s2 = peg$currPos;
                peg$savedPos = peg$currPos;
                s3 = peg$c119();
                if (s3) {
                  s3 = void 0;
                } else {
                  s3 = peg$FAILED;
                }
                if (s3 !== peg$FAILED) {
                  if (input.substr(peg$currPos, 7) === peg$c120) {
                    s4 = peg$c120;
                    peg$currPos += 7;
                  } else {
                    s4 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c121); }
                  }
                  if (s4 !== peg$FAILED) {
                    peg$savedPos = s2;
                    s3 = peg$c122();
                    s2 = s3;
                  } else {
                    peg$currPos = s2;
                    s2 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s2;
                  s2 = peg$FAILED;
                }
                if (s2 !== peg$FAILED) {
                  s3 = peg$parsesemicolon();
                  if (s3 !== peg$FAILED) {
                    s2 = [s2, s3];
                    s1 = s2;
                  } else {
                    peg$currPos = s1;
                    s1 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s1;
                  s1 = peg$FAILED;
                }
              }
            }
          }
          if (s1 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c123(s1);
          }
          s0 = s1;
        }
  
        return s0;
      }
  
      function peg$parseexpression_statement() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parseassignment_expression();
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parsesemicolon();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c124(s1);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsedeclaration() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        peg$silentFails++;
        s0 = peg$currPos;
        s1 = peg$parsefunction_prototype();
        if (s1 !== peg$FAILED) {
          s2 = peg$parsesemicolon();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c126(s1);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          s1 = peg$parselocally_specified_type();
          if (s1 !== peg$FAILED) {
            s2 = peg$parse_();
            if (s2 !== peg$FAILED) {
              s3 = peg$parseinit_declarator_list();
              if (s3 !== peg$FAILED) {
                s4 = peg$parsesemicolon();
                if (s4 !== peg$FAILED) {
                  peg$savedPos = s0;
                  s1 = peg$c127(s1, s3);
                  s0 = s1;
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
          if (s0 === peg$FAILED) {
            s0 = peg$currPos;
            peg$savedPos = peg$currPos;
            s1 = peg$c128();
            if (s1) {
              s1 = void 0;
            } else {
              s1 = peg$FAILED;
            }
            if (s1 !== peg$FAILED) {
              if (input.substr(peg$currPos, 9) === peg$c129) {
                s2 = peg$c129;
                peg$currPos += 9;
              } else {
                s2 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c130); }
              }
              if (s2 !== peg$FAILED) {
                s3 = peg$parse_();
                if (s3 !== peg$FAILED) {
                  s4 = peg$parseidentifier();
                  if (s4 !== peg$FAILED) {
                    s5 = [];
                    s6 = peg$currPos;
                    s7 = peg$parsecomma();
                    if (s7 !== peg$FAILED) {
                      s8 = peg$parseidentifier();
                      if (s8 !== peg$FAILED) {
                        s7 = [s7, s8];
                        s6 = s7;
                      } else {
                        peg$currPos = s6;
                        s6 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s6;
                      s6 = peg$FAILED;
                    }
                    while (s6 !== peg$FAILED) {
                      s5.push(s6);
                      s6 = peg$currPos;
                      s7 = peg$parsecomma();
                      if (s7 !== peg$FAILED) {
                        s8 = peg$parseidentifier();
                        if (s8 !== peg$FAILED) {
                          s7 = [s7, s8];
                          s6 = s7;
                        } else {
                          peg$currPos = s6;
                          s6 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s6;
                        s6 = peg$FAILED;
                      }
                    }
                    if (s5 !== peg$FAILED) {
                      s6 = peg$parsesemicolon();
                      if (s6 !== peg$FAILED) {
                        peg$savedPos = s0;
                        s1 = peg$c131(s4, s5);
                        s0 = s1;
                      } else {
                        peg$currPos = s0;
                        s0 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s0;
                      s0 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
            if (s0 === peg$FAILED) {
              s0 = peg$currPos;
              if (input.substr(peg$currPos, 9) === peg$c132) {
                s1 = peg$c132;
                peg$currPos += 9;
              } else {
                s1 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c133); }
              }
              if (s1 !== peg$FAILED) {
                s2 = peg$parse_();
                if (s2 !== peg$FAILED) {
                  s3 = peg$parseprecision_qualifier();
                  if (s3 !== peg$FAILED) {
                    s4 = peg$parse_();
                    if (s4 !== peg$FAILED) {
                      s5 = peg$parsetype_name();
                      if (s5 !== peg$FAILED) {
                        s6 = peg$parsesemicolon();
                        if (s6 !== peg$FAILED) {
                          peg$savedPos = s0;
                          s1 = peg$c134(s3, s5);
                          s0 = s1;
                        } else {
                          peg$currPos = s0;
                          s0 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s0;
                        s0 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s0;
                      s0 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            }
          }
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c125); }
        }
  
        return s0;
      }
  
      function peg$parseglobal_declaration() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$parsedeclaration();
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          s1 = peg$parsefully_specified_type();
          if (s1 !== peg$FAILED) {
            s2 = peg$parse_();
            if (s2 !== peg$FAILED) {
              s3 = peg$parseinit_declarator_list();
              if (s3 !== peg$FAILED) {
                s4 = peg$parsesemicolon();
                if (s4 !== peg$FAILED) {
                  peg$savedPos = s0;
                  s1 = peg$c135(s1, s3);
                  s0 = s1;
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
          if (s0 === peg$FAILED) {
            s0 = peg$currPos;
            s1 = peg$parseattribute_type();
            if (s1 !== peg$FAILED) {
              s2 = peg$parse_();
              if (s2 !== peg$FAILED) {
                s3 = peg$parsedeclarator_list_no_array();
                if (s3 !== peg$FAILED) {
                  s4 = peg$parsesemicolon();
                  if (s4 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s1 = peg$c135(s1, s3);
                    s0 = s1;
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          }
        }
  
        return s0;
      }
  
      function peg$parsefunction_prototype_parameter_list() {
        var s0, s1, s2, s3, s4, s5;
  
        if (input.substr(peg$currPos, 4) === peg$c136) {
          s0 = peg$c136;
          peg$currPos += 4;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c137); }
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          s1 = peg$parseparameter_declaration();
          if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$currPos;
            s4 = peg$parsecomma();
            if (s4 !== peg$FAILED) {
              s5 = peg$parseparameter_declaration();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
            while (s3 !== peg$FAILED) {
              s2.push(s3);
              s3 = peg$currPos;
              s4 = peg$parsecomma();
              if (s4 !== peg$FAILED) {
                s5 = peg$parseparameter_declaration();
                if (s5 !== peg$FAILED) {
                  s4 = [s4, s5];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            }
            if (s2 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c138(s1, s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        }
  
        return s0;
      }
  
      function peg$parsefunction_prototype() {
        var s0, s1, s2, s3, s4, s5, s6;
  
        s0 = peg$currPos;
        s1 = peg$parsevoid_type();
        if (s1 === peg$FAILED) {
          s1 = peg$parseprecision_type();
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseidentifier();
            if (s3 !== peg$FAILED) {
              s4 = peg$parseleft_paren();
              if (s4 !== peg$FAILED) {
                s5 = peg$parsefunction_prototype_parameter_list();
                if (s5 === peg$FAILED) {
                  s5 = null;
                }
                if (s5 !== peg$FAILED) {
                  s6 = peg$parseright_paren();
                  if (s6 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s1 = peg$c139(s1, s3, s5);
                    s0 = s1;
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseparameter_qualifier() {
        var s0;
  
        if (input.substr(peg$currPos, 5) === peg$c140) {
          s0 = peg$c140;
          peg$currPos += 5;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c141); }
        }
        if (s0 === peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c142) {
            s0 = peg$c142;
            peg$currPos += 2;
          } else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c143); }
          }
          if (s0 === peg$FAILED) {
            if (input.substr(peg$currPos, 3) === peg$c144) {
              s0 = peg$c144;
              peg$currPos += 3;
            } else {
              s0 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c145); }
            }
          }
        }
  
        return s0;
      }
  
      function peg$parseparameter_declaration() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parseconst_qualifier();
        if (s2 !== peg$FAILED) {
          s3 = peg$parse_();
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          s3 = peg$parseparameter_qualifier();
          if (s3 !== peg$FAILED) {
            s4 = peg$parse_();
            if (s4 !== peg$FAILED) {
              s3 = [s3, s4];
              s2 = s3;
            } else {
              peg$currPos = s2;
              s2 = peg$FAILED;
            }
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$currPos;
            s4 = peg$parseprecision_qualifier();
            if (s4 !== peg$FAILED) {
              s5 = peg$parse_();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parsetype_name();
              if (s4 !== peg$FAILED) {
                s5 = peg$parse_();
                if (s5 !== peg$FAILED) {
                  s6 = peg$parseidentifier();
                  if (s6 !== peg$FAILED) {
                    s7 = peg$currPos;
                    s8 = peg$parseleft_bracket();
                    if (s8 !== peg$FAILED) {
                      s9 = peg$parseconditional_expression();
                      if (s9 !== peg$FAILED) {
                        s10 = peg$parseright_bracket();
                        if (s10 !== peg$FAILED) {
                          s8 = [s8, s9, s10];
                          s7 = s8;
                        } else {
                          peg$currPos = s7;
                          s7 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s7;
                        s7 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s7;
                      s7 = peg$FAILED;
                    }
                    if (s7 === peg$FAILED) {
                      s7 = null;
                    }
                    if (s7 !== peg$FAILED) {
                      peg$savedPos = s0;
                      s1 = peg$c146(s1, s2, s3, s4, s6, s7);
                      s0 = s1;
                    } else {
                      peg$currPos = s0;
                      s0 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseinit_declarator_list() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$parseinit_declarator();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parsecomma();
          if (s4 !== peg$FAILED) {
            s5 = peg$parseinit_declarator();
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parsecomma();
            if (s4 !== peg$FAILED) {
              s5 = peg$parseinit_declarator();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c147(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsedeclarator_list() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$parsedeclarator();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parsecomma();
          if (s4 !== peg$FAILED) {
            s5 = peg$parsedeclarator();
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parsecomma();
            if (s4 !== peg$FAILED) {
              s5 = peg$parsedeclarator();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c147(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsedeclarator_list_no_array() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$parsedeclarator_no_array();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parsecomma();
          if (s4 !== peg$FAILED) {
            s5 = peg$parsedeclarator_no_array();
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parsecomma();
            if (s4 !== peg$FAILED) {
              s5 = peg$parsedeclarator_no_array();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c147(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsedeclarator_list_arrays_have_size() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$parsedeclarator_array_with_size();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parsecomma();
          if (s4 !== peg$FAILED) {
            s5 = peg$parsedeclarator_array_with_size();
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parsecomma();
            if (s4 !== peg$FAILED) {
              s5 = peg$parsedeclarator_array_with_size();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c147(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsedeclarator_no_array() {
        var s0, s1;
  
        s0 = peg$currPos;
        s1 = peg$parseidentifier();
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c148(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsedeclarator_array_with_size() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        s1 = peg$parseidentifier();
        if (s1 !== peg$FAILED) {
          s2 = peg$parseleft_bracket();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseconditional_expression();
            if (s3 !== peg$FAILED) {
              s4 = peg$parseright_bracket();
              if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c149(s1, s3);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$parsedeclarator_no_array();
        }
  
        return s0;
      }
  
      function peg$parsedeclarator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parseidentifier();
        if (s1 !== peg$FAILED) {
          s2 = peg$parseleft_bracket();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseright_bracket();
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c150(s1);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$parsedeclarator_array_with_size();
        }
  
        return s0;
      }
  
      function peg$parseinit_declarator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parseidentifier();
        if (s1 !== peg$FAILED) {
          s2 = peg$parseequals();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseconditional_expression();
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c151(s1, s3);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$parsedeclarator();
        }
  
        return s0;
      }
  
      function peg$parsemember_list() {
        var s0, s1, s2, s3, s4, s5, s6;
  
        s0 = peg$currPos;
        s1 = [];
        s2 = peg$currPos;
        s3 = peg$parselocally_specified_type();
        if (s3 !== peg$FAILED) {
          s4 = peg$parse_();
          if (s4 !== peg$FAILED) {
            s5 = peg$parsedeclarator_list_arrays_have_size();
            if (s5 !== peg$FAILED) {
              s6 = peg$parsesemicolon();
              if (s6 !== peg$FAILED) {
                s3 = [s3, s4, s5, s6];
                s2 = s3;
              } else {
                peg$currPos = s2;
                s2 = peg$FAILED;
              }
            } else {
              peg$currPos = s2;
              s2 = peg$FAILED;
            }
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
        } else {
          peg$currPos = s2;
          s2 = peg$FAILED;
        }
        if (s2 !== peg$FAILED) {
          while (s2 !== peg$FAILED) {
            s1.push(s2);
            s2 = peg$currPos;
            s3 = peg$parselocally_specified_type();
            if (s3 !== peg$FAILED) {
              s4 = peg$parse_();
              if (s4 !== peg$FAILED) {
                s5 = peg$parsedeclarator_list_arrays_have_size();
                if (s5 !== peg$FAILED) {
                  s6 = peg$parsesemicolon();
                  if (s6 !== peg$FAILED) {
                    s3 = [s3, s4, s5, s6];
                    s2 = s3;
                  } else {
                    peg$currPos = s2;
                    s2 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s2;
                  s2 = peg$FAILED;
                }
              } else {
                peg$currPos = s2;
                s2 = peg$FAILED;
              }
            } else {
              peg$currPos = s2;
              s2 = peg$FAILED;
            }
          }
        } else {
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c152(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsestruct_definition() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsetype_qualifier();
        if (s2 === peg$FAILED) {
          s2 = peg$parseattribute_qualifier();
        }
        if (s2 !== peg$FAILED) {
          s3 = peg$parse_();
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c153) {
            s2 = peg$c153;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c154); }
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 !== peg$FAILED) {
              s5 = peg$parseidentifier();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parseleft_brace();
              if (s4 !== peg$FAILED) {
                s5 = peg$parsemember_list();
                if (s5 !== peg$FAILED) {
                  s6 = peg$parseright_brace();
                  if (s6 !== peg$FAILED) {
                    s7 = peg$parsedeclarator_list();
                    if (s7 === peg$FAILED) {
                      s7 = null;
                    }
                    if (s7 !== peg$FAILED) {
                      s8 = peg$parsesemicolon();
                      if (s8 !== peg$FAILED) {
                        peg$savedPos = s0;
                        s1 = peg$c155(s1, s3, s5, s7);
                        s0 = s1;
                      } else {
                        peg$currPos = s0;
                        s0 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s0;
                      s0 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseprecision_type() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parseprecision_qualifier();
        if (s2 !== peg$FAILED) {
          s3 = peg$parse_();
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parsetype_name();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c156(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parselocally_specified_type() {
        var s0, s1, s2, s3;
  
        peg$silentFails++;
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parseconst_qualifier();
        if (s2 !== peg$FAILED) {
          s3 = peg$parse_();
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parseprecision_type();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c158(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c157); }
        }
  
        return s0;
      }
  
      function peg$parseattribute_qualifier() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        peg$savedPos = peg$currPos;
        s1 = peg$c128();
        if (s1) {
          s1 = void 0;
        } else {
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 9) === peg$c159) {
            s2 = peg$c159;
            peg$currPos += 9;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c160); }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c161();
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseattribute_type() {
        var s0, s1, s2, s3;
  
        peg$silentFails++;
        s0 = peg$currPos;
        s1 = peg$parseattribute_qualifier();
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseprecision_type();
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c162(s1, s3);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c157); }
        }
  
        return s0;
      }
  
      function peg$parsefully_specified_type() {
        var s0, s1, s2, s3;
  
        peg$silentFails++;
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsetype_qualifier();
        if (s2 !== peg$FAILED) {
          s3 = peg$parse_();
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parseprecision_type();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c158(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c163); }
        }
  
        return s0;
      }
  
      function peg$parseprecision_qualifier() {
        var s0, s1;
  
        peg$silentFails++;
        if (input.substr(peg$currPos, 5) === peg$c165) {
          s0 = peg$c165;
          peg$currPos += 5;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c166); }
        }
        if (s0 === peg$FAILED) {
          if (input.substr(peg$currPos, 7) === peg$c167) {
            s0 = peg$c167;
            peg$currPos += 7;
          } else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c168); }
          }
          if (s0 === peg$FAILED) {
            if (input.substr(peg$currPos, 4) === peg$c169) {
              s0 = peg$c169;
              peg$currPos += 4;
            } else {
              s0 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c170); }
            }
          }
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c164); }
        }
  
        return s0;
      }
  
      function peg$parseconst_qualifier() {
        var s0;
  
        if (input.substr(peg$currPos, 5) === peg$c171) {
          s0 = peg$c171;
          peg$currPos += 5;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c172); }
        }
  
        return s0;
      }
  
      function peg$parsetype_qualifier() {
        var s0, s1, s2, s3;
  
        peg$silentFails++;
        s0 = peg$parseconst_qualifier();
        if (s0 === peg$FAILED) {
          if (input.substr(peg$currPos, 7) === peg$c174) {
            s0 = peg$c174;
            peg$currPos += 7;
          } else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c175); }
          }
          if (s0 === peg$FAILED) {
            s0 = peg$currPos;
            if (input.substr(peg$currPos, 9) === peg$c129) {
              s1 = peg$c129;
              peg$currPos += 9;
            } else {
              s1 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c130); }
            }
            if (s1 !== peg$FAILED) {
              s2 = peg$parse_();
              if (s2 !== peg$FAILED) {
                if (input.substr(peg$currPos, 7) === peg$c174) {
                  s3 = peg$c174;
                  peg$currPos += 7;
                } else {
                  s3 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c175); }
                }
                if (s3 !== peg$FAILED) {
                  peg$savedPos = s0;
                  s1 = peg$c176();
                  s0 = s1;
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
            if (s0 === peg$FAILED) {
              if (input.substr(peg$currPos, 7) === peg$c177) {
                s0 = peg$c177;
                peg$currPos += 7;
              } else {
                s0 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c178); }
              }
            }
          }
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c173); }
        }
  
        return s0;
      }
  
      function peg$parsevoid_type() {
        var s0, s1;
  
        peg$silentFails++;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 4) === peg$c136) {
          s1 = peg$c136;
          peg$currPos += 4;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c137); }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c180();
        }
        s0 = s1;
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c179); }
        }
  
        return s0;
      }
  
      function peg$parsetype_name() {
        var s0, s1;
  
        peg$silentFails++;
        if (input.substr(peg$currPos, 5) === peg$c182) {
          s0 = peg$c182;
          peg$currPos += 5;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c183); }
        }
        if (s0 === peg$FAILED) {
          if (input.substr(peg$currPos, 3) === peg$c184) {
            s0 = peg$c184;
            peg$currPos += 3;
          } else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c185); }
          }
          if (s0 === peg$FAILED) {
            if (input.substr(peg$currPos, 4) === peg$c186) {
              s0 = peg$c186;
              peg$currPos += 4;
            } else {
              s0 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c187); }
            }
            if (s0 === peg$FAILED) {
              if (input.substr(peg$currPos, 9) === peg$c188) {
                s0 = peg$c188;
                peg$currPos += 9;
              } else {
                s0 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c189); }
              }
              if (s0 === peg$FAILED) {
                if (input.substr(peg$currPos, 11) === peg$c190) {
                  s0 = peg$c190;
                  peg$currPos += 11;
                } else {
                  s0 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c191); }
                }
                if (s0 === peg$FAILED) {
                  s0 = peg$parsevector();
                  if (s0 === peg$FAILED) {
                    s0 = peg$parsematrix();
                    if (s0 === peg$FAILED) {
                      s0 = peg$currPos;
                      s1 = peg$parseidentifier();
                      if (s1 !== peg$FAILED) {
                        peg$savedPos = s0;
                        s1 = peg$c192(s1);
                      }
                      s0 = s1;
                    }
                  }
                }
              }
            }
          }
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c181); }
        }
  
        return s0;
      }
  
      function peg$parseidentifier() {
        var s0, s1, s2, s3, s4;
  
        peg$silentFails++;
        s0 = peg$currPos;
        s1 = peg$currPos;
        peg$silentFails++;
        s2 = peg$currPos;
        s3 = peg$parsekeyword();
        if (s3 !== peg$FAILED) {
          if (peg$c194.test(input.charAt(peg$currPos))) {
            s4 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s4 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c195); }
          }
          if (s4 !== peg$FAILED) {
            s3 = [s3, s4];
            s2 = s3;
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
        } else {
          peg$currPos = s2;
          s2 = peg$FAILED;
        }
        peg$silentFails--;
        if (s2 === peg$FAILED) {
          s1 = void 0;
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          if (peg$c58.test(input.charAt(peg$currPos))) {
            s2 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c59); }
          }
          if (s2 !== peg$FAILED) {
            s3 = [];
            if (peg$c60.test(input.charAt(peg$currPos))) {
              s4 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s4 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c61); }
            }
            while (s4 !== peg$FAILED) {
              s3.push(s4);
              if (peg$c60.test(input.charAt(peg$currPos))) {
                s4 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c61); }
              }
            }
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c62(s2, s3);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c193); }
        }
  
        return s0;
      }
  
      function peg$parsekeyword() {
        var s0, s1;
  
        peg$silentFails++;
        if (input.substr(peg$currPos, 9) === peg$c159) {
          s0 = peg$c159;
          peg$currPos += 9;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c160); }
        }
        if (s0 === peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c171) {
            s0 = peg$c171;
            peg$currPos += 5;
          } else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c172); }
          }
          if (s0 === peg$FAILED) {
            if (input.substr(peg$currPos, 4) === peg$c186) {
              s0 = peg$c186;
              peg$currPos += 4;
            } else {
              s0 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c187); }
            }
            if (s0 === peg$FAILED) {
              if (input.substr(peg$currPos, 5) === peg$c182) {
                s0 = peg$c182;
                peg$currPos += 5;
              } else {
                s0 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c183); }
              }
              if (s0 === peg$FAILED) {
                if (input.substr(peg$currPos, 3) === peg$c184) {
                  s0 = peg$c184;
                  peg$currPos += 3;
                } else {
                  s0 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c185); }
                }
                if (s0 === peg$FAILED) {
                  if (input.substr(peg$currPos, 5) === peg$c117) {
                    s0 = peg$c117;
                    peg$currPos += 5;
                  } else {
                    s0 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c118); }
                  }
                  if (s0 === peg$FAILED) {
                    if (input.substr(peg$currPos, 8) === peg$c115) {
                      s0 = peg$c115;
                      peg$currPos += 8;
                    } else {
                      s0 = peg$FAILED;
                      if (peg$silentFails === 0) { peg$fail(peg$c116); }
                    }
                    if (s0 === peg$FAILED) {
                      if (input.substr(peg$currPos, 2) === peg$c109) {
                        s0 = peg$c109;
                        peg$currPos += 2;
                      } else {
                        s0 = peg$FAILED;
                        if (peg$silentFails === 0) { peg$fail(peg$c110); }
                      }
                      if (s0 === peg$FAILED) {
                        if (input.substr(peg$currPos, 4) === peg$c91) {
                          s0 = peg$c91;
                          peg$currPos += 4;
                        } else {
                          s0 = peg$FAILED;
                          if (peg$silentFails === 0) { peg$fail(peg$c92); }
                        }
                        if (s0 === peg$FAILED) {
                          if (input.substr(peg$currPos, 3) === peg$c102) {
                            s0 = peg$c102;
                            peg$currPos += 3;
                          } else {
                            s0 = peg$FAILED;
                            if (peg$silentFails === 0) { peg$fail(peg$c103); }
                          }
                          if (s0 === peg$FAILED) {
                            if (input.substr(peg$currPos, 2) === peg$c84) {
                              s0 = peg$c84;
                              peg$currPos += 2;
                            } else {
                              s0 = peg$FAILED;
                              if (peg$silentFails === 0) { peg$fail(peg$c85); }
                            }
                            if (s0 === peg$FAILED) {
                              if (input.substr(peg$currPos, 7) === peg$c120) {
                                s0 = peg$c120;
                                peg$currPos += 7;
                              } else {
                                s0 = peg$FAILED;
                                if (peg$silentFails === 0) { peg$fail(peg$c121); }
                              }
                              if (s0 === peg$FAILED) {
                                if (input.substr(peg$currPos, 6) === peg$c112) {
                                  s0 = peg$c112;
                                  peg$currPos += 6;
                                } else {
                                  s0 = peg$FAILED;
                                  if (peg$silentFails === 0) { peg$fail(peg$c113); }
                                }
                                if (s0 === peg$FAILED) {
                                  s0 = peg$parsevector();
                                  if (s0 === peg$FAILED) {
                                    s0 = peg$parsematrix();
                                    if (s0 === peg$FAILED) {
                                      if (input.substr(peg$currPos, 2) === peg$c142) {
                                        s0 = peg$c142;
                                        peg$currPos += 2;
                                      } else {
                                        s0 = peg$FAILED;
                                        if (peg$silentFails === 0) { peg$fail(peg$c143); }
                                      }
                                      if (s0 === peg$FAILED) {
                                        if (input.substr(peg$currPos, 3) === peg$c144) {
                                          s0 = peg$c144;
                                          peg$currPos += 3;
                                        } else {
                                          s0 = peg$FAILED;
                                          if (peg$silentFails === 0) { peg$fail(peg$c145); }
                                        }
                                        if (s0 === peg$FAILED) {
                                          if (input.substr(peg$currPos, 5) === peg$c140) {
                                            s0 = peg$c140;
                                            peg$currPos += 5;
                                          } else {
                                            s0 = peg$FAILED;
                                            if (peg$silentFails === 0) { peg$fail(peg$c141); }
                                          }
                                          if (s0 === peg$FAILED) {
                                            if (input.substr(peg$currPos, 7) === peg$c177) {
                                              s0 = peg$c177;
                                              peg$currPos += 7;
                                            } else {
                                              s0 = peg$FAILED;
                                              if (peg$silentFails === 0) { peg$fail(peg$c178); }
                                            }
                                            if (s0 === peg$FAILED) {
                                              if (input.substr(peg$currPos, 7) === peg$c174) {
                                                s0 = peg$c174;
                                                peg$currPos += 7;
                                              } else {
                                                s0 = peg$FAILED;
                                                if (peg$silentFails === 0) { peg$fail(peg$c175); }
                                              }
                                              if (s0 === peg$FAILED) {
                                                if (input.substr(peg$currPos, 9) === peg$c188) {
                                                  s0 = peg$c188;
                                                  peg$currPos += 9;
                                                } else {
                                                  s0 = peg$FAILED;
                                                  if (peg$silentFails === 0) { peg$fail(peg$c189); }
                                                }
                                                if (s0 === peg$FAILED) {
                                                  if (input.substr(peg$currPos, 11) === peg$c190) {
                                                    s0 = peg$c190;
                                                    peg$currPos += 11;
                                                  } else {
                                                    s0 = peg$FAILED;
                                                    if (peg$silentFails === 0) { peg$fail(peg$c191); }
                                                  }
                                                  if (s0 === peg$FAILED) {
                                                    if (input.substr(peg$currPos, 6) === peg$c153) {
                                                      s0 = peg$c153;
                                                      peg$currPos += 6;
                                                    } else {
                                                      s0 = peg$FAILED;
                                                      if (peg$silentFails === 0) { peg$fail(peg$c154); }
                                                    }
                                                    if (s0 === peg$FAILED) {
                                                      if (input.substr(peg$currPos, 4) === peg$c136) {
                                                        s0 = peg$c136;
                                                        peg$currPos += 4;
                                                      } else {
                                                        s0 = peg$FAILED;
                                                        if (peg$silentFails === 0) { peg$fail(peg$c137); }
                                                      }
                                                      if (s0 === peg$FAILED) {
                                                        if (input.substr(peg$currPos, 5) === peg$c105) {
                                                          s0 = peg$c105;
                                                          peg$currPos += 5;
                                                        } else {
                                                          s0 = peg$FAILED;
                                                          if (peg$silentFails === 0) { peg$fail(peg$c106); }
                                                        }
                                                        if (s0 === peg$FAILED) {
                                                          if (input.substr(peg$currPos, 5) === peg$c165) {
                                                            s0 = peg$c165;
                                                            peg$currPos += 5;
                                                          } else {
                                                            s0 = peg$FAILED;
                                                            if (peg$silentFails === 0) { peg$fail(peg$c166); }
                                                          }
                                                          if (s0 === peg$FAILED) {
                                                            if (input.substr(peg$currPos, 7) === peg$c167) {
                                                              s0 = peg$c167;
                                                              peg$currPos += 7;
                                                            } else {
                                                              s0 = peg$FAILED;
                                                              if (peg$silentFails === 0) { peg$fail(peg$c168); }
                                                            }
                                                            if (s0 === peg$FAILED) {
                                                              if (input.substr(peg$currPos, 4) === peg$c169) {
                                                                s0 = peg$c169;
                                                                peg$currPos += 4;
                                                              } else {
                                                                s0 = peg$FAILED;
                                                                if (peg$silentFails === 0) { peg$fail(peg$c170); }
                                                              }
                                                              if (s0 === peg$FAILED) {
                                                                if (input.substr(peg$currPos, 4) === peg$c197) {
                                                                  s0 = peg$c197;
                                                                  peg$currPos += 4;
                                                                } else {
                                                                  s0 = peg$FAILED;
                                                                  if (peg$silentFails === 0) { peg$fail(peg$c198); }
                                                                }
                                                                if (s0 === peg$FAILED) {
                                                                  if (input.substr(peg$currPos, 5) === peg$c199) {
                                                                    s0 = peg$c199;
                                                                    peg$currPos += 5;
                                                                  } else {
                                                                    s0 = peg$FAILED;
                                                                    if (peg$silentFails === 0) { peg$fail(peg$c200); }
                                                                  }
                                                                }
                                                              }
                                                            }
                                                          }
                                                        }
                                                      }
                                                    }
                                                  }
                                                }
                                              }
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c196); }
        }
  
        return s0;
      }
  
      function peg$parsevector() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        if (peg$c201.test(input.charAt(peg$currPos))) {
          s2 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s2 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c202); }
        }
        if (s2 === peg$FAILED) {
          s2 = null;
        }
        if (s2 !== peg$FAILED) {
          if (input.substr(peg$currPos, 3) === peg$c203) {
            s3 = peg$c203;
            peg$currPos += 3;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c204); }
          }
          if (s3 !== peg$FAILED) {
            if (peg$c205.test(input.charAt(peg$currPos))) {
              s4 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s4 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c206); }
            }
            if (s4 !== peg$FAILED) {
              s2 = [s2, s3, s4];
              s1 = s2;
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c207(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsematrix() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        if (input.substr(peg$currPos, 3) === peg$c208) {
          s2 = peg$c208;
          peg$currPos += 3;
        } else {
          s2 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c209); }
        }
        if (s2 !== peg$FAILED) {
          if (peg$c205.test(input.charAt(peg$currPos))) {
            s3 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c206); }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c207(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsereserved() {
        var s0, s1, s2, s3, s4;
  
        peg$silentFails++;
        s0 = peg$currPos;
        s1 = [];
        s2 = peg$parsesingle_underscore_identifier();
        while (s2 !== peg$FAILED) {
          s1.push(s2);
          s2 = peg$parsesingle_underscore_identifier();
        }
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c211) {
            s2 = peg$c211;
            peg$currPos += 2;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c212); }
          }
          if (s2 !== peg$FAILED) {
            s3 = [];
            if (peg$c60.test(input.charAt(peg$currPos))) {
              s4 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s4 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c61); }
            }
            while (s4 !== peg$FAILED) {
              s3.push(s4);
              if (peg$c60.test(input.charAt(peg$currPos))) {
                s4 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c61); }
              }
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c210); }
        }
  
        return s0;
      }
  
      function peg$parsesingle_underscore_identifier() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        s1 = [];
        if (peg$c213.test(input.charAt(peg$currPos))) {
          s2 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s2 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c214); }
        }
        while (s2 !== peg$FAILED) {
          s1.push(s2);
          if (peg$c213.test(input.charAt(peg$currPos))) {
            s2 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c214); }
          }
        }
        if (s1 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 95) {
            s2 = peg$c215;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c216); }
          }
          if (s2 !== peg$FAILED) {
            s3 = [];
            if (peg$c213.test(input.charAt(peg$currPos))) {
              s4 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s4 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c214); }
            }
            if (s4 !== peg$FAILED) {
              while (s4 !== peg$FAILED) {
                s3.push(s4);
                if (peg$c213.test(input.charAt(peg$currPos))) {
                  s4 = input.charAt(peg$currPos);
                  peg$currPos++;
                } else {
                  s4 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c214); }
                }
              }
            } else {
              s3 = peg$FAILED;
            }
            if (s3 !== peg$FAILED) {
              s1 = [s1, s2, s3];
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseint_constant() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        if (peg$c217.test(input.charAt(peg$currPos))) {
          s1 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c218); }
        }
        if (s1 !== peg$FAILED) {
          s2 = [];
          if (peg$c219.test(input.charAt(peg$currPos))) {
            s3 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c220); }
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            if (peg$c219.test(input.charAt(peg$currPos))) {
              s3 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c220); }
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c221(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          if (input.charCodeAt(peg$currPos) === 48) {
            s1 = peg$c222;
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c223); }
          }
          if (s1 !== peg$FAILED) {
            if (peg$c224.test(input.charAt(peg$currPos))) {
              s2 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s2 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c225); }
            }
            if (s2 !== peg$FAILED) {
              s3 = [];
              if (peg$c226.test(input.charAt(peg$currPos))) {
                s4 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c227); }
              }
              if (s4 !== peg$FAILED) {
                while (s4 !== peg$FAILED) {
                  s3.push(s4);
                  if (peg$c226.test(input.charAt(peg$currPos))) {
                    s4 = input.charAt(peg$currPos);
                    peg$currPos++;
                  } else {
                    s4 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c227); }
                  }
                }
              } else {
                s3 = peg$FAILED;
              }
              if (s3 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c228(s3);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
          if (s0 === peg$FAILED) {
            s0 = peg$currPos;
            if (input.charCodeAt(peg$currPos) === 48) {
              s1 = peg$c222;
              peg$currPos++;
            } else {
              s1 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c223); }
            }
            if (s1 !== peg$FAILED) {
              s2 = [];
              if (peg$c229.test(input.charAt(peg$currPos))) {
                s3 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c230); }
              }
              if (s3 !== peg$FAILED) {
                while (s3 !== peg$FAILED) {
                  s2.push(s3);
                  if (peg$c229.test(input.charAt(peg$currPos))) {
                    s3 = input.charAt(peg$currPos);
                    peg$currPos++;
                  } else {
                    s3 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c230); }
                  }
                }
              } else {
                s2 = peg$FAILED;
              }
              if (s2 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c231(s2);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
            if (s0 === peg$FAILED) {
              s0 = peg$currPos;
              if (input.charCodeAt(peg$currPos) === 48) {
                s1 = peg$c222;
                peg$currPos++;
              } else {
                s1 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c223); }
              }
              if (s1 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c232();
              }
              s0 = s1;
            }
          }
        }
  
        return s0;
      }
  
      function peg$parsefloat_constant() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = [];
        if (peg$c219.test(input.charAt(peg$currPos))) {
          s3 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s3 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c220); }
        }
        while (s3 !== peg$FAILED) {
          s2.push(s3);
          if (peg$c219.test(input.charAt(peg$currPos))) {
            s3 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c220); }
          }
        }
        if (s2 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 46) {
            s3 = peg$c233;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c234); }
          }
          if (s3 !== peg$FAILED) {
            s4 = [];
            if (peg$c219.test(input.charAt(peg$currPos))) {
              s5 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s5 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c220); }
            }
            if (s5 !== peg$FAILED) {
              while (s5 !== peg$FAILED) {
                s4.push(s5);
                if (peg$c219.test(input.charAt(peg$currPos))) {
                  s5 = input.charAt(peg$currPos);
                  peg$currPos++;
                } else {
                  s5 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c220); }
                }
              }
            } else {
              s4 = peg$FAILED;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parsefloat_exponent();
              if (s5 === peg$FAILED) {
                s5 = null;
              }
              if (s5 !== peg$FAILED) {
                s2 = [s2, s3, s4, s5];
                s1 = s2;
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 === peg$FAILED) {
          s1 = peg$currPos;
          s2 = [];
          if (peg$c219.test(input.charAt(peg$currPos))) {
            s3 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c220); }
          }
          if (s3 !== peg$FAILED) {
            while (s3 !== peg$FAILED) {
              s2.push(s3);
              if (peg$c219.test(input.charAt(peg$currPos))) {
                s3 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c220); }
              }
            }
          } else {
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 46) {
              s3 = peg$c233;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c234); }
            }
            if (s3 !== peg$FAILED) {
              s4 = [];
              if (peg$c219.test(input.charAt(peg$currPos))) {
                s5 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s5 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c220); }
              }
              while (s5 !== peg$FAILED) {
                s4.push(s5);
                if (peg$c219.test(input.charAt(peg$currPos))) {
                  s5 = input.charAt(peg$currPos);
                  peg$currPos++;
                } else {
                  s5 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c220); }
                }
              }
              if (s4 !== peg$FAILED) {
                s5 = peg$parsefloat_exponent();
                if (s5 === peg$FAILED) {
                  s5 = null;
                }
                if (s5 !== peg$FAILED) {
                  s2 = [s2, s3, s4, s5];
                  s1 = s2;
                } else {
                  peg$currPos = s1;
                  s1 = peg$FAILED;
                }
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c235(s1);
        }
        s0 = s1;
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          s1 = peg$currPos;
          s2 = [];
          if (peg$c219.test(input.charAt(peg$currPos))) {
            s3 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c220); }
          }
          if (s3 !== peg$FAILED) {
            while (s3 !== peg$FAILED) {
              s2.push(s3);
              if (peg$c219.test(input.charAt(peg$currPos))) {
                s3 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c220); }
              }
            }
          } else {
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parsefloat_exponent();
            if (s3 !== peg$FAILED) {
              s2 = [s2, s3];
              s1 = s2;
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
          if (s1 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c236(s1);
          }
          s0 = s1;
        }
  
        return s0;
      }
  
      function peg$parsefloat_exponent() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        if (peg$c237.test(input.charAt(peg$currPos))) {
          s1 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c238); }
        }
        if (s1 !== peg$FAILED) {
          if (peg$c239.test(input.charAt(peg$currPos))) {
            s2 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c240); }
          }
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            s3 = [];
            if (peg$c219.test(input.charAt(peg$currPos))) {
              s4 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s4 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c220); }
            }
            if (s4 !== peg$FAILED) {
              while (s4 !== peg$FAILED) {
                s3.push(s4);
                if (peg$c219.test(input.charAt(peg$currPos))) {
                  s4 = input.charAt(peg$currPos);
                  peg$currPos++;
                } else {
                  s4 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c220); }
                }
              }
            } else {
              s3 = peg$FAILED;
            }
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c241(s2, s3);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseparen_expression() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parseleft_paren();
        if (s1 !== peg$FAILED) {
          s2 = peg$parseassignment_expression();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseright_paren();
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c242(s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsebool_constant() {
        var s0, s1;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 4) === peg$c197) {
          s1 = peg$c197;
          peg$currPos += 4;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c198); }
        }
        if (s1 === peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c199) {
            s1 = peg$c199;
            peg$currPos += 5;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c200); }
          }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c243(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseprimary_expression() {
        var s0;
  
        s0 = peg$parsefunction_call();
        if (s0 === peg$FAILED) {
          s0 = peg$parseidentifier();
          if (s0 === peg$FAILED) {
            s0 = peg$parsefloat_constant();
            if (s0 === peg$FAILED) {
              s0 = peg$parseint_constant();
              if (s0 === peg$FAILED) {
                s0 = peg$parsebool_constant();
                if (s0 === peg$FAILED) {
                  s0 = peg$parseparen_expression();
                }
              }
            }
          }
        }
  
        return s0;
      }
  
      function peg$parseindex_accessor() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parseleft_bracket();
        if (s1 !== peg$FAILED) {
          s2 = peg$parseassignment_expression();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseright_bracket();
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c244(s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsefield_selector() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 46) {
          s1 = peg$c233;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c234); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parseidentifier();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c245(s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsepostfix_expression() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$parseprimary_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$parsefield_selector();
          if (s3 === peg$FAILED) {
            s3 = peg$parseindex_accessor();
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$parsefield_selector();
            if (s3 === peg$FAILED) {
              s3 = peg$parseindex_accessor();
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c246(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsepostfix_expression_no_repeat() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$parsepostfix_expression();
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            if (input.substr(peg$currPos, 2) === peg$c247) {
              s3 = peg$c247;
              peg$currPos += 2;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c248); }
            }
            if (s3 === peg$FAILED) {
              if (input.substr(peg$currPos, 2) === peg$c249) {
                s3 = peg$c249;
                peg$currPos += 2;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c250); }
              }
            }
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s4 = [];
              s5 = peg$parsefield_selector();
              if (s5 === peg$FAILED) {
                s5 = peg$parseindex_accessor();
              }
              while (s5 !== peg$FAILED) {
                s4.push(s5);
                s5 = peg$parsefield_selector();
                if (s5 === peg$FAILED) {
                  s5 = peg$parseindex_accessor();
                }
              }
              if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c251(s1, s3, s4);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseparameter_list() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 4) === peg$c136) {
          s1 = peg$c136;
          peg$currPos += 4;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c137); }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c252();
        }
        s0 = s1;
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          s1 = peg$parseassignment_expression();
          if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$currPos;
            s4 = peg$parsecomma();
            if (s4 !== peg$FAILED) {
              s5 = peg$parseassignment_expression();
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
            while (s3 !== peg$FAILED) {
              s2.push(s3);
              s3 = peg$currPos;
              s4 = peg$parsecomma();
              if (s4 !== peg$FAILED) {
                s5 = peg$parseassignment_expression();
                if (s5 !== peg$FAILED) {
                  s4 = [s4, s5];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            }
            if (s2 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c253(s1, s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        }
  
        return s0;
      }
  
      function peg$parsefunction_call() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        s1 = peg$parsefunction_identifier();
        if (s1 !== peg$FAILED) {
          s2 = peg$parseleft_paren();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseparameter_list();
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parseright_paren();
              if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c254(s1, s3);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsefunction_identifier() {
        var s0, s1;
  
        s0 = peg$currPos;
        s1 = peg$parseidentifier();
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c255(s1);
        }
        s0 = s1;
        if (s0 === peg$FAILED) {
          s0 = peg$parsetype_name();
        }
  
        return s0;
      }
  
      function peg$parseunary_expression() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c247) {
          s1 = peg$c247;
          peg$currPos += 2;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c248); }
        }
        if (s1 === peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c249) {
            s1 = peg$c249;
            peg$currPos += 2;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c250); }
          }
          if (s1 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 33) {
              s1 = peg$c256;
              peg$currPos++;
            } else {
              s1 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c257); }
            }
            if (s1 === peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 126) {
                s1 = peg$c258;
                peg$currPos++;
              } else {
                s1 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c259); }
              }
              if (s1 === peg$FAILED) {
                if (input.charCodeAt(peg$currPos) === 43) {
                  s1 = peg$c260;
                  peg$currPos++;
                } else {
                  s1 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c261); }
                }
                if (s1 === peg$FAILED) {
                  if (input.charCodeAt(peg$currPos) === 45) {
                    s1 = peg$c262;
                    peg$currPos++;
                  } else {
                    s1 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c263); }
                  }
                }
              }
            }
          }
        }
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            s3 = peg$parsepostfix_expression_no_repeat();
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c264(s1, s3);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsemultiplicative_operator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 42) {
          s1 = peg$c265;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c266); }
        }
        if (s1 === peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 47) {
            s1 = peg$c267;
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c268); }
          }
          if (s1 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 37) {
              s1 = peg$c269;
              peg$currPos++;
            } else {
              s1 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c270); }
            }
          }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          peg$silentFails++;
          if (input.charCodeAt(peg$currPos) === 61) {
            s3 = peg$c29;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c30); }
          }
          peg$silentFails--;
          if (s3 === peg$FAILED) {
            s2 = void 0;
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c271(s1);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsemultiplicative_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parseunary_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parsemultiplicative_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parseunary_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parsemultiplicative_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parseunary_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseadditive_operator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 43) {
          s1 = peg$c260;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c261); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          peg$silentFails++;
          if (input.charCodeAt(peg$currPos) === 43) {
            s3 = peg$c260;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c261); }
          }
          if (s3 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 61) {
              s3 = peg$c29;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c30); }
            }
          }
          peg$silentFails--;
          if (s3 === peg$FAILED) {
            s2 = void 0;
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c273();
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          if (input.charCodeAt(peg$currPos) === 45) {
            s1 = peg$c262;
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c263); }
          }
          if (s1 !== peg$FAILED) {
            s2 = peg$currPos;
            peg$silentFails++;
            if (input.charCodeAt(peg$currPos) === 45) {
              s3 = peg$c262;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c263); }
            }
            if (s3 === peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 61) {
                s3 = peg$c29;
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c30); }
              }
            }
            peg$silentFails--;
            if (s3 === peg$FAILED) {
              s2 = void 0;
            } else {
              peg$currPos = s2;
              s2 = peg$FAILED;
            }
            if (s2 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c274();
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        }
  
        return s0;
      }
  
      function peg$parseadditive_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parsemultiplicative_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parseadditive_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parsemultiplicative_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parseadditive_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parsemultiplicative_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseshift_operator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c275) {
          s1 = peg$c275;
          peg$currPos += 2;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c276); }
        }
        if (s1 === peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c277) {
            s1 = peg$c277;
            peg$currPos += 2;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c278); }
          }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          peg$silentFails++;
          if (input.charCodeAt(peg$currPos) === 61) {
            s3 = peg$c29;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c30); }
          }
          peg$silentFails--;
          if (s3 === peg$FAILED) {
            s2 = void 0;
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c271(s1);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseshift_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parseadditive_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parseshift_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parseadditive_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parseshift_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parseadditive_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parserelational_operator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 60) {
          s1 = peg$c279;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c280); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          peg$silentFails++;
          if (input.charCodeAt(peg$currPos) === 60) {
            s3 = peg$c279;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c280); }
          }
          peg$silentFails--;
          if (s3 === peg$FAILED) {
            s2 = void 0;
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 61) {
              s3 = peg$c29;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c30); }
            }
            if (s3 === peg$FAILED) {
              s3 = null;
            }
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c281(s3);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          if (input.charCodeAt(peg$currPos) === 62) {
            s1 = peg$c282;
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c283); }
          }
          if (s1 !== peg$FAILED) {
            s2 = peg$currPos;
            peg$silentFails++;
            if (input.charCodeAt(peg$currPos) === 62) {
              s3 = peg$c282;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c283); }
            }
            peg$silentFails--;
            if (s3 === peg$FAILED) {
              s2 = void 0;
            } else {
              peg$currPos = s2;
              s2 = peg$FAILED;
            }
            if (s2 !== peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 61) {
                s3 = peg$c29;
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c30); }
              }
              if (s3 === peg$FAILED) {
                s3 = null;
              }
              if (s3 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c284(s3);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        }
  
        return s0;
      }
  
      function peg$parserelational_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parseshift_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parserelational_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parseshift_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parserelational_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parseshift_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseequality_operator() {
        var s0, s1;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c285) {
          s1 = peg$c285;
          peg$currPos += 2;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c286); }
        }
        if (s1 === peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c287) {
            s1 = peg$c287;
            peg$currPos += 2;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c288); }
          }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c289(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseequality_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parserelational_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parseequality_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parserelational_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parseequality_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parserelational_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsebitwise_and_operator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 38) {
          s1 = peg$c290;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c291); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          peg$silentFails++;
          if (input.charCodeAt(peg$currPos) === 61) {
            s3 = peg$c29;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c30); }
          }
          if (s3 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 38) {
              s3 = peg$c290;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c291); }
            }
          }
          peg$silentFails--;
          if (s3 === peg$FAILED) {
            s2 = void 0;
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c292();
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsebitwise_and_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parseequality_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parsebitwise_and_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parseequality_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parsebitwise_and_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parseequality_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsebitwise_xor_operator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 94) {
          s1 = peg$c293;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c294); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          peg$silentFails++;
          if (input.charCodeAt(peg$currPos) === 61) {
            s3 = peg$c29;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c30); }
          }
          if (s3 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 94) {
              s3 = peg$c293;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c294); }
            }
          }
          peg$silentFails--;
          if (s3 === peg$FAILED) {
            s2 = void 0;
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c295();
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsebitwise_xor_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parsebitwise_and_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parsebitwise_xor_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parsebitwise_and_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parsebitwise_xor_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parsebitwise_and_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsebitwise_or_operator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 124) {
          s1 = peg$c296;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c297); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          peg$silentFails++;
          if (input.charCodeAt(peg$currPos) === 61) {
            s3 = peg$c29;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c30); }
          }
          if (s3 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 124) {
              s3 = peg$c296;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c297); }
            }
          }
          peg$silentFails--;
          if (s3 === peg$FAILED) {
            s2 = void 0;
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c298();
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsebitwise_or_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parsebitwise_xor_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parsebitwise_or_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parsebitwise_xor_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parsebitwise_or_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parsebitwise_xor_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parselogical_and_operator() {
        var s0, s1;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c299) {
          s1 = peg$c299;
          peg$currPos += 2;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c300); }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c301();
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parselogical_and_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parsebitwise_or_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parselogical_and_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parsebitwise_or_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parselogical_and_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parsebitwise_or_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parselogical_xor_operator() {
        var s0, s1;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c302) {
          s1 = peg$c302;
          peg$currPos += 2;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c303); }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c304();
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parselogical_xor_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parselogical_and_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parselogical_xor_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parselogical_and_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parselogical_xor_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parselogical_and_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parselogical_or_operator() {
        var s0, s1;
  
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c305) {
          s1 = peg$c305;
          peg$currPos += 2;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c306); }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c307();
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parselogical_or_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parselogical_xor_expression();
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$currPos;
          s4 = peg$parse_();
          if (s4 === peg$FAILED) {
            s4 = null;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$parselogical_or_operator();
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_();
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parselogical_xor_expression();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$currPos;
            s4 = peg$parse_();
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parselogical_or_operator();
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parselogical_xor_expression();
                  if (s7 !== peg$FAILED) {
                    s4 = [s4, s5, s6, s7];
                    s3 = s4;
                  } else {
                    peg$currPos = s3;
                    s3 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c272(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseconditional_expression() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;
  
        s0 = peg$currPos;
        s1 = peg$parselogical_or_expression();
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          s3 = peg$parse_();
          if (s3 === peg$FAILED) {
            s3 = null;
          }
          if (s3 !== peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 63) {
              s4 = peg$c308;
              peg$currPos++;
            } else {
              s4 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c309); }
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parse_();
              if (s5 === peg$FAILED) {
                s5 = null;
              }
              if (s5 !== peg$FAILED) {
                s6 = peg$parseassignment_expression();
                if (s6 !== peg$FAILED) {
                  s7 = peg$parse_();
                  if (s7 === peg$FAILED) {
                    s7 = null;
                  }
                  if (s7 !== peg$FAILED) {
                    if (input.charCodeAt(peg$currPos) === 58) {
                      s8 = peg$c310;
                      peg$currPos++;
                    } else {
                      s8 = peg$FAILED;
                      if (peg$silentFails === 0) { peg$fail(peg$c311); }
                    }
                    if (s8 !== peg$FAILED) {
                      s9 = peg$parse_();
                      if (s9 === peg$FAILED) {
                        s9 = null;
                      }
                      if (s9 !== peg$FAILED) {
                        s10 = peg$parseassignment_expression();
                        if (s10 !== peg$FAILED) {
                          s3 = [s3, s4, s5, s6, s7, s8, s9, s10];
                          s2 = s3;
                        } else {
                          peg$currPos = s2;
                          s2 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s2;
                        s2 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s2;
                      s2 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s2;
                    s2 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s2;
                  s2 = peg$FAILED;
                }
              } else {
                peg$currPos = s2;
                s2 = peg$FAILED;
              }
            } else {
              peg$currPos = s2;
              s2 = peg$FAILED;
            }
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c312(s1, s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseassignment_expression() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$parseconditional_expression();
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 61) {
              s3 = peg$c29;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c30); }
            }
            if (s3 === peg$FAILED) {
              if (input.substr(peg$currPos, 2) === peg$c313) {
                s3 = peg$c313;
                peg$currPos += 2;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c314); }
              }
              if (s3 === peg$FAILED) {
                if (input.substr(peg$currPos, 2) === peg$c315) {
                  s3 = peg$c315;
                  peg$currPos += 2;
                } else {
                  s3 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c316); }
                }
                if (s3 === peg$FAILED) {
                  if (input.substr(peg$currPos, 2) === peg$c317) {
                    s3 = peg$c317;
                    peg$currPos += 2;
                  } else {
                    s3 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c318); }
                  }
                  if (s3 === peg$FAILED) {
                    if (input.substr(peg$currPos, 2) === peg$c319) {
                      s3 = peg$c319;
                      peg$currPos += 2;
                    } else {
                      s3 = peg$FAILED;
                      if (peg$silentFails === 0) { peg$fail(peg$c320); }
                    }
                    if (s3 === peg$FAILED) {
                      if (input.substr(peg$currPos, 2) === peg$c321) {
                        s3 = peg$c321;
                        peg$currPos += 2;
                      } else {
                        s3 = peg$FAILED;
                        if (peg$silentFails === 0) { peg$fail(peg$c322); }
                      }
                      if (s3 === peg$FAILED) {
                        if (input.substr(peg$currPos, 3) === peg$c323) {
                          s3 = peg$c323;
                          peg$currPos += 3;
                        } else {
                          s3 = peg$FAILED;
                          if (peg$silentFails === 0) { peg$fail(peg$c324); }
                        }
                        if (s3 === peg$FAILED) {
                          if (input.substr(peg$currPos, 3) === peg$c325) {
                            s3 = peg$c325;
                            peg$currPos += 3;
                          } else {
                            s3 = peg$FAILED;
                            if (peg$silentFails === 0) { peg$fail(peg$c326); }
                          }
                          if (s3 === peg$FAILED) {
                            if (input.substr(peg$currPos, 2) === peg$c327) {
                              s3 = peg$c327;
                              peg$currPos += 2;
                            } else {
                              s3 = peg$FAILED;
                              if (peg$silentFails === 0) { peg$fail(peg$c328); }
                            }
                            if (s3 === peg$FAILED) {
                              if (input.substr(peg$currPos, 2) === peg$c329) {
                                s3 = peg$c329;
                                peg$currPos += 2;
                              } else {
                                s3 = peg$FAILED;
                                if (peg$silentFails === 0) { peg$fail(peg$c330); }
                              }
                              if (s3 === peg$FAILED) {
                                if (input.substr(peg$currPos, 2) === peg$c331) {
                                  s3 = peg$c331;
                                  peg$currPos += 2;
                                } else {
                                  s3 = peg$FAILED;
                                  if (peg$silentFails === 0) { peg$fail(peg$c332); }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parse_();
              if (s4 === peg$FAILED) {
                s4 = null;
              }
              if (s4 !== peg$FAILED) {
                s5 = peg$parseassignment_expression();
                if (s5 !== peg$FAILED) {
                  peg$savedPos = s0;
                  s1 = peg$c333(s1, s3, s5);
                  s0 = s1;
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$parseconditional_expression();
        }
  
        return s0;
      }
  
      function peg$parsecondition() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$parselocally_specified_type();
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_();
          if (s2 !== peg$FAILED) {
            s3 = peg$parseidentifier();
            if (s3 !== peg$FAILED) {
              s4 = peg$parse_();
              if (s4 === peg$FAILED) {
                s4 = null;
              }
              if (s4 !== peg$FAILED) {
                if (input.charCodeAt(peg$currPos) === 61) {
                  s5 = peg$c29;
                  peg$currPos++;
                } else {
                  s5 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c30); }
                }
                if (s5 !== peg$FAILED) {
                  s6 = peg$parse_();
                  if (s6 === peg$FAILED) {
                    s6 = null;
                  }
                  if (s6 !== peg$FAILED) {
                    s7 = peg$parseassignment_expression();
                    if (s7 !== peg$FAILED) {
                      s1 = [s1, s2, s3, s4, s5, s6, s7];
                      s0 = s1;
                    } else {
                      peg$currPos = s0;
                      s0 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s0;
                  s0 = peg$FAILED;
                }
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$parseassignment_expression();
        }
  
        return s0;
      }
  
  
        // Map containing the names of structs defined in the shader mapped to "true".
        var typeNames = { };
  
        // Identifer for each node.
        var next_id = 0;
  
        // The type of shader being parsed.  This sould be set before parsing begins.
        // This allows us to reject invalid constructs such as attribute declaration
        // in a fragment shader or discard ina vertex shader.
        var shaderType = "fs";
  
        function pos() {
            return location();
            /*return {
            line: line(),
            column: column(),
            offset: offset(),
            span: text().length
          };*/
        }
  
        var ASTNode = function(type, position, properties)
        {
            this.type = type;
            this.position = position;
  
            for (var prop in properties)
                if (properties.hasOwnProperty(prop))
                  this[prop] = properties[prop];
        };
  
        ASTNode.__nextId = 1;
  
        // Map of our node type names to values of the PEG parser's "type" property.
        // Expected properties are documented here per-node.
        //
        // Some aliases used in the comments:
        // Node.$initializer == Node.{FunctionPrototype, FunctionDeclaration, Invariant, Precision, Declarator}
        // Node.$expression == Node.{Operator, PostfixExpression, UnaryExpression, BinaryExpression, TernaryExpression, IndexSelector, FieldSelector, Identifier, IntegerLiteral, FloatLiteral, BooleanLiteral}
        // Node.$statement == Node.{IfStatement, ForStatement, WhileStatement, DoStatement, ReturnStatement, ContinueStatement, BreakStatement, DiscardStatement, ExpressionStatement, Preprocessor, MacroCall}
        ASTNode.Types = {
            Program: 'root', // {statements: [Node.$statement]*}
            Preprocessor: 'preprocessor', // {directive: string, identifier: string?, parameters: [string]?, value: string?, guarded_statements: [Node.$statement]*}
            MacroCall: 'macro_call', // {macro_name: string, parameters: [string]+}
            FunctionCall: 'function_call', // {function_name: string, parameters: [Node.$expression]*}
            FunctionPrototype: 'function_prototype', // {name: string, returnType: Node.Type, parameters: [Node.Parameter]*}
            FunctionDeclaration: 'function_declaration', // {name: string, returnType: Node.Type, parameters: [Node.Parameter]*, body: Node.Scope}
            Scope: 'scope', // {statements: [Node.$statement]*}
            IfStatement: 'if_statement',
            ForStatement: 'for_statement',
            WhileStatement: 'while_statement', // {condition: Node.$expression, body: Node.Scope}
            DoStatement: 'do_statement', // {condition: Node.$expression, body: Node.Scope}
            ReturnStatement: 'return', // {value: Node.$expression}
            ContinueStatement: 'continue', // {}
            BreakStatement: 'break', // {}
            DiscardStatement: 'discard', // {}
            ExpressionStatement: 'expression', // {expression: Node.$expression?}
            Declarator: 'declarator', // {typeAttribute: Node.Type, declarators: [Node.DeclaratorItem]+}
            DeclaratorItem: 'declarator_item',
            Invariant: 'invariant',
            Precision: 'precision',
            Parameter: 'parameter',
            StructDefinition: 'struct_definition',
            Type: 'type', // {name: string, precision: string?, qualifier: string?}
            IntegerLiteral: 'int', // {value: number}
            FloatLiteral: 'float', // {value: number}
            BooleanLiteral: 'bool', // {value: boolean}
            Identifier: 'identifier', // {name: string}
            Operator: 'operator', // {operator: {string, Node.FieldSelector, Node.IndexSelector}}
            PostfixExpression: 'postfix', // {operator: Node.Operator, expression: Node.$expression}
            UnaryExpression: 'unary', // {operator: Node.Operator, expression: Node.$expression}
            BinaryExpression: 'binary',
            TernaryExpression: 'ternary',
            IndexSelector: 'accessor', // {index: Node.$expression}
            FieldSelector: 'field_selector' // {selection: string}
        };
  
        /** @constructor */
        function node(extraProperties, position) {
          return new ASTNode(extraProperties.type, pos(), extraProperties);
        };
  
        // Helper function to daisy chain together a series of binary operations.
        function daisy_chain(head, tail) {
          var result = head;
          for (var i = 0; i < tail.length; i++) {
            result = new node({
              type: "binary",
              operator: tail[i][1],
              left: result,
              right: tail[i][3]
            });
          }
          return result;
        };
  
        // Generates AST Nodes for a preprocessor branch.
        function preprocessor_branch(if_directive,
                                     elif_directives,
                                     else_directive) {
          var elseList = elif_directives;
          if (else_directive) {
            elseList = elseList.concat([else_directive]);
          }
          var result = if_directive[0];
          result.guarded_statements = if_directive[1].statements;
          var current_branch = result;
          for (var i = 0; i < elseList.length; i++) {
            current_branch.elseBody = elseList[i][0];
            current_branch.elseBody.guarded_statements =
              elseList[i][1].statements;
            current_branch = current_branch.elseBody;
          }
          return result;
        };
  
  
      peg$result = peg$startRuleFunction();
  
      if (peg$result !== peg$FAILED && peg$currPos === input.length) {
        return peg$result;
      } else {
        if (peg$result !== peg$FAILED && peg$currPos < input.length) {
          peg$fail(peg$endExpectation());
        }
  
        throw peg$buildStructuredError(
          peg$maxFailExpected,
          peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
          peg$maxFailPos < input.length
            ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
            : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
        );
      }
    }
  
    root._PEGLSL = {
      SyntaxError: peg$SyntaxError,
      parse:       peg$parse
    };
  })(this);
  
  var parse_statements = function (statements, root) {
      var data = [],
          
          declarator,
          statement,
          
          statement_exceptions = {
              htoy: true,
              fline: true,
              getFrequency: true
          },
          
          root_declarator_exceptions = {
              resolution: true,
              globalTime: true,
              octave: true,
              mouse: true,
              baseFrequency: true,
              date: true,
              keyboard: true,
              pFrame: true,
              frame: true,
              fragColor: true,
              pKey: true,
              pFrameSynth: true,
              synthOutput: true
          },
          
          i, j;
      
      for (i = 0; i < statements.length; i += 1) {
          statement = statements[i];
  
          if (statement.name === "main" && 
              statement.type === "function_declaration") {
              
              data = data.concat(parse_statements(statement.body.statements));
          } else if (statement.type === "function_declaration") {
              if ((statement.name in statement_exceptions)) {
                  continue;
              }
  
              data.push({
                  type: "function",
                  name: statement.name,
                  position: statement.position,
                  parameters: statement.parameters,
                  returnType: statement.returnType
              });
          } else if (statement.type === "declarator") {
              for (j = 0; j < statement.declarators.length; j += 1) {
                  declarator = statement.declarators[j];
                  
                  if (root) {
                      if ((declarator.name.name in root_declarator_exceptions) ||
                         ((declarator.name.name.match(/iInput\d+/g) && statement.typeAttribute.name === "sampler2D")) || declarator.name.name.match(/control\d+/g)) {
                          continue;
                      }
                  }
  
                  data.push({
                      type: "declarator",
                      name: declarator.name.name,
                      position: statement.position,
                      returnType: statement.typeAttribute.name
                  });
              }
          } else if (statement.type === "preprocessor") {
              data.push({
                  type: "preprocessor",
                  name: statement.identifier,
                  position: statement.position,
                  value: statement.token_string
              });
          }
      }
      
      return data;
  };
  
  self.onmessage = function (m) {
      "use strict";
  
      var glsl_code = m.data.code,
          
          glsl_o,
          
          outline = [];
  
      /* hack for GLSL 3.0 support */
      glsl_code = glsl_code.replace(/out vec4/g, "vec4"); // out vec4 fragColor;
      glsl_code = glsl_code.replace(/.length()/g, ""); // array.length()
      glsl_code = glsl_code.replace(/mat\d+x\d+/g, ""); // matNxN
      glsl_code = glsl_code.replace(/#version 300 es/g, ""); // GLSL 3.0 define
      glsl_code = glsl_code.replace(/.*\[\d+\].*\[\].*\([\s\S]+?\);$/mg, ""); // array initializer
  
      try {
          glsl_o = _PEGLSL.parse(glsl_code);
      } catch (e) {
          console.log("parseGLSL : ", e);
      }
      
      if (glsl_o) {
          outline = parse_statements(glsl_o.statements, true);
      }
      
      postMessage({
          target: m.data.target,
          outline_data: outline
      });
  };
  