/* eslint-disable */

import { getPitchesFromNamedChord, noteNameToPitchClass } from '../scale';import * as types from '../types';
import { DEFAULT_DURS } from '../defaults';
import { safeEval } from '../utils';



const peggyParser: {parse: any, SyntaxError: any, DefaultTracer?: any} = // Generated by Peggy 3.0.2.
//
// https://peggyjs.org/
// @ts-ignore
(function() {
// @ts-ignore
  "use strict";

// @ts-ignore
function peg$subclass(child, parent) {
// @ts-ignore
  function C() { this.constructor = child; }
// @ts-ignore
  C.prototype = parent.prototype;
// @ts-ignore
  child.prototype = new C();
}

// @ts-ignore
function peg$SyntaxError(message, expected, found, location) {
// @ts-ignore
  var self = Error.call(this, message);
  // istanbul ignore next Check is a necessary evil to support older environments
// @ts-ignore
  if (Object.setPrototypeOf) {
// @ts-ignore
    Object.setPrototypeOf(self, peg$SyntaxError.prototype);
  }
// @ts-ignore
  self.expected = expected;
// @ts-ignore
  self.found = found;
// @ts-ignore
  self.location = location;
// @ts-ignore
  self.name = "SyntaxError";
// @ts-ignore
  return self;
}

// @ts-ignore
peg$subclass(peg$SyntaxError, Error);

// @ts-ignore
function peg$padEnd(str, targetLength, padString) {
// @ts-ignore
  padString = padString || " ";
// @ts-ignore
  if (str.length > targetLength) { return str; }
// @ts-ignore
  targetLength -= str.length;
// @ts-ignore
  padString += padString.repeat(targetLength);
// @ts-ignore
  return str + padString.slice(0, targetLength);
}

// @ts-ignore
peg$SyntaxError.prototype.format = function(sources) {
// @ts-ignore
  var str = "Error: " + this.message;
// @ts-ignore
  if (this.location) {
// @ts-ignore
    var src = null;
// @ts-ignore
    var k;
// @ts-ignore
    for (k = 0; k < sources.length; k++) {
// @ts-ignore
      if (sources[k].source === this.location.source) {
// @ts-ignore
        src = sources[k].text.split(/\r\n|\n|\r/g);
// @ts-ignore
        break;
      }
    }
// @ts-ignore
    var s = this.location.start;
// @ts-ignore
    var offset_s = (this.location.source && (typeof this.location.source.offset === "function"))
// @ts-ignore
      ? this.location.source.offset(s)
// @ts-ignore
      : s;
// @ts-ignore
    var loc = this.location.source + ":" + offset_s.line + ":" + offset_s.column;
// @ts-ignore
    if (src) {
// @ts-ignore
      var e = this.location.end;
// @ts-ignore
      var filler = peg$padEnd("", offset_s.line.toString().length, ' ');
// @ts-ignore
      var line = src[s.line - 1];
// @ts-ignore
      var last = s.line === e.line ? e.column : line.length + 1;
// @ts-ignore
      var hatLen = (last - s.column) || 1;
// @ts-ignore
      str += "\n --> " + loc + "\n"
// @ts-ignore
          + filler + " |\n"
// @ts-ignore
          + offset_s.line + " | " + line + "\n"
// @ts-ignore
          + filler + " | " + peg$padEnd("", s.column - 1, ' ')
// @ts-ignore
          + peg$padEnd("", hatLen, "^");
// @ts-ignore
    } else {
// @ts-ignore
      str += "\n at " + loc;
    }
  }
// @ts-ignore
  return str;
};

// @ts-ignore
peg$SyntaxError.buildMessage = function(expected, found) {
// @ts-ignore
  var DESCRIBE_EXPECTATION_FNS = {
// @ts-ignore
    literal: function(expectation) {
// @ts-ignore
      return "\"" + literalEscape(expectation.text) + "\"";
    },

// @ts-ignore
    class: function(expectation) {
// @ts-ignore
      var escapedParts = expectation.parts.map(function(part) {
// @ts-ignore
        return Array.isArray(part)
// @ts-ignore
          ? classEscape(part[0]) + "-" + classEscape(part[1])
// @ts-ignore
          : classEscape(part);
      });

// @ts-ignore
      return "[" + (expectation.inverted ? "^" : "") + escapedParts.join("") + "]";
    },

// @ts-ignore
    any: function() {
// @ts-ignore
      return "any character";
    },

// @ts-ignore
    end: function() {
// @ts-ignore
      return "end of input";
    },

// @ts-ignore
    other: function(expectation) {
// @ts-ignore
      return expectation.description;
    }
  };

// @ts-ignore
  function hex(ch) {
// @ts-ignore
    return ch.charCodeAt(0).toString(16).toUpperCase();
  }

// @ts-ignore
  function literalEscape(s) {
// @ts-ignore
    return s
// @ts-ignore
      .replace(/\\/g, "\\\\")
// @ts-ignore
      .replace(/"/g,  "\\\"")
// @ts-ignore
      .replace(/\0/g, "\\0")
// @ts-ignore
      .replace(/\t/g, "\\t")
// @ts-ignore
      .replace(/\n/g, "\\n")
// @ts-ignore
      .replace(/\r/g, "\\r")
// @ts-ignore
      .replace(/[\x00-\x0F]/g,          function(ch) { return "\\x0" + hex(ch); })
// @ts-ignore
      .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x"  + hex(ch); });
  }

// @ts-ignore
  function classEscape(s) {
// @ts-ignore
    return s
// @ts-ignore
      .replace(/\\/g, "\\\\")
// @ts-ignore
      .replace(/\]/g, "\\]")
// @ts-ignore
      .replace(/\^/g, "\\^")
// @ts-ignore
      .replace(/-/g,  "\\-")
// @ts-ignore
      .replace(/\0/g, "\\0")
// @ts-ignore
      .replace(/\t/g, "\\t")
// @ts-ignore
      .replace(/\n/g, "\\n")
// @ts-ignore
      .replace(/\r/g, "\\r")
// @ts-ignore
      .replace(/[\x00-\x0F]/g,          function(ch) { return "\\x0" + hex(ch); })
// @ts-ignore
      .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x"  + hex(ch); });
  }

// @ts-ignore
  function describeExpectation(expectation) {
// @ts-ignore
    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
  }

// @ts-ignore
  function describeExpected(expected) {
// @ts-ignore
    var descriptions = expected.map(describeExpectation);
// @ts-ignore
    var i, j;

// @ts-ignore
    descriptions.sort();

// @ts-ignore
    if (descriptions.length > 0) {
// @ts-ignore
      for (i = 1, j = 1; i < descriptions.length; i++) {
// @ts-ignore
        if (descriptions[i - 1] !== descriptions[i]) {
// @ts-ignore
          descriptions[j] = descriptions[i];
// @ts-ignore
          j++;
        }
      }
// @ts-ignore
      descriptions.length = j;
    }

// @ts-ignore
    switch (descriptions.length) {
// @ts-ignore
      case 1:
// @ts-ignore
        return descriptions[0];

// @ts-ignore
      case 2:
// @ts-ignore
        return descriptions[0] + " or " + descriptions[1];

// @ts-ignore
      default:
// @ts-ignore
        return descriptions.slice(0, -1).join(", ")
// @ts-ignore
          + ", or "
// @ts-ignore
          + descriptions[descriptions.length - 1];
    }
  }

// @ts-ignore
  function describeFound(found) {
// @ts-ignore
    return found ? "\"" + literalEscape(found) + "\"" : "end of input";
  }

// @ts-ignore
  return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
};

// @ts-ignore
function peg$parse(input, options) {
// @ts-ignore
  options = options !== undefined ? options : {};

// @ts-ignore
  var peg$FAILED = {};
// @ts-ignore
  var peg$source = options.grammarSource;

// @ts-ignore
  var peg$startRuleFunctions = { start: peg$parsestart };
// @ts-ignore
  var peg$startRuleFunction = peg$parsestart;

// @ts-ignore
  var peg$c0 = "-";
  var peg$c1 = ".";
  var peg$c2 = ",";
  var peg$c3 = "|";
  var peg$c4 = "\"";
  var peg$c5 = "'";
  var peg$c6 = "<";
  var peg$c7 = ">";
  var peg$c8 = "@";
  var peg$c9 = ":";
  var peg$c10 = "/";
  var peg$c11 = "(";
  var peg$c12 = ")";
  var peg$c13 = "[:";
  var peg$c14 = "]";
  var peg$c15 = "[";
  var peg$c16 = "{";
  var peg$c17 = "}";
  var peg$c18 = "+";
  var peg$c19 = "*";
  var peg$c20 = "%";
  var peg$c21 = "^";
  var peg$c22 = "&";
  var peg$c23 = ">>";
  var peg$c24 = "<<";
  var peg$c25 = "_";
  var peg$c26 = "?";
  var peg$c27 = "!";
  var peg$c28 = "r";
  var peg$c29 = "#";
  var peg$c30 = "b";
  var peg$c31 = "=";
  var peg$c32 = "~";
  var peg$c33 = "iii";
  var peg$c34 = "ii";
  var peg$c35 = "iv";
  var peg$c36 = "i";
  var peg$c37 = "vii";
  var peg$c38 = "vi";
  var peg$c39 = "v";

  var peg$r0 = /^[0-9]/;
  var peg$r1 = /^[ \n\r\t]/;
  var peg$r2 = /^[a-z]/;
  var peg$r3 = /^[a-z_]/;
  var peg$r4 = /^[a-z_0-9]/;
  var peg$r5 = /^[mklpdcwyhnqaefsxtgujzo]/;
  var peg$r6 = /^[.]/;
  var peg$r7 = /^[a-zA-Z0-9]/;
  var peg$r8 = /^[a-zA-Z0-9\-*+]/;
  var peg$r9 = /^[A-G]/;
  var peg$r10 = /^[bs]/;
  var peg$r11 = /^[A-Z]/;

  var peg$e0 = peg$literalExpectation("-", false);
  var peg$e1 = peg$classExpectation([["0", "9"]], false, false);
  var peg$e2 = peg$literalExpectation(".", false);
  var peg$e3 = peg$otherExpectation("whitespace");
  var peg$e4 = peg$classExpectation([" ", "\n", "\r", "\t"], false, false);
  var peg$e5 = peg$literalExpectation(",", false);
  var peg$e6 = peg$literalExpectation("|", false);
  var peg$e7 = peg$literalExpectation("\"", false);
  var peg$e8 = peg$literalExpectation("'", false);
  var peg$e9 = peg$classExpectation([["a", "z"]], false, false);
  var peg$e10 = peg$classExpectation([["a", "z"], "_"], false, false);
  var peg$e11 = peg$classExpectation([["a", "z"], "_", ["0", "9"]], false, false);
  var peg$e12 = peg$literalExpectation("<", false);
  var peg$e13 = peg$literalExpectation(">", false);
  var peg$e14 = peg$literalExpectation("@", false);
  var peg$e15 = peg$literalExpectation(":", false);
  var peg$e16 = peg$classExpectation(["m", "k", "l", "p", "d", "c", "w", "y", "h", "n", "q", "a", "e", "f", "s", "x", "t", "g", "u", "j", "z", "o"], false, false);
  var peg$e17 = peg$classExpectation(["."], false, false);
  var peg$e18 = peg$literalExpectation("/", false);
  var peg$e19 = peg$literalExpectation("(", false);
  var peg$e20 = peg$literalExpectation(")", false);
  var peg$e21 = peg$literalExpectation("[:", false);
  var peg$e22 = peg$literalExpectation("]", false);
  var peg$e23 = peg$literalExpectation("[", false);
  var peg$e24 = peg$literalExpectation("{", false);
  var peg$e25 = peg$literalExpectation("}", false);
  var peg$e26 = peg$literalExpectation("+", false);
  var peg$e27 = peg$literalExpectation("*", false);
  var peg$e28 = peg$literalExpectation("%", false);
  var peg$e29 = peg$literalExpectation("^", false);
  var peg$e30 = peg$literalExpectation("&", false);
  var peg$e31 = peg$literalExpectation(">>", false);
  var peg$e32 = peg$literalExpectation("<<", false);
  var peg$e33 = peg$literalExpectation("_", false);
  var peg$e34 = peg$literalExpectation("?", false);
  var peg$e35 = peg$literalExpectation("!", false);
  var peg$e36 = peg$literalExpectation("r", false);
  var peg$e37 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false);
  var peg$e38 = peg$literalExpectation("#", false);
  var peg$e39 = peg$literalExpectation("b", false);
  var peg$e40 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "-", "*", "+"], false, false);
  var peg$e41 = peg$classExpectation([["A", "G"]], false, false);
  var peg$e42 = peg$classExpectation(["b", "s"], false, false);
  var peg$e43 = peg$classExpectation([["A", "Z"]], false, false);
  var peg$e44 = peg$literalExpectation("=", false);
  var peg$e45 = peg$literalExpectation("~", false);
  var peg$e46 = peg$literalExpectation("iii", false);
  var peg$e47 = peg$literalExpectation("ii", false);
  var peg$e48 = peg$literalExpectation("iv", false);
  var peg$e49 = peg$literalExpectation("i", false);
  var peg$e50 = peg$literalExpectation("vii", false);
  var peg$e51 = peg$literalExpectation("vi", false);
  var peg$e52 = peg$literalExpectation("v", false);
