//@ts-nocheck
/*
 * Generated by PEG.js 0.10.0.
 *
 * http://pegjs.org/
 */

'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 = { declaration: peg$parsedeclaration },
    peg$startRuleFunction = peg$parsedeclaration,
    peg$c0 = '(',
    peg$c1 = peg$literalExpectation('(', false),
    peg$c2 = ')',
    peg$c3 = peg$literalExpectation(')', false),
    peg$c4 = function (type, name, comment, fields) {
      return { type, name, comment, fields }
    },
    peg$c5 = 'simple',
    peg$c6 = peg$literalExpectation('simple', false),
    peg$c7 = 'object',
    peg$c8 = peg$literalExpectation('object', false),
    peg$c9 = 'table',
    peg$c10 = peg$literalExpectation('table', false),
    peg$c11 = 'auto',
    peg$c12 = peg$literalExpectation('auto', false),
    peg$c13 = 'primary',
    peg$c14 = peg$literalExpectation('primary', false),
    peg$c15 = 'index',
    peg$c16 = peg$literalExpectation('index', false),
    peg$c17 = 'unique',
    peg$c18 = peg$literalExpectation('unique', false),
    peg$c19 = function (f1, w) {
      return w
    },
    peg$c20 = function (f1, fds) {
      if (f1.name) {
        fds.unshift(f1)
      }
      return fds
    },
    peg$c21 = '#',
    peg$c22 = peg$literalExpectation('#', false),
    peg$c23 = ';',
    peg$c24 = peg$literalExpectation(';', false),
    peg$c25 = function (type, name, comment) {
      return { type, name, comment }
    },
    peg$c26 = '[',
    peg$c27 = peg$literalExpectation('[', false),
    peg$c28 = ']',
    peg$c29 = peg$literalExpectation(']', false),
    peg$c30 = function (type, size, name, comment) {
      return { type, size, name, comment }
    },
    peg$c31 = function (type, vals, name, comment) {
      return { type, vals, name, comment }
    },
    peg$c32 = ',',
    peg$c33 = peg$literalExpectation(',', false),
    peg$c34 = function (f1, fds) {
      fds.unshift(f1)
      return fds
    },
    peg$c35 = 'int',
    peg$c36 = peg$literalExpectation('int', false),
    peg$c37 = 'uint',
    peg$c38 = peg$literalExpectation('uint', false),
    peg$c39 = 'short',
    peg$c40 = peg$literalExpectation('short', false),
    peg$c41 = 'ushort',
    peg$c42 = peg$literalExpectation('ushort', false),
    peg$c43 = 'byte',
    peg$c44 = peg$literalExpectation('byte', false),
    peg$c45 = 'ubyte',
    peg$c46 = peg$literalExpectation('ubyte', false),
    peg$c47 = 'float',
    peg$c48 = peg$literalExpectation('float', false),
    peg$c49 = 'char',
    peg$c50 = peg$literalExpectation('char', false),
    peg$c51 = 'string',
    peg$c52 = peg$literalExpectation('string', false),
    peg$c53 = 'lstring',
    peg$c54 = peg$literalExpectation('lstring', false),
    peg$c55 = 'enum',
    peg$c56 = peg$literalExpectation('enum', false),
    peg$c57 = 'double',
    peg$c58 = peg$literalExpectation('double', false),
    peg$c59 = 'bigint',
    peg$c60 = peg$literalExpectation('bigint', false),
    peg$c61 = 'set',
    peg$c62 = peg$literalExpectation('set', false),
    peg$c63 = function (t, n) {
      return t + ' ' + n
    },
    peg$c64 = /^[a-zA-Z_]/,
    peg$c65 = peg$classExpectation([['a', 'z'], ['A', 'Z'], '_'], false, false),
    peg$c66 = /^[a-zA-Z0-9_]/,
    peg$c67 = peg$classExpectation(
      [['a', 'z'], ['A', 'Z'], ['0', '9'], '_'],
      false,
      false,
    ),
    peg$c68 = function (t) {
      return text()
    },
    peg$c69 = '"',
    peg$c70 = peg$literalExpectation('"', false),
    peg$c71 = /^[^"]/,
    peg$c72 = peg$classExpectation(['"'], true, false),
    peg$c73 = function (t) {
      return t.join('')
    },
    peg$c74 = /^[^\n\r]/,
    peg$c75 = peg$classExpectation(['\n', '\r'], true, false),
    peg$c76 = function (t) {
      return t.join('').replace(/^"/, '').replace(/"$/, '')
    },
    peg$c77 = peg$otherExpectation('integer'),
    peg$c78 = /^[0-9]/,
    peg$c79 = peg$classExpectation([['0', '9']], false, false),
    peg$c80 = function () {
      return parseInt(text(), 10)
    },
    peg$c81 = peg$otherExpectation('whitespace'),
    peg$c82 = /^[ \t\n\r]/,
    peg$c83 = peg$classExpectation([' ', '\t', '\n', '\r'], false, false),
    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$parsedeclaration() {
    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13

    s0 = peg$currPos
    s1 = peg$parse_()
    if (s1 !== peg$FAILED) {
      s2 = peg$parsedeclareType()
      if (s2 !== peg$FAILED) {
        s3 = peg$parse_()
        if (s3 !== peg$FAILED) {
          s4 = peg$parsedeclareName()
          if (s4 !== peg$FAILED) {
            s5 = peg$parse_()
            if (s5 !== peg$FAILED) {
              s6 = peg$parsecomment()
              if (s6 !== peg$FAILED) {
                s7 = peg$parse_()
                if (s7 !== peg$FAILED) {
                  if (input.charCodeAt(peg$currPos) === 40) {
                    s8 = peg$c0
                    peg$currPos++
                  } else {
                    s8 = peg$FAILED
                    if (peg$silentFails === 0) {
                      peg$fail(peg$c1)
                    }
                  }
                  if (s8 !== peg$FAILED) {
                    s9 = peg$parse_()
                    if (s9 !== peg$FAILED) {
                      s10 = peg$parsefieldList()
                      if (s10 !== peg$FAILED) {
                        s11 = peg$parse_()
                        if (s11 !== peg$FAILED) {
                          if (input.charCodeAt(peg$currPos) === 41) {
                            s12 = peg$c2
                            peg$currPos++
                          } else {
                            s12 = peg$FAILED
                            if (peg$silentFails === 0) {
                              peg$fail(peg$c3)
                            }
                          }
                          if (s12 !== peg$FAILED) {
                            s13 = peg$parse_()
                            if (s13 !== peg$FAILED) {
                              peg$savedPos = s0
                              s1 = peg$c4(s2, s4, s6, s10)
                              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
            }
          } 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$parsedeclareType() {
    var s0

    if (input.substr(peg$currPos, 6) === peg$c5) {
      s0 = peg$c5
      peg$currPos += 6
    } else {
      s0 = peg$FAILED
      if (peg$silentFails === 0) {
        peg$fail(peg$c6)
      }
    }
    if (s0 === peg$FAILED) {
      if (input.substr(peg$currPos, 6) === peg$c7) {
        s0 = peg$c7
        peg$currPos += 6
      } else {
        s0 = peg$FAILED
        if (peg$silentFails === 0) {
          peg$fail(peg$c8)
        }
      }
      if (s0 === peg$FAILED) {
        if (input.substr(peg$currPos, 5) === peg$c9) {
          s0 = peg$c9
          peg$currPos += 5
        } else {
          s0 = peg$FAILED
          if (peg$silentFails === 0) {
            peg$fail(peg$c10)
          }
        }
      }
    }

    return s0
  }

  function peg$parsedeclareName() {
    var s0, s1, s2, s3

    s0 = peg$parsename()
    if (s0 === peg$FAILED) {
      s0 = peg$currPos
      s1 = peg$parsename()
      if (s1 !== peg$FAILED) {
        s2 = peg$parseindexType()
        if (s2 !== peg$FAILED) {
          s1 = [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
        s1 = peg$parsename()
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c11) {
            s2 = peg$c11
            peg$currPos += 4
          } else {
            s2 = peg$FAILED
            if (peg$silentFails === 0) {
              peg$fail(peg$c12)
            }
          }
          if (s2 !== peg$FAILED) {
            s1 = [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
          s1 = peg$parsename()
          if (s1 !== peg$FAILED) {
            s2 = peg$parseindexType()
            if (s2 !== peg$FAILED) {
              if (input.substr(peg$currPos, 4) === peg$c11) {
                s3 = peg$c11
                peg$currPos += 4
              } else {
                s3 = peg$FAILED
                if (peg$silentFails === 0) {
                  peg$fail(peg$c12)
                }
              }
              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$parseindexType() {
    var s0

    if (input.substr(peg$currPos, 7) === peg$c13) {
      s0 = peg$c13
      peg$currPos += 7
    } else {
      s0 = peg$FAILED
      if (peg$silentFails === 0) {
        peg$fail(peg$c14)
      }
    }
    if (s0 === peg$FAILED) {
      if (input.substr(peg$currPos, 5) === peg$c15) {
        s0 = peg$c15
        peg$currPos += 5
      } else {
        s0 = peg$FAILED
        if (peg$silentFails === 0) {
          peg$fail(peg$c16)
        }
      }
      if (s0 === peg$FAILED) {
        if (input.substr(peg$currPos, 6) === peg$c17) {
          s0 = peg$c17
          peg$currPos += 6
        } else {
          s0 = peg$FAILED
          if (peg$silentFails === 0) {
            peg$fail(peg$c18)
          }
        }
      }
    }

    return s0
  }

  function peg$parsecomment() {
    var s0

    s0 = peg$parsenonQuotedString()
    if (s0 === peg$FAILED) {
      s0 = peg$parse_()
    }

    return s0
  }

  function peg$parsefieldList() {
    var s0, s1, s2, s3, s4, s5, s6

    s0 = peg$currPos
    s1 = peg$parsefield()
    if (s1 !== peg$FAILED) {
      s2 = peg$parse_()
      if (s2 !== peg$FAILED) {
        s3 = []
        s4 = peg$currPos
        s5 = peg$parse_()
        if (s5 !== peg$FAILED) {
          s6 = peg$parsefield()
          if (s6 !== peg$FAILED) {
            peg$savedPos = s4
            s5 = peg$c19(s1, 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$parse_()
          if (s5 !== peg$FAILED) {
            s6 = peg$parsefield()
            if (s6 !== peg$FAILED) {
              peg$savedPos = s4
              s5 = peg$c19(s1, s6)
              s4 = s5
            } else {
              peg$currPos = s4
              s4 = peg$FAILED
            }
          } else {
            peg$currPos = s4
            s4 = peg$FAILED
          }
        }
        if (s3 !== peg$FAILED) {
          s4 = peg$parse_()
          if (s4 !== peg$FAILED) {
            peg$savedPos = s0
            s1 = peg$c20(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$parsecommentStart() {
    var s0

    if (input.charCodeAt(peg$currPos) === 35) {
      s0 = peg$c21
      peg$currPos++
    } else {
      s0 = peg$FAILED
      if (peg$silentFails === 0) {
        peg$fail(peg$c22)
      }
    }

    return s0
  }

  function peg$parseinternalComment() {
    var s0, s1, s2, s3, s4

    s0 = peg$currPos
    s1 = peg$parse_()
    if (s1 !== peg$FAILED) {
      s2 = peg$parsecommentStart()
      if (s2 !== peg$FAILED) {
        s3 = peg$parsenonQuotedString()
        if (s3 !== peg$FAILED) {
          s4 = peg$parse_()
          if (s4 !== peg$FAILED) {
            s1 = [s1, s2, 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$parsefield() {
    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13

    s0 = peg$currPos
    s1 = peg$parsefieldType()
    if (s1 !== peg$FAILED) {
      s2 = peg$parse_()
      if (s2 !== peg$FAILED) {
        s3 = peg$parsename()
        if (s3 !== peg$FAILED) {
          s4 = peg$parse_()
          if (s4 !== peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 59) {
              s5 = peg$c23
              peg$currPos++
            } else {
              s5 = peg$FAILED
              if (peg$silentFails === 0) {
                peg$fail(peg$c24)
              }
            }
            if (s5 !== peg$FAILED) {
              s6 = peg$parse_()
              if (s6 !== peg$FAILED) {
                s7 = peg$parsecomment()
                if (s7 !== peg$FAILED) {
                  peg$savedPos = s0
                  s1 = peg$c25(s1, s3, 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$currPos
      s1 = peg$parsefieldType()
      if (s1 !== peg$FAILED) {
        s2 = peg$parse_()
        if (s2 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 91) {
            s3 = peg$c26
            peg$currPos++
          } else {
            s3 = peg$FAILED
            if (peg$silentFails === 0) {
              peg$fail(peg$c27)
            }
          }
          if (s3 !== peg$FAILED) {
            s4 = peg$parse_()
            if (s4 !== peg$FAILED) {
              s5 = peg$parsefieldSize()
              if (s5 !== peg$FAILED) {
                s6 = peg$parse_()
                if (s6 !== peg$FAILED) {
                  if (input.charCodeAt(peg$currPos) === 93) {
                    s7 = peg$c28
                    peg$currPos++
                  } else {
                    s7 = peg$FAILED
                    if (peg$silentFails === 0) {
                      peg$fail(peg$c29)
                    }
                  }
                  if (s7 !== peg$FAILED) {
                    s8 = peg$parse_()
                    if (s8 !== peg$FAILED) {
                      s9 = peg$parsename()
                      if (s9 !== peg$FAILED) {
                        s10 = peg$parse_()
                        if (s10 !== peg$FAILED) {
                          if (input.charCodeAt(peg$currPos) === 59) {
                            s11 = peg$c23
                            peg$currPos++
                          } else {
                            s11 = peg$FAILED
                            if (peg$silentFails === 0) {
                              peg$fail(peg$c24)
                            }
                          }
                          if (s11 !== peg$FAILED) {
                            s12 = peg$parse_()
                            if (s12 !== peg$FAILED) {
                              s13 = peg$parsecomment()
                              if (s13 !== peg$FAILED) {
                                peg$savedPos = s0
                                s1 = peg$c30(s1, s5, s9, s13)
                                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
              }
            } 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$parsefieldType()
        if (s1 !== peg$FAILED) {
          s2 = peg$parse_()
          if (s2 !== peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 40) {
              s3 = peg$c0
              peg$currPos++
            } else {
              s3 = peg$FAILED
              if (peg$silentFails === 0) {
                peg$fail(peg$c1)
              }
            }
            if (s3 !== peg$FAILED) {
              s4 = peg$parse_()
              if (s4 !== peg$FAILED) {
                s5 = peg$parsefieldValues()
                if (s5 !== peg$FAILED) {
                  s6 = peg$parse_()
                  if (s6 !== peg$FAILED) {
                    if (input.charCodeAt(peg$currPos) === 41) {
                      s7 = peg$c2
                      peg$currPos++
                    } else {
                      s7 = peg$FAILED
                      if (peg$silentFails === 0) {
                        peg$fail(peg$c3)
                      }
                    }
                    if (s7 !== peg$FAILED) {
                      s8 = peg$parse_()
                      if (s8 !== peg$FAILED) {
                        s9 = peg$parsename()
                        if (s9 !== peg$FAILED) {
                          s10 = peg$parse_()
                          if (s10 !== peg$FAILED) {
                            if (input.charCodeAt(peg$currPos) === 59) {
                              s11 = peg$c23
                              peg$currPos++
                            } else {
                              s11 = peg$FAILED
                              if (peg$silentFails === 0) {
                                peg$fail(peg$c24)
                              }
                            }
                            if (s11 !== peg$FAILED) {
                              s12 = peg$parse_()
                              if (s12 !== peg$FAILED) {
                                s13 = peg$parsecomment()
                                if (s13 !== peg$FAILED) {
                                  peg$savedPos = s0
                                  s1 = peg$c31(s1, s5, s9, s13)
                                  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
                }
              } 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$parseinternalComment()
        }
      }
    }

    return s0
  }

  function peg$parsefieldValues() {
    var s0, s1, s2, s3, s4, s5, s6

    s0 = peg$currPos
    s1 = peg$parsename()
    if (s1 !== peg$FAILED) {
      s2 = []
      s3 = peg$currPos
      if (input.charCodeAt(peg$currPos) === 44) {
        s4 = peg$c32
        peg$currPos++
      } else {
        s4 = peg$FAILED
        if (peg$silentFails === 0) {
          peg$fail(peg$c33)
        }
      }
      if (s4 !== peg$FAILED) {
        s5 = peg$parse_()
        if (s5 !== peg$FAILED) {
          s6 = peg$parsename()
          if (s6 !== peg$FAILED) {
            peg$savedPos = s3
            s4 = peg$c19(s1, s6)
            s3 = s4
          } 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
        if (input.charCodeAt(peg$currPos) === 44) {
          s4 = peg$c32
          peg$currPos++
        } else {
          s4 = peg$FAILED
          if (peg$silentFails === 0) {
            peg$fail(peg$c33)
          }
        }
        if (s4 !== peg$FAILED) {
          s5 = peg$parse_()
          if (s5 !== peg$FAILED) {
            s6 = peg$parsename()
            if (s6 !== peg$FAILED) {
              peg$savedPos = s3
              s4 = peg$c19(s1, s6)
              s3 = s4
            } 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$c34(s1, s2)
        s0 = s1
      } else {
        peg$currPos = s0
        s0 = peg$FAILED
      }
    } else {
      peg$currPos = s0
      s0 = peg$FAILED
    }

    return s0
  }

  function peg$parsefieldType() {
    var s0, s1, s2, s3

    if (input.substr(peg$currPos, 3) === peg$c35) {
      s0 = peg$c35
      peg$currPos += 3
    } else {
      s0 = peg$FAILED
      if (peg$silentFails === 0) {
        peg$fail(peg$c36)
      }
    }
    if (s0 === peg$FAILED) {
      if (input.substr(peg$currPos, 4) === peg$c37) {
        s0 = peg$c37
        peg$currPos += 4
      } else {
        s0 = peg$FAILED
        if (peg$silentFails === 0) {
          peg$fail(peg$c38)
        }
      }
      if (s0 === peg$FAILED) {
        if (input.substr(peg$currPos, 5) === peg$c39) {
          s0 = peg$c39
          peg$currPos += 5
        } else {
          s0 = peg$FAILED
          if (peg$silentFails === 0) {
            peg$fail(peg$c40)
          }
        }
        if (s0 === peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c41) {
            s0 = peg$c41
            peg$currPos += 6
          } else {
            s0 = peg$FAILED
            if (peg$silentFails === 0) {
              peg$fail(peg$c42)
            }
          }
          if (s0 === peg$FAILED) {
            if (input.substr(peg$currPos, 4) === peg$c43) {
              s0 = peg$c43
              peg$currPos += 4
            } else {
              s0 = peg$FAILED
              if (peg$silentFails === 0) {
                peg$fail(peg$c44)
              }
            }
            if (s0 === peg$FAILED) {
              if (input.substr(peg$currPos, 5) === peg$c45) {
                s0 = peg$c45
                peg$currPos += 5
              } else {
                s0 = peg$FAILED
                if (peg$silentFails === 0) {
                  peg$fail(peg$c46)
                }
              }
              if (s0 === peg$FAILED) {
                if (input.substr(peg$currPos, 5) === peg$c47) {
                  s0 = peg$c47
                  peg$currPos += 5
                } else {
                  s0 = peg$FAILED
                  if (peg$silentFails === 0) {
                    peg$fail(peg$c48)
                  }
                }
                if (s0 === peg$FAILED) {
                  if (input.substr(peg$currPos, 4) === peg$c49) {
                    s0 = peg$c49
                    peg$currPos += 4
                  } else {
                    s0 = peg$FAILED
                    if (peg$silentFails === 0) {
                      peg$fail(peg$c50)
                    }
                  }
                  if (s0 === peg$FAILED) {
                    if (input.substr(peg$currPos, 6) === peg$c51) {
                      s0 = peg$c51
                      peg$currPos += 6
                    } else {
                      s0 = peg$FAILED
                      if (peg$silentFails === 0) {
                        peg$fail(peg$c52)
                      }
                    }
                    if (s0 === peg$FAILED) {
                      if (input.substr(peg$currPos, 7) === peg$c53) {
                        s0 = peg$c53
                        peg$currPos += 7
                      } else {
                        s0 = peg$FAILED
                        if (peg$silentFails === 0) {
                          peg$fail(peg$c54)
                        }
                      }
                      if (s0 === peg$FAILED) {
                        if (input.substr(peg$currPos, 4) === peg$c55) {
                          s0 = peg$c55
                          peg$currPos += 4
                        } else {
                          s0 = peg$FAILED
                          if (peg$silentFails === 0) {
                            peg$fail(peg$c56)
                          }
                        }
                        if (s0 === peg$FAILED) {
                          if (input.substr(peg$currPos, 6) === peg$c57) {
                            s0 = peg$c57
                            peg$currPos += 6
                          } else {
                            s0 = peg$FAILED
                            if (peg$silentFails === 0) {
                              peg$fail(peg$c58)
                            }
                          }
                          if (s0 === peg$FAILED) {
                            if (input.substr(peg$currPos, 6) === peg$c59) {
                              s0 = peg$c59
                              peg$currPos += 6
                            } else {
                              s0 = peg$FAILED
                              if (peg$silentFails === 0) {
                                peg$fail(peg$c60)
                              }
                            }
                            if (s0 === peg$FAILED) {
                              if (input.substr(peg$currPos, 3) === peg$c61) {
                                s0 = peg$c61
                                peg$currPos += 3
                              } else {
                                s0 = peg$FAILED
                                if (peg$silentFails === 0) {
                                  peg$fail(peg$c62)
                                }
                              }
                              if (s0 === peg$FAILED) {
                                s0 = peg$currPos
                                s1 = peg$parsedeclareType()
                                if (s1 !== peg$FAILED) {
                                  s2 = peg$parse_()
                                  if (s2 !== peg$FAILED) {
                                    s3 = peg$parsedeclareName()
                                    if (s3 !== peg$FAILED) {
                                      peg$savedPos = s0
                                      s1 = peg$c63(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$parsefieldSize() {
    var s0

    s0 = peg$parsenumber()
    if (s0 === peg$FAILED) {
      s0 = peg$parsename()
    }

    return s0
  }

  function peg$parsename() {
    var s0, s1, s2, s3, s4

    s0 = peg$currPos
    s1 = peg$currPos
    if (peg$c64.test(input.charAt(peg$currPos))) {
      s2 = input.charAt(peg$currPos)
      peg$currPos++
    } else {
      s2 = peg$FAILED
      if (peg$silentFails === 0) {
        peg$fail(peg$c65)
      }
    }
    if (s2 !== peg$FAILED) {
      s3 = []
      if (peg$c66.test(input.charAt(peg$currPos))) {
        s4 = input.charAt(peg$currPos)
        peg$currPos++
      } else {
        s4 = peg$FAILED
        if (peg$silentFails === 0) {
          peg$fail(peg$c67)
        }
      }
      while (s4 !== peg$FAILED) {
        s3.push(s4)
        if (peg$c66.test(input.charAt(peg$currPos))) {
          s4 = input.charAt(peg$currPos)
          peg$currPos++
        } else {
          s4 = peg$FAILED
          if (peg$silentFails === 0) {
            peg$fail(peg$c67)
          }
        }
      }
      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$c68(s1)
    }
    s0 = s1

    return s0
  }

  function peg$parsequotedString() {
    var s0, s1, s2, s3

    s0 = peg$currPos
    if (input.charCodeAt(peg$currPos) === 34) {
      s1 = peg$c69
      peg$currPos++
    } else {
      s1 = peg$FAILED
      if (peg$silentFails === 0) {
        peg$fail(peg$c70)
      }
    }
    if (s1 !== peg$FAILED) {
      s2 = []
      if (peg$c71.test(input.charAt(peg$currPos))) {
        s3 = input.charAt(peg$currPos)
        peg$currPos++
      } else {
        s3 = peg$FAILED
        if (peg$silentFails === 0) {
          peg$fail(peg$c72)
        }
      }
      while (s3 !== peg$FAILED) {
        s2.push(s3)
        if (peg$c71.test(input.charAt(peg$currPos))) {
          s3 = input.charAt(peg$currPos)
          peg$currPos++
        } else {
          s3 = peg$FAILED
          if (peg$silentFails === 0) {
            peg$fail(peg$c72)
          }
        }
      }
      if (s2 !== peg$FAILED) {
        if (input.charCodeAt(peg$currPos) === 34) {
          s3 = peg$c69
          peg$currPos++
        } else {
          s3 = peg$FAILED
          if (peg$silentFails === 0) {
            peg$fail(peg$c70)
          }
        }
        if (s3 !== peg$FAILED) {
          peg$savedPos = s0
          s1 = peg$c73(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$parsenonQuotedString() {
    var s0, s1, s2

    s0 = peg$currPos
    s1 = []
    if (peg$c74.test(input.charAt(peg$currPos))) {
      s2 = input.charAt(peg$currPos)
      peg$currPos++
    } else {
      s2 = peg$FAILED
      if (peg$silentFails === 0) {
        peg$fail(peg$c75)
      }
    }
    while (s2 !== peg$FAILED) {
      s1.push(s2)
      if (peg$c74.test(input.charAt(peg$currPos))) {
        s2 = input.charAt(peg$currPos)
        peg$currPos++
      } else {
        s2 = peg$FAILED
        if (peg$silentFails === 0) {
          peg$fail(peg$c75)
        }
      }
    }
    if (s1 !== peg$FAILED) {
      peg$savedPos = s0
      s1 = peg$c76(s1)
    }
    s0 = s1

    return s0
  }

  function peg$parsenumber() {
    var s0, s1, s2, s3

    peg$silentFails++
    s0 = peg$currPos
    s1 = peg$parse_()
    if (s1 !== peg$FAILED) {
      s2 = []
      if (peg$c78.test(input.charAt(peg$currPos))) {
        s3 = input.charAt(peg$currPos)
        peg$currPos++
      } else {
        s3 = peg$FAILED
        if (peg$silentFails === 0) {
          peg$fail(peg$c79)
        }
      }
      if (s3 !== peg$FAILED) {
        while (s3 !== peg$FAILED) {
          s2.push(s3)
          if (peg$c78.test(input.charAt(peg$currPos))) {
            s3 = input.charAt(peg$currPos)
            peg$currPos++
          } else {
            s3 = peg$FAILED
            if (peg$silentFails === 0) {
              peg$fail(peg$c79)
            }
          }
        }
      } else {
        s2 = peg$FAILED
      }
      if (s2 !== peg$FAILED) {
        peg$savedPos = s0
        s1 = peg$c80()
        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$c77)
      }
    }

    return s0
  }

  function peg$parse_() {
    var s0, s1

    peg$silentFails++
    s0 = []
    if (peg$c82.test(input.charAt(peg$currPos))) {
      s1 = input.charAt(peg$currPos)
      peg$currPos++
    } else {
      s1 = peg$FAILED
      if (peg$silentFails === 0) {
        peg$fail(peg$c83)
      }
    }
    while (s1 !== peg$FAILED) {
      s0.push(s1)
      if (peg$c82.test(input.charAt(peg$currPos))) {
        s1 = input.charAt(peg$currPos)
        peg$currPos++
      } else {
        s1 = peg$FAILED
        if (peg$silentFails === 0) {
          peg$fail(peg$c83)
        }
      }
    }
    peg$silentFails--
    if (s0 === peg$FAILED) {
      s1 = peg$FAILED
      if (peg$silentFails === 0) {
        peg$fail(peg$c81)
      }
    }

    return s0
  }

  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),
    )
  }
}

export default {
  SyntaxError: peg$SyntaxError,
  parse: peg$parse,
}
