{
  "version": 3,
  "sources": ["../src/index.ts", "../src/lib/parsers/parse-shp.ts", "../src/lib/streaming/binary-chunk-reader.ts", "../src/lib/parsers/parse-shp-header.ts", "../src/lib/parsers/parse-shp-geometry.ts", "../src/shp-loader.ts", "../src/lib/parsers/parse-shapefile.ts", "../src/lib/parsers/parse-shx.ts", "../src/lib/streaming/zip-batch-iterators.ts", "../src/lib/parsers/parse-dbf.ts", "../src/dbf-loader.ts", "../src/shapefile-loader.ts", "../src/lib/parsers/parse-dbf-to-arrow.ts", "../src/dbf-format.ts", "../src/dbf-arrow-loader.ts", "../src/lib/streaming/binary-reader.ts"],
  "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport type {ShapefileLoaderOptions} from './shapefile-loader';\nexport {ShapefileLoader} from './shapefile-loader';\n\nexport type {DBFLoaderOptions} from './dbf-loader';\nexport {DBFLoader, DBFWorkerLoader} from './dbf-loader';\nexport {DBFArrowLoader, DBFArrowWorkerLoader} from './dbf-arrow-loader';\n\nexport type {SHPLoaderOptions} from './shp-loader';\nexport {SHPLoader, SHPWorkerLoader} from './shp-loader';\n\n// EXPERIMENTAL\nexport {BinaryReader as _BinaryReader} from './lib/streaming/binary-reader';\nexport {BinaryChunkReader as _BinaryChunkReader} from './lib/streaming/binary-chunk-reader';\nexport {zipBatchIterators as _zipBatchIterators} from './lib/streaming/zip-batch-iterators';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {BinaryGeometry} from '@loaders.gl/schema';\nimport {toArrayBufferIterator} from '@loaders.gl/loader-utils';\nimport {BinaryChunkReader} from '../streaming/binary-chunk-reader';\nimport {parseSHPHeader, SHPHeader} from './parse-shp-header';\nimport {parseRecord} from './parse-shp-geometry';\nimport {SHPLoaderOptions} from './types';\n\nconst LITTLE_ENDIAN = true;\nconst BIG_ENDIAN = false;\n\nconst SHP_HEADER_SIZE = 100;\n// According to the spec, the record header is just 8 bytes, but here we set it\n// to 12 so that we can also access the record's type\nconst SHP_RECORD_HEADER_SIZE = 12;\n\nconst STATE = {\n  EXPECTING_HEADER: 0,\n  EXPECTING_RECORD: 1,\n  END: 2,\n  ERROR: 3\n};\n\ntype SHPResult = {\n  geometries: (BinaryGeometry | null)[];\n  header?: SHPHeader;\n  error?: string;\n  progress: {\n    bytesUsed: number;\n    bytesTotal: number;\n    rows: number;\n  };\n  currentIndex: number;\n};\n\nclass SHPParser {\n  options?: SHPLoaderOptions = {};\n  binaryReader = new BinaryChunkReader({maxRewindBytes: SHP_RECORD_HEADER_SIZE});\n  state = STATE.EXPECTING_HEADER;\n  result: SHPResult = {\n    geometries: [],\n    // Initialize with number values to make TS happy\n    // These are initialized for real in STATE.EXPECTING_HEADER\n    progress: {\n      bytesTotal: NaN,\n      bytesUsed: NaN,\n      rows: NaN\n    },\n    currentIndex: NaN\n  };\n\n  constructor(options?: SHPLoaderOptions) {\n    this.options = options;\n  }\n\n  write(arrayBuffer: ArrayBuffer) {\n    this.binaryReader.write(arrayBuffer);\n    this.state = parseState(this.state, this.result, this.binaryReader, this.options);\n  }\n\n  end() {\n    this.binaryReader.end();\n    this.state = parseState(this.state, this.result, this.binaryReader, this.options);\n    // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n    if (this.state !== STATE.END) {\n      this.state = STATE.ERROR;\n      this.result.error = 'SHP incomplete file';\n    }\n  }\n}\n\nexport function parseSHP(arrayBuffer: ArrayBuffer, options?: SHPLoaderOptions): BinaryGeometry[] {\n  const shpParser = new SHPParser(options);\n  shpParser.write(arrayBuffer);\n  shpParser.end();\n\n  // @ts-ignore\n  return shpParser.result;\n}\n\n/**\n * @param asyncIterator\n * @param options\n * @returns\n */\nexport async function* parseSHPInBatches(\n  asyncIterator:\n    | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n    | Iterable<ArrayBufferLike | ArrayBufferView>,\n  options?: SHPLoaderOptions\n): AsyncGenerator<BinaryGeometry | object> {\n  const parser = new SHPParser(options);\n  let headerReturned = false;\n  for await (const arrayBuffer of toArrayBufferIterator(asyncIterator)) {\n    parser.write(arrayBuffer);\n    if (!headerReturned && parser.result.header) {\n      headerReturned = true;\n      yield parser.result.header;\n    }\n\n    if (parser.result.geometries.length > 0) {\n      yield parser.result.geometries;\n      parser.result.geometries = [];\n    }\n  }\n  parser.end();\n  if (parser.result.geometries.length > 0) {\n    yield parser.result.geometries;\n  }\n\n  return;\n}\n\n/**\n * State-machine parser for SHP data\n *\n * Note that whenever more data is needed, a `return`, not a `break`, is\n * necessary, as the `break` keeps the context within `parseState`, while\n * `return` releases context so that more data can be written into the\n * BinaryChunkReader.\n *\n * @param  state Current state\n * @param  result An object to hold result data\n * @param  binaryReader\n * @return State at end of current parsing\n */\n/* eslint-disable complexity, max-depth */\nfunction parseState(\n  state: number,\n  result: SHPResult,\n  binaryReader: BinaryChunkReader,\n  options?: SHPLoaderOptions\n): number {\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    try {\n      switch (state) {\n        case STATE.ERROR:\n        case STATE.END:\n          return state;\n\n        case STATE.EXPECTING_HEADER:\n          // Parse initial file header\n          const dataView = binaryReader.getDataView(SHP_HEADER_SIZE);\n          if (!dataView) {\n            return state;\n          }\n\n          result.header = parseSHPHeader(dataView);\n          result.progress = {\n            bytesUsed: 0,\n            bytesTotal: result.header.length,\n            rows: 0\n          };\n          // index numbering starts at 1\n          result.currentIndex = 1;\n          state = STATE.EXPECTING_RECORD;\n          break;\n\n        case STATE.EXPECTING_RECORD:\n          while (binaryReader.hasAvailableBytes(SHP_RECORD_HEADER_SIZE)) {\n            const recordHeaderView = binaryReader.getDataView(SHP_RECORD_HEADER_SIZE) as DataView;\n            const recordHeader = {\n              recordNumber: recordHeaderView.getInt32(0, BIG_ENDIAN),\n              // 2 byte words; includes the four words of record header\n              byteLength: recordHeaderView.getInt32(4, BIG_ENDIAN) * 2,\n              // This is actually part of the record, not the header...\n              type: recordHeaderView.getInt32(8, LITTLE_ENDIAN)\n            };\n\n            if (!binaryReader.hasAvailableBytes(recordHeader.byteLength - 4)) {\n              binaryReader.rewind(SHP_RECORD_HEADER_SIZE);\n              return state;\n            }\n\n            const invalidRecord =\n              recordHeader.byteLength < 4 ||\n              recordHeader.type !== result.header?.type ||\n              recordHeader.recordNumber !== result.currentIndex;\n\n            // All records must have at least four bytes (for the record shape type)\n            if (invalidRecord) {\n              // Malformed record, try again, advancing just 4 bytes\n              // Note: this is a rewind because binaryReader.getDataView above\n              // moved the pointer forward 12 bytes, so rewinding 8 bytes still\n              // leaves us 4 bytes ahead\n              binaryReader.rewind(SHP_RECORD_HEADER_SIZE - 4);\n            } else {\n              // Note: type is actually part of the record, not the header, so\n              // rewind 4 bytes before reading record\n              binaryReader.rewind(4);\n\n              const recordView = binaryReader.getDataView(recordHeader.byteLength) as DataView;\n              const geometry = parseRecord(recordView, options);\n              result.geometries.push(geometry);\n\n              result.currentIndex++;\n              result.progress.rows = result.currentIndex - 1;\n            }\n          }\n\n          if (binaryReader.ended) {\n            state = STATE.END;\n          }\n\n          return state;\n\n        default:\n          state = STATE.ERROR;\n          result.error = `illegal parser state ${state}`;\n          return state;\n      }\n    } catch (error) {\n      state = STATE.ERROR;\n      result.error = `SHP parsing failed: ${(error as Error)?.message}`;\n      return state;\n    }\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport type BinaryChunkReaderOptions = {\n  maxRewindBytes: number;\n};\n\nexport class BinaryChunkReader {\n  offset: number;\n  arrayBuffers: ArrayBuffer[];\n  ended: boolean;\n  maxRewindBytes: number;\n\n  constructor(options?: BinaryChunkReaderOptions) {\n    const {maxRewindBytes = 0} = options || {};\n\n    /** current global offset into current array buffer*/\n    this.offset = 0;\n    /** current buffer from iterator */\n    this.arrayBuffers = [];\n    this.ended = false;\n\n    /** bytes behind offset to hold on to */\n    this.maxRewindBytes = maxRewindBytes;\n  }\n  /**\n   * @param arrayBuffer\n   */\n  write(arrayBuffer: ArrayBuffer): void {\n    this.arrayBuffers.push(arrayBuffer);\n  }\n\n  end(): void {\n    this.arrayBuffers = [];\n    this.ended = true;\n  }\n\n  /**\n   * Has enough bytes available in array buffers\n   *\n   * @param bytes Number of bytes\n   * @return boolean\n   */\n  hasAvailableBytes(bytes: number): boolean {\n    let bytesAvailable = -this.offset;\n    for (const arrayBuffer of this.arrayBuffers) {\n      bytesAvailable += arrayBuffer.byteLength;\n      if (bytesAvailable >= bytes) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Find offsets of byte ranges within this.arrayBuffers\n   *\n   * @param  bytes Byte length to read\n   * @return Arrays with byte ranges pointing to this.arrayBuffers, Output type is nested array, e.g. [ [0, [1, 2]], ...]\n   */\n  findBufferOffsets(bytes: number): any[] | null {\n    let offset = -this.offset;\n    const selectedBuffers: any = [];\n\n    for (let i = 0; i < this.arrayBuffers.length; i++) {\n      const buf = this.arrayBuffers[i];\n\n      // Current buffer isn't long enough to reach global offset\n      if (offset + buf.byteLength <= 0) {\n        offset += buf.byteLength;\n        // eslint-disable-next-line no-continue\n        continue;\n      }\n\n      // Find start/end offsets for this buffer\n      // When offset < 0, need to skip over Math.abs(offset) bytes\n      // When offset > 0, implies bytes in previous buffer, start at 0\n      const start = offset <= 0 ? Math.abs(offset) : 0;\n      let end: number;\n\n      // Length of requested bytes is contained in current buffer\n      if (start + bytes <= buf.byteLength) {\n        end = start + bytes;\n        selectedBuffers.push([i, [start, end]]);\n        return selectedBuffers;\n      }\n\n      // Will need to look into next buffer\n      end = buf.byteLength;\n      selectedBuffers.push([i, [start, end]]);\n\n      // Need to read fewer bytes in next iter\n      bytes -= buf.byteLength - start;\n      offset += buf.byteLength;\n    }\n\n    // Should only finish loop if exhausted all arrays\n    return null;\n  }\n\n  /**\n   * Get the required number of bytes from the iterator\n   *\n   * @param bytes Number of bytes\n   * @return DataView with data\n   */\n  getDataView(bytes: number): DataView | null {\n    const bufferOffsets = this.findBufferOffsets(bytes);\n    // return `null` if not enough data, except if end() already called, in\n    // which case throw an error.\n    if (!bufferOffsets && this.ended) {\n      throw new Error('binary data exhausted');\n    }\n\n    if (!bufferOffsets) {\n      return null;\n    }\n\n    // If only one arrayBuffer needed, return DataView directly\n    if (bufferOffsets.length === 1) {\n      const [bufferIndex, [start, end]] = bufferOffsets[0];\n      const arrayBuffer = this.arrayBuffers[bufferIndex];\n      const view = new DataView(arrayBuffer, start, end - start);\n\n      this.offset += bytes;\n      this.disposeBuffers();\n      return view;\n    }\n\n    // Concatenate portions of multiple ArrayBuffers\n    const view = new DataView(this._combineArrayBuffers(bufferOffsets));\n    this.offset += bytes;\n    this.disposeBuffers();\n    return view;\n  }\n\n  /**\n   * Dispose of old array buffers\n   */\n  disposeBuffers(): void {\n    while (\n      this.arrayBuffers.length > 0 &&\n      this.offset - this.maxRewindBytes >= this.arrayBuffers[0].byteLength\n    ) {\n      this.offset -= this.arrayBuffers[0].byteLength;\n      this.arrayBuffers.shift();\n    }\n  }\n\n  /**\n   * Copy multiple ArrayBuffers into one contiguous ArrayBuffer\n   *\n   * In contrast to concatenateArrayBuffers, this only copies the necessary\n   * portions of the source arrays, rather than first copying the entire arrays\n   * then taking a part of them.\n   *\n   * @param bufferOffsets List of internal array offsets\n   * @return New contiguous ArrayBuffer\n   */\n  _combineArrayBuffers(bufferOffsets: any[]): ArrayBufferLike {\n    let byteLength: number = 0;\n    for (const bufferOffset of bufferOffsets) {\n      const [start, end] = bufferOffset[1];\n      byteLength += end - start;\n    }\n\n    const result = new Uint8Array(byteLength);\n\n    // Copy the subarrays\n    let resultOffset: number = 0;\n    for (const bufferOffset of bufferOffsets) {\n      const [bufferIndex, [start, end]] = bufferOffset;\n      const sourceArray = new Uint8Array(this.arrayBuffers[bufferIndex]);\n      result.set(sourceArray.subarray(start, end), resultOffset);\n      resultOffset += end - start;\n    }\n\n    return result.buffer;\n  }\n  /**\n   * @param bytes\n   */\n  skip(bytes: number): void {\n    this.offset += bytes;\n  }\n  /**\n   * @param bytes\n   */\n  rewind(bytes: number): void {\n    // TODO - only works if offset is already set\n    this.offset -= bytes;\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport interface SHPHeader {\n  /** SHP Magic number */\n  magic: number;\n\n  /** Number of bytes in file */\n  length: number;\n  version: number;\n  type: number;\n  bbox: {\n    minX: number;\n    minY: number;\n    minZ: number;\n    minM: number;\n    maxX: number;\n    maxY: number;\n    maxZ: number;\n    maxM: number;\n  };\n}\n\nconst LITTLE_ENDIAN = true;\nconst BIG_ENDIAN = false;\nconst SHP_MAGIC_NUMBER = 0x0000270a;\n\n/**\n * Extract the binary header\n * Note: Also used by SHX\n * @param headerView\n * @returns SHPHeader\n */\nexport function parseSHPHeader(headerView: DataView): SHPHeader {\n  // Note: The SHP format switches endianness between fields!\n  // https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf\n  const header = {\n    magic: headerView.getInt32(0, BIG_ENDIAN),\n    // Length is stored as # of 2-byte words; multiply by 2 to get # of bytes\n    length: headerView.getInt32(24, BIG_ENDIAN) * 2,\n    version: headerView.getInt32(28, LITTLE_ENDIAN),\n    type: headerView.getInt32(32, LITTLE_ENDIAN),\n    bbox: {\n      minX: headerView.getFloat64(36, LITTLE_ENDIAN),\n      minY: headerView.getFloat64(44, LITTLE_ENDIAN),\n      minZ: headerView.getFloat64(68, LITTLE_ENDIAN),\n      minM: headerView.getFloat64(84, LITTLE_ENDIAN),\n      maxX: headerView.getFloat64(52, LITTLE_ENDIAN),\n      maxY: headerView.getFloat64(60, LITTLE_ENDIAN),\n      maxZ: headerView.getFloat64(76, LITTLE_ENDIAN),\n      maxM: headerView.getFloat64(92, LITTLE_ENDIAN)\n    }\n  };\n  if (header.magic !== SHP_MAGIC_NUMBER) {\n    // eslint-disable-next-line\n    console.error(`SHP file: bad magic number ${header.magic}`);\n  }\n  if (header.version !== 1000) {\n    // eslint-disable-next-line\n    console.error(`SHP file: bad version ${header.version}`);\n  }\n  return header;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {BinaryGeometry, BinaryGeometryType} from '@loaders.gl/schema';\nimport {SHPLoaderOptions} from './types';\n\nconst LITTLE_ENDIAN = true;\n\n/**\n * Parse individual record\n *\n * @param view Record data\n * @return Binary Geometry Object\n */\n// eslint-disable-next-line complexity\nexport function parseRecord(view: DataView, options?: SHPLoaderOptions): BinaryGeometry | null {\n  const {_maxDimensions = 4} = options?.shp || {};\n\n  let offset = 0;\n  const type: number = view.getInt32(offset, LITTLE_ENDIAN);\n  offset += Int32Array.BYTES_PER_ELEMENT;\n\n  switch (type) {\n    case 0:\n      // Null Shape\n      return parseNull();\n    case 1:\n      // Point\n      return parsePoint(view, offset, Math.min(2, _maxDimensions));\n    case 3:\n      // PolyLine\n      return parsePoly(view, offset, Math.min(2, _maxDimensions), 'LineString');\n    case 5:\n      // Polygon\n      return parsePoly(view, offset, Math.min(2, _maxDimensions), 'Polygon');\n    case 8:\n      // MultiPoint\n      return parseMultiPoint(view, offset, Math.min(2, _maxDimensions));\n    // GeometryZ can have 3 or 4 dimensions, since the M is not required to\n    // exist\n    case 11:\n      // PointZ\n      return parsePoint(view, offset, Math.min(4, _maxDimensions));\n    case 13:\n      // PolyLineZ\n      return parsePoly(view, offset, Math.min(4, _maxDimensions), 'LineString');\n    case 15:\n      // PolygonZ\n      return parsePoly(view, offset, Math.min(4, _maxDimensions), 'Polygon');\n    case 18:\n      // MultiPointZ\n      return parseMultiPoint(view, offset, Math.min(4, _maxDimensions));\n    case 21:\n      // PointM\n      return parsePoint(view, offset, Math.min(3, _maxDimensions));\n    case 23:\n      // PolyLineM\n      return parsePoly(view, offset, Math.min(3, _maxDimensions), 'LineString');\n    case 25:\n      // PolygonM\n      return parsePoly(view, offset, Math.min(3, _maxDimensions), 'Polygon');\n    case 28:\n      // MultiPointM\n      return parseMultiPoint(view, offset, Math.min(3, _maxDimensions));\n    default:\n      throw new Error(`unsupported shape type: ${type}`);\n  }\n}\n\n// TODO handle null\n/**\n * Parse Null geometry\n *\n * @return null\n */\nfunction parseNull(): null {\n  return null;\n}\n\n/**\n * Parse point geometry\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param dim Dimension size\n */\nfunction parsePoint(view: DataView, offset: number, dim: number): BinaryGeometry {\n  let positions: Float64Array;\n  [positions, offset] = parsePositions(view, offset, 1, dim);\n\n  return {\n    positions: {value: positions, size: dim},\n    type: 'Point'\n  };\n}\n\n/**\n * Parse MultiPoint geometry\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param dim Input dimension\n * @return Binary geometry object\n */\nfunction parseMultiPoint(view: DataView, offset: number, dim: number): BinaryGeometry {\n  // skip parsing box\n  offset += 4 * Float64Array.BYTES_PER_ELEMENT;\n\n  const nPoints = view.getInt32(offset, LITTLE_ENDIAN);\n  offset += Int32Array.BYTES_PER_ELEMENT;\n\n  let xyPositions: Float64Array | null = null;\n  let mPositions: Float64Array | null = null;\n  let zPositions: Float64Array | null = null;\n  [xyPositions, offset] = parsePositions(view, offset, nPoints, 2);\n\n  // Parse Z coordinates\n  if (dim === 4) {\n    // skip parsing range\n    offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n    [zPositions, offset] = parsePositions(view, offset, nPoints, 1);\n  }\n\n  // Parse M coordinates\n  if (dim >= 3) {\n    // skip parsing range\n    offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n    [mPositions, offset] = parsePositions(view, offset, nPoints, 1);\n  }\n\n  const positions = concatPositions(xyPositions, mPositions, zPositions);\n\n  return {\n    positions: {value: positions, size: dim},\n    type: 'Point'\n  };\n}\n\n/**\n * Polygon and PolyLine parsing\n *\n * @param view Geometry data\n * @param offset Offset in view\n * @param dim Input dimension\n * @param type Either 'Polygon' or 'Polyline'\n * @return Binary geometry object\n */\n// eslint-disable-next-line max-statements\nfunction parsePoly(\n  view: DataView,\n  offset: number,\n  dim: number,\n  type: BinaryGeometryType\n): BinaryGeometry {\n  // skip parsing bounding box\n  offset += 4 * Float64Array.BYTES_PER_ELEMENT;\n\n  const nParts = view.getInt32(offset, LITTLE_ENDIAN);\n  offset += Int32Array.BYTES_PER_ELEMENT;\n  const nPoints = view.getInt32(offset, LITTLE_ENDIAN);\n  offset += Int32Array.BYTES_PER_ELEMENT;\n\n  // Create longer indices array by 1 because output format is expected to\n  // include the last index as the total number of positions\n  const bufferOffset = view.byteOffset + offset;\n  const bufferLength = nParts * Int32Array.BYTES_PER_ELEMENT;\n  const ringIndices = new Int32Array(nParts + 1);\n  ringIndices.set(new Int32Array(view.buffer.slice(bufferOffset, bufferOffset + bufferLength)));\n  ringIndices[nParts] = nPoints;\n  offset += nParts * Int32Array.BYTES_PER_ELEMENT;\n\n  let xyPositions: Float64Array | null = null;\n  let mPositions: Float64Array | null = null;\n  let zPositions: Float64Array | null = null;\n  [xyPositions, offset] = parsePositions(view, offset, nPoints, 2);\n\n  // Parse Z coordinates\n  if (dim === 4) {\n    // skip parsing range\n    offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n    [zPositions, offset] = parsePositions(view, offset, nPoints, 1);\n  }\n\n  // Parse M coordinates\n  if (dim >= 3) {\n    // skip parsing range\n    offset += 2 * Float64Array.BYTES_PER_ELEMENT;\n    [mPositions, offset] = parsePositions(view, offset, nPoints, 1);\n  }\n\n  const positions = concatPositions(xyPositions, mPositions, zPositions);\n\n  // parsePoly only accepts type = LineString or Polygon\n  if (type === 'LineString') {\n    return {\n      type,\n      positions: {value: positions, size: dim},\n      pathIndices: {value: ringIndices, size: 1}\n    };\n  }\n\n  // for every ring, determine sign of polygon\n  // Use only 2D positions for ring calc\n  const polygonIndices: number[] = [];\n  for (let i = 1; i < ringIndices.length; i++) {\n    const startRingIndex = ringIndices[i - 1];\n    const endRingIndex = ringIndices[i];\n    // @ts-ignore\n    const ring = xyPositions.subarray(startRingIndex * 2, endRingIndex * 2);\n    const sign = getWindingDirection(ring);\n\n    // A positive sign implies clockwise\n    // A clockwise ring is a filled ring\n    if (sign > 0) {\n      polygonIndices.push(startRingIndex);\n    }\n  }\n\n  polygonIndices.push(nPoints);\n\n  return {\n    type,\n    positions: {value: positions, size: dim},\n    primitivePolygonIndices: {value: ringIndices, size: 1},\n    // TODO: Dynamically choose Uint32Array over Uint16Array only when\n    // necessary. I believe the implementation requires nPoints to be the\n    // largest value in the array, so you should be able to use Uint32Array only\n    // when nPoints > 65535.\n    polygonIndices: {value: new Uint32Array(polygonIndices), size: 1}\n  };\n}\n\n/**\n * Parse a contiguous block of positions into a Float64Array\n *\n * @param view  Geometry data\n * @param offset  Offset in view\n * @param nPoints Number of points\n * @param dim     Input dimension\n * @return Data and offset\n */\nfunction parsePositions(\n  view: DataView,\n  offset: number,\n  nPoints: number,\n  dim: number\n): [Float64Array, number] {\n  const bufferOffset = view.byteOffset + offset;\n  const bufferLength = nPoints * dim * Float64Array.BYTES_PER_ELEMENT;\n  return [\n    new Float64Array(view.buffer.slice(bufferOffset, bufferOffset + bufferLength)),\n    offset + bufferLength\n  ];\n}\n\n/**\n * Concatenate and interleave positions arrays\n * xy positions are interleaved; mPositions, zPositions are their own arrays\n *\n * @param xyPositions 2d positions\n * @param mPositions  M positions\n * @param zPositions  Z positions\n * @return Combined interleaved positions\n */\n// eslint-disable-next-line complexity\nfunction concatPositions(\n  xyPositions: Float64Array,\n  mPositions: Float64Array | null,\n  zPositions: Float64Array | null\n): Float64Array {\n  if (!(mPositions || zPositions)) {\n    return xyPositions;\n  }\n\n  let arrayLength = xyPositions.length;\n  let nDim = 2;\n\n  if (zPositions && zPositions.length) {\n    arrayLength += zPositions.length;\n    nDim++;\n  }\n\n  if (mPositions && mPositions.length) {\n    arrayLength += mPositions.length;\n    nDim++;\n  }\n\n  const positions = new Float64Array(arrayLength);\n  for (let i = 0; i < xyPositions.length / 2; i++) {\n    positions[nDim * i] = xyPositions[i * 2];\n    positions[nDim * i + 1] = xyPositions[i * 2 + 1];\n  }\n\n  if (zPositions && zPositions.length) {\n    for (let i = 0; i < zPositions.length; i++) {\n      // If Z coordinates exist; used as third coord in positions array\n      positions[nDim * i + 2] = zPositions[i];\n    }\n  }\n\n  if (mPositions && mPositions.length) {\n    for (let i = 0; i < mPositions.length; i++) {\n      // M is always last, either 3rd or 4th depending on if Z exists\n      positions[nDim * i + (nDim - 1)] = mPositions[i];\n    }\n  }\n\n  return positions;\n}\n\n/**\n * Returns the direction of the polygon path\n * A positive number is clockwise.\n * A negative number is counter clockwise.\n *\n * @param positions\n * @return Sign of polygon ring\n */\nfunction getWindingDirection(positions: Float64Array): number {\n  return Math.sign(getSignedArea(positions));\n}\n\n/**\n * Get signed area of flat typed array of 2d positions\n *\n * @param positions\n * @return Signed area of polygon ring\n */\nfunction getSignedArea(positions: Float64Array): number {\n  let area = 0;\n\n  // Rings are closed according to shapefile spec\n  const nCoords = positions.length / 2 - 1;\n  for (let i = 0; i < nCoords; i++) {\n    area +=\n      (positions[i * 2] + positions[(i + 1) * 2]) *\n      (positions[i * 2 + 1] - positions[(i + 1) * 2 + 1]);\n  }\n\n  return area / 2;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderWithParser, StrictLoaderOptions} from '@loaders.gl/loader-utils';\nimport {parseSHP, parseSHPInBatches} from './lib/parsers/parse-shp';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport const SHP_MAGIC_NUMBER = [0x00, 0x00, 0x27, 0x0a];\n\n/** SHPLoader */\nexport type SHPLoaderOptions = StrictLoaderOptions & {\n  shp?: {\n    _maxDimensions?: number;\n    /** Override the URL to the worker bundle (by default loads from unpkg.com) */\n    workerUrl?: string;\n  };\n};\n\n/**\n * SHP file loader\n */\nexport const SHPWorkerLoader = {\n  dataType: null as unknown,\n  batchType: null as never,\n\n  name: 'SHP',\n  id: 'shp',\n  module: 'shapefile',\n  version: VERSION,\n  worker: true,\n  category: 'geometry',\n  extensions: ['shp'],\n  mimeTypes: ['application/octet-stream'],\n  // ISSUE: This also identifies SHX files, which are identical to SHP for the first 100 bytes...\n  tests: [new Uint8Array(SHP_MAGIC_NUMBER).buffer],\n  options: {\n    shp: {\n      _maxDimensions: 4\n    }\n  }\n} as const satisfies Loader<any, any, SHPLoaderOptions>;\n\n/** SHP file loader */\nexport const SHPLoader: LoaderWithParser = {\n  ...SHPWorkerLoader,\n  parse: async (arrayBuffer, options?) => parseSHP(arrayBuffer, options),\n  parseSync: parseSHP,\n  parseInBatches: (\n    arrayBufferIterator:\n      | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n      | Iterable<ArrayBufferLike | ArrayBufferView>,\n    options\n  ) => parseSHPInBatches(arrayBufferIterator, options)\n};\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// import type {Feature} from '@loaders.gl/gis';\nimport {\n  LoaderContext,\n  parseInBatchesFromContext,\n  parseFromContext,\n  toArrayBufferIterator\n} from '@loaders.gl/loader-utils';\nimport {convertBinaryGeometryToGeometry, transformGeoJsonCoords} from '@loaders.gl/gis';\nimport type {\n  BinaryGeometry,\n  Geometry,\n  ObjectRowTable,\n  ObjectRowTableBatch\n} from '@loaders.gl/schema';\nimport {Proj4Projection} from '@math.gl/proj4';\n\nimport type {SHXOutput} from './parse-shx';\nimport type {SHPHeader} from './parse-shp-header';\nimport type {ShapefileLoaderOptions} from './types';\nimport {parseShx} from './parse-shx';\nimport {zipBatchIterators} from '../streaming/zip-batch-iterators';\nimport {SHPLoader} from '../../shp-loader';\nimport {DBFLoader} from '../../dbf-loader';\n\ntype Feature = any;\ninterface ShapefileOutput {\n  encoding?: string;\n  prj?: string;\n  shx?: SHXOutput;\n  header: SHPHeader;\n  data: object[];\n}\n/**\n * Parsing of file in batches\n */\n// eslint-disable-next-line max-statements, complexity\nexport async function* parseShapefileInBatches(\n  asyncIterator:\n    | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n    | Iterable<ArrayBufferLike | ArrayBufferView>,\n  options?: ShapefileLoaderOptions,\n  context?: LoaderContext\n): AsyncIterable<ShapefileOutput> {\n  const {reproject = false, _targetCrs = 'WGS84'} = options?.gis || {};\n  const {shx, cpg, prj} = await loadShapefileSidecarFiles(options, context);\n\n  // parse geometries\n  const shapeIterable = await parseInBatchesFromContext(\n    toArrayBufferIterator(asyncIterator),\n    SHPLoader,\n    options,\n    context!\n  );\n\n  const shapeIterator: AsyncIterator<any> =\n    shapeIterable[Symbol.asyncIterator]?.() || shapeIterable[Symbol.iterator]?.();\n\n  // parse properties\n  let propertyIterator: AsyncIterator<any> | null = null;\n  const dbfResponse = await context?.fetch(replaceExtension(context?.url || '', 'dbf'));\n  if (dbfResponse?.ok) {\n    const propertyIterable = await parseInBatchesFromContext(\n      dbfResponse,\n      DBFLoader,\n      {\n        ...options,\n        dbf: {\n          ...options?.dbf,\n          encoding: cpg || 'latin1'\n        }\n      },\n      context!\n    );\n    propertyIterator =\n      propertyIterable[Symbol.asyncIterator]?.() || propertyIterable[Symbol.iterator]();\n  }\n\n  // When `options.metadata` is `true`, there's an extra initial `metadata`\n  // object before the iterator starts. zipBatchIterators expects to receive\n  // batches of Array objects, and will fail with non-iterable batches, so it's\n  // important to skip over the first batch.\n  let shapeHeader = (await shapeIterator.next()).value;\n  if (shapeHeader && shapeHeader.batchType === 'metadata') {\n    shapeHeader = (await shapeIterator.next()).value;\n  }\n\n  let dbfHeader: {batchType?: string} = {};\n  if (propertyIterator) {\n    dbfHeader = (await propertyIterator.next()).value;\n    if (dbfHeader && dbfHeader.batchType === 'metadata') {\n      dbfHeader = (await propertyIterator.next()).value;\n    }\n  }\n\n  const zippedIterator: AsyncIterator<ObjectRowTableBatch> = propertyIterator\n    ? zipBatchIterators(shapeIterator, propertyIterator, 'object-row-table')\n    : shapeIterator;\n\n  const zippedBatchIterable: AsyncIterable<ObjectRowTableBatch> = {\n    [Symbol.asyncIterator]() {\n      return zippedIterator;\n    }\n  };\n\n  for await (const batch of zippedBatchIterable) {\n    let geometries: any;\n    let properties: any;\n    if (!propertyIterator) {\n      geometries = batch;\n    } else {\n      [geometries, properties] = batch.data;\n    }\n\n    const geojsonGeometries = parseGeometries(geometries);\n    let features = joinProperties(geojsonGeometries, properties);\n    if (reproject) {\n      // @ts-ignore\n      features = reprojectFeatures(features, prj, _targetCrs);\n    }\n    yield {\n      encoding: cpg,\n      prj,\n      shx,\n      header: shapeHeader,\n      data: features\n    };\n  }\n}\n\n/**\n * Parse shapefile\n *\n * @param arrayBuffer\n * @param options\n * @param context\n * @returns output of shapefile\n */\nexport async function parseShapefile(\n  arrayBuffer: ArrayBuffer,\n  options?: ShapefileLoaderOptions,\n  context?: LoaderContext\n): Promise<ShapefileOutput> {\n  const {reproject = false, _targetCrs = 'WGS84'} = options?.gis || {};\n  const {shx, cpg, prj} = await loadShapefileSidecarFiles(options, context);\n\n  // parse geometries\n  const {header, geometries} = await parseFromContext(arrayBuffer, SHPLoader, options, context!); // {shp: shx}\n\n  const geojsonGeometries = parseGeometries(geometries);\n\n  // parse properties\n  let propertyTable: ObjectRowTable | undefined;\n\n  const dbfResponse = await context?.fetch(replaceExtension(context?.url!, 'dbf'));\n  if (dbfResponse?.ok) {\n    const dbfOptions = {\n      ...options,\n      dbf: {\n        ...options?.dbf,\n        shape: 'object-row-table',\n        encoding: cpg || 'latin1'\n      }\n    };\n    propertyTable = await parseFromContext(dbfResponse as any, DBFLoader, dbfOptions, context!);\n  }\n\n  let features = joinProperties(geojsonGeometries, propertyTable?.data || []);\n  if (reproject) {\n    features = reprojectFeatures(features, prj, _targetCrs);\n  }\n\n  switch (options?.shapefile?.shape) {\n    case 'geojson-table':\n      return {\n        // @ts-expect-error\n        shape: 'geojson-table',\n        type: 'FeatureCollection',\n        encoding: cpg,\n        schema: propertyTable?.schema || {metadata: {}, fields: []},\n        prj,\n        shx,\n        header,\n        features\n      };\n    default:\n      return {\n        encoding: cpg,\n        prj,\n        shx,\n        header,\n        data: features\n      };\n  }\n}\n\n/**\n * Parse geometries\n *\n * @param geometries\n * @returns geometries as an array\n */\nfunction parseGeometries(geometries: BinaryGeometry[]): Geometry[] {\n  const geojsonGeometries: any[] = [];\n  for (const geom of geometries) {\n    geojsonGeometries.push(convertBinaryGeometryToGeometry(geom));\n  }\n  return geojsonGeometries;\n}\n\n/**\n * Join properties and geometries into features\n *\n * @param geometries [description]\n * @param  properties [description]\n * @return [description]\n */\nfunction joinProperties(geometries: Geometry[], properties: object[]): Feature[] {\n  const features: Feature[] = [];\n  for (let i = 0; i < geometries.length; i++) {\n    const geometry = geometries[i];\n    const feature: Feature = {\n      type: 'Feature',\n      geometry,\n      // properties can be undefined if dbfResponse above was empty\n      properties: (properties && properties[i]) || {}\n    };\n    features.push(feature);\n  }\n\n  return features;\n}\n\n/**\n * Reproject GeoJSON features to output CRS\n *\n * @param features parsed GeoJSON features\n * @param sourceCrs source coordinate reference system\n * @param targetCrs \u2020arget coordinate reference system\n * @return Reprojected Features\n */\nfunction reprojectFeatures(features: Feature[], sourceCrs?: string, targetCrs?: string): Feature[] {\n  if (!sourceCrs && !targetCrs) {\n    return features;\n  }\n\n  const projection = new Proj4Projection({from: sourceCrs || 'WGS84', to: targetCrs || 'WGS84'});\n  return transformGeoJsonCoords(features, (coord) => projection.project(coord));\n}\n\n/**\n *\n * @param options\n * @param context\n * @returns Promise\n */\n// eslint-disable-next-line max-statements\nexport async function loadShapefileSidecarFiles(\n  options?: ShapefileLoaderOptions,\n  context?: LoaderContext\n): Promise<{\n  shx?: SHXOutput;\n  cpg?: string;\n  prj?: string;\n}> {\n  // Attempt a parallel load of the small sidecar files\n  // @ts-ignore context must be defined\n  const {url, fetch} = context;\n  const shxPromise = fetch(replaceExtension(url, 'shx'));\n  const cpgPromise = fetch(replaceExtension(url, 'cpg'));\n  const prjPromise = fetch(replaceExtension(url, 'prj'));\n  await Promise.all([shxPromise, cpgPromise, prjPromise]);\n\n  let shx: SHXOutput | undefined;\n  let cpg: string | undefined;\n  let prj: string | undefined;\n\n  const shxResponse = await shxPromise;\n  if (shxResponse.ok) {\n    const arrayBuffer = await shxResponse.arrayBuffer();\n    shx = parseShx(arrayBuffer);\n  }\n\n  const cpgResponse = await cpgPromise;\n  if (cpgResponse.ok) {\n    cpg = await cpgResponse.text();\n  }\n\n  const prjResponse = await prjPromise;\n  if (prjResponse.ok) {\n    prj = await prjResponse.text();\n  }\n\n  return {\n    shx,\n    cpg,\n    prj\n  };\n}\n\n/**\n * Replace the extension at the end of a path.\n *\n * Matches the case of new extension with the case of the original file extension,\n * to increase the chance of finding files without firing off a request storm looking for various case combinations\n *\n * NOTE: Extensions can be both lower and uppercase\n * per spec, extensions should be lower case, but that doesn't mean they always are. See:\n * calvinmetcalf/shapefile-js#64, mapserver/mapserver#4712\n * https://trac.osgeo.org/mapserver/ticket/166\n */\nexport function replaceExtension(url: string, newExtension: string): string {\n  const baseName = basename(url);\n  const extension = extname(url);\n  const isUpperCase = extension === extension.toUpperCase();\n  if (isUpperCase) {\n    newExtension = newExtension.toUpperCase();\n  }\n  return `${baseName}.${newExtension}`;\n}\n\n// NOTE - this gives the entire path minus extension (i.e. NOT same as path.basename)\n/**\n * @param url\n * @returns string\n */\nfunction basename(url: string): string {\n  const extIndex = url && url.lastIndexOf('.');\n  if (typeof extIndex === 'number') {\n    return extIndex >= 0 ? url.substr(0, extIndex) : '';\n  }\n  return extIndex;\n}\n/**\n * @param url\n * @returns string\n */\nfunction extname(url: string): string {\n  const extIndex = url && url.lastIndexOf('.');\n  if (typeof extIndex === 'number') {\n    return extIndex >= 0 ? url.substr(extIndex + 1) : '';\n  }\n  return extIndex;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {parseSHPHeader} from './parse-shp-header';\n\nexport interface SHXOutput {\n  offsets: Int32Array;\n  lengths: Int32Array;\n}\n\nconst SHX_HEADER_SIZE = 100;\nconst BIG_ENDIAN = false;\n\n/**\n * @param arrayBuffer\n * @returns SHXOutput\n */\nexport function parseShx(arrayBuffer: ArrayBuffer): SHXOutput {\n  // SHX header is identical to SHP Header\n  const headerView = new DataView(arrayBuffer, 0, SHX_HEADER_SIZE);\n  const header = parseSHPHeader(headerView);\n  const contentLength = header.length - SHX_HEADER_SIZE;\n\n  const contentView = new DataView(arrayBuffer, SHX_HEADER_SIZE, contentLength);\n\n  const offsets = new Int32Array(contentLength);\n  const lengths = new Int32Array(contentLength);\n\n  for (let i = 0; i < contentLength / 8; i++) {\n    offsets[i] = contentView.getInt32(i * 8, BIG_ENDIAN);\n    lengths[i] = contentView.getInt32(i * 8 + 4, BIG_ENDIAN);\n  }\n\n  return {\n    offsets,\n    lengths\n  };\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ObjectRowTableBatch, ArrayRowTableBatch} from '@loaders.gl/schema';\n\ntype RowTableBatch = ObjectRowTableBatch | ArrayRowTableBatch;\n\n/**\n * Zip two iterators together\n *\n * @param iterator1\n * @param iterator2\n */\nexport async function* zipBatchIterators(\n  iterator1: AsyncIterator<RowTableBatch> | Iterator<RowTableBatch>,\n  iterator2: AsyncIterator<RowTableBatch> | Iterator<RowTableBatch>,\n  shape: 'object-row-table' | 'array-row-table'\n): AsyncGenerator<RowTableBatch, void, unknown> {\n  const batch1Data: unknown[] = [];\n  const batch2Data: unknown[] = [];\n  let iterator1Done: boolean = false;\n  let iterator2Done: boolean = false;\n\n  // TODO - one could let all iterators flow at full speed using `Promise.race`\n  // however we might end up with a big temporary buffer\n  while (!iterator1Done && !iterator2Done) {\n    if (batch1Data.length === 0 && !iterator1Done) {\n      const {value, done} = await iterator1.next();\n      if (done) {\n        iterator1Done = true;\n      } else {\n        // @ts-expect-error\n        batch1Data.push(...value);\n      }\n    }\n    if (batch2Data.length === 0 && !iterator2Done) {\n      const {value, done} = await iterator2.next();\n      if (done) {\n        iterator2Done = true;\n      } else {\n        batch2Data.push(...value);\n      }\n    }\n\n    const batchData = extractBatchData(batch1Data, batch2Data);\n    if (batchData) {\n      yield {\n        batchType: 'data',\n        shape,\n        length: batchData.length,\n        data: batchData\n      };\n    }\n  }\n}\n\n/**\n * Extract batch of same length from two batches\n *\n * @param batch1\n * @param batch2\n * @return array | null\n */\nfunction extractBatchData(batch1: any[], batch2: any[]): any[] | null {\n  const batchLength: number = Math.min(batch1.length, batch2.length);\n  if (batchLength === 0) {\n    return null;\n  }\n\n  // Non interleaved arrays\n  const batch: any[] = [batch1.slice(0, batchLength), batch2.slice(0, batchLength)];\n\n  // Modify the 2 batches\n  batch1.splice(0, batchLength);\n  batch2.splice(0, batchLength);\n  return batch;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Field, ObjectRowTable} from '@loaders.gl/schema';\nimport {toArrayBufferIterator} from '@loaders.gl/loader-utils';\nimport {BinaryChunkReader} from '../streaming/binary-chunk-reader';\nimport {\n  DBFLoaderOptions,\n  DBFResult,\n  DBFTableOutput,\n  DBFHeader,\n  DBFRowsOutput,\n  DBFField\n} from './types';\n\nconst LITTLE_ENDIAN = true;\nconst DBF_HEADER_SIZE = 32;\n\nenum STATE {\n  START = 0, // Expecting header\n  FIELD_DESCRIPTORS = 1,\n  FIELD_PROPERTIES = 2,\n  END = 3,\n  ERROR = 4\n}\n\nclass DBFParser {\n  binaryReader = new BinaryChunkReader();\n  textDecoder: TextDecoder;\n  state = STATE.START;\n  result: DBFResult = {\n    data: []\n  };\n\n  constructor(options: {encoding: string}) {\n    this.textDecoder = new TextDecoder(options.encoding);\n  }\n\n  /**\n   * @param arrayBuffer\n   */\n  write(arrayBuffer: ArrayBuffer): void {\n    this.binaryReader.write(arrayBuffer);\n    this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);\n    // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n\n    // important events:\n    // - schema available\n    // - first rows available\n    // - all rows available\n  }\n\n  end(): void {\n    this.binaryReader.end();\n    this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);\n    // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n    if (this.state !== STATE.END) {\n      this.state = STATE.ERROR;\n      this.result.error = 'DBF incomplete file';\n    }\n  }\n}\n\n/**\n * @param arrayBuffer\n * @param options\n * @returns DBFTable or rows\n */\nexport function parseDBF(\n  arrayBuffer: ArrayBuffer,\n  options: DBFLoaderOptions = {}\n): DBFRowsOutput | DBFTableOutput | ObjectRowTable {\n  const {encoding = 'latin1'} = options.dbf || {};\n\n  const dbfParser = new DBFParser({encoding});\n  dbfParser.write(arrayBuffer);\n  dbfParser.end();\n\n  const {data, schema} = dbfParser.result;\n  const shape = options?.dbf?.shape;\n  switch (shape) {\n    case 'object-row-table': {\n      const table: ObjectRowTable = {\n        shape: 'object-row-table',\n        schema,\n        data\n      };\n      return table;\n    }\n    case 'table':\n      return {schema, rows: data};\n    case 'rows':\n    default:\n      return data;\n  }\n}\n/**\n * @param asyncIterator\n * @param options\n */\nexport async function* parseDBFInBatches(\n  asyncIterator:\n    | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n    | Iterable<ArrayBufferLike | ArrayBufferView>,\n  options: DBFLoaderOptions = {}\n): AsyncIterable<DBFHeader | DBFRowsOutput | DBFTableOutput> {\n  const {encoding = 'latin1'} = options.dbf || {};\n\n  const parser = new DBFParser({encoding});\n  let headerReturned = false;\n  for await (const arrayBuffer of toArrayBufferIterator(asyncIterator)) {\n    parser.write(arrayBuffer);\n    if (!headerReturned && parser.result.dbfHeader) {\n      headerReturned = true;\n      yield parser.result.dbfHeader;\n    }\n\n    if (parser.result.data.length > 0) {\n      yield parser.result.data;\n      parser.result.data = [];\n    }\n  }\n  parser.end();\n  if (parser.result.data.length > 0) {\n    yield parser.result.data;\n  }\n}\n/**\n * https://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm\n * @param state\n * @param result\n * @param binaryReader\n * @param textDecoder\n * @returns\n */\n/* eslint-disable complexity, max-depth */\nfunction parseState(\n  state: STATE,\n  result: DBFResult,\n  binaryReader: BinaryChunkReader,\n  textDecoder: TextDecoder\n): STATE {\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    try {\n      switch (state) {\n        case STATE.ERROR:\n        case STATE.END:\n          return state;\n\n        case STATE.START:\n          // Parse initial file header\n          // DBF Header\n          const dataView = binaryReader.getDataView(DBF_HEADER_SIZE);\n          if (!dataView) {\n            return state;\n          }\n          result.dbfHeader = parseDBFHeader(dataView);\n          result.progress = {\n            bytesUsed: 0,\n            rowsTotal: result.dbfHeader.nRecords,\n            rows: 0\n          };\n          state = STATE.FIELD_DESCRIPTORS;\n          break;\n\n        case STATE.FIELD_DESCRIPTORS:\n          // Parse DBF field descriptors (schema)\n          const fieldDescriptorView = binaryReader.getDataView(\n            // @ts-ignore\n            result.dbfHeader.headerLength - DBF_HEADER_SIZE\n          );\n          if (!fieldDescriptorView) {\n            return state;\n          }\n\n          result.dbfFields = parseFieldDescriptors(fieldDescriptorView, textDecoder);\n          result.schema = {\n            fields: result.dbfFields.map((dbfField) => makeField(dbfField)),\n            metadata: {}\n          };\n\n          state = STATE.FIELD_PROPERTIES;\n\n          // TODO(kyle) Not exactly sure why start offset needs to be headerLength + 1?\n          // parsedbf uses ((fields.length + 1) << 5) + 2;\n          binaryReader.skip(1);\n          break;\n\n        case STATE.FIELD_PROPERTIES:\n          const {recordLength = 0, nRecords = 0} = result?.dbfHeader || {};\n          while (result.data.length < nRecords) {\n            const recordView = binaryReader.getDataView(recordLength - 1);\n            if (!recordView) {\n              return state;\n            }\n            // Note: Avoid actually reading the last byte, which may not be present\n            binaryReader.skip(1);\n\n            // @ts-ignore\n            const row = parseRow(recordView, result.dbfFields, textDecoder);\n            result.data.push(row);\n            // @ts-ignore\n            result.progress.rows = result.data.length;\n          }\n          state = STATE.END;\n          break;\n\n        default:\n          state = STATE.ERROR;\n          result.error = `illegal parser state ${state}`;\n          return state;\n      }\n    } catch (error) {\n      state = STATE.ERROR;\n      result.error = `DBF parsing failed: ${(error as Error).message}`;\n      return state;\n    }\n  }\n}\n\n/**\n * @param headerView\n */\nfunction parseDBFHeader(headerView: DataView): DBFHeader {\n  return {\n    // Last updated date\n    year: headerView.getUint8(1) + 1900,\n    month: headerView.getUint8(2),\n    day: headerView.getUint8(3),\n    // Number of records in data file\n    nRecords: headerView.getUint32(4, LITTLE_ENDIAN),\n    // Length of header in bytes\n    headerLength: headerView.getUint16(8, LITTLE_ENDIAN),\n    // Length of each record\n    recordLength: headerView.getUint16(10, LITTLE_ENDIAN),\n    // Not sure if this is usually set\n    languageDriver: headerView.getUint8(29)\n  };\n}\n\n/**\n * @param view\n */\nfunction parseFieldDescriptors(view: DataView, textDecoder: TextDecoder): DBFField[] {\n  // NOTE: this might overestimate the number of fields if the \"Database\n  // Container\" container exists and is included in the headerLength\n  const nFields = (view.byteLength - 1) / 32;\n  const fields: DBFField[] = [];\n  let offset = 0;\n  for (let i = 0; i < nFields; i++) {\n    const name = textDecoder\n      .decode(new Uint8Array(view.buffer, view.byteOffset + offset, 11))\n      // eslint-disable-next-line no-control-regex\n      .replace(/\\u0000/g, '');\n\n    fields.push({\n      name,\n      dataType: String.fromCharCode(view.getUint8(offset + 11)),\n      fieldLength: view.getUint8(offset + 16),\n      decimal: view.getUint8(offset + 17)\n    });\n    offset += 32;\n  }\n  return fields;\n}\n\n/*\n * @param {BinaryChunkReader} binaryReader\nfunction parseRows(binaryReader, fields, nRecords, recordLength, textDecoder) {\n  const rows = [];\n  for (let i = 0; i < nRecords; i++) {\n    const recordView = binaryReader.getDataView(recordLength - 1);\n    binaryReader.skip(1);\n    // @ts-ignore\n    rows.push(parseRow(recordView, fields, textDecoder));\n  }\n  return rows;\n}\n */\n\n/**\n *\n * @param view\n * @param fields\n * @param textDecoder\n * @returns\n */\nfunction parseRow(\n  view: DataView,\n  fields: DBFField[],\n  textDecoder: TextDecoder\n): {[key: string]: any} {\n  const out: {[key: string]: string | number | boolean | null} = {};\n  let offset = 0;\n  for (const field of fields) {\n    const text = textDecoder.decode(\n      new Uint8Array(view.buffer, view.byteOffset + offset, field.fieldLength)\n    );\n    out[field.name] = parseField(text, field.dataType);\n    offset += field.fieldLength;\n  }\n\n  return out;\n}\n\n/**\n * Should NaN be coerced to null?\n * @param text\n * @param dataType\n * @returns Field depends on a type of the data\n */\nfunction parseField(text: string, dataType: string): string | number | boolean | null {\n  switch (dataType) {\n    case 'B':\n      return parseNumber(text);\n    case 'C':\n      return parseCharacter(text);\n    case 'F':\n      return parseNumber(text);\n    case 'N':\n      return parseNumber(text);\n    case 'O':\n      return parseNumber(text);\n    case 'D':\n      return parseDate(text);\n    case 'L':\n      return parseBoolean(text);\n    default:\n      throw new Error('Unsupported data type');\n  }\n}\n\n/**\n * Parse YYYYMMDD to date in milliseconds\n * @param str YYYYMMDD\n * @returns new Date as a number\n */\nfunction parseDate(str: any): number {\n  return Date.UTC(str.slice(0, 4), parseInt(str.slice(4, 6), 10) - 1, str.slice(6, 8));\n}\n\n/**\n * Read boolean value\n * any of Y, y, T, t coerce to true\n * any of N, n, F, f coerce to false\n * otherwise null\n * @param value\n * @returns boolean | null\n */\nfunction parseBoolean(value: string): boolean | null {\n  return /^[nf]$/i.test(value) ? false : /^[yt]$/i.test(value) ? true : null;\n}\n\n/**\n * Return null instead of NaN\n * @param text\n * @returns number | null\n */\nfunction parseNumber(text: string): number | null {\n  const number = parseFloat(text);\n  return isNaN(number) ? null : number;\n}\n\n/**\n *\n * @param text\n * @returns string | null\n */\nfunction parseCharacter(text: string): string | null {\n  return text.trim() || null;\n}\n\n/**\n * Create a standard Arrow-style `Field` from field descriptor.\n * TODO - use `fieldLength` and `decimal` to generate smaller types?\n * @param param0\n * @returns Field\n */\n// eslint-disable\nfunction makeField({name, dataType, fieldLength, decimal}: DBFField): Field {\n  switch (dataType) {\n    case 'B':\n      return {name, type: 'float64', nullable: true, metadata: {}};\n    case 'C':\n      return {name, type: 'utf8', nullable: true, metadata: {}};\n    case 'F':\n      return {name, type: 'float64', nullable: true, metadata: {}};\n    case 'N':\n      return {name, type: 'float64', nullable: true, metadata: {}};\n    case 'O':\n      return {name, type: 'float64', nullable: true, metadata: {}};\n    case 'D':\n      return {name, type: 'timestamp-millisecond', nullable: true, metadata: {}};\n    case 'L':\n      return {name, type: 'bool', nullable: true, metadata: {}};\n    default:\n      throw new Error('Unsupported data type');\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderWithParser, StrictLoaderOptions} from '@loaders.gl/loader-utils';\nimport {parseDBF, parseDBFInBatches} from './lib/parsers/parse-dbf';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type DBFLoaderOptions = StrictLoaderOptions & {\n  dbf?: {\n    encoding?: string;\n    shape?: 'rows' | 'table' | 'object-row-table';\n    /** Override the URL to the worker bundle (by default loads from unpkg.com) */\n    workerUrl?: string;\n  };\n};\n\n/**\n * DBFLoader - DBF files are used to contain non-geometry columns in Shapefiles\n */\nexport const DBFWorkerLoader = {\n  name: 'DBF',\n  dataType: null as unknown,\n  batchType: null as never,\n\n  id: 'dbf',\n  module: 'shapefile',\n  version: VERSION,\n  worker: true,\n  category: 'table',\n  extensions: ['dbf'],\n  mimeTypes: ['application/x-dbf'],\n  options: {\n    dbf: {\n      encoding: 'latin1'\n    }\n  }\n} as const satisfies Loader<any, any, DBFLoaderOptions>;\n\n/** DBF file loader */\nexport const DBFLoader: LoaderWithParser = {\n  ...DBFWorkerLoader,\n  parse: async (arrayBuffer, options) => parseDBF(arrayBuffer, options),\n  parseSync: parseDBF,\n  parseInBatches(\n    arrayBufferIterator:\n      | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n      | Iterable<ArrayBufferLike | ArrayBufferView>,\n    options\n  ) {\n    return parseDBFInBatches(arrayBufferIterator, options);\n  }\n};\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {StrictLoaderOptions, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {Batch, GeoJSONTable} from '@loaders.gl/schema';\nimport {SHP_MAGIC_NUMBER, SHPLoaderOptions} from './shp-loader';\nimport {parseShapefile, parseShapefileInBatches} from './lib/parsers/parse-shapefile';\nimport {DBFLoaderOptions} from './dbf-loader';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type ShapefileLoaderOptions = StrictLoaderOptions &\n  SHPLoaderOptions &\n  DBFLoaderOptions & {\n    shapefile?: {\n      shape?: 'geojson-table' | 'v3';\n      /** @deprecated Worker URLs must be specified with .dbf.workerUrl * .shp.workerUrl */\n      workerUrl?: never;\n    };\n    gis?: {\n      reproject?: boolean;\n      _targetCrs?: string;\n    };\n  };\n\n/**\n * Shapefile loader\n * @note Shapefile is multifile format and requires providing additional files\n */\nexport const ShapefileLoader = {\n  name: 'Shapefile',\n  id: 'shapefile',\n  module: 'shapefile',\n  version: VERSION,\n  category: 'geometry',\n  extensions: ['shp'],\n  mimeTypes: ['application/octet-stream'],\n  tests: [new Uint8Array(SHP_MAGIC_NUMBER).buffer],\n  options: {\n    shapefile: {\n      shape: 'v3'\n    },\n    shp: {\n      _maxDimensions: 4\n    }\n  },\n  // @ts-expect-error\n  parse: parseShapefile,\n  // @ts-expect-error\n  parseInBatches: parseShapefileInBatches\n} as const satisfies LoaderWithParser<GeoJSONTable, Batch, ShapefileLoaderOptions>;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Schema, Field, ArrowTable, ArrowTableBatch} from '@loaders.gl/schema';\nimport {toArrayBufferIterator} from '@loaders.gl/loader-utils';\nimport {ArrowTableBuilder} from '@loaders.gl/schema-utils';\nimport {BinaryChunkReader} from '../streaming/binary-chunk-reader';\nimport {DBFLoaderOptions, DBFHeader, DBFField} from './types';\n\nexport type DBFResult = {\n  tableBuilder?: ArrowTableBuilder;\n  error?: string;\n  dbfHeader?: DBFHeader;\n  dbfFields?: DBFField[];\n  progress?: {\n    bytesUsed: number;\n    rowsTotal: number;\n    rows: number;\n  };\n};\n\nconst LITTLE_ENDIAN = true;\nconst DBF_HEADER_SIZE = 32;\n\nenum STATE {\n  START = 0, // Expecting header\n  FIELD_DESCRIPTORS = 1,\n  FIELD_PROPERTIES = 2,\n  END = 3,\n  ERROR = 4\n}\n\nclass DBFParser {\n  binaryReader = new BinaryChunkReader();\n  textDecoder: TextDecoder;\n  state = STATE.START;\n  result: DBFResult = {};\n\n  constructor(options: {encoding: string}) {\n    this.textDecoder = new TextDecoder(options.encoding);\n  }\n\n  /**\n   * @param arrayBuffer\n   */\n  write(arrayBuffer: ArrayBuffer): void {\n    this.binaryReader.write(arrayBuffer);\n    this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);\n    // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n\n    // important events:\n    // - schema available\n    // - first rows available\n    // - all rows available\n  }\n\n  end(): void {\n    this.binaryReader.end();\n    this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);\n    // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n    if (this.state !== STATE.END) {\n      this.state = STATE.ERROR;\n      this.result.error = 'DBF incomplete file';\n    }\n  }\n}\n\n/**\n * @param arrayBuffer\n * @param options\n * @returns DBFTable or rows\n */\nexport function parseDBF(arrayBuffer: ArrayBuffer, options: DBFLoaderOptions = {}): ArrowTable {\n  const {encoding = 'latin1'} = options.dbf || {};\n\n  const dbfParser = new DBFParser({encoding});\n  dbfParser.write(arrayBuffer);\n  dbfParser.end();\n\n  const tableBuilder = dbfParser.result.tableBuilder!;\n  const arrowTable = tableBuilder.finishTable();\n  return arrowTable;\n}\n\n/**\n * @param asyncIterator\n * @param options\n */\nexport async function* parseDBFInBatches(\n  asyncIterator:\n    | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n    | Iterable<ArrayBufferLike | ArrayBufferView>,\n  options: DBFLoaderOptions = {}\n): AsyncIterable<ArrowTableBatch> {\n  const {encoding = 'latin1'} = options.dbf || {};\n\n  const parser = new DBFParser({encoding});\n  let headerReturned = false;\n  for await (const arrayBuffer of toArrayBufferIterator(asyncIterator)) {\n    parser.write(arrayBuffer);\n    if (!headerReturned && parser.result.dbfHeader) {\n      headerReturned = true;\n      const tableBuilder = parser.result.tableBuilder!;\n      const tableBatch = tableBuilder.firstBatch();\n      if (tableBatch) {\n        yield tableBatch;\n      }\n    }\n    const tableBuilder = parser.result.tableBuilder!;\n    const tableBatch = tableBuilder.flushBatch();\n    if (tableBatch) {\n      yield tableBatch;\n    }\n  }\n  parser.end();\n  const tableBuilder = parser.result.tableBuilder!;\n  const tableBatch = tableBuilder.finishBatch();\n  if (tableBatch) {\n    yield tableBatch;\n  }\n}\n\n/**\n * https://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm\n * @param state\n * @param result\n * @param binaryReader\n * @param textDecoder\n * @returns\n */\n/* eslint-disable complexity, max-depth */\nfunction parseState(\n  state: STATE,\n  result: DBFResult,\n  binaryReader: BinaryChunkReader,\n  textDecoder: TextDecoder\n): STATE {\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    try {\n      switch (state) {\n        case STATE.ERROR:\n        case STATE.END:\n          return state;\n\n        case STATE.START:\n          // Parse initial file header\n          // DBF Header\n          const dataView = binaryReader.getDataView(DBF_HEADER_SIZE);\n          if (!dataView) {\n            return state;\n          }\n          result.dbfHeader = parseDBFHeader(dataView);\n          result.progress = {\n            bytesUsed: 0,\n            rowsTotal: result.dbfHeader.nRecords,\n            rows: 0\n          };\n          state = STATE.FIELD_DESCRIPTORS;\n          break;\n\n        case STATE.FIELD_DESCRIPTORS:\n          // Parse DBF field descriptors (schema)\n          const fieldDescriptorView = binaryReader.getDataView(\n            // @ts-ignore\n            result.dbfHeader.headerLength - DBF_HEADER_SIZE\n          );\n          if (!fieldDescriptorView) {\n            return state;\n          }\n\n          result.dbfFields = parseFieldDescriptors(fieldDescriptorView, textDecoder);\n          const schema = {\n            fields: result.dbfFields.map((dbfField) => makeField(dbfField)),\n            metadata: {}\n          } as const satisfies Schema;\n          result.tableBuilder = new ArrowTableBuilder(schema);\n\n          state = STATE.FIELD_PROPERTIES;\n\n          // TODO(kyle) Not exactly sure why start offset needs to be headerLength + 1?\n          // parsedbf uses ((fields.length + 1) << 5) + 2;\n          binaryReader.skip(1);\n          break;\n\n        case STATE.FIELD_PROPERTIES:\n          const {recordLength = 0, nRecords = 0} = result?.dbfHeader || {};\n          let rowCount = 0;\n          while (rowCount < nRecords) {\n            rowCount++;\n\n            const recordView = binaryReader.getDataView(recordLength - 1);\n            if (!recordView) {\n              return state;\n            }\n            // Note: Avoid actually reading the last byte, which may not be present\n            binaryReader.skip(1);\n\n            // @ts-ignore\n            const row = parseRow(recordView, result.dbfFields, textDecoder);\n            result.tableBuilder!.addObjectRow(row);\n            // result.progress.rows = result.data.length;\n          }\n          state = STATE.END;\n          break;\n\n        default:\n          state = STATE.ERROR;\n          result.error = `illegal parser state ${state}`;\n          return state;\n      }\n    } catch (error) {\n      state = STATE.ERROR;\n      result.error = `DBF parsing failed: ${(error as Error).message}`;\n      return state;\n    }\n  }\n}\n\n/**\n * @param headerView\n */\nfunction parseDBFHeader(headerView: DataView): DBFHeader {\n  return {\n    // Last updated date\n    year: headerView.getUint8(1) + 1900,\n    month: headerView.getUint8(2),\n    day: headerView.getUint8(3),\n    // Number of records in data file\n    nRecords: headerView.getUint32(4, LITTLE_ENDIAN),\n    // Length of header in bytes\n    headerLength: headerView.getUint16(8, LITTLE_ENDIAN),\n    // Length of each record\n    recordLength: headerView.getUint16(10, LITTLE_ENDIAN),\n    // Not sure if this is usually set\n    languageDriver: headerView.getUint8(29)\n  };\n}\n\n/**\n * @param view\n */\nfunction parseFieldDescriptors(view: DataView, textDecoder: TextDecoder): DBFField[] {\n  // NOTE: this might overestimate the number of fields if the \"Database\n  // Container\" container exists and is included in the headerLength\n  const nFields = (view.byteLength - 1) / 32;\n  const fields: DBFField[] = [];\n  let offset = 0;\n  for (let i = 0; i < nFields; i++) {\n    const name = textDecoder\n      .decode(new Uint8Array(view.buffer, view.byteOffset + offset, 11))\n      // eslint-disable-next-line no-control-regex\n      .replace(/\\u0000/g, '');\n\n    fields.push({\n      name,\n      dataType: String.fromCharCode(view.getUint8(offset + 11)),\n      fieldLength: view.getUint8(offset + 16),\n      decimal: view.getUint8(offset + 17)\n    });\n    offset += 32;\n  }\n  return fields;\n}\n\n/**\n *\n * @param view\n * @param fields\n * @param textDecoder\n * @returns\n */\nfunction parseRow(\n  view: DataView,\n  fields: DBFField[],\n  textDecoder: TextDecoder\n): {[key: string]: any} {\n  const out: {[key: string]: string | number | boolean | null} = {};\n  let offset = 0;\n  for (const field of fields) {\n    const text = textDecoder.decode(\n      new Uint8Array(view.buffer, view.byteOffset + offset, field.fieldLength)\n    );\n    out[field.name] = parseField(text, field.dataType);\n    offset += field.fieldLength;\n  }\n\n  return out;\n}\n\n/**\n * Should NaN be coerced to null?\n * @param text\n * @param dataType\n * @returns Field depends on a type of the data\n */\nfunction parseField(text: string, dataType: string): string | number | boolean | null {\n  switch (dataType) {\n    case 'B':\n      return parseNumber(text);\n    case 'C':\n      return parseCharacter(text);\n    case 'F':\n      return parseNumber(text);\n    case 'N':\n      return parseNumber(text);\n    case 'O':\n      return parseNumber(text);\n    case 'D':\n      return parseDate(text);\n    case 'L':\n      return parseBoolean(text);\n    default:\n      throw new Error('Unsupported data type');\n  }\n}\n\n/**\n * Parse YYYYMMDD to date in milliseconds\n * @param str YYYYMMDD\n * @returns new Date as a number\n */\nfunction parseDate(str: any): number {\n  return Date.UTC(str.slice(0, 4), parseInt(str.slice(4, 6), 10) - 1, str.slice(6, 8));\n}\n\n/**\n * Read boolean value\n * any of Y, y, T, t coerce to true\n * any of N, n, F, f coerce to false\n * otherwise null\n * @param value\n * @returns boolean | null\n */\nfunction parseBoolean(value: string): boolean | null {\n  return /^[nf]$/i.test(value) ? false : /^[yt]$/i.test(value) ? true : null;\n}\n\n/**\n * Return null instead of NaN\n * @param text\n * @returns number | null\n */\nfunction parseNumber(text: string): number | null {\n  const number = parseFloat(text);\n  return isNaN(number) ? null : number;\n}\n\n/**\n *\n * @param text\n * @returns string | null\n */\nfunction parseCharacter(text: string): string | null {\n  return text.trim() || null;\n}\n\n/**\n * Create a standard Arrow-style `Field` from field descriptor.\n * TODO - use `fieldLength` and `decimal` to generate smaller types?\n * @param param0\n * @returns Field\n */\n// eslint-disable\nfunction makeField({name, dataType, fieldLength, decimal}: DBFField): Field {\n  switch (dataType) {\n    case 'B':\n      return {name, type: 'float64', nullable: true, metadata: {}};\n    case 'C':\n      return {name, type: 'utf8', nullable: true, metadata: {}};\n    case 'F':\n      return {name, type: 'float64', nullable: true, metadata: {}};\n    case 'N':\n      return {name, type: 'float64', nullable: true, metadata: {}};\n    case 'O':\n      return {name, type: 'float64', nullable: true, metadata: {}};\n    case 'D':\n      return {name, type: 'timestamp-millisecond', nullable: true, metadata: {}};\n    case 'L':\n      return {name, type: 'bool', nullable: true, metadata: {}};\n    default:\n      throw new Error('Unsupported data type');\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Format} from '@loaders.gl/loader-utils';\n\n/** Information about the DBF format */\nexport const DBFFormat = {\n  name: 'DBF',\n  id: 'dbf',\n  module: 'shapefile',\n  category: 'table',\n  extensions: ['dbf'],\n  mimeTypes: ['application/x-dbf']\n} as const satisfies Format;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderWithParser, StrictLoaderOptions} from '@loaders.gl/loader-utils';\nimport type {ArrowTable, ArrowTableBatch} from '@loaders.gl/schema';\nimport {parseDBF, parseDBFInBatches} from './lib/parsers/parse-dbf-to-arrow';\nimport {DBFFormat} from './dbf-format';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type DBFLoaderOptions = StrictLoaderOptions & {\n  dbf?: {\n    encoding?: string;\n    /** Override the URL to the worker bundle (by default loads from unpkg.com) */\n    workerUrl?: string;\n  };\n};\n\n/**\n * DBFLoader - DBF files are used to contain non-geometry columns in Shapefiles\n */\nexport const DBFArrowWorkerLoader = {\n  ...DBFFormat,\n  dataType: null as unknown as ArrowTable,\n  batchType: null as unknown as ArrowTableBatch,\n  version: VERSION,\n  worker: true,\n  options: {\n    dbf: {\n      encoding: 'latin1'\n    }\n  }\n} as const satisfies Loader<ArrowTable, ArrowTableBatch, DBFLoaderOptions>;\n\n/** DBF file loader */\nexport const DBFArrowLoader = {\n  ...DBFArrowWorkerLoader,\n  parse: async (arrayBuffer, options) => parseDBF(arrayBuffer, options),\n  parseSync: parseDBF,\n  parseInBatches(\n    arrayBufferIterator:\n      | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n      | Iterable<ArrayBufferLike | ArrayBufferView>,\n    options\n  ) {\n    return parseDBFInBatches(arrayBufferIterator, options);\n  }\n} as const satisfies LoaderWithParser<ArrowTable, ArrowTableBatch, DBFLoaderOptions>;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport class BinaryReader {\n  offset: number;\n  arrayBuffer: ArrayBuffer;\n\n  constructor(arrayBuffer: ArrayBuffer) {\n    /** current global (stream) offset */\n    this.offset = 0;\n    /** current buffer from iterator */\n    this.arrayBuffer = arrayBuffer;\n  }\n  /**\n   * Checks if there are available bytes in data\n   *\n   * @param bytes\n   * @returns boolean\n   */\n  hasAvailableBytes(bytes: number): boolean {\n    return this.arrayBuffer.byteLength - this.offset >= bytes;\n  }\n\n  /**\n   * Get the required number of bytes from the iterator\n   *\n   * @param bytes\n   * @returns Dataview\n   */\n  getDataView(bytes: number): DataView {\n    if (bytes && !this.hasAvailableBytes(bytes)) {\n      throw new Error('binary data exhausted');\n    }\n\n    const dataView = bytes\n      ? new DataView(this.arrayBuffer, this.offset, bytes)\n      : new DataView(this.arrayBuffer, this.offset);\n    this.offset += bytes;\n    return dataView;\n  }\n\n  /**\n   * Skipping\n   *\n   * @param bytes\n   */\n  skip(bytes: number): void {\n    this.offset += bytes;\n  }\n\n  /**\n   * Rewinding\n   *\n   * @param bytes\n   */\n  rewind(bytes: number): void {\n    this.offset -= bytes;\n  }\n}\n"],
  "mappings": "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",
  "names": ["view", "LITTLE_ENDIAN", "LITTLE_ENDIAN", "BIG_ENDIAN", "SHP_MAGIC_NUMBER", "import_loader_utils", "BIG_ENDIAN", "import_loader_utils", "LITTLE_ENDIAN", "STATE", "parseState", "VERSION", "VERSION", "SHP_MAGIC_NUMBER", "import_loader_utils", "LITTLE_ENDIAN", "DBF_HEADER_SIZE", "STATE", "DBFParser", "parseState", "parseDBF", "parseDBFInBatches", "tableBuilder", "tableBatch", "parseDBFHeader", "parseFieldDescriptors", "makeField", "parseRow", "parseField", "parseNumber", "parseCharacter", "parseDate", "parseBoolean", "VERSION", "parseDBF", "parseDBFInBatches"]
}