// @ts-ignore

  var peg$f0 = function(s) { 
// @ts-ignore
  return s.filter(a => a);
};// @ts-ignore

  var peg$f1 = function() {// @ts-ignore
 return parseFloat(text()) };// @ts-ignore

  var peg$f2 = function() {// @ts-ignore
 return parseInt(text()); };// @ts-ignore

  var peg$f3 = function() {// @ts-ignore
 return parseInt(text()) };// @ts-ignore

  var peg$f4 = function() {// @ts-ignore
 return undefined };// @ts-ignore

  var peg$f5 = function(t) {
// @ts-ignore
  return build(types.Sound, {sound: t});
};// @ts-ignore

  var peg$f6 = function() {// @ts-ignore
 return text() };// @ts-ignore

  var peg$f7 = function() {// @ts-ignore
 return text() };// @ts-ignore

  var peg$f8 = function(l) {// @ts-ignore
 return build(types.Cycle,{items: l}) };// @ts-ignore

  var peg$f9 = function(v) {// @ts-ignore
 return v };// @ts-ignore

  var peg$f10 = function(e, s) {// @ts-ignore
 return build(types.SoundEvent,{item: e, sound: s}) };// @ts-ignore

  var peg$f11 = function(e, i) {// @ts-ignore
 return build(types.SoundIndex,{item: e, soundIndex: i}) };// @ts-ignore

  var peg$f12 = function(n) {// @ts-ignore
 return n };// @ts-ignore

  var peg$f13 = function(c, d) {
// @ts-ignore
  var dots = d ? d.length : 0;
// @ts-ignore
  var dur = DEFAULT_DURS[c]
// @ts-ignore
  if(dots>0) return (dur * (2.0-(1.0/(2*dots))))
// @ts-ignore
  else return dur
};// @ts-ignore

  var peg$f14 = function(n, d) {// @ts-ignore
 return n/d };// @ts-ignore

  var peg$f15 = function(n) {// @ts-ignore
 return n.filter(a => a) };// @ts-ignore

  var peg$f16 = function(l) {// @ts-ignore
 return build(types.Cycle,{items: l}) };// @ts-ignore

  var peg$f17 = function(l, rep) {
// @ts-ignore
  if(rep) return build(types.Repeat,{item: l, times: rep});
// @ts-ignore
  else return build(types.List,{items: l}); 
};// @ts-ignore

  var peg$f18 = function(n) {// @ts-ignore
 return n };// @ts-ignore

  var peg$f19 = function(a, b, c) {
// @ts-ignore
  if(c instanceof types.Pitch) {
// @ts-ignore
    c = build(types.List, {items:[c]})
  }
// @ts-ignore
  return build(types.ListOperation,{left: a, operation: b, right: c});  
};// @ts-ignore

  var peg$f20 = function(l, rep) {// @ts-ignore
 return build(types.RepeatList,{items: l, times: rep}) };// @ts-ignore

  var peg$f21 = function(l) {// @ts-ignore
 return build(types.Subdivision,{items: l}) };// @ts-ignore

  var peg$f22 = function(list) {// @ts-ignore
 return list.map(val => { return (typeof val === "number") ? val : undefined }); };// @ts-ignore

  var peg$f23 = function() {// @ts-ignore
 return Math.ceil(safeEval(text())) };// @ts-ignore

  var peg$f24 = function(values) { 
// @ts-ignore
  var pitches = values.filter(a => a).map(val => { return build(types.Pitch, {originalPitch: val[0], pitch: val[0]}, val.toString())});
// @ts-ignore
  return build(types.List,{items: pitches});
};// @ts-ignore

  var peg$f25 = function(v) {
// @ts-ignore
  return v;
};// @ts-ignore

  var peg$f26 = function(v) {// @ts-ignore
 return v };// @ts-ignore

  var peg$f27 = function() { 
  // Ignore for now
// @ts-ignore
  return undefined 
};// @ts-ignore

  var peg$f28 = function(l) {// @ts-ignore
 return build(types.Cycle,{items: l}) };// @ts-ignore

  var peg$f29 = function(octave) { 
// @ts-ignore
  return build(types.OctaveChange,{octave: octave}); 
};// @ts-ignore

  var peg$f30 = function() { 
// @ts-ignore
  return text().split('').reduce((sum, char) => sum + (char === '^' ? 1 : -1), 0);
};// @ts-ignore

  var peg$f31 = function() {// @ts-ignore
 return build(types.RandomPitch,{seededRandom: options.seededRandom}) };// @ts-ignore

  var peg$f32 = function(a, b) {// @ts-ignore
 return build(types.RandomPitch,{min: a, max: b, seededRandom: options.seededRandom }) };// @ts-ignore

  var peg$f33 = function(n, i) {// @ts-ignore
 return build(types.Repeat,{item: n, times: i}) };// @ts-ignore

  var peg$f34 = function(dur) { 
// @ts-ignore
  return build(types.DurationChange,{duration: dur}) 
};// @ts-ignore

  var peg$f35 = function(d) {// @ts-ignore
 return d };// @ts-ignore

  var peg$f36 = function(d) {
// @ts-ignore
  return build(types.Rest, {duration: d})
};// @ts-ignore

  var peg$f37 = function(oct, dur, add, val) {
// @ts-ignore
  const octave = oct ? options.nodeOptions.octave+oct : options.nodeOptions.octave;
// @ts-ignore
  return build(types.Pitch, {duration: dur, pitch: val, originalPitch: val, addedOctave: octave, add: add})
};// @ts-ignore

  var peg$f38 = function(acc) {
// @ts-ignore
  return acc.reduce((acc, cur) => { return acc+(cur === "#" ? 1 : -1) },0)
};// @ts-ignore

  var peg$f39 = function(c, l) {
// @ts-ignore
  return build(types.Arpeggio, {chord: c, indexes: l})
};// @ts-ignore

  var peg$f40 = function(left, right, inv) { 
// @ts-ignore
  return build(types.Chord, {pitches:[left].concat(right), inversion: inv}) 
};// @ts-ignore

  var peg$f41 = function() {
// @ts-ignore
  return text()
};// @ts-ignore

  var peg$f42 = function(val) {// @ts-ignore
 return val };// @ts-ignore

  var peg$f43 = function() {
// @ts-ignore
  return text()
};// @ts-ignore

  var peg$f44 = function(name, op, i) {
// @ts-ignore
  if(!options["variables"]) {
// @ts-ignore
    options["variables"] = {}
  }
// @ts-ignore
  options["variables"][name] = (op === "=" ? i.prevaluate() : i);
// @ts-ignore
  return undefined
};// @ts-ignore

  var peg$f45 = function(name) {
// @ts-ignore
  if(name && options["variables"] && options["variables"][name]) {
// @ts-ignore
    return options["variables"][name]
// @ts-ignore
  } else {
// @ts-ignore
    return undefined
  }
};// @ts-ignore

  var peg$f46 = function(oct, dur, root, name, inv) { 
// @ts-ignore
  const scale = "CHROMATIC"
// @ts-ignore
  const key = root;
// @ts-ignore
  const pitches = getPitchesFromNamedChord(name, root, scale, oct, dur);
// @ts-ignore
  const duration = dur ? dur : options.nodeOptions.duration;
// @ts-ignore
  const octave = oct ? options.nodeOptions.octave+oct : options.nodeOptions.octave;
// @ts-ignore
  return build(types.Chord, {duration: duration, chordOctave: octave, pitches: pitches, chordName: name, inversion: inv, scaleName: scale, key: key})
};// @ts-ignore

  var peg$f47 = function(val, name, inv) {
// @ts-ignore
  const scale = options.nodeOptions.scaleName ? options.nodeOptions.scaleName : "MAJOR";
// @ts-ignore
  const key = options.nodeOptions.key ? options.nodeOptions.key : "C";
// @ts-ignore
  return build(types.Roman, {roman: val, chordName: name, inversion: inv, scaleName: scale, key: key})
};// @ts-ignore

  var peg$f48 = function(name) {
  // If name is defined as a variable, return the variable
// @ts-ignore
  if(name && options["variables"] && options["variables"][name]) {
// @ts-ignore
    return options["variables"][name]
  }
// @ts-ignore
  const scale = options.nodeOptions.scaleName ? options.nodeOptions.scaleName : "MAJOR";
// @ts-ignore
  const key = options.nodeOptions.key ? options.nodeOptions.key : "C";
// @ts-ignore
  const pitch = noteNameToPitchClass(name,key,scale);
// @ts-ignore
  return build(types.Pitch, {pitch: pitch.pc, originalPitch: pitch.pc, add: pitch.add, scaleName: scale, key: key})
};
// @ts-ignore
  var peg$currPos = 0;
