{
  "version": 3,
  "sources": ["../node_modules/parsimmon/src/parsimmon.js", "../src/vidx.ts", "../src/geometry.ts", "../src/range-manip.ts", "../src/Versification.ts", "../src/printer.ts", "../src/validate.ts", "../src/parser.ts", "../src/parser-url.ts", "../src/lib.ts", "../src/index.ts"],
  "sourcesContent": ["\"use strict\";\n\nfunction Parsimmon(action) {\n  if (!(this instanceof Parsimmon)) {\n    return new Parsimmon(action);\n  }\n  this._ = action;\n}\n\nvar _ = Parsimmon.prototype;\n\nfunction times(n, f) {\n  var i = 0;\n  for (i; i < n; i++) {\n    f(i);\n  }\n}\n\nfunction forEach(f, arr) {\n  times(arr.length, function(i) {\n    f(arr[i], i, arr);\n  });\n}\n\nfunction reduce(f, seed, arr) {\n  forEach(function(elem, i, arr) {\n    seed = f(seed, elem, i, arr);\n  }, arr);\n  return seed;\n}\n\nfunction map(f, arr) {\n  return reduce(\n    function(acc, elem, i, a) {\n      return acc.concat([f(elem, i, a)]);\n    },\n    [],\n    arr\n  );\n}\n\nfunction lshiftBuffer(input) {\n  var asTwoBytes = reduce(\n    function(a, v, i, b) {\n      return a.concat(\n        i === b.length - 1\n          ? Buffer.from([v, 0]).readUInt16BE(0)\n          : b.readUInt16BE(i)\n      );\n    },\n    [],\n    input\n  );\n  return Buffer.from(\n    map(function(x) {\n      return ((x << 1) & 0xffff) >> 8;\n    }, asTwoBytes)\n  );\n}\n\nfunction consumeBitsFromBuffer(n, input) {\n  var state = { v: 0, buf: input };\n  times(n, function() {\n    state = {\n      v: (state.v << 1) | bitPeekBuffer(state.buf),\n      buf: lshiftBuffer(state.buf)\n    };\n  });\n  return state;\n}\n\nfunction bitPeekBuffer(input) {\n  return input[0] >> 7;\n}\n\nfunction sum(numArr) {\n  return reduce(\n    function(x, y) {\n      return x + y;\n    },\n    0,\n    numArr\n  );\n}\n\nfunction find(pred, arr) {\n  return reduce(\n    function(found, elem) {\n      return found || (pred(elem) ? elem : found);\n    },\n    null,\n    arr\n  );\n}\n\nfunction bufferExists() {\n  return typeof Buffer !== \"undefined\";\n}\n\nfunction setExists() {\n  if (Parsimmon._supportsSet !== undefined) {\n    return Parsimmon._supportsSet;\n  }\n  var exists = typeof Set !== \"undefined\";\n  Parsimmon._supportsSet = exists;\n  return exists;\n}\n\nfunction ensureBuffer() {\n  if (!bufferExists()) {\n    throw new Error(\n      \"Buffer global does not exist; please use webpack if you need to parse Buffers in the browser.\"\n    );\n  }\n}\n\nfunction bitSeq(alignments) {\n  ensureBuffer();\n  var totalBits = sum(alignments);\n  if (totalBits % 8 !== 0) {\n    throw new Error(\n      \"The bits [\" +\n        alignments.join(\", \") +\n        \"] add up to \" +\n        totalBits +\n        \" which is not an even number of bytes; the total should be divisible by 8\"\n    );\n  }\n  var bytes = totalBits / 8;\n\n  var tooBigRange = find(function(x) {\n    return x > 48;\n  }, alignments);\n  if (tooBigRange) {\n    throw new Error(\n      tooBigRange + \" bit range requested exceeds 48 bit (6 byte) Number max.\"\n    );\n  }\n\n  return new Parsimmon(function(input, i) {\n    var newPos = bytes + i;\n    if (newPos > input.length) {\n      return makeFailure(i, bytes.toString() + \" bytes\");\n    }\n    return makeSuccess(\n      newPos,\n      reduce(\n        function(acc, bits) {\n          var state = consumeBitsFromBuffer(bits, acc.buf);\n          return {\n            coll: acc.coll.concat(state.v),\n            buf: state.buf\n          };\n        },\n        { coll: [], buf: input.slice(i, newPos) },\n        alignments\n      ).coll\n    );\n  });\n}\n\nfunction bitSeqObj(namedAlignments) {\n  ensureBuffer();\n  var seenKeys = {};\n  var totalKeys = 0;\n  var fullAlignments = map(function(item) {\n    if (isArray(item)) {\n      var pair = item;\n      if (pair.length !== 2) {\n        throw new Error(\n          \"[\" +\n            pair.join(\", \") +\n            \"] should be length 2, got length \" +\n            pair.length\n        );\n      }\n      assertString(pair[0]);\n      assertNumber(pair[1]);\n      if (Object.prototype.hasOwnProperty.call(seenKeys, pair[0])) {\n        throw new Error(\"duplicate key in bitSeqObj: \" + pair[0]);\n      }\n      seenKeys[pair[0]] = true;\n      totalKeys++;\n      return pair;\n    } else {\n      assertNumber(item);\n      return [null, item];\n    }\n  }, namedAlignments);\n  if (totalKeys < 1) {\n    throw new Error(\n      \"bitSeqObj expects at least one named pair, got [\" +\n        namedAlignments.join(\", \") +\n        \"]\"\n    );\n  }\n  var namesOnly = map(function(pair) {\n    return pair[0];\n  }, fullAlignments);\n  var alignmentsOnly = map(function(pair) {\n    return pair[1];\n  }, fullAlignments);\n\n  return bitSeq(alignmentsOnly).map(function(parsed) {\n    var namedParsed = map(function(name, i) {\n      return [name, parsed[i]];\n    }, namesOnly);\n\n    return reduce(\n      function(obj, kv) {\n        if (kv[0] !== null) {\n          obj[kv[0]] = kv[1];\n        }\n        return obj;\n      },\n      {},\n      namedParsed\n    );\n  });\n}\n\nfunction parseBufferFor(other, length) {\n  return new Parsimmon(function(input, i) {\n    ensureBuffer();\n    if (i + length > input.length) {\n      return makeFailure(i, length + \" bytes for \" + other);\n    }\n    return makeSuccess(i + length, input.slice(i, i + length));\n  });\n}\n\nfunction parseBuffer(length) {\n  return parseBufferFor(\"buffer\", length).map(function(unsafe) {\n    return Buffer.from(unsafe);\n  });\n}\n\nfunction encodedString(encoding, length) {\n  return parseBufferFor(\"string\", length).map(function(buff) {\n    return buff.toString(encoding);\n  });\n}\n\nfunction isInteger(value) {\n  return typeof value === \"number\" && Math.floor(value) === value;\n}\n\nfunction assertValidIntegerByteLengthFor(who, length) {\n  if (!isInteger(length) || length < 0 || length > 6) {\n    throw new Error(who + \" requires integer length in range [0, 6].\");\n  }\n}\n\nfunction uintBE(length) {\n  assertValidIntegerByteLengthFor(\"uintBE\", length);\n  return parseBufferFor(\"uintBE(\" + length + \")\", length).map(function(buff) {\n    return buff.readUIntBE(0, length);\n  });\n}\n\nfunction uintLE(length) {\n  assertValidIntegerByteLengthFor(\"uintLE\", length);\n  return parseBufferFor(\"uintLE(\" + length + \")\", length).map(function(buff) {\n    return buff.readUIntLE(0, length);\n  });\n}\n\nfunction intBE(length) {\n  assertValidIntegerByteLengthFor(\"intBE\", length);\n  return parseBufferFor(\"intBE(\" + length + \")\", length).map(function(buff) {\n    return buff.readIntBE(0, length);\n  });\n}\n\nfunction intLE(length) {\n  assertValidIntegerByteLengthFor(\"intLE\", length);\n  return parseBufferFor(\"intLE(\" + length + \")\", length).map(function(buff) {\n    return buff.readIntLE(0, length);\n  });\n}\n\nfunction floatBE() {\n  return parseBufferFor(\"floatBE\", 4).map(function(buff) {\n    return buff.readFloatBE(0);\n  });\n}\n\nfunction floatLE() {\n  return parseBufferFor(\"floatLE\", 4).map(function(buff) {\n    return buff.readFloatLE(0);\n  });\n}\n\nfunction doubleBE() {\n  return parseBufferFor(\"doubleBE\", 8).map(function(buff) {\n    return buff.readDoubleBE(0);\n  });\n}\n\nfunction doubleLE() {\n  return parseBufferFor(\"doubleLE\", 8).map(function(buff) {\n    return buff.readDoubleLE(0);\n  });\n}\n\nfunction toArray(arrLike) {\n  return Array.prototype.slice.call(arrLike);\n}\n// -*- Helpers -*-\n\nfunction isParser(obj) {\n  return obj instanceof Parsimmon;\n}\n\nfunction isArray(x) {\n  return {}.toString.call(x) === \"[object Array]\";\n}\n\nfunction isBuffer(x) {\n  /* global Buffer */\n  return bufferExists() && Buffer.isBuffer(x);\n}\n\nfunction makeSuccess(index, value) {\n  return {\n    status: true,\n    index: index,\n    value: value,\n    furthest: -1,\n    expected: []\n  };\n}\n\nfunction makeFailure(index, expected) {\n  if (!isArray(expected)) {\n    expected = [expected];\n  }\n  return {\n    status: false,\n    index: -1,\n    value: null,\n    furthest: index,\n    expected: expected\n  };\n}\n\nfunction mergeReplies(result, last) {\n  if (!last) {\n    return result;\n  }\n  if (result.furthest > last.furthest) {\n    return result;\n  }\n  var expected =\n    result.furthest === last.furthest\n      ? union(result.expected, last.expected)\n      : last.expected;\n  return {\n    status: result.status,\n    index: result.index,\n    value: result.value,\n    furthest: last.furthest,\n    expected: expected\n  };\n}\n\n// index of { input => { index => { lineNumber, startOfLine } } }\n// when we see a new index we just walk backwards to the last seen index and\n// compute the new lineNumber and startOfLine from there so we don't have to\n// recompute from the whole input\nvar lineColumnIndex = {};\nfunction makeLineColumnIndex(input, i) {\n  if (isBuffer(input)) {\n    return {\n      offset: i,\n      line: -1,\n      column: -1\n    };\n  }\n\n  // initialize if we haven't seen this input yet\n  if (!(input in lineColumnIndex)) {\n    lineColumnIndex[input] = {};\n  }\n\n  var inputIndex = lineColumnIndex[input];\n\n  var prevLine = 0;\n  var newLines = 0;\n  var lineStart = 0;\n  var j = i;\n  while (j >= 0) {\n    if (j in inputIndex) {\n      prevLine = inputIndex[j].line;\n      // lineStart === 0 when we haven't found a new line on the walk\n      // back from i, so we are on the same line as the previously cached\n      // index\n      if (lineStart === 0) {\n        lineStart = inputIndex[j].lineStart;\n      }\n      break;\n    }\n\n    if (\n      // Unix LF (\\n) or Windows CRLF (\\r\\n) line ending\n      input.charAt(j) === \"\\n\" ||\n      // Old Mac CR (\\r) line ending\n      (input.charAt(j) === \"\\r\" && input.charAt(j + 1) !== \"\\n\")\n    ) {\n      newLines++;\n      // lineStart === 0 when this is the first new line we have found\n      if (lineStart === 0) {\n        lineStart = j + 1;\n      }\n    }\n    j--;\n  }\n\n  var lineWeAreUpTo = prevLine + newLines;\n  var columnWeAreUpTo = i - lineStart;\n\n  inputIndex[i] = { line: lineWeAreUpTo, lineStart: lineStart };\n\n  // lines and columns are 1-indexed\n  return {\n    offset: i,\n    line: lineWeAreUpTo + 1,\n    column: columnWeAreUpTo + 1\n  };\n}\n\n// Returns the sorted set union of two arrays of strings\nfunction union(xs, ys) {\n  // for newer browsers/node we can improve performance by using\n  // modern JS\n  if (setExists() && Array.from) {\n    // eslint-disable-next-line no-undef\n    var set = new Set(xs);\n    for (var y = 0; y < ys.length; y++) {\n      set.add(ys[y]);\n    }\n    var arr = Array.from(set);\n    arr.sort();\n    return arr;\n  }\n  var obj = {};\n  for (var i = 0; i < xs.length; i++) {\n    obj[xs[i]] = true;\n  }\n  for (var j = 0; j < ys.length; j++) {\n    obj[ys[j]] = true;\n  }\n  var keys = [];\n  for (var k in obj) {\n    if ({}.hasOwnProperty.call(obj, k)) {\n      keys.push(k);\n    }\n  }\n  keys.sort();\n  return keys;\n}\n\nfunction assertParser(p) {\n  if (!isParser(p)) {\n    throw new Error(\"not a parser: \" + p);\n  }\n}\n\nfunction get(input, i) {\n  if (typeof input === \"string\") {\n    return input.charAt(i);\n  }\n  return input[i];\n}\n\n// TODO[ES5]: Switch to Array.isArray eventually.\nfunction assertArray(x) {\n  if (!isArray(x)) {\n    throw new Error(\"not an array: \" + x);\n  }\n}\n\nfunction assertNumber(x) {\n  if (typeof x !== \"number\") {\n    throw new Error(\"not a number: \" + x);\n  }\n}\n\nfunction assertRegexp(x) {\n  if (!(x instanceof RegExp)) {\n    throw new Error(\"not a regexp: \" + x);\n  }\n  var f = flags(x);\n  for (var i = 0; i < f.length; i++) {\n    var c = f.charAt(i);\n    // Only allow regexp flags [imus] for now, since [g] and [y] specifically\n    // mess up Parsimmon. If more non-stateful regexp flags are added in the\n    // future, this will need to be revisited.\n    if (c !== \"i\" && c !== \"m\" && c !== \"u\" && c !== \"s\") {\n      throw new Error('unsupported regexp flag \"' + c + '\": ' + x);\n    }\n  }\n}\n\nfunction assertFunction(x) {\n  if (typeof x !== \"function\") {\n    throw new Error(\"not a function: \" + x);\n  }\n}\n\nfunction assertString(x) {\n  if (typeof x !== \"string\") {\n    throw new Error(\"not a string: \" + x);\n  }\n}\n\n// -*- Error Formatting -*-\n\nvar linesBeforeStringError = 2;\nvar linesAfterStringError = 3;\nvar bytesPerLine = 8;\nvar bytesBefore = bytesPerLine * 5;\nvar bytesAfter = bytesPerLine * 4;\nvar defaultLinePrefix = \"  \";\n\nfunction repeat(string, amount) {\n  return new Array(amount + 1).join(string);\n}\n\nfunction formatExpected(expected) {\n  if (expected.length === 1) {\n    return \"Expected:\\n\\n\" + expected[0];\n  }\n  return \"Expected one of the following: \\n\\n\" + expected.join(\", \");\n}\n\nfunction leftPad(str, pad, char) {\n  var add = pad - str.length;\n  if (add <= 0) {\n    return str;\n  }\n  return repeat(char, add) + str;\n}\n\nfunction toChunks(arr, chunkSize) {\n  var length = arr.length;\n  var chunks = [];\n  var chunkIndex = 0;\n\n  if (length <= chunkSize) {\n    return [arr.slice()];\n  }\n\n  for (var i = 0; i < length; i++) {\n    if (!chunks[chunkIndex]) {\n      chunks.push([]);\n    }\n\n    chunks[chunkIndex].push(arr[i]);\n\n    if ((i + 1) % chunkSize === 0) {\n      chunkIndex++;\n    }\n  }\n\n  return chunks;\n}\n\n// Get a range of indexes including `i`-th element and `before` and `after` amount of elements from `arr`.\nfunction rangeFromIndexAndOffsets(i, before, after, length) {\n  return {\n    // Guard against the negative upper bound for lines included in the output.\n    from: i - before > 0 ? i - before : 0,\n    to: i + after > length ? length : i + after\n  };\n}\n\nfunction byteRangeToRange(byteRange) {\n  // Exception for inputs smaller than `bytesPerLine`\n  if (byteRange.from === 0 && byteRange.to === 1) {\n    return {\n      from: byteRange.from,\n      to: byteRange.to\n    };\n  }\n\n  return {\n    from: byteRange.from / bytesPerLine,\n    // Round `to`, so we don't get float if the amount of bytes is not divisible by `bytesPerLine`\n    to: Math.floor(byteRange.to / bytesPerLine)\n  };\n}\n\nfunction formatGot(input, error) {\n  var index = error.index;\n  var i = index.offset;\n\n  var verticalMarkerLength = 1;\n  var column;\n  var lineWithErrorIndex;\n  var lines;\n  var lineRange;\n  var lastLineNumberLabelLength;\n\n  if (i === input.length) {\n    return \"Got the end of the input\";\n  }\n\n  if (isBuffer(input)) {\n    var byteLineWithErrorIndex = i - (i % bytesPerLine);\n    var columnByteIndex = i - byteLineWithErrorIndex;\n    var byteRange = rangeFromIndexAndOffsets(\n      byteLineWithErrorIndex,\n      bytesBefore,\n      bytesAfter + bytesPerLine,\n      input.length\n    );\n    var bytes = input.slice(byteRange.from, byteRange.to);\n    var bytesInChunks = toChunks(bytes.toJSON().data, bytesPerLine);\n\n    var byteLines = map(function(byteRow) {\n      return map(function(byteValue) {\n        // Prefix byte values with a `0` if they are shorter than 2 characters.\n        return leftPad(byteValue.toString(16), 2, \"0\");\n      }, byteRow);\n    }, bytesInChunks);\n\n    lineRange = byteRangeToRange(byteRange);\n    lineWithErrorIndex = byteLineWithErrorIndex / bytesPerLine;\n    column = columnByteIndex * 3;\n\n    // Account for an extra space.\n    if (columnByteIndex >= 4) {\n      column += 1;\n    }\n\n    verticalMarkerLength = 2;\n    lines = map(function(byteLine) {\n      return byteLine.length <= 4\n        ? byteLine.join(\" \")\n        : byteLine.slice(0, 4).join(\" \") + \"  \" + byteLine.slice(4).join(\" \");\n    }, byteLines);\n    lastLineNumberLabelLength = (\n      (lineRange.to > 0 ? lineRange.to - 1 : lineRange.to) * 8\n    ).toString(16).length;\n\n    if (lastLineNumberLabelLength < 2) {\n      lastLineNumberLabelLength = 2;\n    }\n  } else {\n    var inputLines = input.split(/\\r\\n|[\\n\\r\\u2028\\u2029]/);\n    column = index.column - 1;\n    lineWithErrorIndex = index.line - 1;\n    lineRange = rangeFromIndexAndOffsets(\n      lineWithErrorIndex,\n      linesBeforeStringError,\n      linesAfterStringError,\n      inputLines.length\n    );\n\n    lines = inputLines.slice(lineRange.from, lineRange.to);\n    lastLineNumberLabelLength = lineRange.to.toString().length;\n  }\n\n  var lineWithErrorCurrentIndex = lineWithErrorIndex - lineRange.from;\n\n  if (isBuffer(input)) {\n    lastLineNumberLabelLength = (\n      (lineRange.to > 0 ? lineRange.to - 1 : lineRange.to) * 8\n    ).toString(16).length;\n\n    if (lastLineNumberLabelLength < 2) {\n      lastLineNumberLabelLength = 2;\n    }\n  }\n\n  var linesWithLineNumbers = reduce(\n    function(acc, lineSource, index) {\n      var isLineWithError = index === lineWithErrorCurrentIndex;\n      var prefix = isLineWithError ? \"> \" : defaultLinePrefix;\n      var lineNumberLabel;\n\n      if (isBuffer(input)) {\n        lineNumberLabel = leftPad(\n          ((lineRange.from + index) * 8).toString(16),\n          lastLineNumberLabelLength,\n          \"0\"\n        );\n      } else {\n        lineNumberLabel = leftPad(\n          (lineRange.from + index + 1).toString(),\n          lastLineNumberLabelLength,\n          \" \"\n        );\n      }\n\n      return [].concat(\n        acc,\n        [prefix + lineNumberLabel + \" | \" + lineSource],\n        isLineWithError\n          ? [\n              defaultLinePrefix +\n                repeat(\" \", lastLineNumberLabelLength) +\n                \" | \" +\n                leftPad(\"\", column, \" \") +\n                repeat(\"^\", verticalMarkerLength)\n            ]\n          : []\n      );\n    },\n    [],\n    lines\n  );\n\n  return linesWithLineNumbers.join(\"\\n\");\n}\n\nfunction formatError(input, error) {\n  return [\n    \"\\n\",\n    \"-- PARSING FAILED \" + repeat(\"-\", 50),\n    \"\\n\\n\",\n    formatGot(input, error),\n    \"\\n\\n\",\n    formatExpected(error.expected),\n    \"\\n\"\n  ].join(\"\");\n}\n\nfunction flags(re) {\n  if (re.flags !== undefined) {\n    return re.flags;\n  }\n  // legacy browser support\n  return [\n    re.global ? \"g\" : \"\",\n    re.ignoreCase ? \"i\" : \"\",\n    re.multiline ? \"m\" : \"\",\n    re.unicode ? \"u\" : \"\",\n    re.sticky ? \"y\" : \"\"\n  ].join(\"\");\n}\n\nfunction anchoredRegexp(re) {\n  return RegExp(\"^(?:\" + re.source + \")\", flags(re));\n}\n\n// -*- Combinators -*-\n\nfunction seq() {\n  var parsers = [].slice.call(arguments);\n  var numParsers = parsers.length;\n  for (var j = 0; j < numParsers; j += 1) {\n    assertParser(parsers[j]);\n  }\n  return Parsimmon(function(input, i) {\n    var result;\n    var accum = new Array(numParsers);\n    for (var j = 0; j < numParsers; j += 1) {\n      result = mergeReplies(parsers[j]._(input, i), result);\n      if (!result.status) {\n        return result;\n      }\n      accum[j] = result.value;\n      i = result.index;\n    }\n    return mergeReplies(makeSuccess(i, accum), result);\n  });\n}\n\nfunction seqObj() {\n  var seenKeys = {};\n  var totalKeys = 0;\n  var parsers = toArray(arguments);\n  var numParsers = parsers.length;\n  for (var j = 0; j < numParsers; j += 1) {\n    var p = parsers[j];\n    if (isParser(p)) {\n      continue;\n    }\n    if (isArray(p)) {\n      var isWellFormed =\n        p.length === 2 && typeof p[0] === \"string\" && isParser(p[1]);\n      if (isWellFormed) {\n        var key = p[0];\n        if (Object.prototype.hasOwnProperty.call(seenKeys, key)) {\n          throw new Error(\"seqObj: duplicate key \" + key);\n        }\n        seenKeys[key] = true;\n        totalKeys++;\n        continue;\n      }\n    }\n    throw new Error(\n      \"seqObj arguments must be parsers or [string, parser] array pairs.\"\n    );\n  }\n  if (totalKeys === 0) {\n    throw new Error(\"seqObj expects at least one named parser, found zero\");\n  }\n  return Parsimmon(function(input, i) {\n    var result;\n    var accum = {};\n    for (var j = 0; j < numParsers; j += 1) {\n      var name;\n      var parser;\n      if (isArray(parsers[j])) {\n        name = parsers[j][0];\n        parser = parsers[j][1];\n      } else {\n        name = null;\n        parser = parsers[j];\n      }\n      result = mergeReplies(parser._(input, i), result);\n      if (!result.status) {\n        return result;\n      }\n      if (name) {\n        accum[name] = result.value;\n      }\n      i = result.index;\n    }\n    return mergeReplies(makeSuccess(i, accum), result);\n  });\n}\n\nfunction seqMap() {\n  var args = [].slice.call(arguments);\n  if (args.length === 0) {\n    throw new Error(\"seqMap needs at least one argument\");\n  }\n  var mapper = args.pop();\n  assertFunction(mapper);\n  return seq.apply(null, args).map(function(results) {\n    return mapper.apply(null, results);\n  });\n}\n\n// TODO[ES5]: Revisit this with Object.keys and .bind.\nfunction createLanguage(parsers) {\n  var language = {};\n  for (var key in parsers) {\n    if ({}.hasOwnProperty.call(parsers, key)) {\n      (function(key) {\n        var func = function() {\n          return parsers[key](language);\n        };\n        language[key] = lazy(func);\n      })(key);\n    }\n  }\n  return language;\n}\n\nfunction alt() {\n  var parsers = [].slice.call(arguments);\n  var numParsers = parsers.length;\n  if (numParsers === 0) {\n    return fail(\"zero alternates\");\n  }\n  for (var j = 0; j < numParsers; j += 1) {\n    assertParser(parsers[j]);\n  }\n  return Parsimmon(function(input, i) {\n    var result;\n    for (var j = 0; j < parsers.length; j += 1) {\n      result = mergeReplies(parsers[j]._(input, i), result);\n      if (result.status) {\n        return result;\n      }\n    }\n    return result;\n  });\n}\n\nfunction sepBy(parser, separator) {\n  // Argument asserted by sepBy1\n  return sepBy1(parser, separator).or(succeed([]));\n}\n\nfunction sepBy1(parser, separator) {\n  assertParser(parser);\n  assertParser(separator);\n  var pairs = separator.then(parser).many();\n  return seqMap(parser, pairs, function(r, rs) {\n    return [r].concat(rs);\n  });\n}\n\n// -*- Core Parsing Methods -*-\n\n_.parse = function(input) {\n  if (typeof input !== \"string\" && !isBuffer(input)) {\n    throw new Error(\n      \".parse must be called with a string or Buffer as its argument\"\n    );\n  }\n  var parseResult = this.skip(eof)._(input, 0);\n\n  var result;\n  if (parseResult.status) {\n    result = {\n      status: true,\n      value: parseResult.value\n    };\n  } else {\n    result = {\n      status: false,\n      index: makeLineColumnIndex(input, parseResult.furthest),\n      expected: parseResult.expected\n    };\n  }\n\n  // release memory from lineColumnIndex now we are done parsing\n  delete lineColumnIndex[input];\n\n  return result;\n};\n\n// -*- Other Methods -*-\n\n_.tryParse = function(str) {\n  var result = this.parse(str);\n  if (result.status) {\n    return result.value;\n  } else {\n    var msg = formatError(str, result);\n    var err = new Error(msg);\n    err.type = \"ParsimmonError\";\n    err.result = result;\n    throw err;\n  }\n};\n\n_.assert = function(condition, errorMessage) {\n  return this.chain(function(value) {\n    return condition(value) ? succeed(value) : fail(errorMessage);\n  });\n};\n\n_.or = function(alternative) {\n  return alt(this, alternative);\n};\n\n_.trim = function(parser) {\n  return this.wrap(parser, parser);\n};\n\n_.wrap = function(leftParser, rightParser) {\n  return seqMap(leftParser, this, rightParser, function(left, middle) {\n    return middle;\n  });\n};\n\n_.thru = function(wrapper) {\n  return wrapper(this);\n};\n\n_.then = function(next) {\n  assertParser(next);\n  return seq(this, next).map(function(results) {\n    return results[1];\n  });\n};\n\n_.many = function() {\n  var self = this;\n\n  return Parsimmon(function(input, i) {\n    var accum = [];\n    var result = undefined;\n\n    for (;;) {\n      result = mergeReplies(self._(input, i), result);\n      if (result.status) {\n        if (i === result.index) {\n          throw new Error(\n            \"infinite loop detected in .many() parser --- calling .many() on \" +\n              \"a parser which can accept zero characters is usually the cause\"\n          );\n        }\n        i = result.index;\n        accum.push(result.value);\n      } else {\n        return mergeReplies(makeSuccess(i, accum), result);\n      }\n    }\n  });\n};\n\n_.tieWith = function(separator) {\n  assertString(separator);\n  return this.map(function(args) {\n    assertArray(args);\n    if (args.length) {\n      assertString(args[0]);\n      var s = args[0];\n      for (var i = 1; i < args.length; i++) {\n        assertString(args[i]);\n        s += separator + args[i];\n      }\n      return s;\n    } else {\n      return \"\";\n    }\n  });\n};\n\n_.tie = function() {\n  return this.tieWith(\"\");\n};\n\n_.times = function(min, max) {\n  var self = this;\n  if (arguments.length < 2) {\n    max = min;\n  }\n  assertNumber(min);\n  assertNumber(max);\n  return Parsimmon(function(input, i) {\n    var accum = [];\n    var result = undefined;\n    var prevResult = undefined;\n    for (var times = 0; times < min; times += 1) {\n      result = self._(input, i);\n      prevResult = mergeReplies(result, prevResult);\n      if (result.status) {\n        i = result.index;\n        accum.push(result.value);\n      } else {\n        return prevResult;\n      }\n    }\n    for (; times < max; times += 1) {\n      result = self._(input, i);\n      prevResult = mergeReplies(result, prevResult);\n      if (result.status) {\n        i = result.index;\n        accum.push(result.value);\n      } else {\n        break;\n      }\n    }\n    return mergeReplies(makeSuccess(i, accum), prevResult);\n  });\n};\n\n_.result = function(res) {\n  return this.map(function() {\n    return res;\n  });\n};\n\n_.atMost = function(n) {\n  return this.times(0, n);\n};\n\n_.atLeast = function(n) {\n  return seqMap(this.times(n), this.many(), function(init, rest) {\n    return init.concat(rest);\n  });\n};\n\n_.map = function(fn) {\n  assertFunction(fn);\n  var self = this;\n  return Parsimmon(function(input, i) {\n    var result = self._(input, i);\n    if (!result.status) {\n      return result;\n    }\n    return mergeReplies(makeSuccess(result.index, fn(result.value)), result);\n  });\n};\n\n_.contramap = function(fn) {\n  assertFunction(fn);\n  var self = this;\n  return Parsimmon(function(input, i) {\n    var result = self.parse(fn(input.slice(i)));\n    if (!result.status) {\n      return result;\n    }\n    return makeSuccess(i + input.length, result.value);\n  });\n};\n\n_.promap = function(f, g) {\n  assertFunction(f);\n  assertFunction(g);\n  return this.contramap(f).map(g);\n};\n\n_.skip = function(next) {\n  return seq(this, next).map(function(results) {\n    return results[0];\n  });\n};\n\n_.mark = function() {\n  return seqMap(index, this, index, function(start, value, end) {\n    return {\n      start: start,\n      value: value,\n      end: end\n    };\n  });\n};\n\n_.node = function(name) {\n  return seqMap(index, this, index, function(start, value, end) {\n    return {\n      name: name,\n      value: value,\n      start: start,\n      end: end\n    };\n  });\n};\n\n_.sepBy = function(separator) {\n  return sepBy(this, separator);\n};\n\n_.sepBy1 = function(separator) {\n  return sepBy1(this, separator);\n};\n\n_.lookahead = function(x) {\n  return this.skip(lookahead(x));\n};\n\n_.notFollowedBy = function(x) {\n  return this.skip(notFollowedBy(x));\n};\n\n_.desc = function(expected) {\n  if (!isArray(expected)) {\n    expected = [expected];\n  }\n  var self = this;\n  return Parsimmon(function(input, i) {\n    var reply = self._(input, i);\n    if (!reply.status) {\n      reply.expected = expected;\n    }\n    return reply;\n  });\n};\n\n_.fallback = function(result) {\n  return this.or(succeed(result));\n};\n\n_.ap = function(other) {\n  return seqMap(other, this, function(f, x) {\n    return f(x);\n  });\n};\n\n_.chain = function(f) {\n  var self = this;\n  return Parsimmon(function(input, i) {\n    var result = self._(input, i);\n    if (!result.status) {\n      return result;\n    }\n    var nextParser = f(result.value);\n    return mergeReplies(nextParser._(input, result.index), result);\n  });\n};\n\n// -*- Constructors -*-\n\nfunction string(str) {\n  assertString(str);\n  var expected = \"'\" + str + \"'\";\n  return Parsimmon(function(input, i) {\n    var j = i + str.length;\n    var head = input.slice(i, j);\n    if (head === str) {\n      return makeSuccess(j, head);\n    } else {\n      return makeFailure(i, expected);\n    }\n  });\n}\n\nfunction byte(b) {\n  ensureBuffer();\n  assertNumber(b);\n  if (b > 0xff) {\n    throw new Error(\n      \"Value specified to byte constructor (\" +\n        b +\n        \"=0x\" +\n        b.toString(16) +\n        \") is larger in value than a single byte.\"\n    );\n  }\n  var expected = (b > 0xf ? \"0x\" : \"0x0\") + b.toString(16);\n  return Parsimmon(function(input, i) {\n    var head = get(input, i);\n    if (head === b) {\n      return makeSuccess(i + 1, head);\n    } else {\n      return makeFailure(i, expected);\n    }\n  });\n}\n\nfunction regexp(re, group) {\n  assertRegexp(re);\n  if (arguments.length >= 2) {\n    assertNumber(group);\n  } else {\n    group = 0;\n  }\n  var anchored = anchoredRegexp(re);\n  var expected = \"\" + re;\n  return Parsimmon(function(input, i) {\n    var match = anchored.exec(input.slice(i));\n    if (match) {\n      if (0 <= group && group <= match.length) {\n        var fullMatch = match[0];\n        var groupMatch = match[group];\n        return makeSuccess(i + fullMatch.length, groupMatch);\n      }\n      var message =\n        \"valid match group (0 to \" + match.length + \") in \" + expected;\n      return makeFailure(i, message);\n    }\n    return makeFailure(i, expected);\n  });\n}\n\nfunction succeed(value) {\n  return Parsimmon(function(input, i) {\n    return makeSuccess(i, value);\n  });\n}\n\nfunction fail(expected) {\n  return Parsimmon(function(input, i) {\n    return makeFailure(i, expected);\n  });\n}\n\nfunction lookahead(x) {\n  if (isParser(x)) {\n    return Parsimmon(function(input, i) {\n      var result = x._(input, i);\n      result.index = i;\n      result.value = \"\";\n      return result;\n    });\n  } else if (typeof x === \"string\") {\n    return lookahead(string(x));\n  } else if (x instanceof RegExp) {\n    return lookahead(regexp(x));\n  }\n  throw new Error(\"not a string, regexp, or parser: \" + x);\n}\n\nfunction notFollowedBy(parser) {\n  assertParser(parser);\n  return Parsimmon(function(input, i) {\n    var result = parser._(input, i);\n    var text = input.slice(i, result.index);\n    return result.status\n      ? makeFailure(i, 'not \"' + text + '\"')\n      : makeSuccess(i, null);\n  });\n}\n\nfunction test(predicate) {\n  assertFunction(predicate);\n  return Parsimmon(function(input, i) {\n    var char = get(input, i);\n    if (i < input.length && predicate(char)) {\n      return makeSuccess(i + 1, char);\n    } else {\n      return makeFailure(i, \"a character/byte matching \" + predicate);\n    }\n  });\n}\n\nfunction oneOf(str) {\n  var expected = str.split(\"\");\n  for (var idx = 0; idx < expected.length; idx++) {\n    expected[idx] = \"'\" + expected[idx] + \"'\";\n  }\n  return test(function(ch) {\n    return str.indexOf(ch) >= 0;\n  }).desc(expected);\n}\n\nfunction noneOf(str) {\n  return test(function(ch) {\n    return str.indexOf(ch) < 0;\n  }).desc(\"none of '\" + str + \"'\");\n}\n\nfunction custom(parsingFunction) {\n  return Parsimmon(parsingFunction(makeSuccess, makeFailure));\n}\n\n// TODO[ES5]: Improve error message using JSON.stringify eventually.\nfunction range(begin, end) {\n  return test(function(ch) {\n    return begin <= ch && ch <= end;\n  }).desc(begin + \"-\" + end);\n}\n\nfunction takeWhile(predicate) {\n  assertFunction(predicate);\n\n  return Parsimmon(function(input, i) {\n    var j = i;\n    while (j < input.length && predicate(get(input, j))) {\n      j++;\n    }\n    return makeSuccess(j, input.slice(i, j));\n  });\n}\n\nfunction lazy(desc, f) {\n  if (arguments.length < 2) {\n    f = desc;\n    desc = undefined;\n  }\n\n  var parser = Parsimmon(function(input, i) {\n    parser._ = f()._;\n    return parser._(input, i);\n  });\n\n  if (desc) {\n    return parser.desc(desc);\n  } else {\n    return parser;\n  }\n}\n\n// -*- Fantasy Land Extras -*-\n\nfunction empty() {\n  return fail(\"fantasy-land/empty\");\n}\n\n_.concat = _.or;\n_.empty = empty;\n_.of = succeed;\n_[\"fantasy-land/ap\"] = _.ap;\n_[\"fantasy-land/chain\"] = _.chain;\n_[\"fantasy-land/concat\"] = _.concat;\n_[\"fantasy-land/empty\"] = _.empty;\n_[\"fantasy-land/of\"] = _.of;\n_[\"fantasy-land/map\"] = _.map;\n\n// -*- Base Parsers -*-\n\nvar index = Parsimmon(function(input, i) {\n  return makeSuccess(i, makeLineColumnIndex(input, i));\n});\n\nvar any = Parsimmon(function(input, i) {\n  if (i >= input.length) {\n    return makeFailure(i, \"any character/byte\");\n  }\n  return makeSuccess(i + 1, get(input, i));\n});\n\nvar all = Parsimmon(function(input, i) {\n  return makeSuccess(input.length, input.slice(i));\n});\n\nvar eof = Parsimmon(function(input, i) {\n  if (i < input.length) {\n    return makeFailure(i, \"EOF\");\n  }\n  return makeSuccess(i, null);\n});\n\nvar digit = regexp(/[0-9]/).desc(\"a digit\");\nvar digits = regexp(/[0-9]*/).desc(\"optional digits\");\nvar letter = regexp(/[a-z]/i).desc(\"a letter\");\nvar letters = regexp(/[a-z]*/i).desc(\"optional letters\");\nvar optWhitespace = regexp(/\\s*/).desc(\"optional whitespace\");\nvar whitespace = regexp(/\\s+/).desc(\"whitespace\");\nvar cr = string(\"\\r\");\nvar lf = string(\"\\n\");\nvar crlf = string(\"\\r\\n\");\nvar newline = alt(crlf, lf, cr).desc(\"newline\");\nvar end = alt(newline, eof);\n\nParsimmon.all = all;\nParsimmon.alt = alt;\nParsimmon.any = any;\nParsimmon.cr = cr;\nParsimmon.createLanguage = createLanguage;\nParsimmon.crlf = crlf;\nParsimmon.custom = custom;\nParsimmon.digit = digit;\nParsimmon.digits = digits;\nParsimmon.empty = empty;\nParsimmon.end = end;\nParsimmon.eof = eof;\nParsimmon.fail = fail;\nParsimmon.formatError = formatError;\nParsimmon.index = index;\nParsimmon.isParser = isParser;\nParsimmon.lazy = lazy;\nParsimmon.letter = letter;\nParsimmon.letters = letters;\nParsimmon.lf = lf;\nParsimmon.lookahead = lookahead;\nParsimmon.makeFailure = makeFailure;\nParsimmon.makeSuccess = makeSuccess;\nParsimmon.newline = newline;\nParsimmon.noneOf = noneOf;\nParsimmon.notFollowedBy = notFollowedBy;\nParsimmon.of = succeed;\nParsimmon.oneOf = oneOf;\nParsimmon.optWhitespace = optWhitespace;\nParsimmon.Parser = Parsimmon;\nParsimmon.range = range;\nParsimmon.regex = regexp;\nParsimmon.regexp = regexp;\nParsimmon.sepBy = sepBy;\nParsimmon.sepBy1 = sepBy1;\nParsimmon.seq = seq;\nParsimmon.seqMap = seqMap;\nParsimmon.seqObj = seqObj;\nParsimmon.string = string;\nParsimmon.succeed = succeed;\nParsimmon.takeWhile = takeWhile;\nParsimmon.test = test;\nParsimmon.whitespace = whitespace;\nParsimmon[\"fantasy-land/empty\"] = empty;\nParsimmon[\"fantasy-land/of\"] = succeed;\n\nParsimmon.Binary = {\n  bitSeq: bitSeq,\n  bitSeqObj: bitSeqObj,\n  byte: byte,\n  buffer: parseBuffer,\n  encodedString: encodedString,\n  uintBE: uintBE,\n  uint8BE: uintBE(1),\n  uint16BE: uintBE(2),\n  uint32BE: uintBE(4),\n  uintLE: uintLE,\n  uint8LE: uintLE(1),\n  uint16LE: uintLE(2),\n  uint32LE: uintLE(4),\n  intBE: intBE,\n  int8BE: intBE(1),\n  int16BE: intBE(2),\n  int32BE: intBE(4),\n  intLE: intLE,\n  int8LE: intLE(1),\n  int16LE: intLE(2),\n  int32LE: intLE(4),\n  floatBE: floatBE(),\n  floatLE: floatLE(),\n  doubleBE: doubleBE(),\n  doubleLE: doubleLE()\n};\n\nmodule.exports = Parsimmon;\n", "/**\n * Contains various utility functions related to converting BibleVerse's to and\n * from \"Verse Indexes\" (IE: VIDX)\n */\n\nimport { Versification } from './Versification';\nimport { BibleRef, BibleVerse, BibleRange } from './BibleRef';\n\n/**\n * Converts a BibleVerse to a \"Verse Index\" which would be the 0-based index of\n * the verse in an array contain all verse of the bible\n */\nexport function toVidx(versification: Versification, verse: BibleVerse) : number {\n\treturn versification.book[verse.book][verse.chapter].cumulative_verse + verse.verse - 1;\n}\n\nexport function fromVidx(versification: Versification, vidx: number) : BibleVerse {\n\t// First identify the book containing the CVID by linear search of the books\n\t// only 66 books so performance is fine\n\tlet b_idx;\n\tfor(b_idx = 1; b_idx < versification.order.length; ++b_idx){\n\t\tif(versification.order[b_idx].chapters[0].cumulative_verse > vidx){\n\t\t\tbreak;\n\t\t}\n\t}\n\t--b_idx;\n\n\tlet book = versification.order[b_idx];\n\n\t// Now find the chapter, again by linear search, but even longest book (Psalms)\n\t// has only 150 chapters, so performance is fine\n\tlet c_idx;\n\tfor(c_idx = 1; c_idx < book.chapters.length; ++c_idx){\n\t\tif(book.chapters[c_idx].cumulative_verse > vidx){\n\t\t\tbreak;\n\t\t}\n\t}\n\t--c_idx;\n\n\t// +1's here since chapters and verses not indexed from 0\n\treturn { book    : book.id,\n\t\t\t\t\t chapter : c_idx + 1,\n\t\t\t\t\t verse   : vidx - book.chapters[c_idx].cumulative_verse + 1,\n\t\t\t\t };\n}\n\n\n/**\n * Counts the total number of verses expressed by a BibleRef\n */\nexport function countVerses(v : Versification, ref : BibleRef) : number {\n\tif(ref.is_range){\n\t\t// +1 since we include both start and end, and adjacent verses have vidx's\n\t\t// differing by 1\n\t\treturn toVidx(v, ref.end) - toVidx(v, ref.start) + 1;\n\t} else {\n\t\treturn 1;\n\t}\n}\n\n/**\n * Takes a list of BibleRefs and returns a new list containing just the first N\n * verses from the set\n */\nexport function firstNVerses(v    : Versification,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t refs : BibleRef[],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t n    : number\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : BibleRef[] {\n\tif(n === 0 || refs.length === 0){\n\t\treturn [];\n\t}\n\n\tif (refs.length === 1){\n\t\tlet ref = refs[0];\n\n\t\tlet count = countVerses(v, ref);\n\t\tif(count <= n){ return refs; }\n\n\t\t// Logically we MUST be left with a range now, since if n === 0 we would\n\t\t// have already returned, hence n > 0\n\t\t// If ref is a BibleVerse then count = 1, hence count >= n, hence\n\t\t// we have just returned\n\t\t// But typescript can't do that sort of inference, so we force it here\n\t\tlet range : BibleRange = ref as BibleRange;\n\n\t\tif(n == 1){ return [range.start]; }\n\n\t\t// Now we simply get the v_idx of the start, advance by n, and convert\n\t\t// back to a verse\n\t\treturn [{ is_range : true,\n\t\t\t\t\t\t\tstart    : range.start,\n\t\t\t\t\t\t\tend      : fromVidx(v, toVidx(v, range.start) + n - 1),\n\t\t\t\t\t\t}];\n\t}\n\n\t// If we're still going then we have multiple BibleRef instances to consider\n\t// We can simply go thorugh the list, adding each ref in turn until we run\n\t// out of verses\n\t// The final entry is trimmed to the length of the remaining allowance\n\t// using firstNVerses (although the refs.length === 1 case will be hit)\n\tlet result : BibleRef[] = [];\n\tlet used = 0;\n\tfor(let i = 0; i < refs.length && used < n; ++i){\n\t\tlet more = firstNVerses(v, [refs[i]], n - used);\n\t\tused += countVerses(v, more[0]);\n\t\tresult.push(more[0]);\n\t}\n\treturn result;\n}\n", "/**\n * Various utility functions for treating [[BibleRef]]s as geometry, IE:\n * BibleVerse's as points, and BibleRange's as line segments, and then finding intersections/etc\n */\n\nimport { BibleRef, BibleVerse, BibleRange, BibleRefLibData } from './BibleRef';\nimport { Versification, BookMeta } from './Versification'\nimport * as Vidx from './vidx';\n\nexport interface GeometryFunctions {\n\tgetIntersection(a: BibleRef | BibleRef[], b: BibleRef | BibleRef[]): BibleRef[];\n\tintersects(a: BibleRef | BibleRef[], b: BibleRef | BibleRef[]): boolean,\n\tcontains(a: BibleRef, b: BibleRef): boolean,\n\tgetUnion(a: BibleRef | BibleRef[], b: BibleRef | BibleRef[]): BibleRef[];\n\tgetDifference(a: BibleRef | BibleRef[], b: BibleRef | BibleRef[]): BibleRef[];\n\tindexOf(a: BibleRef | BibleRef[], b: BibleVerse): number;\n\tverseAtIndex(a: BibleRef | BibleRef[], idx: number): BibleVerse | undefined;\n\tcreateIntersectionSet(a: BibleRef | BibleRef[]) : IntersectionSet;\n\tcombineRanges(refs: BibleRef[]) : BibleRef[];\n};\n\n/**\n *  Represents a 1d line segment (we map [[BibleRange]]'s to vidx ranges to do maths on them)\n *\n * @private\n */\nexport interface LineSegment {\n\tmin: number;\n\tmax: number;\n}\n\n/**\n * Generates the most compressed representation possible of some set of\n * [[BibleVerse]]s/[[BibleRange]]s by combining adjacent or overlapping ranges into\n * larger ones\n *\n * For example, an input list of \"Gen 1\", \"Gen 2\", \"Gen 3\", would produce a\n * single [[BibleRange]] for \"Gen 1-3\"\n *\n * Order of input ranges in unimportant, since this functional will interally\n * call [[sort]] first\n */\nexport function combineRanges(this: BibleRefLibData, refs: BibleRef[]) : BibleRef[]{\n\tlet v = this.versification;\n\n\t// Convert BibleRefs into vidx pairs representing the range\n\tlet ranges = _toLineSegmentsUnsorted(this, refs);\n\tranges = ranges.sort((a,b) => a.min - b.min);\n\n\t// Combine all ranges\n\tlet out_ranges : LineSegment[] = [];\n\tlet cur_r : LineSegment | null = null;\n\tfor(let new_r of ranges){\n\t\tif(cur_r == null){\n\t\t\tcur_r = new_r;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(new_r.min > cur_r.max+1){\n\t\t\t// then no overlap\n\t\t\tout_ranges.push(cur_r);\n\t\t\tcur_r = new_r;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// expand the current cur_r to end at the end of the new one\n\t\tif(new_r.max > cur_r.max){ cur_r.max = new_r.max };\n\t}\n\n\tif(cur_r){ out_ranges.push(cur_r); }\n\n\t// Convert vidx pairs back into BibleRefs\n\treturn out_ranges.map(x => _fromLineSegment(this, x));\n}\n\n/**\n * Opaque type containing data for use by `getIntersection` or `intersects`\n */\nexport type IntersectionSet = { segments: LineSegment[] };\n\n/**\n * Precomputes data regarding BibleRef list as used by `getIntersection` and `intersects`\n *\n * This is more performant if you call either of these functions multiple times where one of the two\n * inputs remains constant\n */\nexport function createIntersectionSet(this: BibleRefLibData, x: BibleRef | BibleRef[]) : IntersectionSet {\n\treturn { segments: _toLineSegments(this, x) };\n}\n\n/**\n * Creates a new array of [[BibleRef]]s which represents the intersection between two other sets\n *\n * @param this - Any object with a `versification` field\n * @param x    - First set of [[BibleRef]] instances\n * @param y    - Second set of [[BibleRef]] instances\n *\n * @return Simplified and sorted list of [[BibleRef]]s which appear in both input sets. Will\n * return empty array if there are no verses in common between the inputs\n */\nexport function getIntersection(this: BibleRefLibData, x: BibleRef | BibleRef[] | IntersectionSet, y: BibleRef | BibleRef[] | IntersectionSet) : BibleRef[]  {\n\tlet a = _toLineSegments(this, x);\n\tlet b = _toLineSegments(this, y);\n\n\tlet ai = 0; let bi = 0;\n\tlet out : BibleRef[] = [];\n\twhile(ai < a.length && bi < b.length){\n\t\t// Find intersections between current list heads\n\t\tlet intersection = _intersectLineSegment(a[ai], b[bi]);\n\n\t\tif(intersection === null){\n\t\t\t// If no intersection between current heads, skip past the one which ends soonest\n\t\t\tif(a[ai].max < b[bi].max){\n\t\t\t\t++ai;\n\t\t\t} else {\n\t\t\t\t++bi;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If intersection found, add to result set\n\t\tout.push(_fromLineSegment(this, intersection));\n\n\t\t// Alter the ranges to exclude that which we've just found\n\t\ta[ai].min = intersection.max+1;\n\t\tb[bi].min = intersection.max+1;\n\n\t\t// Skip past list heads if they now have length 0\n\t\tif(a[ai].min >= a[ai].max){ ++ai; }\n\t\tif(b[bi].min >= b[bi].max){ ++bi; }\n\t}\n\n\treturn out;\n}\n\n/**\n * Determines whether two sets of [[BibleRef]]s have any verses in common\n *\n * This is much faster on large data sets than `getIntersection` when just a boolean result is\n * required\n */\nexport function intersects(this: BibleRefLibData, x: BibleRef | BibleRef[] | IntersectionSet, y: BibleRef | BibleRef[] | IntersectionSet) : boolean {\n\tlet a = _toLineSegments(this, x);\n\tlet b = _toLineSegments(this, y);\n\n\t// apply the O(log(n)) search to the larger haystack and the O(n) search to the smaller needles\n\tlet [ needles, haystack ] =  a.length > b.length ? [ b, a ] : [ a, b ];\n\n\tfor(let needle of needles) {\n\t\t// haystack is sorted by min, so find the first possible item that could possibly intersect\n\t\t// using a binary search (IE: O(log(n)) rather than O(n) performance)\n\t\tlet minLo = 0;\n\t\tlet minHi = haystack.length-1;\n\t\twhile(minLo < minHi-1) {\n\t\t\tlet center = minLo + Math.ceil((minHi - minLo)/2);\n\t\t\twhile(minLo < minHi-1 && haystack[center].min < needle.min) {\n\t\t\t\tminLo  = center;\n\t\t\t\tcenter = minLo + Math.ceil((minHi - minLo)/2);\n\t\t\t}\n\t\t\tminHi = center;\n\t\t}\n\n\t\t// now do a linear search from minLow to end of haystack\n\t\t// in reality, we can bail out much sooner\n\t\t// (as soon as the haystack's min is greater than needle's max)\n\t\tfor(let i = minLo; i < haystack.length; ++i) {\n\t\t\tif(needle.max < haystack[i].min) { break; }\n\t\t\tif(_intersectLineSegment(needle, haystack[i])){ return true; }\n\t\t}\n\n\t}\n\n\t// if still going, we obviously don't have an intersection\n\treturn false;\n}\n\n/**\n * Determines whether `outer` fully contains all verses present within `inner`\n */\nexport function contains(this: BibleRefLibData, outer: BibleRef | BibleRef[], inner: BibleRef | BibleRef[]) : boolean {\n\tlet a = _toLineSegments(this, outer);\n\tlet b = _toLineSegments(this, inner);\n\n\tlet ai = 0, bi = 0;\n\twhile(bi < b.length){\n\t\t// Consume head of a while segment is before start of head of b\n\t\twhile(a[ai].max < b[bi].min){\n\t\t\t++ai;\n\t\t\tif(ai >= a.length){ return false; }\n\t\t}\n\n\t\t// Check that b falls within the head of a\n\t\twhile(bi < b.length && b[bi].min <= a[ai].max){\n\t\t\tif(a[ai].min > b[bi].min || b[bi].max > a[ai].max){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t++bi;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Returns the union of two sets of [[BibleRef]]s, IE: the combined and simpified set of verses\n * which are in one or the other or both input sets\n */\nexport function getUnion(this: BibleRefLibData, a: BibleRef | BibleRef[], b: BibleRef | BibleRef[]) : BibleRef[] {\n\tlet x = 'length' in a ? a : [a];\n\tlet y = 'length' in b ? b : [b];\n\treturn combineRanges.bind(this)([...x, ...y]);\n}\n\n/**\n * Computes the subtraction of two sets of [[BibleRef]]s, returing a new list of [[BibleRef]]\n * instances containing all verses in set `x` but not in set `y`\n *\n * @param x - The left hand set\n * @param y - The right hand set\n * @return Set operation `x \\ y` -> IE: all verses in `x` but not in `y`\n */\nexport function getDifference(this: BibleRefLibData, x: BibleRef | BibleRef[], y: BibleRef | BibleRef[]): BibleRef[] {\n\tlet a = _toLineSegments(this, x);\n\tlet b = _toLineSegments(this, y);\n\n\tlet result : BibleRef[] = [];\n\tlet ai = 0, bi = 0\n\twhile(ai < a.length && bi < b.length){\n\t\tlet inter = _intersectLineSegment(a[ai], b[bi]);\n\t\tif(inter){\n\t\t\tif(a[ai].min < inter.min){\n\t\t\t\tresult.push(_fromLineSegment(this, { min: a[ai].min, max: inter.min-1 }));\n\t\t\t}\n\t\t\ta[ai].min = inter.max+1;\n\t\t\tb[bi].min = inter.max+1;\n\t\t\tif(a[ai].min > a[ai].max){ ++ai; }\n\t\t\tif(b[bi].min > b[bi].max){ ++bi; }\n\t\t} else {\n\t\t\tif(a[ai].min < b[bi].min){\n\t\t\t\tresult.push(_fromLineSegment(this, a[ai]));\n\t\t\t\t++ai;\n\t\t\t} else {\n\t\t\t\t++bi;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Consume any remaining elements of a now that b has been exhausted\n\twhile(ai < a.length){\n\t\tresult.push(_fromLineSegment(this, a[ai]));\n\t\t++ai;\n\t}\n\n\treturn result;\n}\n\n/**\n * Given a (potentially non-continous) set of [[BibleRef]]'s, computes the index of some\n * [[BibleVerse]] within the set.\n *\n * For example, given the input set \"Revelation 1:1; Exodus 1:2-4; Genesis 10:5\" the following\n * verses appear at each index:\n * - 0: Revelation 1:1\n * - 1: Exodus 1:2\n * - 2: Exodus 1:3\n * - 3: Exodus 1:4\n * - 4: Genesis 10:5\n *\n * @param array - The array of input verses you wish to search (aka, the haystack)\n * @param verse - The verse whose index you wish to determnine (aka, the needle)\n * @return The zero based index at which `verse` can be found, or -1 if the `verse` does not appear\n * within the input `array`\n *\n * @note If the same verse appears at multiple positions within the input array then only the\n * first index is returned\n *\n * @note The inverse of this function is [[verseAtIndex]]\n */\nexport function indexOf(this: BibleRefLibData, array: BibleRef | BibleRef[], verse: BibleVerse): number {\n\tlet blocks = _toLineSegmentsUnsorted(this, array);\n\tlet idx    = Vidx.toVidx(this.versification, verse);\n\n\tlet offset = 0;\n\tfor(let b of blocks){\n\t\tif(idx >= b.min && idx <= b.max){\n\t\t\t// then target verse falls within this\n\t\t\treturn offset + (idx - b.min);\n\t\t} else {\n\t\t\toffset += (b.max - b.min) + 1;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n * Given a (potentially non-continous) set of [[BibleRef]]'s, finds the [[BibleVerse]] at the\n * specified index. This is the inverse of [[indexOf]]\n *\n * @param array - The set of [[BibleRef]] instances (or singular instance) to extract a verse from\n * @param index - The zero based index of the verse you wish to extract from the input set\n *\n * @return BibleVerse instance, or undefined if `index` is out of bounds\n *\n * @note Semantically, the call `AwokenRef.verseAtIndex(array, n)` is equivalent to\n * `AwokenRef.splitByVerse(array)[n]`, however this version is more efficent for a single call,\n * since it does not have build the full temporary array, but intead internally operates by\n * blocks of verses represented by the [[BibleRef]] instances in the input `array`\n */\nexport function verseAtIndex(this: BibleRefLibData, array: BibleRef | BibleRef[], index: number): BibleVerse | undefined {\n\tlet blocks = _toLineSegmentsUnsorted(this, array);\n\n\tlet offset = 0;\n\tfor(let b of blocks){\n\t\tlet max_offset = offset + (b.max - b.min);\n\t\tif(index >= offset && index <= max_offset){\n\t\t\treturn Vidx.fromVidx(this.versification, b.min + index - offset);\n\t\t} else {\n\t\t\toffset = max_offset + 1;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n//\n// Private implementation methods below\n//\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Converts a set of [[BibleRef]]'s into a set of [[LineSegment]] instances. Returns set will not\n * be sorted/combined\n *\n * @private\n */\nfunction _toLineSegmentsUnsorted(lib: BibleRefLibData, input: BibleRef | BibleRef[]): LineSegment[] {\n\tlet in_arr : BibleRef[] = 'length' in input ? input : [input];\n\treturn in_arr.map((x : BibleRef) => {\n\t\tif(x.is_range){\n\t\t\treturn { min: Vidx.toVidx(lib.versification, x.start), max: Vidx.toVidx(lib.versification, x.end) };\n\t\t} else {\n\t\t\tlet val = Vidx.toVidx(lib.versification, x);\n\t\t\treturn { min: val, max: val };\n\t\t}\n\t});\n}\n\n/**\n * Converts a set of [[BibleRef]]'s into a set of [[LineSegment]] instances\n *\n * First calls combineRanges to ensure returned set is ordered and consists of the minimal number\n * of segments\n *\n * @private\n */\nfunction _toLineSegments(lib: BibleRefLibData, input: BibleRef | BibleRef[] | IntersectionSet): LineSegment[] {\n\tif('segments' in input) { return input.segments; }\n\tlet in_arr : BibleRef[] = 'length' in input ? input : [input];\n\treturn _toLineSegmentsUnsorted(lib, combineRanges.bind(lib)(in_arr));\n}\n\n/**\n * Convertse a [[LineSegment]] instance back into a [[BibleRef]]\n *\n * @private\n */\nfunction _fromLineSegment(lib: BibleRefLibData, line: LineSegment): BibleRef{\n\tif(line.min === line.max){\n\t\treturn Vidx.fromVidx(lib.versification, line.min);\n\t} else {\n\t\treturn { is_range : true,\n\t\t\t\t\t\t start    : Vidx.fromVidx(lib.versification, line.min),\n\t\t\t\t\t\t end      : Vidx.fromVidx(lib.versification, line.max)\n\t\t\t\t\t };\n\t}\n}\n\n/**\n * Finds the intersection between two 1d [[LineSegment]] instances, or returns null if there is no\n * intersection\n *\n * @private\n */\nfunction _intersectLineSegment(a: LineSegment, b: LineSegment) : LineSegment | null {\n\tlet min = Math.max(a.min, b.min);\n\tlet max = Math.min(b.max, a.max);\n\n\tif(min <= max){\n\t\treturn { min, max };\n\t} else {\n\t\treturn null;\n\t}\n}\n", "/**\n * Various utility functions for manipulating (sets of) ranges\n */\n\nimport { BibleRef, BibleVerse, BibleRange, BibleRefLibData } from './BibleRef';\nimport { Versification, BookMeta } from './Versification'\nimport * as Vidx from './vidx';\nimport { combineRanges } from './geometry';\n\nexport interface RangeManipFunctions {\n\tsplitByBook(refs: BibleRef | BibleRef[], expand_verses?: boolean) : BibleRef[];\n\tsplitByChapter(refs: BibleRef | BibleRef[], expand_verses?: boolean) : BibleRef[];\n\tsplitByVerse(refs: BibleRef | BibleRef[]) : BibleVerse[];\n\titerateByBook   (refs: BibleRef | BibleRef[], expand_verses?: boolean): Iterable<BibleRef>;\n\titerateByChapter(refs: BibleRef | BibleRef[], expand_verses?: boolean): Iterable<BibleRef>;\n\titerateByVerse  (refs: BibleRef | BibleRef[]): Iterable<BibleVerse>;\n\tgroupByBook(refs: BibleRef | BibleRef[]) : RefsByBook[];\n\tgroupByChapter(refs: BibleRef | BibleRef[]) : RefsByChapter[];\n\tgroupByLevel(refs: BibleRef | BibleRef[], options?: RefsByLevelOptions) : RefsByLevel;\n\tmakeRange(book : string, chapter?: number) : BibleRange;\n\tmakeBookRange(book_start: string, book_end: string): BibleRange;\n\tnextChapter(ref: BibleRef, constrain_book?: boolean) : BibleRange | null;\n\tpreviousChapter(ref: BibleRef, constrain_book?: boolean) : BibleRange | null;\n\tnextBook(ref: BibleRef) : BibleRange | null;\n\tpreviousBook(ref: BibleRef) : BibleRange | null;\n\tnextVerse(ref: BibleRef, opts?: { constrain_book?: boolean, constrain_chapter?: boolean }): BibleVerse | null;\n\tpreviousVerse(ref: BibleRef, opts?: { constrain_book?: boolean, constrain_chapter?: boolean }): BibleVerse | null;\n\tisFullBook(ref: BibleRef) : boolean;\n\tisFullChapter(ref: BibleRef) : boolean;\n};\n\n/**\n * Creates a [[BibleRange]] representing either an entire book, or\n * an entire chapter\n * @note This function will throw if the specified book is not a\n * valid book ID, or if the specified chapter is too high\n *\n * @param this - Any object with a `versification` field\n */\nexport function makeRange(this: BibleRefLibData, book : string, chapter? : number) : BibleRange {\n\treturn _makeRange(this.versification, book, chapter);\n}\n\n/**\n * Creates a [[BibleRange]] representing a number of complete books, starting\n * at chapter 1 verse 1 of `book_start`, and ending at the final chapter/verse\n * of book_end\n *\n * @note book_end can be left undefined in which case it will be assumed to be\n * equal to book_start. Useful for code where book_end is a variable since\n * caller doesn't know if book_end will be defined\n */\nexport function makeBookRange(this: BibleRefLibData, book_start: string, book_end?: string): BibleRange {\n\treturn _makeBookRange(this.versification, book_start, book_end);\n}\n\n/**\n * Splits an array of ranges such that any input range spanning multiple\n * books is subdivided into multiple smaller ranges, one for each book\n * @param refs - The list of refs to be split\n * @param expand_verses - If set then even single verses will be represented\n * as ranges of length 1, ensuring all returned objects have the same schema\n */\nexport function splitByBook(this: BibleRefLibData,\n\t\t\t\t\t\t\t\t\t\t refs: BibleRef | BibleRef[],\n\t\t\t\t\t\t\t\t\t\t expand_verses?: boolean\n\t\t\t\t\t\t\t\t\t\t) : BibleRef[] {\n\treturn Array.from(iterateByBook.bind(this)(refs, expand_verses));\n}\n\n/**\n * Splits an array of ranges such that any input range spanning multiple\n * chapters is subdivided into multiple smaller ranges, one for each chapter\n * @param refs - The list of refs to be split\n * @param expand_verses - If set then even single verses will be represented\n * as ranges of length 1, ensuring all returned objects have the same schema.\n */\nexport function splitByChapter(this: BibleRefLibData,\n\t\t\t\t\t\t\t\t\t\t\t\trefs: BibleRef | BibleRef[],\n\t\t\t\t\t\t\t\t\t\t\t\texpand_verses?: boolean) : BibleRef[]{\n\treturn Array.from(iterateByChapter.bind(this)(refs, expand_verses));\n}\n\n/**\n * Splits an array of ranges to form an array of individual verses\n * @param refs - The list of refs to be split\n */\nexport function splitByVerse(this: BibleRefLibData, refs: BibleRef | BibleRef[]) : BibleVerse[]{\n\treturn Array.from(iterateByVerse.bind(this)(refs));\n}\n\n/**\n * Returns an iterator that traverses over the objects that would have been\n * returned by `splitByBook`\n */\nexport function iterateByBook(this: BibleRefLibData, refs: BibleRef | BibleRef[], expand_verses?: boolean): Iterable<BibleRef> {\n\tif(expand_verses === undefined){ expand_verses = false; }\n\tif(!('length' in refs)){ refs = [refs]; }\n\treturn _iterateBookRanges(this.versification, refs, expand_verses)\n}\n\n\n/**\n * Returns an iterator that traverses over the objects that would have been\n * returned by `splitByChapter`\n */\nexport function iterateByChapter(this: BibleRefLibData, refs: BibleRef | BibleRef[], expand_verses?: boolean): Iterable<BibleRef> {\n\tif(expand_verses === undefined){ expand_verses = false; }\n\tif(!('length' in refs)){ refs = [refs]; }\n\treturn _iterateChapterRanges(this.versification, refs, expand_verses);\n}\n\n/**\n * Returns an iterator that traverses over the objects that would have been\n * returned by `splitByVerse`\n */\nexport function iterateByVerse(this: BibleRefLibData, refs: BibleRef | BibleRef[]): Iterable<BibleVerse> {\n\tif(!('length' in refs)){ refs = [refs]; }\n\treturn _iterateVerses(this.versification, refs);\n}\n\n/**\n * Given a BibleRef, returns a new BibleVerse which represents the next verse after\n * the last verse in the input ref\n * @param opts.constrain_book - If set, will not cross book boundaries to find another verse\n * @param opts.constrain_chapter - If set, will not cross chapter boundaries to find another verse\n */\nexport function nextVerse(\n\tthis: BibleRefLibData,\n\tref: BibleRef,\n\topts: { constrain_book?: boolean, constrain_chapter?: boolean } = {}\n) : BibleVerse | null {\n\tlet v : BibleVerse = ref.is_range ? ref.end : ref;\n\n\tlet cur_book = this.versification.book[v.book];\n\tlet cur_chpt = cur_book?.chapters[v.chapter-1];\n\tif(!cur_book || !cur_chpt){\n\t\tthrow new Error(\"Invalid input reference to nextVerse!\");\n\t}\n\n\tif(v.verse+1 < cur_chpt.verse_count) {\n\t\treturn { book: v.book, chapter: v.chapter, verse: v.verse + 1 };\n\t}\n\tif(opts.constrain_chapter) { return null; }\n\n\tlet next = nextChapter.bind(this)(ref, opts.constrain_book);\n\tif(next) {\n\t\treturn next.start;\n\t}\n\treturn null;\n}\n\n/**\n * Given a BibleRef, returns a new BibleVerse which represents the verse preceeding\n * the first verse in the input ref\n * @param opts.constrain_book - If set, will not cross book boundaries to find another verse\n * @param opts.constrain_chapter - If set, will not cross chapter boundaries to find another verse\n */\nexport function previousVerse(\n\tthis: BibleRefLibData,\n\tref: BibleRef,\n\topts: { constrain_book?: boolean, constrain_chapter?: boolean } = {}\n) : BibleVerse | null {\n\tlet v : BibleVerse = ref.is_range ? ref.end : ref;\n\n\tif(v.verse > 1) {\n\t\treturn { book: v.book, chapter: v.chapter, verse: v.verse -1 };\n\t}\n\tif(opts.constrain_chapter) { return null; }\n\tlet prev = previousChapter.bind(this)(ref, opts.constrain_book);\n\tif(prev) {\n\t\treturn prev.end;\n\t}\n\treturn null;\n}\n\n\n/**\n * Given a BibleRef, returns a new BibleRef which represents the next chapter\n * after the last verse in the input ref.\n * @param constrain_book - If true, will not cross book boundaries to find another chapter\n * @return BibleRef or null if there is no next chapter\n */\nexport function nextChapter(this: BibleRefLibData, ref: BibleRef, constrain_book?: boolean) : BibleRange | null {\n\tlet r : BibleVerse = ref.is_range ? ref.end : ref;\n\n\tlet cur_book = this.versification.book[r.book];\n\tif(cur_book === undefined){\n\t\tthrow new Error(\"Invalid input reference to nextChapter!\");\n\t}\n\n\tif(r.chapter < cur_book.chapters.length){\n\t\treturn _makeRange(this.versification, r.book, r.chapter + 1);\n\t} else {\n\t\tif(constrain_book){ return null; }\n\t\tif(cur_book.index+1 < this.versification.order.length){\n\t\t\treturn _makeRange(this.versification, this.versification.order[cur_book.index+1].id, 1);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n/**\n * Returns BibleRef representing the range of verses making up the chapter\n * BEFORE the first verse of the input ref\n * @param constrain_book - If true, will not cross book boundaries to find another chapter\n * @return BibleRef or null if there is no previous chapter\n */\nexport function previousChapter(this: BibleRefLibData, ref: BibleRef, constrain_book?: boolean) : BibleRange | null{\n\tlet r : BibleVerse = ref.is_range ? ref.start : ref;\n\n\tlet new_book_id = r.book;\n\tlet new_chapter = 0;\n\n\tif(r.chapter <= 1){\n\t\tif(constrain_book){ return null; }\n\t\tlet old_book = this.versification.book[r.book];\n\t\tif(old_book === undefined){ throw new Error(\"Invalid input reference to previousChapter\"); }\n\t\tif(old_book.index === 0){ return null; }\n\t\tlet new_book = this.versification.order[old_book.index-1];\n\t\tnew_book_id = new_book.id;\n\t\tnew_chapter = new_book.chapters.length;\n\t} else {\n\t\tnew_chapter = r.chapter - 1;\n\t}\n\n\treturn _makeRange(this.versification, new_book_id, new_chapter);\n}\n\n/**\n * Given a BibleRef, returns a new BibleRef which represents the range of verses making up\n * the next book after the book containing the last verse in the input range\n * @return BibleRef or null if there is no next book (IE: input is revelation)\n */\nexport function nextBook(this: BibleRefLibData, ref: BibleRef) : BibleRange | null {\n\tlet r : BibleVerse = ref.is_range ? ref.end : ref;\n\n\tlet cur_book = this.versification.book[r.book];\n\tif(cur_book.index+1 < this.versification.order.length){\n\t\treturn _makeRange(this.versification, this.versification.order[cur_book.index+1].id);\n\t} else {\n\t\treturn null;\n\t}\n}\n\n/**\n * Given a BibleRef, returns a new BibleRef which represents the range of verses making up\n * the book before the book containing the first verse in the input range\n * @return BibleRef or null if there is no previous book (IE: input is genesis)\n */\nexport function previousBook(this: BibleRefLibData, ref: BibleRef) : BibleRange | null {\n\tlet r : BibleVerse = ref.is_range ? ref.start : ref;\n\n\tlet cur_book = this.versification.book[r.book];\n\tif(cur_book.index > 0){\n\t\treturn _makeRange(this.versification, this.versification.order[cur_book.index-1].id);\n\t} else {\n\t\treturn null;\n\t}\n}\n\n/**\n * Determines if a [[BibleRef]] is in fact just a single [[BibleRange]] which represents **exactly**\n * the entirety of a single book - no more, no less\n * @return Boolean representing decision\n */\nexport function isFullBook(this: BibleRefLibData, ref: BibleRef) : boolean {\n\tif(!ref.is_range){ return false; }\n\n\tlet book_id = ref.start.book;\n\tif(ref.end.book != book_id){ return false; }\n\n\treturn (\n\t\tref.start.chapter === 1 &&\n\t\t\tref.start.verse   === 1 &&\n\t\t\tref.end.chapter   === this.versification.book[book_id].chapters.length &&\n\t\t\tref.end.verse     === this.versification.book[book_id][ref.end.chapter].verse_count\n\t);\n}\n\n/**\n * Determines if a [[BibleRef]] is in fact just a single [[BibleRange]] which represents **exactly**\n * the entirety of a single chapter - no more, no less\n * @return Boolean representing decision\n */\nexport function isFullChapter(this: BibleRefLibData, ref: BibleRef) : boolean {\n\tif(!ref.is_range){ return false; }\n\n\tlet book_id = ref.start.book;\n\tif(ref.end.book != book_id){ return false; }\n\n\treturn (\n\t\tref.start.chapter === ref.end.chapter &&\n\t  ref.start.verse   === 1 &&\n\t\tref.end.verse     === this.versification.book[book_id][ref.start.chapter].verse_count\n\t);\n}\n\n/**\n * Bucket of BibleRefs with a common Book\n * @see [[groupByBook]]\n */\nexport interface RefsByBook {\n\t/** The book common to all references in this bucket */\n\tbook       : string;\n\n\t/** The set of [[BibleRef]]s in this bucket */\n\treferences : BibleRef[];\n};\n\n/**\n * Groups a list of references into buckets split by book\n *\n * Returns list of [[RefsByBook]] representing the buckets that the input references have been\n * sorted into. Returns list will be in order from the bucket for the first book to the last book,\n * however the individual references within each bucket will maintain their order relative to\n * the input array - hence input order matters. Pre-sort if desired.\n */\nexport function groupByBook(this: BibleRefLibData, refs: BibleRef[] | BibleRef) : RefsByBook[] {\n\tlet buckets : { [index:string]: RefsByBook } = {};\n\n\tfor (let r of iterateByBook.bind(this)(refs)) {\n\t\tlet bk = r.is_range ? r.start.book : r.book;\n\t\tif(!buckets[bk]){\n\t\t\tbuckets[bk] = {\n\t\t\t\tbook: bk,\n\t\t\t\treferences: [ r ]\n\t\t\t};\n\t\t} else {\n\t\t\tbuckets[bk].references.push(r);\n\t\t}\n\t}\n\n\treturn Object.values(buckets).sort((a,b) => {\n\t\treturn this.versification.book[a.book].index - this.versification.book[b.book].index;\n\t});\n}\n\n/**\n * Bucket of BibleRefs with a common Book and chapter\n * @see [[groupByChapter]]\n */\nexport interface RefsByChapter {\n\t/** The book common to all references in this bucket */\n\tbook       : string;\n\n\t/** The chapter common to all references in this bucket */\n\tchapter    : number;\n\n\t/** The set of [[BibleRef]]s in this bucket */\n\treferences : BibleRef[];\n};\n\n/**\n * Groups a list of references into buckets split by book, chapter\n *\n * Returns list of [[RefsByChapter]] representing the buckets that the input references have been\n * sorted into. Returns list will be in order from the bucket for the first book to the last book,\n * however the individual references within each bucket will maintain their order relative to\n * the input array - hence input order matters. Pre-sort if desired.\n */\nexport function groupByChapter(this: BibleRefLibData, refs: BibleRef[] | BibleRef) : RefsByChapter[] {\n\tlet buckets : { [index:string]: RefsByChapter } = {};\n\n\tfor (let r of iterateByChapter.bind(this)(refs)) {\n\t\tlet bk, ch;\n\t\tif(r.is_range){\n\t\t\tbk = r.start.book;\n\t\t\tch = r.start.chapter;\n\t\t} else {\n\t\t\tbk = r.book;\n\t\t\tch = r.chapter;\n\t\t}\n\t\tlet key = `${bk}_${ch}`;\n\n\t\tif(!buckets[key]){\n\t\t\tbuckets[key] = {\n\t\t\t\tbook: bk, chapter: ch,\n\t\t\t\treferences: [ r ]\n\t\t\t};\n\t\t} else {\n\t\t\tbuckets[key].references.push(r);\n\t\t}\n\t}\n\n\treturn Object.values(buckets).sort((a,b) => {\n\t\tlet bkDelta = this.versification.book[a.book].index - this.versification.book[b.book].index;\n\t\tif(bkDelta === 0){\n\t\t\treturn a.chapter - b.chapter;\n\t\t} else {\n\t\t\treturn bkDelta;\n\t\t}\n\t});\n}\n\nexport interface RefsByLevel {\n\tbooks      : BibleRange[];\n\tchapters   : BibleRange[];\n\tverses     : BibleVerse[];\n};\n\nexport interface RefsByLevelOptions {\n\t/**\n\t * If true, then smaller levels will create entries in larger levels\n\t *\n\t * For example:\n\t * - Gen.1.1 -> { books: [ Gen ], chapters: [ Gen.1 ], verses: [ Gen.1.1 ] }\n\t * - Gen.1   -> { books: [ Gen ], chapters: [ Gen.1 ], verses: [] }\n\t * - Gen     -> { books: [ Gen ], chapters: [],        verses: [] }\n\t *\n\t * Multiple verses will be combined into a single chapter entry, and multiple\n\t * chapters will be combined into a single book entry\n\t *\n\t * If set then the following will hold: ---subset of---> chapters ---subset of---> books\n\t *\n\t * If `disperse` is also set, then all arrays will represent the same set of Bible references,\n\t * but with different organizations of data structures\n\t */\n\tconsolidate?: boolean,\n\n\t/**\n\t * If true, then larger levels will create entries in smaller levels\n\t *\n\t * For example:\n\t * - Gen.1.1 -> { books: [],      chapters: [],                           verses: [ Gen.1.1 ] },\n\t * - Gen.1   -> { books: [],      chapters: [ Gen.1 ],                    verses: [ Gen.1.1, Gen.1.2, Gen.1.3, ... ] }\n\t * - Gen     -> { books: [ Gen ], chapters: [ Gen.1, Gen.2, Gen.3, ... ], verses: [ Gen.1.1, Gen.1.2, Gen.1.3, ... ] }\n\t *\n\t * A chapter/verse contained by multiple higher level ranges will only be added once\n\t *\n\t * If set then the following will hold: ---subset of--> chapters ---subset of---> verses\n\t *\n\t * If `consolidate` is also set, then all arrays will represent the same set of Bible references,\n\t * but with different organizations of data structures\n\t */\n\tdisperse?: boolean,\n}\n\n/**\n * Sorts a list of references into seperate lists for full books, full chapters,\n * and individual verses\n *\n * For example, Gen, Exo.1, Lev.1.1 would be grouped into the object:\n * {\n *   books    : [ Gen ],\n *   chapters : [ Exo.1 ],\n *   verses   : [ Lev.1.1 ],\n * }\n *\n * The `books` and `chapters` array will contain only [[BibleRange]]s, where as `verses` will\n * contain only [[BibleVerse]]s\n *\n * The output arrays will be de-deuplicated when multiple inputs would create the same output,\n * and arrays will be sorted into verse order - hence input order is not important\n */\nexport function groupByLevel(this: BibleRefLibData, refs: BibleRef[] | BibleRef, options?: RefsByLevelOptions) : RefsByLevel {\n\tif(!options){ options = {}; }\n\tif(!('length' in refs)){ refs = [refs]; }\n\n\tlet result : RefsByLevel = { books: [], chapters: [], verses: [] };\n\n\tfor(let r of _iterateBookRanges(this.versification, refs, true) as BibleRange[]) {\n\n\t\tlet fullBook = isFullBook.bind(this)(r);\n\t\tif(fullBook || options.consolidate) {\n\t\t\tresult.books.push(_makeRange(this.versification, r.start.book));\n\t\t}\n\n\t\tif(fullBook && !options.disperse) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor(let c of _iterateChapterRanges(this.versification, [r], true) as BibleRange[]) {\n\n\t\t\tlet fullChapter = isFullChapter.bind(this)(c);\n\n\t\t\tif(fullChapter || options.consolidate) {\n\t\t\t\tresult.chapters.push(_makeRange(this.versification, c.start.book, c.start.chapter));\n\t\t\t}\n\n\t\t\tif(fullChapter && !options.disperse) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tresult.verses = result.verses.concat(splitByVerse.bind(this)(c));\n\t\t}\n\t}\n\n\t// de-deduplicate entries\n\tresult.books    = splitByBook.bind(this)(combineRanges.bind(this)(result.books)) as BibleRange[];\n\tresult.chapters = splitByChapter.bind(this)(combineRanges.bind(this)(result.chapters)) as BibleRange[];\n\tresult.verses   = splitByVerse.bind(this)(combineRanges.bind(this)(result.verses)) as BibleVerse[];\n\n\treturn result;\n}\n\n////////////////////////////////////////////////////////////////////\n//\n// Private Implementation Functions\n//\n////////////////////////////////////////////////////////////////////\n\nfunction _makeRange(v: Versification, book : string, chapter? : number) : BibleRange {\n\tlet b_meta = v.book[book];\n\tif(b_meta == null){ throw new Error(\"Specified book id does not exist\"); }\n\tif(chapter){\n\t\tif(chapter > b_meta.chapters.length){\n\t\t\tthrow new Error(\"Specified chapter index is too high\");\n\t\t}\n\t\treturn {\n\t\t\tis_range: true,\n\t\t\tstart   : { book, chapter, verse: 1 },\n\t\t\tend     : { book, chapter, verse: b_meta.chapters[chapter-1].verse_count }\n\t\t};\n\t} else {\n\t\treturn {\n\t\t\tis_range: true,\n\t\t\tstart   : { book, chapter: 1, verse: 1 },\n\t\t\tend     : { book,\n\t\t\t\t\t\t\t\t\tchapter: b_meta.chapters.length,\n\t\t\t\t\t\t\t\t\tverse: b_meta.chapters[b_meta.chapters.length-1].verse_count\n\t\t\t\t\t\t\t\t}\n\t\t};\n\t}\n}\n\nexport function _makeBookRange(v: Versification, book_start: string, book_end: string = book_start): BibleRange {\n\tlet end_b = v.book[book_end];\n\tlet end_c = end_b.chapters[end_b.chapters.length-1];\n\treturn {\n\t\tis_range: true,\n\t\tstart: { book: book_start, chapter: 1, verse: 1 },\n\t\tend: { book: book_end, chapter: end_b.chapters.length, verse: end_c.verse_count },\n\t}\n\n}\n\nfunction* _iterateBookRanges(v: Versification, refs: BibleRef[], verse_as_range: boolean) : Iterable<BibleRef> {\n\tfor(let cur of refs){\n\t\tif(!cur.is_range){\n\t\t\t// single verse\n\t\t\tif(verse_as_range){\n\t\t\t\tyield { is_range: true, start: cur, end: cur };\n\t\t\t} else {\n\t\t\t\tyield cur;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(cur.start.book == cur.end.book){\n\t\t\t// then the range contains only a single book already, return it\n\t\t\tyield cur;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// if still going we have a cross book range, split at boundries\n\n\t\t// Yeild the first book from the defined start point, to the end of the book\n\t\tlet last_c = v.book[cur.start.book].chapters.length;\n\t\tlet last_v = v.book[cur.start.book].chapters[last_c-1].verse_count;\n\t\tyield { is_range: true,\n\t\t\t\t\t\tstart : cur.start,\n\t\t\t\t\t\tend   : { book: cur.start.book, chapter: last_c, verse: last_v },\n\t\t\t\t\t};\n\n\t\t// yield all complete books\n\t\tfor(let bi = v.book[cur.start.book].index+1; bi < v.book[cur.end.book].index; ++bi){\n\t\t\tyield _makeRange(v, v.order[bi].id);\n\t\t}\n\n\t\t// yield the final book, from chapter 1 verse 1, to the defined end point\n\t\tyield { is_range: true,\n\t\t\t\t\t\tstart: { book: cur.end.book, chapter: 1, verse: 1 },\n\t\t\t\t\t\tend  : cur.end\n\t\t\t\t\t};\n\t}\n}\n\n\nfunction* _iterateChapterRanges(v: Versification, refs: BibleRef[], verse_as_range: boolean) : Iterable<BibleRef> {\n\tfor(let cur of _iterateBookRanges(v, refs, verse_as_range)){\n\t\tif(!cur.is_range){\n\t\t\tyield cur;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif(cur.start.chapter == cur.end.chapter){\n\t\t\t// then we have only a single chapter anyway\n\t\t\tyield cur;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// then we have a cross chapter range, emit each individually\n\t\tlet book    = cur.start.book;\n\t\tlet b_meta = v.book[book];\n\n\t\t// Yeild the first chapter from the defined start point, to the end of the chapter\n\t\tlet last_v = b_meta.chapters[cur.start.chapter-1].verse_count;\n\t\tyield { is_range: true,\n\t\t\t\t\t\tstart : cur.start,\n\t\t\t\t\t\tend   : { book, chapter: cur.start.chapter, verse: last_v },\n\t\t\t\t\t};\n\n\t\t// Yield all complete chapters\n\t\tfor(let ci = cur.start.chapter+1; ci < cur.end.chapter; ++ci){\n\t\t\tyield _makeRange(v, b_meta.id, ci);\n\t\t}\n\n\t\t// yield the final chapter from verse 1, to the defined end point\n\t\tyield { is_range: true,\n\t\t\t\t\t\tstart: { book, chapter: cur.end.chapter, verse: 1 },\n\t\t\t\t\t\tend  : cur.end\n\t\t\t\t\t};\n\t}\n}\n\nfunction* _iterateVerses(v: Versification, refs: BibleRef[]) : Iterable<BibleVerse> {\n\tfor(let cur of _iterateChapterRanges(v, refs, false)){\n\t\tif(cur.is_range){\n\t\t\tfor(let v = cur.start.verse; v <= cur.end.verse; ++v){\n\t\t\t\tyield { book: cur.start.book, chapter: cur.start.chapter, verse: v };\n\t\t\t}\n\t\t} else {\n\t\t\tyield cur;\n\t\t}\n\t}\n}\n", "/**\n * A Versification represents the way in which the bible text is split into\n * books, chapters and verses\n *\n * This module exports both a type decleration, and the default data set\n */\nimport BibleRef from './BibleRef';\nimport { _makeBookRange } from './range-manip';\n\n/**\n * Minimal data set used to create full BookMeta\n * @private\n */\nexport interface BookMetaRaw {\n\t/**\n\t * 4 character USFM identifier, in upper case\n\t */\n\tid : string,\n\n\t/**\n\t * Shortened book name used in osis references\n\t */\n\tosisId: string,\n\n\t/**\n\t * Canconical, long form, name\n\t */\n\tname: string,\n\n\t/**\n\t * Common aliases/abbreviations\n\t */\n\taliases: string[],\n\n\t/**\n\t * Array of the number of verses in each chapter\n\t * Number of chapters in the book is implied by the length of this array\n\t */\n\tverse_counts : number[],\n};\n\nexport interface ChapterMeta {\n\t/**\n\t * Number of verses within this chapter\n\t */\n\tverse_count: number;\n\n\t/**\n\t * The cumulative number of verses between the beginning of the versification\n\t * and the first verse of this chapter\n\t */\n\tcumulative_verse: number;\n};\n\nexport interface BookMeta {\n\t// 3 character USFM identifier, in upper case\n\tid: string,\n\n\t// shortened book name used in osis references\n\tosisId: string,\n\n\t// Canconical name\n\tname: string,\n\n\t// 0 based index defining the ordering of the books\n\tindex : number,\n\n\t// Common aliases/shortenings\n\taliases: string[],\n\n\t// Array of ChapterMeta's for each chapter in the book\n\tchapters: ChapterMeta[],\n\n\t// Mapping of chapter number to meta data concerning a chapter\n\t[index: number] : ChapterMeta,\n};\n\n/**\n * A range alias is a regex pattern which denotes a named BibleRef set\n * Eg, these should parse equivalently:\n * - \"Gospels\" 'Mat-Jhn'\n * - \"Old Testament\" = 'Gen-Mal'\n */\ninterface RangeAlias {\n\tpattern: RegExp;\n\trefs: BibleRef[];\n}\n\n/**\n * Argument that can be used to create a RangeAlias using just a compact\n * [book,book] representation for full book ranges where the books are used\n * as an argument to makeBookRange\n *\n * (this is primarily used in the createVersification arguments to make\n * the hard coded data we need to store both smaller (good for browser bundle)\n * and more compatible with versifications with different verse number divisions\n * (as we don't duplicate data about chapter/verse count inside a raw refs array)\n */\ntype RangeAliasRaw = RangeAlias | {\n\tpattern: RegExp\n\tbooks: ([string,string] | [string])[];\n}\n\nexport interface Versification {\n\t/**\n\t * Array of books within this Versification scheme\n\t */\n\torder : BookMeta[],\n\n\t/**\n\t * Mapping from book ID (eg GEN, REV) to the corresponding\n\t * element of the order array\n\t */\n\tbook : { [ index: string ] : BookMeta },\n\n\t/** Set of aliases that map onto cross-book ranges */\n\trangeAliases: RangeAlias[];\n};\n\n/**\n * Creates a full Versification object from the minimal data set by computing\n * the rest\n */\nexport function createVersification(data: BookMetaRaw[], rangeAliases: RangeAliasRaw[] = []) : Versification {\n\tlet result : Versification = {\n\t\torder: [],\n\t\tbook : {},\n\t\trangeAliases: [],\n\t};\n\n\tlet accumulator = 0;\n\tfor(let i = 0; i < data.length; ++i){\n\t\tlet raw = data[i];\n\n\t\tlet chapters : ChapterMeta[] = [];\n\t\tfor(let c of raw.verse_counts){\n\t\t\tchapters.push({\n\t\t\t\tverse_count      : c,\n\t\t\t\tcumulative_verse : accumulator,\n\t\t\t});\n\t\t\taccumulator += c;\n\t\t}\n\n\t\tlet b_meta : BookMeta = {\n\t\t\tid       : raw.id,\n\t\t\tosisId   : raw.osisId,\n\t\t\tname     : raw.name,\n\t\t\tindex    : i,\n\t\t\taliases  : raw.aliases,\n\t\t\tchapters : chapters,\n\t\t};\n\n\t\tfor(let j = 0; j < chapters.length; ++j){\n\t\t\tb_meta[j+1] = chapters[j];\n\t\t}\n\t\tresult.order.push(b_meta);\n\t\tresult.book[b_meta.id] = b_meta;\n\t}\n\n\tresult.rangeAliases = rangeAliases.map(x => {\n\t\tif('refs' in x) { return x; }\n\t\treturn {\n\t\t\tpattern: x.pattern,\n\t\t\trefs: x.books.map(b => _makeBookRange(result, b[0], b[1]))\n\t\t}\n\t}) as any[];\n\n\treturn result;\n}\n\n/**\n * Contains meta data concerning books of the bible as per standard versification scheme.\n * This does not include the apocrypha\n *\n * Aliases contains common abbrevations for books compiled from various sources. Note that these\n * must be unique since the parser relies on them!\n *\n * USFM Abbreviations:\n * - https://ubsicap.github.io/usfm/identification/books.html\n *\n * OSIS Abbreviations:\n * - https://wiki.crosswire.org/OSIS_Book_Abbreviations\n *\n * Chicago Abbreviations:\n * - https://hbl.gcc.libguides.com/ld.php?content_id=13822328\n *\n * Other Abbreviation Sources:\n * - https://www.aresearchguide.com/bibleabb.html\n * - https://www.logos.com/bible-book-abbreviations\n * - https://www.biblija.net/abbrevs.all.php\n *\n * @private\n */\nconst default_data : BookMetaRaw[] = [\n\t{ id            : 'GEN',\n\t  osisId        : 'Gen',\n\t  name          : 'Genesis',\n\t  aliases       : ['Gn', 'Ge'],\n\t  verse_counts  : [31,25,24,26,32,22,24,22,29,32,32,20,18,24,21,16,27,33,38,18,34,24,20,67,34,35,46,22,35,43,55,32,20,31,29,43,36,30,23,23,57,38,34,34,28,34,31,22,33,26],\n\t},\n\t{ id            : 'EXO',\n\t  osisId        : 'Exod',\n\t  name          : 'Exodus',\n\t  aliases       : ['Exod', 'Ex'],\n\t  verse_counts  : [22,25,22,31,23,30,25,32,35,29,10,51,22,31,27,36,16,27,25,26,36,31,33,18,40,37,21,43,46,38,18,35,23,35,35,38,29,31,43,38],\n\t},\n\t{ id            : 'LEV',\n\t  osisId        : 'Lev',\n\t  name          : 'Leviticus',\n\t  aliases       : ['Lv', 'Le'],\n\t  verse_counts  : [17,16,17,35,19,30,38,36,24,20,47,8,59,57,33,34,16,30,37,27,24,33,44,23,55,46,34],\n\t},\n\t{ id            : 'NUM',\n\t  osisId        : 'Num',\n\t  name          : 'Numbers',\n\t  aliases       : ['Nm', 'Nu', 'Nb'],\n\t  verse_counts  : [54,34,51,49,31,27,89,26,23,36,35,16,33,45,41,50,13,32,22,29,35,41,30,25,18,65,23,31,40,16,54,42,56,29,34,13],\n\t},\n\t{ id            : 'DEU',\n\t  osisId        : 'Deut',\n\t  name          : 'Deuteronomy',\n\t  aliases       : ['Deut', 'Dt', 'De'],\n\t  verse_counts  : [46,37,29,49,33,25,26,20,29,22,32,32,18,29,23,22,20,22,21,20,23,30,25,22,19,19,26,68,29,20,30,52,29,12],\n\t},\n\t{ id            : 'JOS',\n\t  osisId        : 'Josh',\n\t  name          : 'Joshua',\n\t  aliases       : ['Josh', 'Jo', 'Jsh'],\n\t  verse_counts  : [18,24,17,24,15,27,26,35,27,43,23,24,33,15,63,10,18,28,51,9,45,34,16,33],\n\t},\n\t{ id            : 'JDG',\n\t  osisId        : 'Judg',\n\t  name          : 'Judges',\n\t  aliases       : ['Judg', 'Jgs', 'Jg', 'Jdgs'],\n\t  verse_counts  : [36,23,31,24,31,40,25,35,57,18,40,15,25,20,20,31,13,31,30,48,25],\n\t},\n\t{ id            : 'RUT',\n\t  osisId        : 'Ruth',\n\t  name          : 'Ruth',\n\t  aliases       : ['Ru', 'Rth'],\n\t  verse_counts  : [22,23,18,22],\n\t},\n\t{ id            : '1SA',\n\t  osisId        : '1Sam',\n\t  name          : '1 Samuel',\n\t  aliases       : ['1 Sam', '1 Sm'],\n\t  verse_counts  : [28,36,21,22,12,21,17,22,27,27,15,25,23,52,35,23,58,30,24,42,15,23,29,22,44,25,12,25,11,31,13],\n\t},\n\t{ id            : '2SA',\n\t  osisId        : '2Sam',\n\t  name          : '2 Samuel',\n\t  aliases       : ['2 Sam', '2 Sm'],\n\t  verse_counts  : [27,32,39,12,25,23,29,18,13,19,27,31,39,33,37,23,29,33,43,26,22,51,39,25],\n\t},\n\t{ id            : '1KI',\n\t  osisId        : '1Kgs',\n\t  name          : '1 Kings',\n\t  aliases       : ['1 Kgs', '1 Kin', '1 Kngs'],\n\t  verse_counts  : [53,46,28,34,18,38,51,66,28,29,43,33,34,31,34,34,24,46,21,43,29,53],\n\t},\n\t{ id            : '2KI',\n\t  osisId        : '2Kgs',\n\t  name          : '2 Kings',\n\t  aliases       : ['2 Kgs', '2 Kin', '2 Kngs'],\n\t  verse_counts  : [18,25,27,44,27,33,20,29,37,36,21,21,25,29,38,20,41,37,37,21,26,20,37,20,30],\n\t},\n\t{ id            : '1CH',\n\t  osisId        : '1Chr',\n\t  name          : '1 Chronicles',\n\t  aliases       : ['1 Chr', '1 Chron'],\n\t  verse_counts  : [54,55,24,43,26,81,40,40,44,14,47,40,14,17,29,43,27,17,19,8,30,19,32,31,31,32,34,21,30],\n\t},\n\t{ id            : '2CH',\n\t  osisId        : '2Chr',\n\t  name          : '2 Chronicles',\n\t  aliases       : ['2 Chr', '2 Chron'],\n\t  verse_counts  : [17,18,17,22,14,42,22,18,31,19,23,16,22,15,19,14,19,34,11,37,20,12,21,27,28,23,9,27,36,27,21,33,25,33,27,23],\n\t},\n\t{ id            : 'EZR',\n\t  osisId        : 'Ezra',\n\t  name          : 'Ezra',\n\t  aliases       : ['Ezr'],\n\t  verse_counts  : [11,70,13,24,17,22,28,36,15,44],\n\t},\n\t{ id            : 'NEH',\n\t  osisId        : 'Neh',\n\t  name          : 'Nehemiah',\n\t  aliases       : ['Ne'],\n\t  verse_counts  : [11,20,32,23,19,19,73,18,38,39,36,47,31],\n\t},\n\t{ id            : 'EST',\n\t  osisId        : 'Esth',\n\t  name          : 'Esther',\n\t  aliases       : ['Esth', 'Es'],\n\t  verse_counts  : [22,23,15,17,14,14,10,17,32,3],\n\t},\n\t{ id            : 'JOB',\n\t  osisId        : 'Job',\n\t  name          : 'Job',\n\t  aliases       : ['Jb'],\n\t  verse_counts  : [22,13,26,21,27,30,21,22,35,22,20,25,28,22,35,22,16,21,29,29,34,30,17,25,6,14,23,28,25,31,40,22,33,37,16,33,24,41,30,24,34,17],\n\t},\n\t{ id            : 'PSA',\n\t  osisId        : 'Ps',\n\t  name          : 'Psalm',\n\t  aliases       : ['Psalms', 'Ps', 'Pss', 'Psm', 'Pslm'],\n\t  verse_counts  : [6,12,8,8,12,10,17,9,20,18,7,8,6,7,5,11,15,50,14,9,13,31,6,10,22,12,14,9,11,12,24,11,22,22,28,12,40,22,13,17,13,11,5,26,17,11,9,14,20,23,19,9,6,7,23,13,11,11,17,12,8,12,11,10,13,20,7,35,36,5,24,20,28,23,10,12,20,72,13,19,16,8,18,12,13,17,7,18,52,17,16,15,5,23,11,13,12,9,9,5,8,28,22,35,45,48,43,13,31,7,10,10,9,8,18,19,2,29,176,7,8,9,4,8,5,6,5,6,8,8,3,18,3,3,21,26,9,8,24,13,10,7,12,15,21,10,20,14,9,6],\n\t},\n\t{ id            : 'PRO',\n\t  osisId        : 'Prov',\n\t  name          : 'Proverbs',\n\t  aliases       : ['Prov', 'Prv', 'Pr'],\n\t  verse_counts  : [33,22,35,27,23,35,27,36,18,32,31,28,25,35,33,33,28,24,29,30,31,29,35,34,28,28,27,28,27,33,31],\n\t},\n\t{ id            : 'ECC',\n\t  osisId        : 'Eccl',\n\t  name          : 'Ecclesiastes',\n\t  aliases       : [ 'Eccl', 'Eccles', 'Ec', 'Eccle', 'Qoheleth', 'Qoh', 'Kohelet', 'Koh' ],\n\t  verse_counts  : [18,26,22,16,20,12,29,17,18,20,10,14],\n\t},\n\t{ id            : 'SNG',\n\t  osisId        : 'Song',\n\t  name          : 'Song of Solomon',\n\t  aliases       : [ 'Song', 'Song of Songs', 'SOS', 'SongOfSolomon', 'SongOfSongs', 'Song of Sol', 'Sg', 'Canticles', 'Cant'],\n\t  verse_counts  : [17,17,11,16,16,13,13,14],\n\t},\n\t{ id            : 'ISA',\n\t  osisId        : 'Isa',\n\t  name          : 'Isaiah',\n\t  aliases       : ['Is'],\n\t  verse_counts  : [31,22,26,6,30,13,25,22,21,34,16,6,22,32,9,14,14,7,25,6,17,25,18,23,12,21,13,29,24,33,9,20,24,17,10,22,38,22,8,31,29,25,28,28,25,13,15,22,26,11,23,15,12,17,13,12,21,14,21,22,11,12,19,12,25,24],\n\t},\n\t{ id            : 'JER',\n\t  osisId        : 'Jer',\n\t  name          : 'Jeremiah',\n\t  aliases       : ['Je', 'Jr'],\n\t  verse_counts  : [19,37,25,31,31,30,34,22,26,25,23,17,27,22,21,21,27,23,15,18,14,30,40,10,38,24,22,17,32,24,40,44,26,22,19,32,21,28,18,16,18,22,13,30,5,28,7,47,39,46,64,34],\n\t},\n\t{ id            : 'LAM',\n\t  osisId        : 'Lam',\n\t  name          : 'Lamentations',\n\t  aliases       : ['La'],\n\t  verse_counts  : [22,22,66,22,22],\n\t},\n\t{ id            : 'EZK',\n\t  osisId        : 'Ezek',\n\t  name          : 'Ezekiel',\n\t  aliases       : [ 'Ezek', 'Ez', 'Eze' ],\n\t  verse_counts  : [28,10,27,17,17,14,27,18,11,22,25,28,23,23,8,63,24,32,14,49,32,31,49,27,17,21,36,26,21,26,18,32,33,31,15,38,28,23,29,49,26,20,27,31,25,24,23,35],\n\t},\n\t{ id            : 'DAN',\n\t  osisId        : 'Dan',\n\t  name          : 'Daniel',\n\t  aliases       : ['Dn', 'Da'],\n\t  verse_counts  : [21,49,30,37,31,28,28,27,27,21,45,13],\n\t},\n\t{ id            : 'HOS',\n\t  osisId        : 'Hos',\n\t  name          : 'Hosea',\n\t  aliases       : ['Ho'],\n\t  verse_counts  : [11,23,5,19,15,11,16,14,17,15,12,14,16,9],\n\t},\n\t{ id            : 'JOL',\n\t  osisId        : 'Joel',\n\t  name          : 'Joel',\n\t  aliases       : ['Jl', 'Joe'],\n\t  verse_counts  : [20,32,21],\n\t},\n\t{ id            : 'AMO',\n\t  osisId        : 'Amos',\n\t  name          : 'Amos',\n\t  aliases       : ['Am'],\n\t  verse_counts  : [15,16,15,13,27,14,17,14,15],\n\t},\n\t{ id            : 'OBA',\n\t  osisId        : 'Obad',\n\t  name          : 'Obadiah',\n\t  aliases       : ['Obad', 'Ob'],\n\t  verse_counts  : [21],\n\t},\n\t{ id            : 'JON',\n\t  osisId        : 'Jonah',\n\t  name          : 'Jonah',\n\t  aliases       : ['Jnh'],\n\t  verse_counts  : [17,10,10,11],\n\t},\n\t{ id            : 'MIC',\n\t  osisId        : 'Mic',\n\t  name          : 'Micah',\n\t  aliases       : ['Mi', 'Mc', 'Mch'],\n\t  verse_counts  : [16,13,12,13,15,16,20],\n\t},\n\t{ id            : 'NAM',\n\t  osisId        : 'Nah',\n\t  name          : 'Nahum',\n\t  aliases       : ['Na', 'Nah'],\n\t  verse_counts  : [15,13,19],\n\t},\n\t{ id            : 'HAB',\n\t  osisId        : 'Hab',\n\t  name          : 'Habakkuk',\n\t  aliases       : ['Hb'],\n\t  verse_counts  : [17,20,19],\n\t},\n\t{ id            : 'ZEP',\n\t  osisId        : 'Zeph',\n\t  name          : 'Zephaniah',\n\t  aliases       : ['Zeph', 'Zp'],\n\t  verse_counts  : [18,15,20],\n\t},\n\t{ id            : 'HAG',\n\t  osisId        : 'Hag',\n\t  name          : 'Haggai',\n\t  aliases       : ['Hg', 'Hagg', 'Hgg'],\n\t  verse_counts  : [15,23],\n\t},\n\t{ id            : 'ZEC',\n\t  osisId        : 'Zech',\n\t  name          : 'Zechariah',\n\t  aliases       : ['Zech', 'Zec', 'Zc', 'Zch', 'Zah'],\n\t  verse_counts  : [21,13,10,14,11,15,14,23,17,12,17,14,9,21],\n\t},\n\t{ id            : 'MAL',\n\t  osisId        : 'Mal',\n\t  name          : 'Malachi',\n\t  aliases       : ['Ml'],\n\t  verse_counts  : [14,17,18,6],\n\t},\n\n\t//\n\t// NEW TESTEMANT\n\t//\n\n\t{ id            : 'MAT',\n\t  osisId        : 'Matt',\n\t  name          : 'Matthew',\n\t  aliases       : ['Matt', 'Mt'],\n\t  verse_counts  : [25,23,17,25,48,34,29,34,38,42,30,50,58,36,39,28,27,35,30,34,46,46,39,51,46,75,66,20],\n\t},\n\t{ id            : 'MRK',\n\t  osisId        : 'Mark',\n\t  name          : 'Mark',\n\t  aliases       : ['Mk', 'Mar', 'Mr'],\n\t  verse_counts  : [45,28,35,41,43,56,37,38,50,52,33,44,37,72,47,20],\n\t},\n\t{ id            : 'LUK',\n\t  osisId        : 'Luke',\n\t  name          : 'Luke',\n\t  aliases       : ['Lk', 'Lu', 'Lc', 'Luc'],\n\t  verse_counts  : [80,52,38,44,39,49,50,56,62,42,54,59,35,35,32,31,37,43,48,47,38,71,56,53],\n\t},\n\t{ id            : 'JHN',\n\t  osisId        : 'John',\n\t  name          : 'John',\n\t  aliases       : ['Jn'],\n\t  verse_counts  : [51,25,36,54,47,71,53,59,41,42,57,50,38,31,27,33,26,40,42,31,25],\n\t},\n\t{ id            : 'ACT',\n\t  osisId        : 'Acts',\n\t  name          : 'Acts',\n\t  aliases       : ['Ac'],\n\t  verse_counts  : [26,47,26,37,42,15,60,40,43,48,30,25,52,28,41,40,34,28,41,38,40,30,35,27,27,32,44,31],\n\t},\n\t{ id            : 'ROM',\n\t  osisId        : 'Rom',\n\t  name          : 'Romans',\n\t  aliases       : ['Ro', 'Rm'],\n\t  verse_counts  : [32,29,31,25,21,23,25,39,33,21,36,21,14,23,33,27],\n\t},\n\t{ id            : '1CO',\n\t  osisId        : '1Cor',\n\t  name          : '1 Corinthians',\n\t  aliases       : [ '1 Cor'],\n\t  verse_counts  : [31,16,23,21,13,20,40,13,27,33,34,31,13,40,58,24],\n\t},\n\t{ id            : '2CO',\n\t  osisId        : '2Cor',\n\t  name          : '2 Corinthians',\n\t  aliases       : ['2 Cor'],\n\t  verse_counts  : [24,17,18,18,21,18,16,24,15,18,33,21,14],\n\t},\n\t{ id            : 'GAL',\n\t  osisId        : 'Gal',\n\t  name          : 'Galatians',\n\t  aliases       : ['Ga', 'Gl'],\n\t  verse_counts  : [24,21,29,31,26,18],\n\t},\n\t{ id            : 'EPH',\n\t  osisId        : 'Eph',\n\t  name          : 'Ephesians',\n\t  aliases       : ['Ephes'],\n\t  verse_counts  : [23,22,21,32,33,24],\n\t},\n\t{ id            : 'PHP',\n\t  osisId        : 'Phil',\n\t  name          : 'Philippians',\n\t  aliases       : ['Phil', 'Phl', 'Pp'],\n\t  verse_counts  : [30,30,21,23],\n\t},\n\t{ id            : 'COL',\n\t  osisId        : 'Col',\n\t  name          : 'Colossians',\n\t  aliases       : [],\n\t  verse_counts  : [29,23,25,18],\n\t},\n\t{ id            : '1TH',\n\t  osisId        : '1Thess',\n\t  name          : '1 Thessalonians',\n\t  aliases       : ['1 Thess', '1 Thes', '1 Te', '1 Ts', '1 Tess'],\n\t  verse_counts  : [10,20,13,18,28],\n\t},\n\t{ id            : '2TH',\n\t  osisId        : '2Thess',\n\t  name          : '2 Thessalonians',\n\t  aliases       : ['2 Thess', '2 Thes', '2 Te', '2 Ts', '2 Tess'],\n\t  verse_counts  : [12,17,18],\n\t},\n\t{ id            : '1TI',\n\t  osisId        : '1Tim',\n\t  name          : '1 Timothy',\n\t  aliases       : ['1 Tim', '1 Tm', '1 Ti'],\n\t  verse_counts  : [20,15,16,16,25,21],\n\t},\n\t{ id            : '2TI',\n\t  osisId        : '2Tim',\n\t  name          : '2 Timothy',\n\t  aliases       : ['2 Tim', '2 Tm', '2 Ti'],\n\t  verse_counts  : [18,26,17,22],\n\t},\n\t{ id            : 'TIT',\n\t  osisId        : 'Titus',\n\t  name          : 'Titus',\n\t  aliases       : ['Ti', 'Tt'],\n\t  verse_counts  : [16,15,15],\n\t},\n\t{ id            : 'PHM',\n\t  osisId        : 'Phlm',\n\t  name          : 'Philemon',\n\t  aliases       : ['Phlm', 'Philem', 'Pm'],\n\t  verse_counts  : [25],\n\t},\n\t{ id            : 'HEB',\n\t  osisId        : 'Heb',\n\t  name          : 'Hebrews',\n\t  aliases       : ['Hbr', 'Hebr', 'He'],\n\t  verse_counts  : [14,18,19,16,14,20,28,13,28,39,40,29,25],\n\t},\n\t{ id            : 'JAS',\n\t  osisId        : 'Jas',\n\t  name          : 'James',\n\t  aliases       : ['Jm'],\n\t  verse_counts  : [27,26,18,17,20],\n\t},\n\t{ id            : '1PE',\n\t  osisId        : '1Pet',\n\t  name          : '1 Peter',\n\t  aliases       : ['1 Pet', '1 Pt', '1 Pe', '1 Petr'],\n\t  verse_counts  : [25,25,22,19,14],\n\t},\n\t{ id            : '2PE',\n\t  osisId        : '2Pet',\n\t  name          : '2 Peter',\n\t  aliases       : ['2 Pet', '2 Pt', '2 Pe', '2 Petr'],\n\t  verse_counts  : [21,22,18],\n\t},\n\t{ id            : '1JN',\n\t  osisId        : '1John',\n\t  name          : '1 John',\n\t  aliases       : ['1 Jn', '1 Jo', '1 Joh'],\n\t  verse_counts  : [10,29,24,21,21],\n\t},\n\t{ id            : '2JN',\n\t  osisId        : '2John',\n\t  name          : '2 John',\n\t  aliases       : ['2 Jn', '2 Jo', '2 Joh'],\n\t  verse_counts  : [13],\n\t},\n\t{ id            : '3JN',\n\t  osisId        : '3John',\n\t  name          : '3 John',\n\t  aliases       : ['3 Jn', '3 Jo', '3 Joh'],\n\t  verse_counts  : [14],\n\t},\n\t{ id            : 'JUD',\n\t  osisId        : 'Jude',\n\t  name          : 'Jude',\n\t  aliases       : ['Jde', 'Jd'],\n\t  verse_counts  : [25],\n\t},\n\t{ id            : 'REV',\n\t  osisId        : 'Rev',\n\t  name          : 'Revelation',\n\t  aliases       : ['Apoc', 'Rv'],\n\t  verse_counts  : [20,29,22,11,14,17,17,13,21,11,19,17,18,20,8,21,18,24,21,15,27,21],\n\t},\n];\n\nconst default_range_aliases : RangeAliasRaw[] = [\n\t{\n\t\tpattern: /gospels?/i,\n\t\tbooks: [['MAT', 'JHN']],\n\t}, {\n\t\tpattern: /torah|pentateuch|law|(five )?books of moses/i,\n\t\tbooks: [['GEN', 'DEU']],\n\t}, {\n\t\tpattern: /old test[ae]ment|tanakh/i, // accept common mis-spelling\n\t\tbooks: [['GEN', 'MAL']],\n\t}, {\n\t\tpattern: /new test[ae]ment/i, // accept common mis-spelling\n\t\tbooks: [['MAT', 'REV']],\n\t}, {\n\t\tpattern: /ketuvim/i,\n\t\tbooks: [['JOS', 'JDG'], ['1SA', '2KI'], ['ISA', 'JER'], ['EZK'], ['HOS', 'MAL']],\n\t}, {\n\t\tpattern: /nevi'?im/i,\n\t\tbooks: [['RUT'], ['1CH', 'SNG'], ['LAM'], ['DAN']],\n\t}\n]\n\nexport const VERSIFICATION : Versification = createVersification(default_data, default_range_aliases);\nexport default VERSIFICATION;\n", "/**\n * Contains utilities to print a BibleRef as a string\n */\n\nimport VERSIFICATION from './Versification';\nimport { Versification } from './Versification';\nimport { BibleRef, BibleVerse, BibleRange } from './BibleRef';\nimport { combineRanges } from './geometry';\n\n/**\n * Set of optional flags which can be passed to the format function\n */\nexport interface FormatOptions {\n\t/**\n\t * The format to use for book name\n\t * - name -> The full name      -> Judges\n\t * - usfm -> The 3 char usfm id -> JDG\n\t * - osis -> The OSIS id        -> Judg\n\t */\n\tbook_format? : \"name\" | \"usfm\" | \"osis\",\n\n\t/**\n\t * The character/string to use to separate the book name/id from the chapter/verse\n\t * numbers\n\t * Defaults to ' ', can use '.' and still be conformant with parser\n\t */\n\tbook_separator?: string,\n\n\t/**\n\t * The character to use to separate the chapter number from the verse number\n\t * To be conformant with the parse this should be set to one of:\n\t * [ ':', 'v', '.', ' v ' ]\n\t */\n\tverse_separator?: string;\n\n\t/**\n\t * The character to use to separate multiple references if a list of distinct refs is passed in.\n\t * To be conformat with the parser this should be set to a string matching the regex \\s*[;_]\\s*\n\t * Defaults to '; '\n\t */\n\tref_separator?: string;\n\n\t/**\n\t * If set then all printer added whitespace will be stripped\n\t * (IE: excludes whitespace in any custom separator options)\n\t * This makes for harder to read outputs, but URL encodable output strings\n\t */\n\tstrip_whitespace?: boolean,\n\n\t/**\n\t * If set then implict elements will be hidden, for example a range\n\t * reperenting an chapter will be printed as \"Genesis 1\" rather than\n\t * \"Genesis 1:1-31\", and a range representing an entire book will be\n\t * printed \"Genesis\" rather than \"Genesis 1:1 - 50:26\"]\n\t */\n\tcompact? : boolean,\n\n\t/**\n\t * If true, references will always be output in there entirety\n\t * (IE: never reusing part of the previous reference as implicit context)\n\t *\n\t * Eg, Rather than \"Genesis 1:4,6\" we will return \"Genesis 1:4; Genesis 1:6\"\n\t *\n\t * Additionally, ranges will contain complete references on both sides of the separator\n\t * character, Eg, Rather than \"Genesis 1:4-6\" we will return \"Genesis 1:4 - Genesis 1:6\"\n\t *\n\t * Defaults to false, must be true to adhear to OSIS reference specification\n\t */\n\tcomplete_refs? : boolean,\n\n\t/**\n\t * If true then adjacent/overlapping ranges will sorted into order and\n\t * combined before printing\n\t */\n\tcombine_ranges? : boolean,\n\n\t/**\n\t * If true then string will be converted to lower case before being returned\n\t */\n\tlowercase?: boolean,\n};\n\nconst DEFAULT_OPTS : FormatOptions = {\n\tbook_format      : \"name\",\n\tverse_separator  : ':',\n\tstrip_whitespace : false,\n\tcompact          : false,\n\tcombine_ranges   : false,\n\tcomplete_refs    : false,\n\tlowercase        : false,\n};\n\n/**\n * Enumeration of possible format presets\n *\n * - osis      -> uses . separators and osis book ids, eg: \"Gen.1.1\"\n * - url       -> uses url safe separators and usfm book ids, eg: gen1v1_exo1v2-3\n * - compact   -> sets the `compact` flag to true\n * - lowercase -> sets the `lowercase` flag to true\n * - combined  -> sets the `combine_ranges` flag to true\n * - complete  -> sets the `complete_refs` flag to true\n */\nexport type FormatPreset = \"osis\" | \"url\" | \"compact\" | \"lowercase\" | \"combined\";\n\n/**\n * Set of arguments that can be passed to represent a formatting scheme\n *\n * Either a full FormatOptions object describing the options, or a present\n * name such as \"osis\" for OSIS formatted references\n *\n * Present name can be combined with :, eg: url:combined to use url formatting, and combine ranges\n * Later presets override earlier presets\n *\n * For a full list of present names, see [[FormatPreset]]\n *\n */\nexport type FormatArg = FormatOptions | string;\n\nconst FORMAT_PRESETS : { [index:string] : FormatOptions } = {\n\t\"osis\": {\n\t\tbook_format      : \"osis\",\n\t\tbook_separator   : '.',\n\t\tverse_separator  : '.',\n\t\tcomplete_refs    : true,\n\t\tstrip_whitespace : true,\n\t\tref_separator    : ', ',\n\t},\n\t\"url\": {\n\t\tbook_format      : \"usfm\",\n\t\tbook_separator   : '',\n\t\tverse_separator  : 'v',\n\t\tstrip_whitespace : true,\n\t\tcompact          : true,\n\t\tref_separator    : '_',\n\t\tlowercase        : true,\n\t},\n\t\"compact\"   : { compact        : true },\n\t\"lowercase\" : { lowercase      : true },\n\t\"combined\"  : { combine_ranges : true },\n\t\"complete\"  : { complete_refs  : true },\n};\n\n\n\n// Strips whitespace if option is set\nfunction _stripWhitespaceMaybe(opts : FormatOptions, str: string){\n\treturn opts.strip_whitespace ? str.replace(/ /g, '') : str;\n}\n\n// Returns a string representing the name of the specified book id\n// obeying the format options\n// Will have a trailing space unless strip_whitespace is set\nfunction _formatBookName(v: Versification, id : string, opts : FormatOptions) : string {\n\tlet out : string;\n\tswitch(opts.book_format){\n\t\tcase \"name\": out = v.book[id].name; break;\n\t\tcase \"usfm\": out = id; break;\n\t\tcase \"osis\": out = v.book[id].osisId; break;\n\t\tdefault:\n\t\t\tthrow new Error(\"Invalid output book format specified\");\n\t}\n\treturn opts.lowercase ? out.toLowerCase() : out;\n}\n\n// Formats a chapter verse specifier, eg \"3:5\"\nfunction _formatChapterVerse(x: BibleVerse, opts: FormatOptions) : string {\n\treturn `${x.chapter}${opts.verse_separator}${x.verse}`;\n}\n\nfunction _generateFormatOpts(arg_opts?: FormatArg) : FormatOptions{\n\tlet result = { ...DEFAULT_OPTS };\n\n\tif(typeof arg_opts === \"string\"){\n\t\tfor(let preset of arg_opts.split(':')){\n\n\t\t\tif(!(preset in FORMAT_PRESETS)){\n\t\t\t\tthrow new Error(`Invalid format preset name specified: '${preset}'`);\n\t\t\t}\n\n\t\t\tresult = { ...result, ...FORMAT_PRESETS[preset] };\n\t\t}\n\n\t} else if (arg_opts !== undefined) {\n\t\tresult = { ...result, ...arg_opts };\n\t}\n\n\tif(!result.book_separator) {\n\t\tresult.book_separator = result.strip_whitespace ? '' : ' ';\n\t}\n\tif(!result.ref_separator) {\n\t\tresult.ref_separator = result.strip_whitespace ? ';' : '; ';\n\t}\n\n\treturn result;\n}\n\n/**\n * Format a single BibleVerse to a string\n * @private\n */\nexport function formatBibleVerse(v: Versification, x : BibleVerse, arg_opts? : FormatArg) : string {\n\tlet opts = _generateFormatOpts(arg_opts);\n\treturn _stripWhitespaceMaybe(\n\t\topts, _formatBookName(v, x.book, opts) + opts.book_separator + _formatChapterVerse(x, opts)\n\t);\n}\n\n/**\n * Format a single BibleRange to a string\n * @private\n */\nexport function formatBibleRange(v: Versification, x: BibleRange, arg_opts? : FormatArg) : string{\n\tlet opts = _generateFormatOpts(arg_opts);\n\n\tlet b_meta = v.book[x.start.book];\n\n\tconst SPACED_HYPHEN = opts.strip_whitespace ? '-' : ' - ';\n\n\tif(x.start.book !== x.end.book || opts.complete_refs){\n    // cross book range\n\n    if(\n      opts.compact && !opts.complete_refs &&\n      x.start.verse === 1 &&\n      x.end.verse === v.book[x.end.book].chapters[x.end.chapter-1].verse_count\n    ) {\n\n      if (\n        x.start.chapter === 1 &&\n        x.end.chapter === v.book[x.end.book].chapters.length\n      ) {\n        // then its a range of complete books, eg, \"Genesis - Exodus\"\n        return _formatBookName(v, x.start.book, opts) + SPACED_HYPHEN + _formatBookName(v, x.end.book, opts)\n      } else {\n        // then its a range of complete chapters, eg \"Genesis 10 - Exodus 3\"\n        return (\n          _formatBookName(v, x.start.book, opts) + `${opts.book_separator}${x.start.chapter}` +\n          SPACED_HYPHEN +\n            _formatBookName(v, x.end.book, opts) + `${opts.book_separator}${x.end.chapter}`\n        );\n      }\n    }\n    // Format as two completely separate BibleVerse refs, joined by \" - \"\n    return (\n      formatBibleVerse(v, x.start, opts) +\n        SPACED_HYPHEN +\n        formatBibleVerse(v, x.end, opts)\n    );\n  } else if (x.start.chapter !== x.end.chapter){\n    // Cross chapter range within single book\n\n    if(opts.compact &&\n       x.start.verse === 1 &&\n       x.end.verse === b_meta.chapters[x.end.chapter-1].verse_count\n      ){\n      // then its a range of complete chapters\n\n      if(x.start.chapter === 1 && x.end.chapter === b_meta.chapters.length){\n        // Its a complete book, format as \"Genesis\"\n        return _formatBookName(v, x.start.book, opts);\n      } else {\n        // format as \"Geneses 1 - 2\"\n        return _formatBookName(v, x.start.book, opts) + `${opts.book_separator}${x.start.chapter}${SPACED_HYPHEN}${x.end.chapter}`;\n      }\n    }\n\n\t\t// Format as \"Genesis 1:2 - 3:4\"\n\t\treturn (\n\t\t\t_formatBookName(v, x.start.book, opts) +\n\t\t\topts.book_separator +\n\t\t\t_formatChapterVerse(x.start, opts) +\n\t\t\tSPACED_HYPHEN +\n\t\t\t_formatChapterVerse(x.end, opts)\n\t\t);\n\t} else if (x.start.verse !== x.end.verse){\n\t\tif(opts.compact &&\n\t\t\t x.start.verse === 1 &&\n\t\t\t x.end.verse   === b_meta.chapters[x.end.chapter-1].verse_count\n\t\t\t) {\n\t\t\t// then its an entire chapter, format as \"Genesis 1\"\n\t\t\treturn (\n\t\t\t\t_formatBookName(v, x.start.book, opts) + opts.book_separator + x.start.chapter\n\t\t\t);\n\t\t}\n\n\t\t// Range of verses within single chapter\n\t\t// Format as \"Genesis 1:2-3\"\n\t\treturn formatBibleVerse(v, x.start, opts) + '-' + x.end.verse;\n\t} else {\n\t\t// Then start == end\n\t\treturn formatBibleVerse(v, x.start, opts);\n\t}\n}\n\n/**\n * Format a list of BibleRefs to strings using commas to shorten the output\n * wherever possible\n * Eg, mapping formatBibleVerse over [\n *   { book: 'GEN', chapter: 1, verse: 1 },\n *   { book: 'GEN', chapter: 1, verse: 2 },\n * ]\n * would produce \"Genesis 1:1\" and \"Genesis 1:2\"\n * By using this function we instead get the more compact \"Genesis 1:1,2\"\n * @private\n */\nexport function formatBibleRefList(v: Versification, xs: BibleRef[], arg_opts? : FormatArg) : string {\n\tif(xs.length == 0){ return \"\"; }\n\tlet opts = _generateFormatOpts(arg_opts);\n\n\tif(opts.combine_ranges){ xs = combineRanges.bind({ versification: v })(xs); }\n\n\tlet cur_book  : string | null = null;\n\tlet cur_chpt  : number | null = null;\n\n\tlet results = [];\n\tlet cur_str = \"\";\n\n\t// separator used for multiple chapter verse blocks, eg Gen 1:2, 5:6\n\t//                                                             ^^\n\tconst CV_SEPARATOR = opts.strip_whitespace ? ',' : ', ';\n\tconst SPACED_HYPHEN = opts.strip_whitespace ? '-' : ' - ';\n\n\tfunction makeNewRef(x : BibleRef){\n\t\tif(cur_str.length > 0){ results.push(cur_str) };\n\t\tcur_str = \"\";\n\t\tif(x['is_range']){\n\t\t\tcur_str = formatBibleRange(v, x, opts);\n\t\t\tif(x.start.book    === x.end.book)   { cur_book = x.start.book; }\n\t\t\tif(x.start.chapter === x.end.chapter){ cur_chpt = x.start.chapter; }\n\t\t} else {\n\t\t\tcur_str = formatBibleVerse(v, x, opts);\n\t\t\tcur_book  = x.book;\n\t\t\tcur_chpt  = x.chapter;\n\t\t}\n\t}\n\n\tfor(let x of xs){\n\t\tif(!x.is_range){ // Then we're dealing with a single verse\n\t\t\tif(x.book !== cur_book || opts.complete_refs){\n\t\t\t\t// Nothing to reuse\n\t\t\t\tmakeNewRef(x);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(x.chapter != cur_chpt){\n\t\t\t\t// Can reuse book only\n\t\t\t\tcur_str += CV_SEPARATOR + _formatChapterVerse(x,opts);\n\t\t\t\tcur_chpt = x.chapter;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Can reuse book and chapter\n\t\t\tcur_str += \",\" + x.verse;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If still going then we're dealing with a range\n\n\t\tif(x.start.book !== x.end.book || x.start.book !== cur_book || opts.complete_refs){\n\t\t\t// Don't reuse anything if its a cross book range, or\n\t\t\t// if the range is within a single book - but not the current book\n\t\t\tmakeNewRef(x);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If still going then we can reuse the book part...\n\n\n\t\tif(x.start.chapter !== x.end.chapter || x.start.chapter !== cur_chpt){\n\t\t\t// Cannot reuse chapter part\n\t\t\tcur_str += (\n\t\t\t\t  CV_SEPARATOR +\n\t\t\t\t\t_formatChapterVerse(x.start, opts) +\n\t\t\t\t\tSPACED_HYPHEN +\n\t\t\t\t\t_formatChapterVerse(x.end,   opts)\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Can reuse chapter part\n\t\tcur_str += \",\" + x.start.verse + (x.start.verse === x.end.verse ? '' : \"-\" + x.end.verse);\n\t}\n\n\tresults.push(cur_str);\n\n\treturn results.join(opts.ref_separator);\n}\n", "/**\n * Allows for validation (and fixing) of BibleRefs\n */\n\nimport { BibleRef, BibleVerse, BibleRange }    from './BibleRef';\nimport { Versification, BookMeta } from './Versification'\n\n/**\n * Enumeration of the different sorts of validation error\n */\nexport enum ErrKind {\n\t/** The specified book does not exist */\n\tBadBook = \"BADBOOK\",\n\n\t/** Verse number is higher than number of verses in chapter */\n\tBadVerse = \"BADVERSE\",\n\n\t/** Chapter number is higher than number of chapters in book */\n\tBadChapter = \"BADCHPT\",\n\n\t/** A range goes from later in the bible to earlier in the bible */\n\tBackwardsRange = \"BACKWARDSRANGE\",\n\n\t//////////////////////////////////////////////\n\t// Warnings below\n\n\t/** A range contains just a single verse */\n\tRangeOfOne = \"RANGEOFONE\",\n};\n\n/**\n * Represents an error which was detected during validation\n */\nexport type ValidationError = {\n\tkind: ErrKind.BadBook,\n\tis_warning: false,\n\tmessage: string,\n\tgot: string,\n\tref: BibleVerse,\n} | {\n\tkind: ErrKind.BadVerse | ErrKind.BadChapter,\n\tis_warning: false,\n\tmessage: string,\n\n\tmax_value: number,\n\tgot: number,\n\tref: BibleVerse,\n} | {\n\tkind: ErrKind.BackwardsRange,\n\tis_warning: false,\n\tmessage: string,\n\n\t/** The most significant part of the range which is reversed */\n\tcomponent: \"book\" | \"chapter\" | \"verse\",\n\tref: BibleRange,\n} | {\n\tkind: ErrKind.RangeOfOne,\n\tis_warning: true,\n\tmessage: string,\n\tref: BibleRange,\n};\n\nfunction _validateVerse(v : Versification, ref: BibleVerse) : ValidationError[] {\n\tlet b_data : BookMeta | undefined = v.book[ref.book];\n\n\tlet results : ValidationError[] = [];\n\n\tif(b_data == undefined){\n\t\tresults.push({\n\t\t\tref        : ref,\n\t\t\tkind       : ErrKind.BadBook,\n\t\t\tis_warning : false,\n\t\t\tmessage    : \"The specified book does not exist\",\n\t\t\tgot        : ref.book,\n\t\t});\n\t} else if (b_data.chapters.length < ref.chapter){\n\t\tresults.push({\n\t\t\tref        : ref,\n\t\t\tkind       : ErrKind.BadChapter,\n\t\t\tis_warning : false,\n\t\t\tmessage    : `${b_data.name} has only ${b_data.chapters.length} chapters`,\n\t\t\tmax_value  : b_data.chapters.length,\n\t\t\tgot        : ref.chapter,\n\t\t});\n\t} else if(b_data[ref.chapter].verse_count < ref.verse){\n\t\tresults.push({\n\t\t\tref        : ref,\n\t\t\tkind       : ErrKind.BadVerse,\n\t\t\tis_warning : false,\n\t\t\tmessage    : `${b_data.name} ${ref.chapter} has only ${b_data[ref.chapter].verse_count} verses`,\n\t\t\tmax_value  : b_data[ref.chapter].verse_count,\n\t\t\tgot        : ref.verse,\n\t\t});\n\t}\n\n\treturn results;\n}\n/**\n * Validates a BibleRef, returning an array of errors, or empty array if no\n * issues\n * Note that the .ref field of each error produced will be a reference to the\n * BibleRef passed in rather than a copy\n * @param include_warnings - if true then warning messages will be included\n */\nexport function validate(v : Versification, ref : BibleRef, include_warnings?: boolean) : ValidationError[] {\n\tif(include_warnings === undefined){ include_warnings = true; }\n\n\tlet results : ValidationError[] = [];\n\n\tif(ref.is_range === undefined){\n\t\tresults = results.concat(_validateVerse(v, ref));\n\t} else {\n\t\tresults = results.concat(_validateVerse(v, ref.start));\n\t\tresults = results.concat(_validateVerse(v, ref.end));\n\n\t\tlet b1_data : BookMeta | undefined = v.book[ref.start.book];\n\t\tlet b2_data : BookMeta | undefined = v.book[ref.end.book  ];\n\n\t\tif(b1_data && b2_data && b2_data.index < b1_data.index){\n\t\t\tresults.push({\n\t\t\t\tref        : ref,\n\t\t\t\tkind       : ErrKind.BackwardsRange,\n\t\t\t\tis_warning : false,\n\t\t\t\tmessage    : `Range is backwards (${b2_data.name} comes before ${b1_data.name})`,\n\t\t\t\tcomponent  : \"book\",\n\t\t\t});\n\t\t} else if(ref.start.book === ref.end.book){\n\t\t\tif(ref.end.chapter < ref.start.chapter){\n\t\t\t\tresults.push({\n\t\t\t\t\tref        : ref,\n\t\t\t\t\tkind       : ErrKind.BackwardsRange,\n\t\t\t\t\tis_warning : false,\n\t\t\t\t\tmessage    : `Chapter range is backwards`,\n\t\t\t\t\tcomponent  : \"chapter\",\n\t\t\t\t});\n\t\t\t} else if (ref.end.chapter === ref.start.chapter){\n\t\t\t\tif(ref.end.verse < ref.start.verse){\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tref        : ref,\n\t\t\t\t\t\tkind       : ErrKind.BackwardsRange,\n\t\t\t\t\t\tis_warning : false,\n\t\t\t\t\t\tmessage    : `Verse range is backwards`,\n\t\t\t\t\t\tcomponent  : \"verse\",\n\t\t\t\t\t});\n\t\t\t\t} else if(ref.end.verse === ref.start.verse && include_warnings){\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tref        : ref,\n\t\t\t\t\t\tkind       : ErrKind.RangeOfOne,\n\t\t\t\t\t\tis_warning : true,\n\t\t\t\t\t\tmessage    : `Range contains only a single verse`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n}\n\n/**\n * Attempts to fix errors identified by \"validate\". Will modify the specified\n * ref in place rather than making a copy\n * Will throw if the error is unfixable\n * @return reference to the passed in BibleRef\n */\nexport function repair(v: Versification, ref: BibleRef, include_warnings? : boolean) : BibleRef{\n\tlet errors = validate(v, ref, include_warnings);\n\n\tfor(let i = 0; i < 5 && errors.length; ++i){\n\t\tfor(let err of errors){\n\t\t\t_fixError(v, err);\n\t\t}\n\t\terrors = validate(v, ref, include_warnings);\n\t}\n\n\tif(errors.length){ throw new Error(\"Max fix passes exceeded\"); }\n\n\treturn ref;\n}\n\n\nfunction _fixError(v : Versification, err: ValidationError) : void {\n\tswitch(err.kind){\n\t\tcase ErrKind.BadBook:\n\t\t\tthrow new Error(\"Cannot fix an 'unknown book' error\");\n\t\tcase ErrKind.BadChapter:\n\t\t\terr.ref.chapter = err.max_value;\n\t\t\terr.ref.verse   = v.book[err.ref.book][err.ref.chapter].verse_count;\n\t\t\tbreak;\n\t\tcase ErrKind.BadVerse:\n\t\t\terr.ref.verse = err.max_value;\n\t\t\tbreak;\n\t\tcase ErrKind.BackwardsRange:\n\t\t\tlet tmp = err.ref.start;\n\t\t\terr.ref.start = err.ref.end;\n\t\t\terr.ref.end   = tmp;\n\t\t\tbreak;\n\t\tcase ErrKind.RangeOfOne:\n\t\t\t// We have to modify the object in place rather then setting to a new\n\t\t\t// object (as the whole point is we've passed it by reference)\n\t\t\t// Hence rebuild the members of the existing object\n\t\t\tlet r = err.ref as any;\n\t\t\tr.book    = r.start.book;\n\t\t\tr.chapter = r.start.chapter;\n\t\t\tr.verse   = r.start.verse;\n\t\t\tdelete r.is_range;\n\t\t\tdelete r.start;\n\t\t\tdelete r.end;\n\t\t\tbreak;\n\t}\n}\n", "import P from 'parsimmon';\n\nimport VERSIFICATION from './Versification';\nimport type { Versification } from './Versification';\nimport BibleRef      from './BibleRef';\nimport { _makeBookRange } from './range-manip';\n\n/**\n * Represents the result of a successful attempt to parse a string representing a [[BibleRef]]\n */\ninterface ParseResultSuccess {\n\t/**\n\t * Whether the parsing was successful - `true` for a [[ParseResultSuccess]]\n\t */\n\tstatus : true;\n\n\t/**\n\t * The array of [[BibleRef]]s which were parsed\n\t * An array is used since input string may include multiple non-contigious blocks, for example:\n\t * - Genesis 1 v5,8\n\t * - Genesis 1:1 ; Exodus 1:1\n\t */\n\tvalue  : BibleRef[];\n}\n\n/**\n * Represents the result of an unsuccessful attempt to parse a string representing a [[BibleRef]]\n */\ninterface ParseResultFailure {\n\t/**\n\t * Whether the parsing was successful - `false` for a [[ParseResultFailure]]\n\t */\n\tstatus: false,\n\n\t/**\n\t * List of possible tokens/characters at the indicated location\n\t */\n\texpected: string[],\n\n\t/**\n\t * Location within input string where an unexpected token was encountered\n\t */\n\tindex: { column: number, line: number, offset: number },\n\n\t/**\n\t * The string we were attempting to parse\n\t */\n\tinput: string,\n};\n\n/**\n * Represents the output of attempting to parse a string containing a Bible reference\n * Check the `status` field to see if the parse succeeded, and then utalize the fields\n * of [[ParseResultSuccess]] and [[ParseResultFailure]] as appropriate\n */\nexport type ParseResult = ParseResultSuccess | ParseResultFailure;\n\n/**\n * Set of publically exposed parsimon parsers\n */\nexport interface Parsers {\n\tBook     : P.Parser<string>;\n\tBibleRef : P.Parser<BibleRef[]>;\n}\n\n///////////////////////////////////////////////////////////////////////\n// Basic Parsers\n// These do not depend on versification and thus are not declared inside buildParsers\n\n// differs to parsimons whitespace in that it doesn't consume new lines\nconst pAnySpace : P.Parser<string> = P.regex(/[ \\t]*/);\n\nconst pInt : P.Parser<number> = P\n\t.regex(/[0-9]+/)\n\t.skip(pAnySpace)\n\t.map(s => Number(s));\n\n\n// Helper to parse a number before a book name, eg, in \"1 John\"\nconst pBookPrefixNumber : P.Parser<number> = P.alt(\n\tP.string(\"1st\").map((x) => 1),\n\tP.string(\"2nd\").map((x) => 2),\n\tP.string(\"3rd\").map((x) => 3),\n\tP.string(\"First\" ).map(() => 1),\n\tP.string(\"Second\").map(() => 2),\n\tP.string(\"Third\" ).map(() => 3),\n\tP.oneOf(\"123\").map(x => parseInt(x)),\n\tP.oneOf(\"I\").times(1,3).map(x => x.length),\n);\n\n// Parses a character that separates a chapter number from verse number\nconst pVerseSeparator : P.Parser<string> = P.oneOf(\":v.\").skip(pAnySpace);\n\n// Parses a comma seperator, optionally followed by whitespace\nconst pCommaSeparator : P.Parser<string> = P.oneOf(',').skip(pAnySpace);\n\nconst pRangeSeparator : P.Parser<string> = P\n\t.optWhitespace\n\t.then(P.oneOf(\"-\"))\n\t.skip(pAnySpace);\n\n// Represents an integer or optionally a range of ints such as \"5\" or \"5 - 7\"\ninterface IntRange {\n\tstart : number,\n\tend   : number | null,\n};\nconst pIntRange : P.Parser<IntRange> = P.seq(\n\tpInt, pRangeSeparator.then(pInt).fallback(null)\n).chain(([start, end]) => {\n\tif(end && end <= start){\n\t\treturn P.fail(\"End of range must be higher than start\");\n\t}\n\treturn P.succeed({ start, end });\n});\n\n\n/**\n * Builds parsers for a given Versification scheme\n */\nexport function buildParsers(versification: Versification = VERSIFICATION) : Parsers {\n\n\tlet book_name_to_id : { [ index: string ] : string } = {};\n\tfor(let book of versification.order){\n\t\t[ book.name, ...book.aliases ].map(x => book_name_to_id[x.toLowerCase()] = book.id)\n\t}\n\n\t///////////////////////////////////////////////////////////////////////\n\t// Bible Book\n\n\tconst pBookId : P.Parser<string> = P\n\t\t.regex(/([0-9A-Z]{3})\\.?/i)\n\t\t.chain(x => {\n\t\t\tx = x.toUpperCase().substring(0,3);\n\t\t\tif(versification.book[x]){\n\t\t\t\treturn P.succeed(x);\n\t\t\t} else {\n\t\t\t\treturn P.fail(`Invalid book ID: ${x}`);\n\t\t\t}\n\t\t}).desc(\"USFM book identifier (eg: 'GEN', 'REV')\");\n\n\tconst pBookName : P.Parser<string> = P.alt(\n\t\t// Multiword book names\n\t\tP.regexp(/[Ss]ong\\sof\\s[Ss](ongs|olomon|ol)/).chain(x => P.succeed(\"SNG\")),\n\n\t\t// Number followed by single word (eg: 1 Kings)\n\t\tP.seq(pBookPrefixNumber, pAnySpace, P.letters).chain(x => {\n\t\t\tlet name = x[0] + ' ' + x[2].toLowerCase();\n\t\t\tlet id   = book_name_to_id[name];\n\t\t\tif(id){ return P.succeed(id); }\n\t\t\telse  { return P.fail(\"Invalid book name: \" + x); }\n\t\t}),\n\n\t\t// Single word book names\n\t\tP.regexp(/[A-Z]+/i).chain(x => {\n\t\t\tlet id = book_name_to_id[x.toLowerCase()];\n\t\t\tif(id){ return P.succeed(id); }\n\t\t\telse  { return P.fail(\"Invalid book name: \" + x); }\n\t\t})\n\t).desc(\"Book name (eg, 'Genesis', '2 Kings')\");\n\n\tconst rangeAliases = versification.rangeAliases.map(({ pattern, refs }) => (\n\t\tP.regexp(pattern).chain(x => P.succeed(refs))\n\t))\n\tconst pRangeAlias : P.Parser<BibleRef[]> = P.alt(...rangeAliases);\n\n\tconst pBook : P.Parser<string> = P.alt(pBookName, pBookId).skip(P.regexp(/\\.? */));\n\n\t///////////////////////////////////////////////////////////////////////\n\n\t// Parses a chapter/verse reference such as:\n\t// full_chapters:\n\t// 5         :: full chapter\n\t// 5-8       :: chapter range\n\t//\n\t// verse:\n\t// 5:6       :: single verse\n\t// 5:6,12    :: multiple verses\n\t// 5:6-12    :: range of verses\n\t// 5:6-12,14 :: multiple ranges/verses\n\t//\n\t// chapter_range:\n\t// 5:12 - 6:13\n\ttype ChapterVerseSpecifier = {\n\t\tkind: \"full_chapter\",\n\t\trange: IntRange\n\t} | {\n\t\tkind    : \"verse\",\n\t\tchapter : number,\n\t\tverses  : IntRange[],\n\t} | {\n\t\tkind: \"chapter_range\",\n\t\tc1 : number,\n\t\tv1 : number,\n\t\tc2 : number,\n\t\tv2 : number,\n\t};\n\tconst pChapterVerseSpecifier : P.Parser<ChapterVerseSpecifier> = P.alt(\n\t\t// chapter_range:\n\t\tP.seqMap(\n\t\t\tpInt.skip(pVerseSeparator),\n\t\t\tpInt,\n\t\t\tpRangeSeparator,\n\t\t\tpInt.skip(pVerseSeparator),\n\t\t\tpInt,\n\t\t\t(c1, v1, r, c2, v2) => { return { kind: \"chapter_range\", c1, v1, c2, v2 }; }\n\t\t),\n\n\t\t// Parses full chapters, eg \"5\", \"5-8\"\n\t\tpIntRange.notFollowedBy(pVerseSeparator).map((range) => {\n\t\t\treturn { kind: \"full_chapter\", range };\n\t\t}),\n\n\t\t// Parses single chapter with verses, eg \"5:8\", \"5:8-10\",\n\t\tP.seqMap(\n\t\t\tpInt,\n\t\t\tpVerseSeparator.then(\n\t\t\t\t(pIntRange.notFollowedBy(pVerseSeparator)).sepBy1(pCommaSeparator)\n\t\t\t),\n\t\t\t(chapter : number, verses : IntRange[]) => {\n\t\t\t\treturn { kind: \"verse\", chapter, verses };\n\t\t\t}\n\t\t)\n\t).notFollowedBy(\n\t\t// this requirement breaks an ambiguity in parsing something like:\n\t\t// \"1Sam1,2Sam1\n\t\t//\n\t\t// Without it we parse\n\t\t// \"1Sam1\" -> valid ref\n\t\t// \",2\"    -> valid ref (with previous context)\n\t\t// \"Sam1\"  -> invalid ref (no such book)\n\t\tP.regex(/[a-z]/i)\n\t);\n\n\t// Converts a parsed ChapterVerseSpecifier into a list of BibleRefs\n\tfunction chapterVerseSpecifierToBibleRef(book : string, cv : ChapterVerseSpecifier) : BibleRef[]{\n\t\tswitch(cv.kind){\n\t\t\tcase \"full_chapter\": {\n\t\t\t\tlet start : number = cv.range.start;\n\t\t\t\tlet end   : number = cv.range.end ? cv.range.end : cv.range.start;\n\t\t\t\tlet last_verse = 1;\n\t\t\t\tif(versification.book[book][end] !== undefined){\n\t\t\t\t\tlast_verse = versification.book[book][end].verse_count;\n\t\t\t\t}\n\t\t\t\treturn [{\n\t\t\t\t\tis_range: true,\n\t\t\t\t\tstart : { book, chapter: start, verse: 1 },\n\t\t\t\t\tend   : { book, chapter: end,   verse: last_verse },\n\t\t\t\t}];\n\t\t\t}\n\t\t\tcase \"verse\": {\n\t\t\t\tlet chapter = cv.chapter;\n\t\t\t\tlet results : BibleRef[] = [];\n\t\t\t\tfor(let v of cv.verses){\n\t\t\t\t\tif(v.end){\n\t\t\t\t\t\tresults.push({\n\t\t\t\t\t\t\tis_range: true,\n\t\t\t\t\t\t\tstart : { book, chapter, verse: v.start },\n\t\t\t\t\t\t\tend   : { book, chapter, verse: v.end   },\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresults.push({ book, chapter, verse: v.start });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn results;\n\t\t\t}\n\t\t\tcase \"chapter_range\":\n\t\t\t\treturn [{\n\t\t\t\t\tis_range: true,\n\t\t\t\t\tstart : { book, chapter: cv.c1, verse: cv.v1 },\n\t\t\t\t\tend   : { book, chapter: cv.c2, verse: cv.v2 },\n\t\t\t\t}];\n\t\t}\n\t}\n\n\tconst pBibleRefSingle : P.Parser<BibleRef[]> = P.alt(\n\t\t// Ranges where both sides of - have a book name, for example:\n\t\t//\n\t\t// Eg:\n\t\t// - Genesis 1:1 - Genesis 5:1\n\t\t// - Genesis 1   - Genesis 5\n\t\t// - Genesis - Exodus\n\t\tP.seq(\n\t\t\tpBook,\n\t\t\tP.seq(pInt, pVerseSeparator.then(pInt).fallback(null)).fallback(null),\n\t\t\tpRangeSeparator,\n\t\t\tpBook,\n\t\t\t(pChapterVerseSpecifier.sepBy(pCommaSeparator)), // sepBy automatically falls back to []\n\t\t).chain(([b1, b1_extra, r, b2, b2_extra]) => {\n\t\t\tlet results : BibleRef[] = [];\n\n\t\t\tlet start = { book: b1, chapter: 1, verse: 1};\n\t\t\tif(b1_extra){\n\t\t\t\tlet [c1, v1] = b1_extra;\n\t\t\t\tstart.chapter = c1;\n\t\t\t\tif(v1 !== null) { start.verse = v1; }\n\t\t\t}\n\n\t\t\tlet end = {\n\t\t\t\tbook    : b2,\n\t\t\t\tchapter : versification.book[b2].chapters.length,\n\t\t\t\tverse   : 0\n\t\t\t};\n\t\t\tif(!b2_extra.length) {\n\t\t\t\tend.verse = versification.book[b2][end.chapter].verse_count;\n\t\t\t\tresults.push({ is_range: true, start, end });\n\t\t\t} else {\n\t\t\t\t// The first item in the cv_list needs special handling, since the pChapterVerseSpecifier\n\t\t\t\t// allows for ranges - which are NOT allowed here\n\t\t\t\t// After handling the head of the cv_list we can fallback to the standard chapterVerseSpeciferToBibleRef\n\t\t\t\tconst cv_first = b2_extra[0]!;\n\t\t\t\tswitch(cv_first.kind) {\n\t\t\t\tcase 'full_chapter':\n\t\t\t\t\tif(cv_first.range.end) {\n\t\t\t\t\t\t// This is a case like \"Gen 1 - Exo 2-3\" which makes no sense\n\t\t\t\t\t\treturn P.fail('Double range encountered');\n\t\t\t\t\t}\n\t\t\t\t\tend.chapter = cv_first.range.start;\n\t\t\t\t\tend.verse = versification.book[b2][end.chapter].verse_count;\n\t\t\t\t\tresults.push({ is_range: true, start, end });\n\n\t\t\t\t\t// consume head of cv_list fully!\n\t\t\t\t\tb2_extra.shift();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'verse':\n\t\t\t\t\tif(cv_first.verses[0].end) {\n\t\t\t\t\t\t// This is a case Like \"Gen 1 - Exo 2:3 - 4:5\" which makes no sense\n\t\t\t\t\t\treturn P.fail('Double range encountered');\n\t\t\t\t\t}\n\t\t\t\t\tend.chapter = cv_first.chapter;\n\t\t\t\t\tend.verse   = cv_first.verses[0].start;\n\t\t\t\t\tresults.push({ is_range: true, start, end });\n\t\t\t\t\t// consume only first item in verse list, reset\n\t\t\t\t\t// is processed as normal\n\t\t\t\t\tcv_first.verses.shift();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// this represents other range types\n\t\t\t\t\treturn P.fail('Double range encountered')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// consume extra items still left in cv_list\n\t\t\tfor(let cv of (b2_extra || [])) {\n\t\t\t\tresults = results.concat(chapterVerseSpecifierToBibleRef(b2, cv));\n\t\t\t}\n\t\t\treturn P.succeed(results);\n\t\t}),\n\n\t\t// Ranges within a single chapter\n\t\t// EG: Gen 5:12-14\n\t\tP.seqMap(\n\t\t\tpBook,\n\t\t\tpChapterVerseSpecifier.sepBy(pCommaSeparator),\n\t\t\t(book : string, cv_list : ChapterVerseSpecifier[]) => {\n\n\t\t\t\tif(cv_list.length == 0){\n\t\t\t\t\t// Then we just got a book name, no chapter/verse\n\t\t\t\t\tlet max_chapter : number = versification.book[book].chapters.length;\n\t\t\t\t\tlet max_verse   : number = versification.book[book][max_chapter].verse_count;\n\t\t\t\t\treturn [{\n\t\t\t\t\t\tis_range: true,\n\t\t\t\t\t\tstart : { book, chapter: 1, verse: 1 },\n\t\t\t\t\t\tend   : { book, chapter: max_chapter, verse: max_verse},\n\t\t\t\t\t}];\n\t\t\t\t}\n\n\t\t\t\tlet results : BibleRef[] = [];\n\t\t\t\tfor(let cv of cv_list){\n\t\t\t\t\tresults = results.concat(chapterVerseSpecifierToBibleRef(book, cv));\n\t\t\t\t}\n\t\t\t\treturn results;\n\t\t\t}\n\t\t),\n\n\t\t// A range of numbered books, eg, 1-2 Kings\n\t\t// These cannot have a cv specifier afterwards, IE: 1-2 Kings 3v4 doesn't make sense\n\t\tP.seq(\n\t\t\tpBookPrefixNumber,\n\t\t\tpRangeSeparator.then(pBookPrefixNumber),\n\t\t\tpAnySpace.then(P.letters)\n\t\t).chain(([ prefix_a, prefix_b, book ]: [ number, number, string ]) => {\n\t\t\tif(prefix_a === prefix_b) { return P.fail('Numbered book range must have different start to end'); }\n\n\t\t\tlet name_a = prefix_a + ' ' + book.toLowerCase();\n\t\t\tlet id_a = book_name_to_id[name_a];\n\t\t\tif(!id_a) { return P.fail(`Invalid book name: ${prefix_a} ${book.toLowerCase()}`); }\n\n\t\t\tlet name_b = prefix_b + ' ' + book.toLowerCase();\n\t\t\tlet id_b = book_name_to_id[name_b];\n\t\t\tif(!id_b) { return P.fail(`Invalid book name: ${prefix_b} ${book.toLowerCase()}`); }\n\n\t\t\treturn P.succeed(_makeBookRange(versification, id_a, id_b));\n\t\t}),\n\n\t\t// A named range alias from the versification, eg \"Old Testament\"\n\t\t// As with numbered book ranges, these cannot have a cv specifier\n\t\tpRangeAlias,\n\t);\n\n\tconst pBibleRef : P.Parser<BibleRef[]> = pBibleRefSingle\n\t\t.sepBy1(pAnySpace.then(P.oneOf(';_,')).then(pAnySpace))\n\t\t.map((list) => list.reduce((acc, x) => acc.concat(x), []));\n\n\treturn {\n\t\tBook     : pBook,\n\t\tBibleRef : pBibleRef,\n\t}\n}\n\nexport const DefaultParsers = buildParsers();\nexport default DefaultParsers;\n", "/**\n * Specialized version of parser designed to much more rapidly parse url encoded verse refs\n */\n\nimport { BibleRef, BibleRefLibData } from './BibleRef';\nimport { makeRange } from './range-manip';\n\n/**\n * Function to parse data written using [[format]] with the 'url' preset\n * This operates ~20x faster than the generic parser and guarantied to produce the\n * exact same output as standard [[parseOrThrow]] on good input. Behaviour is undefined\n * on bad input - some checks are omitted for increased performance which may cause\n * this function to return garbage output when [[parseOrThrow]] would have thrown\n *\n * For reference, a 5.5kb url-encoded [[BibleRef]] string takes 1.5ms to parse with\n * this function, or 30ms to parse with the generic parser.\n * The equivalent JSON representation of the data is 72kb, but can be parsed\n * in ~0.7ms using the native JSON.parse function\n */\nexport function parseUrlEncoded(this: BibleRefLibData, raw: string): BibleRef[] {\n\tconst BKS = this.versification.book;\n\tlet results : BibleRef[] = [];\n\n\t// variables to store context of the book/chapter for ranges/comma lists\n\tlet book    : string | null = null;\n\tlet chapter : number | null = null;\n\n\t// queues of values and placeholders being processed\n\t// we only emit values to results once the sequence of\n\t// seperators is unambigious\n\t// eg 1v2-3\n\t// (sequence seperator v-) is ambigious since\n\t// it could be:\n\t// - chapter 1v2-3\n\t// - chapter 1v2, chapter 3v(next item to read)\n\t// seps is a string so we can compare whole list in one go ('v-' == seps rather than seps[0] === 'v' && ...)\n\tlet nums : number[] = [];\n\tlet seps : string   = '';\n\n\t// next char index of 'raw' to process\n\tlet idx = 0;\n\n\tfunction consumeInt() : number | null {\n\t\t// in testing, using the built in parseInt and substring\n\t\t// is faster than iterating character by character and builing our own int\n\t\tlet out = parseInt(raw.substring(idx));\n\t\tif(out) {\n\t\t\tidx += `${out}`.length;\n\t\t\treturn out;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\tconst mkR = makeRange.bind(this);\n\n\ttop: while(idx < raw.length) {\n\t\t// parse book name\n\t\tlet book = raw.substring(idx, idx+3).toUpperCase();\n\t\tidx += 3;\n\t\tif(!BKS[book]) {\n\t\t\tthrow new Error('Failed to parse url BibleRef, wanted book id, got: ' + book);\n\t\t}\n\n\t\t// clear out existing context for the new book\n\t\tchapter = null;\n\n\t\t// restart loop immediately if we've reached end of block\n\t\tif((raw.charAt(idx) || '_') === '_') {\n\t\t\t++idx;\n\t\t\tresults.push(mkR(book));\n\t\t\tcontinue top;\n\t\t}\n\n\t\t// this disambiugates parsing cross-range book like 1ki-2ki where\n\t\t// the first char after range looks like an int!\n\t\tif(raw.charAt(idx) === '-') {\n\t\t\t++idx;\n\t\t\tseps = '-';\n\t\t}\n\n\t\tparseChapterVerse: while(true) {\n\n\t\t\tif(seps === '-') {\n\t\t\t\tlet book2 = raw.substring(idx, idx+3).toUpperCase();\n\t\t\t\tif(BKS[book2]) {\n\t\t\t\t\t// this is a cross book range!\n\t\t\t\t\tidx+=3;\n\n\t\t\t\t\t// we need to parse optional chapter and verse number, but we\n\t\t\t\t\t// don't allow any continuation after them, so this is simple\n\t\t\t\t\t// (eg, gen1v2-exo3v4,5 is invalid)\n\t\t\t\t\tlet start : BibleRef = chapter ? { book, chapter: chapter, verse: nums.shift()! } : { book, chapter: nums.shift() || 1, verse: 1 };\n\n\t\t\t\t\t//console.log(\"About to parse cross-book range closer cv spec: \" + raw.substring(idx));\n\t\t\t\t\tlet chapter2 = consumeInt();\n\n\t\t\t\t\tlet end : BibleRef = chapter2 ? mkR(book2, chapter2).end : mkR(book2).end;\n\t\t\t\t\tif(chapter2 && raw.charAt(idx) === 'v') {\n\t\t\t\t\t\t++idx;\n\t\t\t\t\t\tend.verse = consumeInt()!;\n\t\t\t\t\t\tif(!end.verse) {\n\t\t\t\t\t\t\tthrow new Error(\"Expected integer after 'v' seperator in closing cross-book range\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (raw.charAt(idx) === '_') { ++idx; }\n\t\t\t\t\tseps = '';\n\t\t\t\t\tresults.push({ is_range: true, start, end });\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// on each iteration of the loop we consider one more number and following seperator\n\t\t\t// _ is used as seperator to reset to top:\n\t\t\t// hence if idx is beyond end of raw, we use _ instead of the returned empty string\n\t\t\tnums.push(consumeInt()!);\n\t\t\tlet nextSep = (raw.charAt(idx++) || '_');\n\n\t\t\t//console.dir({ seps, nextSep, rest: raw.substring(idx), nums });\n\n\t\t\t// try and consume the head of the nums/seps lists\n\t\t\t// only doing so if the sequence of seperators so far is unambigious\n\t\t\t// eg, gen1v3-5 (IE: seperators 'v-') is ambigious, since it could be\n\t\t\t// - chapter 1 v 3-5\n\t\t\t// - chapter 1v3 - 5v(?? to read next ??)\n\t\t\tif(seps === '' && nextSep === 'v') {\n\t\t\t\t// if first sep in a region is a v, the just update the current chapter\n\t\t\t\t// context but emit nothing\n\t\t\t\tchapter = nums.shift()!;\n\t\t\t\tcontinue parseChapterVerse;\n\t\t\t}\n\n\t\t\t// if we're closing a region then try and emit data\n\t\t\tif(nextSep === ',' || nextSep === '_') {\n\t\t\t\tswitch(seps) {\n\t\t\t\tcase '': // gen1 or gen1v1\n\t\t\t\t\tresults.push(chapter ? { book, chapter, verse: nums.shift()! } : mkR(book, nums.shift()!) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '-':\n\t\t\t\t\tif(chapter) { // gen1v2-3,\n\t\t\t\t\t\tresults.push({ is_range: true, start: { book, chapter, verse: nums.shift()! }, end: { book, chapter, verse: nums.shift()! }});\n\t\t\t\t\t} else { // gen1-2,\n\t\t\t\t\t\tresults.push({ is_range: true, start: { book, chapter: nums.shift()!, verse: 1}, end: mkR(book, nums.shift()!).end});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase '-v':\n\t\t\t\t\t// this could either be gen1v2-3v4 or gen1-2v3 depending on if the\n\t\t\t\t\t// chapter variable is set\n\t\t\t\t\t// The later is invalid input, so in the spirit of being fast on good\n\t\t\t\t\t// input, we don't bother checking!\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tis_range: true,\n\t\t\t\t\t\tstart: { book, chapter: chapter!, verse: nums.shift()! },\n\t\t\t\t\t\tend: { book, chapter: nums.shift()!, verse: nums.shift()! }\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tseps += nextSep;\n\t\t\t\t\tif(seps.length > 2) {\n\t\t\t\t\t\tthrow new Error('Invalid bible ref url input');\n\t\t\t\t\t}\n\t\t\t\t\tcontinue parseChapterVerse;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tseps += nextSep;\n\t\t\t\tcontinue parseChapterVerse;\n\t\t\t}\n\n\t\t\t// if still going, we must have emitted some data...\n\t\t\tseps = '';\n\t\t\tif(nextSep === '_') { continue top; }\n\t\t}\n\t}\n\n\treturn results;\n}\n", "/**\n * Pulls together all the modules into single coherent API of the library\n */\n\nimport { BibleRef, BibleVerse, BibleRange, BibleRefLibData } from './BibleRef';\nimport { Parsers, DefaultParsers, ParseResult, buildParsers } from './parser';\nimport { parseUrlEncoded }      from './parser-url';\nimport * as Printer             from './printer';\nimport VERSIFICATION            from './Versification';\nimport * as Vidx                from './vidx';\nimport * as Validate            from './validate';\nimport * as RangeManip          from './range-manip';\nimport * as Geometry            from './geometry';\n\nimport { Versification        } from './Versification';\nimport { FormatArg            } from './printer';\nimport { ValidationError      } from './validate';\nimport { RangeManipFunctions  } from './range-manip';\nimport { GeometryFunctions    } from './geometry';\n\n/**\n * Publically exposed interface to this library\n */\nexport interface BibleRefLib extends BibleRefLibData, RangeManipFunctions, GeometryFunctions {\n\tparse(str: string) : ParseResult;\n\tparseOrThrow(str: string) : BibleRef[];\n\tparseUrlEncoded(this: BibleRefLib, str: string): BibleRef[];\n\tparseBookName(this: BibleRefLib, str: string) : string | null;\n\tformat(b : BibleRef | BibleRef[], opts?: FormatArg) : string;\n\tsort(refs : BibleRef[]) : BibleRef[];\n\ttoVidx(verse: BibleVerse) : number;\n\tfromVidx(vidx : number) : BibleVerse;\n\tfirstNVerses(refs : BibleRef | BibleRef[], n : number) : BibleRef[];\n\tcountVerses(refs : BibleRef | BibleRef[]) : number;\n\tvalidate(refs: BibleRef | BibleRef[], include_warnings?: boolean) : ValidationError[];\n\trepair(ref: BibleRef, include_warnings?: boolean) : BibleRef;\n\t_parsers: Parsers;\n};\n\n/**\n * Parses a string which may (or may not) represent a [[BibleRef]]\n * and returns a [[ParseResult]] representing whether the parse was successful,\n * and if so what value was obtained.\n *\n * Examples of valid input strings include:\n *\n * Book references (returns (list of) range(s) representing entire book):\n * - Genesis\n * - Gen\n * - GEN\n * - Genesis; Revelation\n *\n * Chapter references (returns (list of) range(s) representing entire chapters):\n * - Genesis 1\n * - GEN1\n * - Genesis 1; Exodus 2; REV1\n *\n * Verse References (represents a single verse):\n * - Genesis 1:1\n * - Gen 1v1\n * - GEN1.1\n *\n * Verse Ranges (continous blocks of verses, can cross chapter/book boundaries):\n * - Genesis 1:1-4\n * - Genesis 1:1 - 2:2\n * - Genesis 50 - Exodus 2\n *\n * Complex sets/combinations:\n * - Genesis 1:1, 2-4, 6\n * - GEN1.1-2; EXO3:4 - DEU5v6,10; Revelation 22\n *\n * @public\n * @param this - Instance of [[BibleRefLib]] (includes the versification to use)\n * @param str  - The string to parse\n */\nfunction parse(this: BibleRefLib, str: string) : ParseResult {\n\tlet result = this._parsers.BibleRef.parse(str);\n\tif(result.status === false){\n\t\treturn { ...result, input: str };\n\t}\n\treturn result;\n}\n\n/**\n * As with [[parse]], but throws error if the input string is not a valid representation\n * of a [[BibleRef]]\n *\n * If the input string is known to be in syntax as written by [[format]] function\n * using the 'url' preset, [[parseUrlEncoded]] is equivalent to this function\n * but runs ~20x faster\n *\n * @public\n * @param this - Instance of [[BibleRefLib]] (includes the versification to use)\n * @param str  - The string to parse\n */\nfunction parseOrThrow(this: BibleRefLib, str: string) : BibleRef[]{\n\tlet result = this.parse(str);\n\tif(result.status === true){ return result.value; }\n\tthrow result;\n}\n\n/**\n * Parses the name of a book and returns either a string containing the USFM book id\n * or `null` if the book name was not recognised\n *\n * @public\n * @param this - Instance of [[BibleRefLib]] (includes the versification to use)\n * @param str  - The string to parse\n */\nfunction parseBookName(this: BibleRefLib, str: string) : string | null {\n\tlet result = this._parsers.Book.parse(str);\n\tif(result.status === true){\n\t\treturn result.value;\n\t} else {\n\t\treturn null;\n\t}\n}\n\n/**\n * Converts a JSON [[BibleRef]] (or array thereof) into a human readable string\n *\n * The output format is fairly flexible, see [[FormatArg]] for details\n */\nfunction format(this: BibleRefLib, b : BibleRef | BibleRef[], opts?: FormatArg) : string{\n\tif('length' in b){\n\t\treturn Printer.formatBibleRefList(this.versification, b, opts);\n\t}\n\n\tif(b.is_range){\n\t\treturn Printer.formatBibleRange(this.versification, b, opts);\n\t} else {\n\t\treturn Printer.formatBibleVerse(this.versification, b, opts);\n\t}\n}\n\n/**\n * Takes an array of [[BibleRef]] instances and sorts them into\n * order as per the versification scheme in use, from the BibleRef\n * which appears first, to the one which apears last\n *\n * @note [[BibleRanges]] are compared based on their `start` value\n */\nfunction sort(this: BibleRefLib, refs: BibleRef[]) : BibleRef[] {\n\treturn refs.sort((a : BibleRef, b : BibleRef) => {\n\t\tlet start = a.is_range ? a.start : a;\n\t\tlet end   = b.is_range ? b.start : b;\n\t\tlet va = Vidx.toVidx(this.versification, start);\n\t\tlet vb = Vidx.toVidx(this.versification, end);\n\n\t\tif(va == vb){\n\t\t\tif( a.is_range && !b.is_range){ return  1; }\n\t\t\tif(!a.is_range &&  b.is_range){ return -1; }\n\t\t\treturn 0;\n\t\t}\n\t\treturn va - vb;\n\t});\n}\n\n/**\n * Converts a [[BibleVerse]] into a \"Verse Index\", IE: number between 0 and ~33K\n * Where 0 is the first verse of the Bible, and max value is the last verse of the Bible\n */\nfunction toVidx(this: BibleRefLib, verse : BibleVerse): number {\n\treturn Vidx.toVidx(this.versification, verse);\n}\n\n/**\n * Converts a \"Verse Index\" produced by [[toVidex]] back into a JSON [[BibleVerse]]\n *\n * @note You should ensure the versification scheme used is the same in both directions, else\n * unexpected results are likely to occur\n */\nfunction fromVidx(this: BibleRefLib, vidx : number): BibleVerse {\n\treturn Vidx.fromVidx(this.versification, vidx);;\n}\n\n/**\n * Given a [[BibleRef]] instance, or array thereof, returns a new array of [[BibleRef]] instances\n * which contains at most `n` verses. The final [[BibleRange]] in input list may be split if its\n * length is too great\n *\n * @param refs - List of references to consider\n * @param n    - Maximum number of verses to include in output set\n *\n * @note This is a no-op if `countVerses(refs) < n`\n */\nfunction firstNVerses(this: BibleRefLib, refs: BibleRef | BibleRef[], n : number) : BibleRef[] {\n\tlet data : BibleRef[] = 'length' in refs ? refs : [refs];\n\treturn Vidx.firstNVerses(this.versification, data, n);\n}\n\n/**\n * Computes the total number of verses in the input [[BibleRef]] (or list thereof)\n */\nfunction countVerses(this: BibleRefLib, refs: BibleRef | BibleRef[]) : number {\n\tif('length' in refs){\n\t\treturn refs\n\t\t\t.map((r) => Vidx.countVerses(this.versification, r))\n\t\t\t.reduce((acc, x) => acc + x, 0);\n\t} else {\n\t\treturn Vidx.countVerses(this.versification, refs);\n\t}\n}\n\n/**\n * Checks for issues with a [[BibleRef]] JSON object, such as the chapter or verse count\n * being out of bounds\n */\nfunction validate(this: BibleRefLib,\n\t\t\t\t\t\t\t\t\trefs: BibleRef | BibleRef[],\n\t\t\t\t\t\t\t\t\tinclude_warnings?: boolean) {\n\tif('length' in refs){\n\t\treturn refs\n\t\t\t.map((r) => Validate.validate(this.versification, r, include_warnings))\n\t\t\t.reduce((acc, x) => acc.concat(x), []);\n\t} else {\n\t\treturn Validate.validate(this.versification, refs, include_warnings);\n\t}\n}\n\n/**\n * Attempts to fix issues identified by [[Validate]], for example by reducing the verse/chapter\n * number if it is too high\n */\nfunction repair(this: BibleRefLib, ref: BibleRef, include_warnings?: boolean) : BibleRef {\n\treturn Validate.repair(this.versification, ref, include_warnings);\n}\n\n/**\n * Constructor interface\n *\n * We are using a hybrid interface to this lib, you can just require(lib)\n * and call function such as parse, parseOrThrow, etc - or you can construct a\n * new instance with a non standard versification scheme and then call methods\n * of that\n */\ntype BibleRefLibConstructor =\t(v: Versification) => BibleRefLib;\n\nconst AwokenRef : BibleRefLib & BibleRefLibConstructor = function(this: BibleRefLib, v: Versification) : BibleRefLib {\n\tthis.versification         = v;\n\tthis._parsers              = buildParsers(v);\n\tthis.parse                 = parse;\n\tthis.parseOrThrow          = parseOrThrow;\n\tthis.parseUrlEncoded       = parseUrlEncoded;\n\tthis.format                = format;\n\tthis.sort                  = sort;\n\tthis.toVidx                = toVidx;\n\tthis.fromVidx              = fromVidx;\n\tthis.firstNVerses          = firstNVerses;\n\tthis.countVerses           = countVerses;\n\tthis.validate              = validate;\n\tthis.repair                = repair;\n\tthis.makeRange             = RangeManip.makeRange;\n\tthis.makeBookRange         = RangeManip.makeBookRange;\n\tthis.splitByBook           = RangeManip.splitByBook;\n\tthis.splitByChapter        = RangeManip.splitByChapter;\n\tthis.splitByVerse          = RangeManip.splitByVerse;\n\tthis.groupByBook           = RangeManip.groupByBook;\n\tthis.groupByChapter        = RangeManip.groupByChapter;\n\tthis.groupByLevel          = RangeManip.groupByLevel;\n\tthis.iterateByBook         = RangeManip.iterateByBook;\n\tthis.iterateByChapter      = RangeManip.iterateByChapter;\n\tthis.iterateByVerse        = RangeManip.iterateByVerse;\n\tthis.nextVerse             = RangeManip.nextVerse;\n\tthis.previousVerse         = RangeManip.previousVerse;\n\tthis.nextChapter           = RangeManip.nextChapter;\n\tthis.previousChapter       = RangeManip.previousChapter;\n\tthis.nextBook              = RangeManip.nextBook;\n\tthis.previousBook          = RangeManip.previousBook;\n\tthis.createIntersectionSet = Geometry.createIntersectionSet;\n\tthis.combineRanges         = Geometry.combineRanges;\n\tthis.getIntersection       = Geometry.getIntersection;\n\tthis.intersects            = Geometry.intersects;\n\tthis.getUnion              = Geometry.getUnion;\n\tthis.getDifference         = Geometry.getDifference;\n\tthis.contains              = Geometry.contains;\n\tthis.indexOf               = Geometry.indexOf;\n\tthis.verseAtIndex          = Geometry.verseAtIndex;\n\treturn this;\n};\n\n// Allow calling of all methods statically, with the default Versification scheme used\nAwokenRef.versification         = VERSIFICATION;\nAwokenRef._parsers              = DefaultParsers;\nAwokenRef.parse                 = parse.bind(AwokenRef);\nAwokenRef.parseOrThrow          = parseOrThrow.bind(AwokenRef);\nAwokenRef.parseUrlEncoded       = parseUrlEncoded.bind(AwokenRef);\nAwokenRef.parseBookName         = parseBookName.bind(AwokenRef);\nAwokenRef.format                = format.bind(AwokenRef);\nAwokenRef.sort                  = sort.bind(AwokenRef);\nAwokenRef.toVidx                = toVidx.bind(AwokenRef);\nAwokenRef.fromVidx              = fromVidx.bind(AwokenRef);\nAwokenRef.firstNVerses          = firstNVerses.bind(AwokenRef);\nAwokenRef.countVerses           = countVerses.bind(AwokenRef);\nAwokenRef.validate              = validate.bind(AwokenRef);\nAwokenRef.repair                = repair.bind(AwokenRef);\nAwokenRef.makeRange             = RangeManip.makeRange.bind(AwokenRef);\nAwokenRef.makeBookRange         = RangeManip.makeBookRange.bind(AwokenRef);\nAwokenRef.splitByBook           = RangeManip.splitByBook.bind(AwokenRef);\nAwokenRef.splitByChapter        = RangeManip.splitByChapter.bind(AwokenRef);\nAwokenRef.splitByVerse          = RangeManip.splitByVerse.bind(AwokenRef);\nAwokenRef.iterateByBook         = RangeManip.iterateByBook.bind(AwokenRef);\nAwokenRef.iterateByChapter      = RangeManip.iterateByChapter.bind(AwokenRef);\nAwokenRef.iterateByVerse        = RangeManip.iterateByVerse.bind(AwokenRef);\nAwokenRef.groupByBook           = RangeManip.groupByBook.bind(AwokenRef);\nAwokenRef.groupByChapter        = RangeManip.groupByChapter.bind(AwokenRef);\nAwokenRef.groupByLevel          = RangeManip.groupByLevel.bind(AwokenRef);\nAwokenRef.nextVerse             = RangeManip.nextVerse.bind(AwokenRef);\nAwokenRef.previousVerse         = RangeManip.previousVerse.bind(AwokenRef);\nAwokenRef.nextChapter           = RangeManip.nextChapter.bind(AwokenRef);\nAwokenRef.previousChapter       = RangeManip.previousChapter.bind(AwokenRef);\nAwokenRef.nextBook              = RangeManip.nextBook.bind(AwokenRef);\nAwokenRef.previousBook          = RangeManip.previousBook.bind(AwokenRef);\nAwokenRef.isFullBook            = RangeManip.isFullBook.bind(AwokenRef);\nAwokenRef.isFullChapter         = RangeManip.isFullChapter.bind(AwokenRef);\nAwokenRef.combineRanges         = Geometry.combineRanges.bind(AwokenRef);\nAwokenRef.createIntersectionSet = Geometry.createIntersectionSet.bind(AwokenRef);\nAwokenRef.getIntersection       = Geometry.getIntersection.bind(AwokenRef);\nAwokenRef.intersects            = Geometry.intersects.bind(AwokenRef);\nAwokenRef.getUnion              = Geometry.getUnion.bind(AwokenRef);\nAwokenRef.getDifference         = Geometry.getDifference.bind(AwokenRef);\nAwokenRef.contains              = Geometry.contains.bind(AwokenRef);\nAwokenRef.indexOf               = Geometry.indexOf.bind(AwokenRef);\nAwokenRef.verseAtIndex          = Geometry.verseAtIndex.bind(AwokenRef);\n\nexport default AwokenRef;\nexport { AwokenRef };\n", "/**\n * Main file representing the full API of the library\n *\n * This file is used by the esmodule build to include extra public typescript\n * type definitions. These are not used by browser, and hence are seperated\n * from the main \"library\" in ./lib\n */\n\n/**\n * Export types which should be visible to users of the library\n */\nexport { BibleRef, BibleVerse, BibleRange }       from './BibleRef';\nexport { Versification, createVersification  }    from './Versification';\nexport { FormatOptions, FormatArg  }              from './printer';\nexport { ValidationError }                        from './validate';\nexport { RefsByBook, RefsByChapter, RefsByLevel } from './range-manip';\n\nimport AwokenRef from './lib';\nexport default AwokenRef;\nexport { AwokenRef };\n"],
  "mappings": "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",
  "names": ["arr", "index", "string", "j", "key", "times", "end", "v", "P", "P", "book", "book2", "toVidx", "fromVidx", "firstNVerses", "countVerses", "validate", "repair"]
}