// @ts-ignore
  var peg$savedPos = 0;
// @ts-ignore
  var peg$posDetailsCache = [{ line: 1, column: 1 }];
// @ts-ignore
  var peg$maxFailPos = 0;
// @ts-ignore
  var peg$maxFailExpected = [];
// @ts-ignore
  var peg$silentFails = 0;

// @ts-ignore
  var peg$resultsCache = {};

// @ts-ignore
  var peg$result;

// @ts-ignore
  if ("startRule" in options) {
// @ts-ignore
    if (!(options.startRule in peg$startRuleFunctions)) {
// @ts-ignore
      throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
    }

// @ts-ignore
    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
  }

// @ts-ignore
  function text() {
// @ts-ignore
    return input.substring(peg$savedPos, peg$currPos);
  }

// @ts-ignore
  function offset() {
// @ts-ignore
    return peg$savedPos;
  }

// @ts-ignore
  function range() {
// @ts-ignore
    return {
// @ts-ignore
      source: peg$source,
// @ts-ignore
      start: peg$savedPos,
// @ts-ignore
      end: peg$currPos
    };
  }

// @ts-ignore
  function location() {
// @ts-ignore
    return peg$computeLocation(peg$savedPos, peg$currPos);
  }

// @ts-ignore
  function expected(description, location) {
// @ts-ignore
    location = location !== undefined
// @ts-ignore
      ? location
// @ts-ignore
      : peg$computeLocation(peg$savedPos, peg$currPos);

// @ts-ignore
    throw peg$buildStructuredError(
// @ts-ignore
      [peg$otherExpectation(description)],
// @ts-ignore
      input.substring(peg$savedPos, peg$currPos),
// @ts-ignore
      location
    );
  }

// @ts-ignore
  function error(message, location) {
// @ts-ignore
    location = location !== undefined
// @ts-ignore
      ? location
// @ts-ignore
      : peg$computeLocation(peg$savedPos, peg$currPos);

// @ts-ignore
    throw peg$buildSimpleError(message, location);
  }

// @ts-ignore
  function peg$literalExpectation(text, ignoreCase) {
// @ts-ignore
    return { type: "literal", text: text, ignoreCase: ignoreCase };
  }

// @ts-ignore
  function peg$classExpectation(parts, inverted, ignoreCase) {
// @ts-ignore
    return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
  }

// @ts-ignore
  function peg$anyExpectation() {
// @ts-ignore
    return { type: "any" };
  }

// @ts-ignore
  function peg$endExpectation() {
// @ts-ignore
    return { type: "end" };
  }

// @ts-ignore
  function peg$otherExpectation(description) {
// @ts-ignore
    return { type: "other", description: description };
  }

// @ts-ignore
  function peg$computePosDetails(pos) {
// @ts-ignore
    var details = peg$posDetailsCache[pos];
// @ts-ignore
    var p;

// @ts-ignore
    if (details) {
// @ts-ignore
      return details;
// @ts-ignore
    } else {
// @ts-ignore
      p = pos - 1;
// @ts-ignore
      while (!peg$posDetailsCache[p]) {
// @ts-ignore
        p--;
      }

// @ts-ignore
      details = peg$posDetailsCache[p];
// @ts-ignore
      details = {
// @ts-ignore
        line: details.line,
// @ts-ignore
        column: details.column
      };

// @ts-ignore
      while (p < pos) {
// @ts-ignore
        if (input.charCodeAt(p) === 10) {
// @ts-ignore
          details.line++;
// @ts-ignore
          details.column = 1;
// @ts-ignore
        } else {
// @ts-ignore
          details.column++;
        }

// @ts-ignore
        p++;
      }

// @ts-ignore
      peg$posDetailsCache[pos] = details;

// @ts-ignore
      return details;
    }
  }

// @ts-ignore
  function peg$computeLocation(startPos, endPos, offset) {
// @ts-ignore
    var startPosDetails = peg$computePosDetails(startPos);
// @ts-ignore
    var endPosDetails = peg$computePosDetails(endPos);

// @ts-ignore
    var res = {
// @ts-ignore
      source: peg$source,
// @ts-ignore
      start: {
// @ts-ignore
        offset: startPos,
// @ts-ignore
        line: startPosDetails.line,
// @ts-ignore
        column: startPosDetails.column
      },
// @ts-ignore
      end: {
// @ts-ignore
        offset: endPos,
// @ts-ignore
        line: endPosDetails.line,
// @ts-ignore
        column: endPosDetails.column
      }
    };
// @ts-ignore
    if (offset && peg$source && (typeof peg$source.offset === "function")) {
// @ts-ignore
      res.start = peg$source.offset(res.start);
// @ts-ignore
      res.end = peg$source.offset(res.end);
    }
// @ts-ignore
    return res;
  }

// @ts-ignore
  function peg$fail(expected) {
// @ts-ignore
    if (peg$currPos < peg$maxFailPos) { return; }

// @ts-ignore
    if (peg$currPos > peg$maxFailPos) {
// @ts-ignore
      peg$maxFailPos = peg$currPos;
// @ts-ignore
      peg$maxFailExpected = [];
    }

// @ts-ignore
    peg$maxFailExpected.push(expected);
  }

// @ts-ignore
  function peg$buildSimpleError(message, location) {
// @ts-ignore
    return new peg$SyntaxError(message, null, null, location);
  }

// @ts-ignore
  function peg$buildStructuredError(expected, found, location) {
// @ts-ignore
    return new peg$SyntaxError(
// @ts-ignore
      peg$SyntaxError.buildMessage(expected, found),
// @ts-ignore
      expected,
// @ts-ignore
      found,
// @ts-ignore
      location
    );
  }

// @ts-ignore
  function // @ts-ignore
peg$parsestart() {
// @ts-ignore
    var s0, s1;

// @ts-ignore
    var key = peg$currPos * 59 + 0;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parseitems();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f0(s1);
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsefloat() {
// @ts-ignore
    var s0, s1, s2, s3, s4, s5, s6;

// @ts-ignore
    var key = peg$currPos * 59 + 1;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 45) {
// @ts-ignore
      s2 = peg$c0;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s2 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e0); }
    }
// @ts-ignore
    if (s2 === peg$FAILED) {
// @ts-ignore
      s2 = null;
    }
// @ts-ignore
    s3 = [];
// @ts-ignore
    if (peg$r0.test(input.charAt(peg$currPos))) {
// @ts-ignore
      s4 = input.charAt(peg$currPos);
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s4 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e1); }
    }
// @ts-ignore
    while (s4 !== peg$FAILED) {
// @ts-ignore
      s3.push(s4);
// @ts-ignore
      if (peg$r0.test(input.charAt(peg$currPos))) {
// @ts-ignore
        s4 = input.charAt(peg$currPos);
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s4 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e1); }
      }
    }
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 46) {
// @ts-ignore
      s4 = peg$c1;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s4 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e2); }
    }
// @ts-ignore
    if (s4 !== peg$FAILED) {
// @ts-ignore
      s5 = [];
// @ts-ignore
      if (peg$r0.test(input.charAt(peg$currPos))) {
// @ts-ignore
        s6 = input.charAt(peg$currPos);
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s6 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e1); }
      }
// @ts-ignore
      if (s6 !== peg$FAILED) {
// @ts-ignore
        while (s6 !== peg$FAILED) {
// @ts-ignore
          s5.push(s6);
// @ts-ignore
          if (peg$r0.test(input.charAt(peg$currPos))) {
// @ts-ignore
            s6 = input.charAt(peg$currPos);
// @ts-ignore
            peg$currPos++;
// @ts-ignore
          } else {
// @ts-ignore
            s6 = peg$FAILED;
// @ts-ignore
            if (peg$silentFails === 0) { peg$fail(peg$e1); }
          }
        }
// @ts-ignore
      } else {
// @ts-ignore
        s5 = peg$FAILED;
      }
// @ts-ignore
      if (s5 !== peg$FAILED) {
// @ts-ignore
        s2 = [s2, s3, s4, s5];
// @ts-ignore
        s1 = s2;
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s1;
// @ts-ignore
        s1 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s1;
// @ts-ignore
      s1 = peg$FAILED;
    }
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = peg$currPos;
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 46) {
// @ts-ignore
        s2 = peg$c1;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e2); }
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = [];
// @ts-ignore
        if (peg$r0.test(input.charAt(peg$currPos))) {
// @ts-ignore
          s4 = input.charAt(peg$currPos);
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s4 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e1); }
        }
// @ts-ignore
        if (s4 !== peg$FAILED) {
// @ts-ignore
          while (s4 !== peg$FAILED) {
// @ts-ignore
            s3.push(s4);
// @ts-ignore
            if (peg$r0.test(input.charAt(peg$currPos))) {
// @ts-ignore
              s4 = input.charAt(peg$currPos);
// @ts-ignore
              peg$currPos++;
// @ts-ignore
            } else {
// @ts-ignore
              s4 = peg$FAILED;
// @ts-ignore
              if (peg$silentFails === 0) { peg$fail(peg$e1); }
            }
          }
// @ts-ignore
        } else {
// @ts-ignore
          s3 = peg$FAILED;
        }
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          s2 = [s2, s3];
// @ts-ignore
          s1 = s2;
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s1;
// @ts-ignore
          s1 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s1;
// @ts-ignore
        s1 = peg$FAILED;
      }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f1();
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseint() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 2;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 45) {
// @ts-ignore
      s1 = peg$c0;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e0); }
    }
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = null;
    }
// @ts-ignore
    if (peg$r0.test(input.charAt(peg$currPos))) {
// @ts-ignore
      s2 = input.charAt(peg$currPos);
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s2 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e1); }
    }
// @ts-ignore
    if (s2 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s0 = peg$f2();
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsemulti() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 3;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 45) {
// @ts-ignore
      s1 = peg$c0;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e0); }
    }
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = null;
    }
// @ts-ignore
    s2 = [];
// @ts-ignore
    if (peg$r0.test(input.charAt(peg$currPos))) {
// @ts-ignore
      s3 = input.charAt(peg$currPos);
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s3 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e1); }
    }
// @ts-ignore
    if (s3 !== peg$FAILED) {
// @ts-ignore
      while (s3 !== peg$FAILED) {
// @ts-ignore
        s2.push(s3);
// @ts-ignore
        if (peg$r0.test(input.charAt(peg$currPos))) {
// @ts-ignore
          s3 = input.charAt(peg$currPos);
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s3 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e1); }
        }
      }
// @ts-ignore
    } else {
// @ts-ignore
      s2 = peg$FAILED;
    }
// @ts-ignore
    if (s2 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s0 = peg$f3();
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsews() {
// @ts-ignore
    var s0, s1;

// @ts-ignore
    var key = peg$currPos * 59 + 4;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    peg$silentFails++;
// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (peg$r1.test(input.charAt(peg$currPos))) {
// @ts-ignore
      s1 = input.charAt(peg$currPos);
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e4); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f4();
    }
// @ts-ignore
    s0 = s1;
// @ts-ignore
    peg$silentFails--;
// @ts-ignore
    if (s0 === peg$FAILED) {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e3); }
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsecomma() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 5;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsews();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 44) {
// @ts-ignore
        s2 = peg$c2;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e5); }
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = peg$parsews();
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          s1 = [s1, s2, s3];
// @ts-ignore
          s0 = s1;
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsepipe() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 6;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsews();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 124) {
// @ts-ignore
        s2 = peg$c3;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e6); }
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = peg$parsews();
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          s1 = [s1, s2, s3];
// @ts-ignore
          s0 = s1;
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsequote() {
// @ts-ignore
    var s0;

// @ts-ignore
    var key = peg$currPos * 59 + 7;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 34) {
// @ts-ignore
      s0 = peg$c4;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s0 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e7); }
    }
// @ts-ignore
    if (s0 === peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 39) {
// @ts-ignore
        s0 = peg$c5;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s0 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e8); }
      }
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsesound() {
// @ts-ignore
    var s0, s1;

// @ts-ignore
    var key = peg$currPos * 59 + 8;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsesoundname();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f5(s1);
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseparallelSound() {
// @ts-ignore
    var s0, s1, s2, s3, s4, s5;

// @ts-ignore
    var key = peg$currPos * 59 + 9;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsesound();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = [];
// @ts-ignore
      s3 = peg$currPos;
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 44) {
// @ts-ignore
        s4 = peg$c2;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s4 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e5); }
      }
// @ts-ignore
      if (s4 !== peg$FAILED) {
// @ts-ignore
        s5 = peg$parsesound();
// @ts-ignore
        if (s5 !== peg$FAILED) {
// @ts-ignore
          s4 = [s4, s5];
// @ts-ignore
          s3 = s4;
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s3;
// @ts-ignore
          s3 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s3;
// @ts-ignore
        s3 = peg$FAILED;
      }
// @ts-ignore
      while (s3 !== peg$FAILED) {
// @ts-ignore
        s2.push(s3);
// @ts-ignore
        s3 = peg$currPos;
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 44) {
// @ts-ignore
          s4 = peg$c2;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s4 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e5); }
        }
// @ts-ignore
        if (s4 !== peg$FAILED) {
// @ts-ignore
          s5 = peg$parsesound();
// @ts-ignore
          if (s5 !== peg$FAILED) {
// @ts-ignore
            s4 = [s4, s5];
// @ts-ignore
            s3 = s4;
// @ts-ignore
          } else {
// @ts-ignore
            peg$currPos = s3;
// @ts-ignore
            s3 = peg$FAILED;
          }
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s3;
// @ts-ignore
          s3 = peg$FAILED;
        }
      }
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s0 = peg$f6();
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsesoundname() {
// @ts-ignore
    var s0, s1, s2, s3, s4;

// @ts-ignore
    var key = peg$currPos * 59 + 10;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (peg$r2.test(input.charAt(peg$currPos))) {
// @ts-ignore
      s1 = input.charAt(peg$currPos);
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e9); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = [];
// @ts-ignore
      if (peg$r3.test(input.charAt(peg$currPos))) {
// @ts-ignore
        s3 = input.charAt(peg$currPos);
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s3 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e10); }
      }
// @ts-ignore
      if (s3 !== peg$FAILED) {
// @ts-ignore
        while (s3 !== peg$FAILED) {
// @ts-ignore
          s2.push(s3);
// @ts-ignore
          if (peg$r3.test(input.charAt(peg$currPos))) {
// @ts-ignore
            s3 = input.charAt(peg$currPos);
// @ts-ignore
            peg$currPos++;
// @ts-ignore
          } else {
// @ts-ignore
            s3 = peg$FAILED;
// @ts-ignore
            if (peg$silentFails === 0) { peg$fail(peg$e10); }
          }
        }
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = [];
// @ts-ignore
        if (peg$r4.test(input.charAt(peg$currPos))) {
// @ts-ignore
          s4 = input.charAt(peg$currPos);
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s4 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e11); }
        }
// @ts-ignore
        while (s4 !== peg$FAILED) {
// @ts-ignore
          s3.push(s4);
// @ts-ignore
          if (peg$r4.test(input.charAt(peg$currPos))) {
// @ts-ignore
            s4 = input.charAt(peg$currPos);
// @ts-ignore
            peg$currPos++;
// @ts-ignore
          } else {
// @ts-ignore
            s4 = peg$FAILED;
// @ts-ignore
            if (peg$silentFails === 0) { peg$fail(peg$e11); }
          }
        }
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f7();
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsesound_param() {
// @ts-ignore
    var s0;

// @ts-ignore
    var key = peg$currPos * 59 + 11;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$parsesound_cycle();
// @ts-ignore
    if (s0 === peg$FAILED) {
// @ts-ignore
      s0 = peg$parsesound_items();
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsesound_cycle() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 12;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 60) {
// @ts-ignore
      s1 = peg$c6;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e12); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = [];
// @ts-ignore
      s3 = peg$parsesound_param();
// @ts-ignore
      if (s3 !== peg$FAILED) {
// @ts-ignore
        while (s3 !== peg$FAILED) {
// @ts-ignore
          s2.push(s3);
// @ts-ignore
          s3 = peg$parsesound_param();
        }
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 62) {
// @ts-ignore
          s3 = peg$c7;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s3 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e13); }
        }
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f8(s2);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsesound_items() {
// @ts-ignore
    var s0;

// @ts-ignore
    var key = peg$currPos * 59 + 13;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$parsesoundname();
// @ts-ignore
    if (s0 === peg$FAILED) {
// @ts-ignore
      s0 = peg$parsesound_cycle();
// @ts-ignore
      if (s0 === peg$FAILED) {
// @ts-ignore
        s0 = peg$parsews();
      }
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsepitched_sound() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 14;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 64) {
// @ts-ignore
      s1 = peg$c8;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e14); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parsesound_param();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f9(s2);
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsecontainers() {
// @ts-ignore
    var s0;

// @ts-ignore
    var key = peg$currPos * 59 + 15;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$parselist_operation();
// @ts-ignore
    if (s0 === peg$FAILED) {
// @ts-ignore
      s0 = peg$parselist();
// @ts-ignore
      if (s0 === peg$FAILED) {
// @ts-ignore
        s0 = peg$parsesubdivision();
// @ts-ignore
        if (s0 === peg$FAILED) {
// @ts-ignore
          s0 = peg$parsecycle();
// @ts-ignore
          if (s0 === peg$FAILED) {
// @ts-ignore
            s0 = peg$parsereplist();
          }
        }
      }
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsesound_event() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 16;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsecontainers();
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = peg$parseitem();
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parsepitched_sound();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f10(s1, s2);
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsesound_index() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 17;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsesound_event();
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = peg$parsecontainers();
// @ts-ignore
      if (s1 === peg$FAILED) {
// @ts-ignore
        s1 = peg$parseitem();
      }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parsesnum();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f11(s1, s2);
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsesnum() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 18;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 58) {
// @ts-ignore
      s1 = peg$c9;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e15); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parsenumeric_param();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f12(s2);
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsedurchar() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 19;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (peg$r5.test(input.charAt(peg$currPos))) {
// @ts-ignore
      s1 = input.charAt(peg$currPos);
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e16); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = [];
// @ts-ignore
      if (peg$r6.test(input.charAt(peg$currPos))) {
// @ts-ignore
        s3 = input.charAt(peg$currPos);
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s3 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e17); }
      }
// @ts-ignore
      while (s3 !== peg$FAILED) {
// @ts-ignore
        s2.push(s3);
// @ts-ignore
        if (peg$r6.test(input.charAt(peg$currPos))) {
// @ts-ignore
          s3 = input.charAt(peg$currPos);
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s3 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e17); }
        }
      }
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s0 = peg$f13(s1, s2);
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseduration() {
// @ts-ignore
    var s0;

// @ts-ignore
    var key = peg$currPos * 59 + 20;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$parseratio();
// @ts-ignore
    if (s0 === peg$FAILED) {
// @ts-ignore
      s0 = peg$parsefloat();
// @ts-ignore
      if (s0 === peg$FAILED) {
// @ts-ignore
        s0 = peg$parsedurchar();
      }
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseratio() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 21;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsemulti();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 47) {
// @ts-ignore
        s2 = peg$c10;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e18); }
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = peg$parsemulti();
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f14(s1, s3);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseitems() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 22;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = [];
// @ts-ignore
    s2 = peg$parserepeat();
// @ts-ignore
    if (s2 === peg$FAILED) {
// @ts-ignore
      s2 = peg$parsearpeggio();
// @ts-ignore
      if (s2 === peg$FAILED) {
// @ts-ignore
        s2 = peg$parsesound_index();
// @ts-ignore
        if (s2 === peg$FAILED) {
// @ts-ignore
          s2 = peg$parsesound_event();
// @ts-ignore
          if (s2 === peg$FAILED) {
// @ts-ignore
            s2 = peg$parselist_operation();
// @ts-ignore
            if (s2 === peg$FAILED) {
// @ts-ignore
              s2 = peg$parsesubdivision();
// @ts-ignore
              if (s2 === peg$FAILED) {
// @ts-ignore
                s2 = peg$parselist();
// @ts-ignore
                if (s2 === peg$FAILED) {
// @ts-ignore
                  s2 = peg$parsereplist();
// @ts-ignore
                  if (s2 === peg$FAILED) {
// @ts-ignore
                    s2 = peg$parseitem();
// @ts-ignore
                    if (s2 === peg$FAILED) {
// @ts-ignore
                      s2 = peg$parsecycle();
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
// @ts-ignore
    if (s2 !== peg$FAILED) {
// @ts-ignore
      while (s2 !== peg$FAILED) {
// @ts-ignore
        s1.push(s2);
// @ts-ignore
        s2 = peg$parserepeat();
// @ts-ignore
        if (s2 === peg$FAILED) {
// @ts-ignore
          s2 = peg$parsearpeggio();
// @ts-ignore
          if (s2 === peg$FAILED) {
// @ts-ignore
            s2 = peg$parsesound_index();
// @ts-ignore
            if (s2 === peg$FAILED) {
// @ts-ignore
              s2 = peg$parsesound_event();
// @ts-ignore
              if (s2 === peg$FAILED) {
// @ts-ignore
                s2 = peg$parselist_operation();
// @ts-ignore
                if (s2 === peg$FAILED) {
// @ts-ignore
                  s2 = peg$parsesubdivision();
// @ts-ignore
                  if (s2 === peg$FAILED) {
// @ts-ignore
                    s2 = peg$parselist();
// @ts-ignore
                    if (s2 === peg$FAILED) {
// @ts-ignore
                      s2 = peg$parsereplist();
// @ts-ignore
                      if (s2 === peg$FAILED) {
// @ts-ignore
                        s2 = peg$parseitem();
// @ts-ignore
                        if (s2 === peg$FAILED) {
// @ts-ignore
                          s2 = peg$parsecycle();
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f15(s1);
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsenumeric_param() {
// @ts-ignore
    var s0;

// @ts-ignore
    var key = peg$currPos * 59 + 23;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$parsews();
// @ts-ignore
    if (s0 === peg$FAILED) {
// @ts-ignore
      s0 = peg$parsemulti();
// @ts-ignore
      if (s0 === peg$FAILED) {
// @ts-ignore
        s0 = peg$parserandom();
// @ts-ignore
        if (s0 === peg$FAILED) {
// @ts-ignore
          s0 = peg$parserandom_between();
// @ts-ignore
          if (s0 === peg$FAILED) {
// @ts-ignore
            s0 = peg$parsenum_cycle();
// @ts-ignore
            if (s0 === peg$FAILED) {
// @ts-ignore
              s0 = peg$parseeval_param();
            }
          }
        }
      }
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsenum_cycle() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 24;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 60) {
// @ts-ignore
      s1 = peg$c6;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e12); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = [];
// @ts-ignore
      s3 = peg$parsenumeric_param();
// @ts-ignore
      if (s3 !== peg$FAILED) {
// @ts-ignore
        while (s3 !== peg$FAILED) {
// @ts-ignore
          s2.push(s3);
// @ts-ignore
          s3 = peg$parsenumeric_param();
        }
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 62) {
// @ts-ignore
          s3 = peg$c7;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s3 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e13); }
        }
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f16(s2);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parselist() {
// @ts-ignore
    var s0, s1, s2, s3, s4, s5;

// @ts-ignore
    var key = peg$currPos * 59 + 25;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 40) {
// @ts-ignore
      s1 = peg$c11;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e19); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 58) {
// @ts-ignore
        s2 = peg$c9;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e15); }
      }
// @ts-ignore
      if (s2 === peg$FAILED) {
// @ts-ignore
        s2 = null;
      }
// @ts-ignore
      s3 = peg$parseitems();
// @ts-ignore
      if (s3 !== peg$FAILED) {
// @ts-ignore
        s4 = peg$parselistrepeat();
// @ts-ignore
        if (s4 === peg$FAILED) {
// @ts-ignore
          s4 = null;
        }
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 41) {
// @ts-ignore
          s5 = peg$c12;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s5 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e20); }
        }
// @ts-ignore
        if (s5 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f17(s3, s4);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parselistrepeat() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 26;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 58) {
// @ts-ignore
      s1 = peg$c9;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e15); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parsemulti();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f18(s2);
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parselist_operation() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 27;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parselist();
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = peg$parsevariable();
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parseoperation();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = peg$parselist();
// @ts-ignore
        if (s3 === peg$FAILED) {
// @ts-ignore
          s3 = peg$parsevariable();
// @ts-ignore
          if (s3 === peg$FAILED) {
// @ts-ignore
            s3 = peg$parsepitch();
          }
        }
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f19(s1, s2, s3);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsereplist() {
// @ts-ignore
    var s0, s1, s2, s3, s4;

// @ts-ignore
    var key = peg$currPos * 59 + 28;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.substr(peg$currPos, 2) === peg$c13) {
// @ts-ignore
      s1 = peg$c13;
// @ts-ignore
      peg$currPos += 2;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e21); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parseitems();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = peg$parselistrepeat();
// @ts-ignore
        if (s3 === peg$FAILED) {
// @ts-ignore
          s3 = null;
        }
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 93) {
// @ts-ignore
          s4 = peg$c14;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s4 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e22); }
        }
// @ts-ignore
        if (s4 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f20(s2, s3);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsesubdivision() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 29;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 91) {
// @ts-ignore
      s1 = peg$c15;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e23); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parseitems();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 93) {
// @ts-ignore
          s3 = peg$c14;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s3 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e22); }
        }
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f21(s2);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseeval_item() {
// @ts-ignore
    var s0;

// @ts-ignore
    var key = peg$currPos * 59 + 30;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$parsemulti();
// @ts-ignore
    if (s0 === peg$FAILED) {
// @ts-ignore
      s0 = peg$parseint();
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseeval_items() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 31;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = [];
// @ts-ignore
    s2 = peg$parseeval_op();
// @ts-ignore
    if (s2 === peg$FAILED) {
// @ts-ignore
      s2 = peg$parseeval_item();
    }
// @ts-ignore
    if (s2 !== peg$FAILED) {
// @ts-ignore
      while (s2 !== peg$FAILED) {
// @ts-ignore
        s1.push(s2);
// @ts-ignore
        s2 = peg$parseeval_op();
// @ts-ignore
        if (s2 === peg$FAILED) {
// @ts-ignore
          s2 = peg$parseeval_item();
        }
      }
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f22(s1);
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseeval_op() {
// @ts-ignore
    var s0, s1, s2, s3, s4, s5;

// @ts-ignore
    var key = peg$currPos * 59 + 32;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 40) {
// @ts-ignore
      s1 = peg$c11;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e19); }
    }
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = null;
    }
// @ts-ignore
    s2 = peg$parseeval_item();
// @ts-ignore
    if (s2 !== peg$FAILED) {
// @ts-ignore
      s3 = peg$parseoperation();
// @ts-ignore
      if (s3 !== peg$FAILED) {
// @ts-ignore
        s4 = peg$parseeval_items();
// @ts-ignore
        if (s4 !== peg$FAILED) {
// @ts-ignore
          if (input.charCodeAt(peg$currPos) === 41) {
// @ts-ignore
            s5 = peg$c12;
// @ts-ignore
            peg$currPos++;
// @ts-ignore
          } else {
// @ts-ignore
            s5 = peg$FAILED;
// @ts-ignore
            if (peg$silentFails === 0) { peg$fail(peg$e20); }
          }
// @ts-ignore
          if (s5 === peg$FAILED) {
// @ts-ignore
            s5 = null;
          }
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f23();
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseeval() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 33;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 123) {
// @ts-ignore
      s1 = peg$c16;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e24); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = [];
// @ts-ignore
      s3 = peg$parseeval_items();
// @ts-ignore
      if (s3 === peg$FAILED) {
// @ts-ignore
        s3 = peg$parsews();
      }
// @ts-ignore
      if (s3 !== peg$FAILED) {
// @ts-ignore
        while (s3 !== peg$FAILED) {
// @ts-ignore
          s2.push(s3);
// @ts-ignore
          s3 = peg$parseeval_items();
// @ts-ignore
          if (s3 === peg$FAILED) {
// @ts-ignore
            s3 = peg$parsews();
          }
        }
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 125) {
// @ts-ignore
          s3 = peg$c17;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s3 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e25); }
        }
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f24(s2);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseeval_param() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 34;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 123) {
// @ts-ignore
      s1 = peg$c16;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e24); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parsemulti();
// @ts-ignore
      if (s2 === peg$FAILED) {
// @ts-ignore
        s2 = peg$parserandom_between();
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 125) {
// @ts-ignore
          s3 = peg$c17;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s3 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e25); }
        }
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f25(s2);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseoperation() {
// @ts-ignore
    var s0;

// @ts-ignore
    var key = peg$currPos * 59 + 35;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 43) {
// @ts-ignore
      s0 = peg$c18;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s0 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e26); }
    }
// @ts-ignore
    if (s0 === peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 45) {
// @ts-ignore
        s0 = peg$c0;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s0 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e0); }
      }
// @ts-ignore
      if (s0 === peg$FAILED) {
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 42) {
// @ts-ignore
          s0 = peg$c19;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s0 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e27); }
        }
// @ts-ignore
        if (s0 === peg$FAILED) {
// @ts-ignore
          if (input.charCodeAt(peg$currPos) === 47) {
// @ts-ignore
            s0 = peg$c10;
// @ts-ignore
            peg$currPos++;
// @ts-ignore
          } else {
// @ts-ignore
            s0 = peg$FAILED;
// @ts-ignore
            if (peg$silentFails === 0) { peg$fail(peg$e18); }
          }
// @ts-ignore
          if (s0 === peg$FAILED) {
// @ts-ignore
            if (input.charCodeAt(peg$currPos) === 37) {
// @ts-ignore
              s0 = peg$c20;
// @ts-ignore
              peg$currPos++;
// @ts-ignore
            } else {
// @ts-ignore
              s0 = peg$FAILED;
// @ts-ignore
              if (peg$silentFails === 0) { peg$fail(peg$e28); }
            }
// @ts-ignore
            if (s0 === peg$FAILED) {
// @ts-ignore
              if (input.charCodeAt(peg$currPos) === 94) {
// @ts-ignore
                s0 = peg$c21;
// @ts-ignore
                peg$currPos++;
// @ts-ignore
              } else {
// @ts-ignore
                s0 = peg$FAILED;
// @ts-ignore
                if (peg$silentFails === 0) { peg$fail(peg$e29); }
              }
// @ts-ignore
              if (s0 === peg$FAILED) {
// @ts-ignore
                if (input.charCodeAt(peg$currPos) === 124) {
// @ts-ignore
                  s0 = peg$c3;
// @ts-ignore
                  peg$currPos++;
// @ts-ignore
                } else {
// @ts-ignore
                  s0 = peg$FAILED;
// @ts-ignore
                  if (peg$silentFails === 0) { peg$fail(peg$e6); }
                }
// @ts-ignore
                if (s0 === peg$FAILED) {
// @ts-ignore
                  if (input.charCodeAt(peg$currPos) === 38) {
// @ts-ignore
                    s0 = peg$c22;
// @ts-ignore
                    peg$currPos++;
// @ts-ignore
                  } else {
// @ts-ignore
                    s0 = peg$FAILED;
// @ts-ignore
                    if (peg$silentFails === 0) { peg$fail(peg$e30); }
                  }
// @ts-ignore
                  if (s0 === peg$FAILED) {
// @ts-ignore
                    if (input.substr(peg$currPos, 2) === peg$c23) {
// @ts-ignore
                      s0 = peg$c23;
// @ts-ignore
                      peg$currPos += 2;
// @ts-ignore
                    } else {
// @ts-ignore
                      s0 = peg$FAILED;
// @ts-ignore
                      if (peg$silentFails === 0) { peg$fail(peg$e31); }
                    }
// @ts-ignore
                    if (s0 === peg$FAILED) {
// @ts-ignore
                      if (input.substr(peg$currPos, 2) === peg$c24) {
// @ts-ignore
                        s0 = peg$c24;
// @ts-ignore
                        peg$currPos += 2;
// @ts-ignore
                      } else {
// @ts-ignore
                        s0 = peg$FAILED;
// @ts-ignore
                        if (peg$silentFails === 0) { peg$fail(peg$e32); }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseitem() {
// @ts-ignore
    var s0, s1;

// @ts-ignore
    var key = peg$currPos * 59 + 36;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parserest();
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = peg$parseassignment();
// @ts-ignore
      if (s1 === peg$FAILED) {
// @ts-ignore
        s1 = peg$parseromans();
// @ts-ignore
        if (s1 === peg$FAILED) {
// @ts-ignore
          s1 = peg$parsenamedChord();
// @ts-ignore
          if (s1 === peg$FAILED) {
// @ts-ignore
            s1 = peg$parsenamedNote();
// @ts-ignore
            if (s1 === peg$FAILED) {
// @ts-ignore
              s1 = peg$parsevariable();
// @ts-ignore
              if (s1 === peg$FAILED) {
// @ts-ignore
                s1 = peg$parsesound();
// @ts-ignore
                if (s1 === peg$FAILED) {
// @ts-ignore
                  s1 = peg$parsechord();
// @ts-ignore
                  if (s1 === peg$FAILED) {
// @ts-ignore
                    s1 = peg$parsepitch();
// @ts-ignore
                    if (s1 === peg$FAILED) {
// @ts-ignore
                      s1 = peg$parseoctave_change();
// @ts-ignore
                      if (s1 === peg$FAILED) {
// @ts-ignore
                        s1 = peg$parsews();
// @ts-ignore
                        if (s1 === peg$FAILED) {
// @ts-ignore
                          s1 = peg$parseduration_change();
// @ts-ignore
                          if (s1 === peg$FAILED) {
// @ts-ignore
                            s1 = peg$parselist();
// @ts-ignore
                            if (s1 === peg$FAILED) {
// @ts-ignore
                              s1 = peg$parseeval();
// @ts-ignore
                              if (s1 === peg$FAILED) {
// @ts-ignore
                                s1 = peg$parsebar();
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f26(s1);
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsebar() {
// @ts-ignore
    var s0, s1;

// @ts-ignore
    var key = peg$currPos * 59 + 37;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 124) {
// @ts-ignore
      s1 = peg$c3;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e6); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f27();
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsecycle() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 38;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 60) {
// @ts-ignore
      s1 = peg$c6;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e12); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parseitems();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 62) {
// @ts-ignore
          s3 = peg$c7;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s3 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e13); }
        }
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f28(s2);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseoctave_change() {
// @ts-ignore
    var s0, s1;

// @ts-ignore
    var key = peg$currPos * 59 + 39;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parseoctave();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f29(s1);
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseoctave() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 40;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = [];
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 94) {
// @ts-ignore
      s2 = peg$c21;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s2 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e29); }
    }
// @ts-ignore
    if (s2 === peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 95) {
// @ts-ignore
        s2 = peg$c25;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e33); }
      }
    }
// @ts-ignore
    if (s2 !== peg$FAILED) {
// @ts-ignore
      while (s2 !== peg$FAILED) {
// @ts-ignore
        s1.push(s2);
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 94) {
// @ts-ignore
          s2 = peg$c21;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s2 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e29); }
        }
// @ts-ignore
        if (s2 === peg$FAILED) {
// @ts-ignore
          if (input.charCodeAt(peg$currPos) === 95) {
// @ts-ignore
            s2 = peg$c25;
// @ts-ignore
            peg$currPos++;
// @ts-ignore
          } else {
// @ts-ignore
            s2 = peg$FAILED;
// @ts-ignore
            if (peg$silentFails === 0) { peg$fail(peg$e33); }
          }
        }
      }
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f30();
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parserandom() {
// @ts-ignore
    var s0, s1;

// @ts-ignore
    var key = peg$currPos * 59 + 41;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 63) {
// @ts-ignore
      s1 = peg$c26;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e34); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f31();
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parserandom_between() {
// @ts-ignore
    var s0, s1, s2, s3, s4, s5;

// @ts-ignore
    var key = peg$currPos * 59 + 42;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 40) {
// @ts-ignore
      s1 = peg$c11;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e19); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parsemulti();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 44) {
// @ts-ignore
          s3 = peg$c2;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s3 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e5); }
        }
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          s4 = peg$parsemulti();
// @ts-ignore
          if (s4 !== peg$FAILED) {
// @ts-ignore
            if (input.charCodeAt(peg$currPos) === 41) {
// @ts-ignore
              s5 = peg$c12;
// @ts-ignore
              peg$currPos++;
// @ts-ignore
            } else {
// @ts-ignore
              s5 = peg$FAILED;
// @ts-ignore
              if (peg$silentFails === 0) { peg$fail(peg$e20); }
            }
// @ts-ignore
            if (s5 !== peg$FAILED) {
// @ts-ignore
              peg$savedPos = s0;
// @ts-ignore
              s0 = peg$f32(s2, s4);
// @ts-ignore
            } else {
// @ts-ignore
              peg$currPos = s0;
// @ts-ignore
              s0 = peg$FAILED;
            }
// @ts-ignore
          } else {
// @ts-ignore
            peg$currPos = s0;
// @ts-ignore
            s0 = peg$FAILED;
          }
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parserepeat() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 43;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsesound_index();
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = peg$parsesound_event();
// @ts-ignore
      if (s1 === peg$FAILED) {
// @ts-ignore
        s1 = peg$parsecontainers();
// @ts-ignore
        if (s1 === peg$FAILED) {
// @ts-ignore
          s1 = peg$parseitem();
        }
      }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 33) {
// @ts-ignore
        s2 = peg$c27;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e35); }
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = peg$parsemulti();
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f33(s1, s3);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseduration_change() {
// @ts-ignore
    var s0, s1;

// @ts-ignore
    var key = peg$currPos * 59 + 44;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parseduration();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f34(s1);
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parserest_duration() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 45;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parseduration();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 94) {
// @ts-ignore
        s2 = peg$c21;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e29); }
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f35(s1);
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parserest() {
// @ts-ignore
    var s0, s1, s2, s3, s4;

// @ts-ignore
    var key = peg$currPos * 59 + 46;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parserest_duration();
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = null;
    }
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 114) {
// @ts-ignore
      s2 = peg$c28;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s2 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e36); }
    }
// @ts-ignore
    if (s2 !== peg$FAILED) {
// @ts-ignore
      s3 = peg$currPos;
// @ts-ignore
      peg$silentFails++;
// @ts-ignore
      if (peg$r7.test(input.charAt(peg$currPos))) {
// @ts-ignore
        s4 = input.charAt(peg$currPos);
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s4 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e37); }
      }
// @ts-ignore
      peg$silentFails--;
// @ts-ignore
      if (s4 === peg$FAILED) {
// @ts-ignore
        s3 = undefined;
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s3;
// @ts-ignore
        s3 = peg$FAILED;
      }
// @ts-ignore
      if (s3 !== peg$FAILED) {
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f36(s1);
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsepitch() {
// @ts-ignore
    var s0, s1, s2, s3, s4;

// @ts-ignore
    var key = peg$currPos * 59 + 47;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parseoctave();
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = null;
    }
// @ts-ignore
    s2 = peg$parseduration();
// @ts-ignore
    if (s2 === peg$FAILED) {
// @ts-ignore
      s2 = null;
    }
// @ts-ignore
    s3 = peg$parseaccidentals();
// @ts-ignore
    if (s3 === peg$FAILED) {
// @ts-ignore
      s3 = null;
    }
// @ts-ignore
    s4 = peg$parseint();
// @ts-ignore
    if (s4 === peg$FAILED) {
// @ts-ignore
      s4 = peg$parserandom();
// @ts-ignore
      if (s4 === peg$FAILED) {
// @ts-ignore
        s4 = peg$parserandom_between();
// @ts-ignore
        if (s4 === peg$FAILED) {
// @ts-ignore
          s4 = peg$parseeval_param();
        }
      }
    }
// @ts-ignore
    if (s4 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s0 = peg$f37(s1, s2, s3, s4);
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseaccidentals() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 48;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = [];
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 35) {
// @ts-ignore
      s2 = peg$c29;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s2 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e38); }
    }
// @ts-ignore
    if (s2 === peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 98) {
// @ts-ignore
        s2 = peg$c30;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e39); }
      }
    }
// @ts-ignore
    if (s2 !== peg$FAILED) {
// @ts-ignore
      while (s2 !== peg$FAILED) {
// @ts-ignore
        s1.push(s2);
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 35) {
// @ts-ignore
          s2 = peg$c29;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s2 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e38); }
        }
// @ts-ignore
        if (s2 === peg$FAILED) {
// @ts-ignore
          if (input.charCodeAt(peg$currPos) === 98) {
// @ts-ignore
            s2 = peg$c30;
// @ts-ignore
            peg$currPos++;
// @ts-ignore
          } else {
// @ts-ignore
            s2 = peg$FAILED;
// @ts-ignore
            if (peg$silentFails === 0) { peg$fail(peg$e39); }
          }
        }
      }
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f38(s1);
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsearpeggio() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 49;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsechord();
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = peg$parsenamedChord();
// @ts-ignore
      if (s1 === peg$FAILED) {
// @ts-ignore
        s1 = peg$parseromans();
// @ts-ignore
        if (s1 === peg$FAILED) {
// @ts-ignore
          s1 = peg$parselist();
        }
      }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 64) {
// @ts-ignore
        s2 = peg$c8;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e14); }
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = peg$parselist();
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f39(s1, s3);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsechord() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 50;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsepitch();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = [];
// @ts-ignore
      s3 = peg$parsepitch();
// @ts-ignore
      if (s3 !== peg$FAILED) {
// @ts-ignore
        while (s3 !== peg$FAILED) {
// @ts-ignore
          s2.push(s3);
// @ts-ignore
          s3 = peg$parsepitch();
        }
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = peg$parseinvert();
// @ts-ignore
        if (s3 === peg$FAILED) {
// @ts-ignore
          s3 = null;
        }
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f40(s1, s2, s3);
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsechordName() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 51;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = [];
// @ts-ignore
    if (peg$r8.test(input.charAt(peg$currPos))) {
// @ts-ignore
      s2 = input.charAt(peg$currPos);
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s2 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e40); }
    }
// @ts-ignore
    if (s2 !== peg$FAILED) {
// @ts-ignore
      while (s2 !== peg$FAILED) {
// @ts-ignore
        s1.push(s2);
// @ts-ignore
        if (peg$r8.test(input.charAt(peg$currPos))) {
// @ts-ignore
          s2 = input.charAt(peg$currPos);
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s2 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e40); }
        }
      }
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f41();
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseinvert() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 52;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.charCodeAt(peg$currPos) === 37) {
// @ts-ignore
      s1 = peg$c20;
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e28); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      s2 = peg$parsemulti();
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f42(s2);
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsenoteName() {
// @ts-ignore
    var s0, s1, s2;

// @ts-ignore
    var key = peg$currPos * 59 + 53;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (peg$r9.test(input.charAt(peg$currPos))) {
// @ts-ignore
      s1 = input.charAt(peg$currPos);
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e41); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      if (peg$r10.test(input.charAt(peg$currPos))) {
// @ts-ignore
        s2 = input.charAt(peg$currPos);
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e42); }
      }
// @ts-ignore
      if (s2 === peg$FAILED) {
// @ts-ignore
        s2 = null;
      }
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s0 = peg$f43();
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseassignment() {
// @ts-ignore
    var s0, s1, s2, s3;

// @ts-ignore
    var key = peg$currPos * 59 + 54;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (peg$r11.test(input.charAt(peg$currPos))) {
// @ts-ignore
      s1 = input.charAt(peg$currPos);
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e43); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 61) {
// @ts-ignore
        s2 = peg$c31;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e44); }
      }
// @ts-ignore
      if (s2 === peg$FAILED) {
// @ts-ignore
        if (input.charCodeAt(peg$currPos) === 126) {
// @ts-ignore
          s2 = peg$c32;
// @ts-ignore
          peg$currPos++;
// @ts-ignore
        } else {
// @ts-ignore
          s2 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e45); }
        }
      }
// @ts-ignore
      if (s2 !== peg$FAILED) {
// @ts-ignore
        s3 = peg$parseitem();
// @ts-ignore
        if (s3 !== peg$FAILED) {
// @ts-ignore
          peg$savedPos = s0;
// @ts-ignore
          s0 = peg$f44(s1, s2, s3);
// @ts-ignore
        } else {
// @ts-ignore
          peg$currPos = s0;
// @ts-ignore
          s0 = peg$FAILED;
        }
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsevariable() {
// @ts-ignore
    var s0, s1;

// @ts-ignore
    var key = peg$currPos * 59 + 55;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (peg$r11.test(input.charAt(peg$currPos))) {
// @ts-ignore
      s1 = input.charAt(peg$currPos);
// @ts-ignore
      peg$currPos++;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e43); }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f45(s1);
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsenamedChord() {
// @ts-ignore
    var s0, s1, s2, s3, s4, s5, s6;

// @ts-ignore
    var key = peg$currPos * 59 + 56;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parseoctave();
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      s1 = null;
    }
// @ts-ignore
    s2 = peg$parseduration();
// @ts-ignore
    if (s2 === peg$FAILED) {
// @ts-ignore
      s2 = null;
    }
// @ts-ignore
    s3 = peg$parsenoteName();
// @ts-ignore
    if (s3 !== peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 94) {
// @ts-ignore
        s4 = peg$c21;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s4 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e29); }
      }
// @ts-ignore
      if (s4 === peg$FAILED) {
// @ts-ignore
        s4 = null;
      }
// @ts-ignore
      s5 = peg$parsechordName();
// @ts-ignore
      if (s5 !== peg$FAILED) {
// @ts-ignore
        s6 = peg$parseinvert();
// @ts-ignore
        if (s6 === peg$FAILED) {
// @ts-ignore
          s6 = null;
        }
// @ts-ignore
        peg$savedPos = s0;
// @ts-ignore
        s0 = peg$f46(s1, s2, s3, s5, s6);
// @ts-ignore
      } else {
// @ts-ignore
        peg$currPos = s0;
// @ts-ignore
        s0 = peg$FAILED;
      }
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parseromans() {
// @ts-ignore
    var s0, s1, s2, s3, s4;

// @ts-ignore
    var key = peg$currPos * 59 + 57;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    if (input.substr(peg$currPos, 3) === peg$c33) {
// @ts-ignore
      s1 = peg$c33;
// @ts-ignore
      peg$currPos += 3;
// @ts-ignore
    } else {
// @ts-ignore
      s1 = peg$FAILED;
// @ts-ignore
      if (peg$silentFails === 0) { peg$fail(peg$e46); }
    }
// @ts-ignore
    if (s1 === peg$FAILED) {
// @ts-ignore
      if (input.substr(peg$currPos, 2) === peg$c34) {
// @ts-ignore
        s1 = peg$c34;
// @ts-ignore
        peg$currPos += 2;
// @ts-ignore
      } else {
// @ts-ignore
        s1 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e47); }
      }
// @ts-ignore
      if (s1 === peg$FAILED) {
// @ts-ignore
        if (input.substr(peg$currPos, 2) === peg$c35) {
// @ts-ignore
          s1 = peg$c35;
// @ts-ignore
          peg$currPos += 2;
// @ts-ignore
        } else {
// @ts-ignore
          s1 = peg$FAILED;
// @ts-ignore
          if (peg$silentFails === 0) { peg$fail(peg$e48); }
        }
// @ts-ignore
        if (s1 === peg$FAILED) {
// @ts-ignore
          if (input.charCodeAt(peg$currPos) === 105) {
// @ts-ignore
            s1 = peg$c36;
// @ts-ignore
            peg$currPos++;
// @ts-ignore
          } else {
// @ts-ignore
            s1 = peg$FAILED;
// @ts-ignore
            if (peg$silentFails === 0) { peg$fail(peg$e49); }
          }
// @ts-ignore
          if (s1 === peg$FAILED) {
// @ts-ignore
            if (input.substr(peg$currPos, 3) === peg$c37) {
// @ts-ignore
              s1 = peg$c37;
// @ts-ignore
              peg$currPos += 3;
// @ts-ignore
            } else {
// @ts-ignore
              s1 = peg$FAILED;
// @ts-ignore
              if (peg$silentFails === 0) { peg$fail(peg$e50); }
            }
// @ts-ignore
            if (s1 === peg$FAILED) {
// @ts-ignore
              if (input.substr(peg$currPos, 2) === peg$c38) {
// @ts-ignore
                s1 = peg$c38;
// @ts-ignore
                peg$currPos += 2;
// @ts-ignore
              } else {
// @ts-ignore
                s1 = peg$FAILED;
// @ts-ignore
                if (peg$silentFails === 0) { peg$fail(peg$e51); }
              }
// @ts-ignore
              if (s1 === peg$FAILED) {
// @ts-ignore
                if (input.charCodeAt(peg$currPos) === 118) {
// @ts-ignore
                  s1 = peg$c39;
// @ts-ignore
                  peg$currPos++;
// @ts-ignore
                } else {
// @ts-ignore
                  s1 = peg$FAILED;
// @ts-ignore
                  if (peg$silentFails === 0) { peg$fail(peg$e52); }
                }
              }
            }
          }
        }
      }
    }
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      if (input.charCodeAt(peg$currPos) === 94) {
// @ts-ignore
        s2 = peg$c21;
// @ts-ignore
        peg$currPos++;
// @ts-ignore
      } else {
// @ts-ignore
        s2 = peg$FAILED;
// @ts-ignore
        if (peg$silentFails === 0) { peg$fail(peg$e29); }
      }
// @ts-ignore
      if (s2 === peg$FAILED) {
// @ts-ignore
        s2 = null;
      }
// @ts-ignore
      s3 = peg$parsechordName();
// @ts-ignore
      if (s3 === peg$FAILED) {
// @ts-ignore
        s3 = null;
      }
// @ts-ignore
      s4 = peg$parseinvert();
// @ts-ignore
      if (s4 === peg$FAILED) {
// @ts-ignore
        s4 = null;
      }
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s0 = peg$f47(s1, s3, s4);
// @ts-ignore
    } else {
// @ts-ignore
      peg$currPos = s0;
// @ts-ignore
      s0 = peg$FAILED;
    }

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }

// @ts-ignore
  function // @ts-ignore
peg$parsenamedNote() {
// @ts-ignore
    var s0, s1;

// @ts-ignore
    var key = peg$currPos * 59 + 58;
// @ts-ignore
    var cached = peg$resultsCache[key];

// @ts-ignore
    if (cached) {
// @ts-ignore
      peg$currPos = cached.nextPos;

// @ts-ignore
      return cached.result;
    }

// @ts-ignore
    s0 = peg$currPos;
// @ts-ignore
    s1 = peg$parsenoteName();
// @ts-ignore
    if (s1 !== peg$FAILED) {
// @ts-ignore
      peg$savedPos = s0;
// @ts-ignore
      s1 = peg$f48(s1);
    }
// @ts-ignore
    s0 = s1;

// @ts-ignore
    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };

// @ts-ignore
    return s0;
  }


  // See imports from zconfig.json
  // imports transform from ziffers.ts
  // imports DEFAULT_DURS from defaults.ts

// @ts-ignore
  var nodeOptions = options.nodeOptions || {};

// @ts-ignore
  function build(ClassReference, values, cont=undefined) {
// @ts-ignore
    values.text = cont ? cont : text();
// @ts-ignore
    values.location = location();
    // Merge all default options to values if value is not set, null or undefined
// @ts-ignore
    for (var key in nodeOptions) {
// @ts-ignore
      if (values[key] === undefined || values[key] === null) {
// @ts-ignore
        values[key] = nodeOptions[key];
      }
    }
// @ts-ignore
    return new ClassReference(values);
  }
  
  // console.log("OPTIONS:", options);
  

// @ts-ignore
  peg$result = peg$startRuleFunction();

// @ts-ignore
  if (peg$result !== peg$FAILED && peg$currPos === input.length) {
// @ts-ignore
    return peg$result;
// @ts-ignore
  } else {
// @ts-ignore
    if (peg$result !== peg$FAILED && peg$currPos < input.length) {
// @ts-ignore
      peg$fail(peg$endExpectation());
    }

// @ts-ignore
    throw peg$buildStructuredError(
// @ts-ignore
      peg$maxFailExpected,
// @ts-ignore
      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
// @ts-ignore
      peg$maxFailPos < input.length
// @ts-ignore
        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
// @ts-ignore
        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
    );
  }
}

// @ts-ignore
  return {
    SyntaxError: peg$SyntaxError,
    parse: peg$parse
  };
})()

export interface FilePosition {
  offset: number;
  line: number;
  column: number;
}

export interface FileRange {
  start: FilePosition;
  end: FilePosition;
  source: string;
}

export interface LiteralExpectation {
  type: "literal";
  text: string;
  ignoreCase: boolean;
}

export interface ClassParts extends Array<string | ClassParts> {}

export interface ClassExpectation {
  type: "class";
  parts: ClassParts;
  inverted: boolean;
  ignoreCase: boolean;
}

export interface AnyExpectation {
  type: "any";
}

export interface EndExpectation {
  type: "end";
}

export interface OtherExpectation {
  type: "other";
  description: string;
}

export type Expectation = LiteralExpectation | ClassExpectation | AnyExpectation | EndExpectation | OtherExpectation;

declare class _PeggySyntaxError extends Error {
  public static buildMessage(expected: Expectation[], found: string | null): string;
  public message: string;
  public expected: Expectation[];
  public found: string | null;
  public location: FileRange;
  public name: string;
  constructor(message: string, expected: Expectation[], found: string | null, location: FileRange);
  format(sources: {
    source?: any;
    text: string;
  }[]): string;
}

export interface TraceEvent {
    type: string;
    rule: string;
    result?: any;
    location: FileRange;
  }

declare class _DefaultTracer {
  private indentLevel: number;
  public trace(event: TraceEvent): void;
}

peggyParser.SyntaxError.prototype.name = "PeggySyntaxError";

export interface ParseOptions {
  filename?: string;
  startRule?: "start";
  tracer?: any;
  [key: string]: any;
}
export type ParseFunction = <Options extends ParseOptions>(
    input: string,
    options?: Options
  ) => Options extends { startRule: infer StartRule } ?
    StartRule extends "start" ? Start : Start
    : Start;
export const parse: ParseFunction = peggyParser.parse;

export const PeggySyntaxError = peggyParser.SyntaxError as typeof _PeggySyntaxError;

export type PeggySyntaxError = _PeggySyntaxError;

// These types were autogenerated by ts-pegjs
export type Start = any;
export type Float = number;
export type Int = number;
export type Multi = number;
export type Ws = undefined;
export type Comma = [Ws, ",", Ws];
export type Pipe = [Ws, "|", Ws];
export type Quote = '"' | "'";
export type Sound = any;
export type ParallelSound = string;
export type Soundname = string;
export type SoundParam = SoundCycle | SoundItems;
export type SoundCycle = any;
export type SoundItems = Soundname | SoundCycle | Ws;
export type PitchedSound = SoundParam;
export type Containers = ListOperation | List | Subdivision | Cycle | Replist;
export type SoundEvent = any;
export type SoundIndex = any;
export type Snum = NumericParam;
export type Durchar = any;
export type Duration = Ratio | Float | Durchar;
export type Ratio = number;
export type Items = any[];
export type NumericParam =
  | Ws
  | Multi
  | Random
  | RandomBetween
  | NumCycle
  | EvalParam;
export type NumCycle = any;
export type List = any;
export type Listrepeat = Multi;
export type ListOperation = any;
export type Replist = any;
export type Subdivision = any;
export type EvalItem = Multi | Int;
export type EvalItems = (number | undefined)[];
export type EvalOp = number;
export type Eval = any;
export type EvalParam = Multi | RandomBetween;
export type Operation =
  | "+"
  | "-"
  | "*"
  | "/"
  | "%"
  | "^"
  | "|"
  | "&"
  | ">>"
  | "<<";
export type Item =
  | Rest
  | Assignment
  | Romans
  | NamedChord
  | NamedNote
  | Variable
  | Sound
  | Chord
  | Pitch
  | OctaveChange
  | Ws
  | DurationChange
  | List
  | Eval
  | Bar;
export type Bar = undefined;
export type Cycle = any;
export type OctaveChange = any;
export type Octave = number;
export type Random = any;
export type RandomBetween = any;
export type Repeat = any;
export type DurationChange = any;
export type RestDuration = Duration;
export type Rest = any;
export type Pitch = any;
export type Accidentals = number;
export type Arpeggio = any;
export type Chord = any;
export type ChordName = string;
export type Invert = Multi;
export type NoteName = string;
export type Assignment = undefined;
export type Variable = any;
export type NamedChord = any;
export type Romans = any;
export type NamedNote = any;
