{"version":3,"file":"nmr-parser.min.js","sources":["../node_modules/is-any-array/lib-esm/index.js","../src/constantTables.js","../src/formatDependentVariable.js","../src/formatLinearDimension.js","../node_modules/iobuffer/lib-esm/text.browser.js","../node_modules/iobuffer/lib-esm/IOBuffer.js","../node_modules/jeolconverter/src/conversionTables.js","../node_modules/jeolconverter/src/utils.js","../node_modules/jeolconverter/src/parseJEOL.js","../node_modules/gyromagnetic-ratio/lib-esm/index.js","../node_modules/median-quickselect/lib/median-quickselect.min.js","../node_modules/ml-spectra-processing/lib-esm/matrix/matrixMinMaxZ.js","../node_modules/ml-spectra-processing/lib-esm/matrix/matrixCheck.js","../node_modules/ml-spectra-processing/lib-esm/utils/createStepArray.js","../node_modules/ensure-string/lib-esm/index.js","../node_modules/isutf8/dist/index.esm.js","../src/utils/toKeyValue.js","../src/fromJEOL.js","../node_modules/brukerconverter/src/groupByExperiments.js","../node_modules/brukerconverter/src/util/joinMetaInfo.js","../node_modules/dynamic-typing/src/parseString.js","../node_modules/jcampconverter/lib-esm/complexChromatogram.js","../node_modules/jcampconverter/lib-esm/convertToFloatArray.js","../node_modules/jcampconverter/lib-esm/parse/fastParseXYData.js","../node_modules/jcampconverter/lib-esm/parse/parsePeakTable.js","../node_modules/jcampconverter/lib-esm/parse/parseXYA.js","../node_modules/ml-array-median/lib-es6/index.js","../node_modules/jcampconverter/lib-esm/2d/add2D.js","../node_modules/jcampconverter/lib-esm/2d/convertTo3DZ.js","../node_modules/jcampconverter/lib-esm/2d/generateContourLines.js","../node_modules/jcampconverter/lib-esm/profiling.js","../node_modules/jcampconverter/lib-esm/simpleChromatogram.js","../node_modules/jcampconverter/lib-esm/postProcessing.js","../node_modules/jcampconverter/lib-esm/postProcessingNMR.js","../node_modules/jcampconverter/lib-esm/prepareNtuplesDatatable.js","../node_modules/jcampconverter/lib-esm/prepareSpectrum.js","../node_modules/jcampconverter/lib-esm/convert.js","../node_modules/brukerconverter/src/util/parseData.js","../node_modules/brukerconverter/src/util/setFIDSpectrumData.js","../node_modules/brukerconverter/src/util/setXYSpectrumData.js","../node_modules/brukerconverter/src/util/convert1D.js","../node_modules/brukerconverter/src/util/mergeMetadata.js","../node_modules/brukerconverter/src/util/convert2D.js","../node_modules/brukerconverter/src/util/convertTo3DZ.js","../node_modules/brukerconverter/src/util/convertOneExperiment.js","../node_modules/brukerconverter/src/convertFileCollection.js","../src/utils/convertToFloatArray.js","../src/utils/getDigitalFilterParameters.js","../src/utils/getNucleusFromMetadata.js","../src/utils/getSpectrumType.js","../src/utils/getInfoFromJCAMP.js","../src/fromBruker.js","../src/fromJCAMP.js","../src/read.js"],"sourcesContent":["const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n    return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","/**\n * a number that correspond to a type of numeric\n * @typedef {number} numericType\n * @const\n */\nexport const numericTypeTable = {\n  0: 'uint8',\n  1: 'uint16',\n  2: 'uint32',\n  3: 'uint64',\n  4: 'int8',\n  5: 'int16',\n  6: 'int32',\n  7: 'int64',\n  8: 'float32',\n  9: 'float64',\n  10: 'complex64',\n  11: 'complex128',\n};\n\n/**\n * a number that corresponds to a type of quantity\n * @typedef {number} quantityType\n * @const\n */\nexport const quantityTypeTable = {\n  0: 'scalar',\n  1: 'vector',\n  2: 'matrix',\n  3: 'symetricMatrix',\n  4: 'pixel',\n};\n","import { isAnyArray } from 'is-any-array';\n\nimport { numericTypeTable, quantityTypeTable } from './constantTables';\n/**\n * a class for dependent variable\n * @param {object || array} data - the dependent variable\n * @param {numericType} numericType - a number that correspond to a type of numeric used to store the components\n * @param {object} [options] - an object with options (name, unit, quantityName, componentLabels, sparseSampling, application, description)\n * @param {string} [options.name] - a name of the dependent variable\n * @param {string} [options.unit] - the unit of the dependent variable\n * @param {string} [options.quantityName] - a name of the quantity\n * @param {array} [options.componentLabels] - an array of labels for each component of the dependent variable\n * @return {object} - an dependent variable\n */\nexport function formatDependentVariable(data, numericType, options = {}) {\n  let {\n    quantityType = 0,\n    encoding = 'none',\n    name = '',\n    unit = '',\n    quantityName = '',\n    componentLabels = [],\n    sparseSampling = {},\n    from = 0,\n    to = -1,\n  } = options;\n\n  let components;\n  if (isAnyArray(data)) {\n    throw new Error('not yet implemented');\n  } else if (Object.keys(data).length === 2) {\n    components = fromReIm(data, from, to);\n  }\n\n  if (componentLabels.length === 0) {\n    componentLabels = components.componentLabels;\n  }\n\n  return {\n    type: 'internal',\n    quantityType: quantityTypeTable[quantityType],\n    numericType: numericTypeTable[numericType],\n    encoding,\n    name,\n    unit,\n    quantityName,\n    componentLabels,\n    sparseSampling,\n    description: options.description || '',\n    application: options.application || '',\n    components: components.components,\n    dataLength: components.dataLength,\n  };\n}\n\n/**\n * import object {re:[], im:[]} to component\n * @param {object} reIm - a reIm object to import\n * @param {number} from - lower limit\n * @param {number} to - upper limit\n * @return {array} - components\n */\nfunction fromReIm(reIm, from, to) {\n  let dataLength = [];\n  let componentLabels = [];\n  let components = [];\n  if (isAnyArray(reIm.re) & isAnyArray(reIm.im)) {\n    if (typeof reIm.re[0] === 'number') {\n      // if 1D\n      dataLength[0] = setLengthComplex(from[0], to[0], reIm.re.length);\n      let component = new Float64Array(dataLength[0]);\n      for (let i = 0; i < dataLength[0]; i += 2) {\n        let idx = i + from[0] * 2;\n        component[i] = reIm.re[idx / 2];\n        component[i + 1] = reIm.im[idx / 2];\n      }\n      components.push(component);\n      componentLabels.push('complex');\n    } else if (isAnyArray(reIm.re[0])) {\n      // if 2D\n      dataLength[0] = setLength(from[1], to[1], reIm.re.length);\n      dataLength[1] = setLengthComplex(from[0], to[0], reIm.re[0].length);\n\n      for (let j = 0; j < dataLength[0]; j++) {\n        let component = new Float64Array(dataLength[1]);\n        for (let i = 0; i < dataLength[1]; i += 2) {\n          let idx = i + from[0] * 2;\n          component[i] = reIm.re[j][idx / 2];\n          component[i + 1] = reIm.im[j][idx / 2];\n        }\n        components.push(component);\n      }\n    } else {\n      throw new Error('check your object');\n    }\n  } else if (isAnyArray(reIm.re.re)) {\n    dataLength[0] = setLengthComplex(from[1], to[1], reIm.re.re.length);\n    let re = fromReIm(reIm.re, from, to).components;\n    let im = fromReIm(reIm.im, from, to).components;\n    for (let j = 0; j < dataLength[0] / 2; j++) {\n      components.push(re[j]);\n      components.push(im[j]);\n    }\n  } else {\n    throw new Error('check the dimension or the type of data in your array');\n  }\n  return {\n    dataLength,\n    componentLabels,\n    components,\n  };\n}\n\nfunction setLength(from, to, length) {\n  if (to - from + 1 < length) {\n    return to - from + 1;\n  } else {\n    return length;\n  }\n}\n\nfunction setLengthComplex(from, to, length) {\n  if (to - from + 1 < length) {\n    return (to - from + 1) * 2;\n  } else {\n    return length * 2;\n  }\n}\n\n// /**\n//  * add component to components from 1D array.\n//  * @param {array} array - a 1D or 2D array to import\n//  * @return {Float64Array} - component\n//  */\n// function add1DArray(array) {\n//   let component;\n//   component = new Float64Array(array.length);\n//   for (let i = 0; i < array.length; i++) {\n//     component[i] = array[i];\n//   }\n//   return component;\n// }\n\n// /**\n//  * import component to InternalDEPENDENTVAR class object from 1D or 2D array.\n//  * @param {array} array - a 1D or 2D array to import\n//  */\n// function fromArray(array) {\n//   this.dataLength[0] = array.length;\n//   if (typeof array[0] === 'number') {\n//     this.components = [this.add1DArray(array)];\n//   } else if (Array.isArray(array[0])) {\n//     this.dataLength[1] = array[0].length;\n//     for (let j = 0; j < this.dataLength[1]; j++) {\n//       this.components.push(this.add1DArray(array[j]));\n//     }\n//   } else {\n//     throw new Error('check the dimension or the type of data in your array');\n//   }\n//   return this;\n// }\n","/**\n *\n * @param {*} label\n * @param {*} count\n * @param {*} increment\n * @param {*} options\n */\nexport function formatLinearDimension(label, count, increment, options = {}) {\n  return {\n    label: String(label),\n    count: Number(count),\n    increment,\n    type: 'linear',\n    description: String(options.description) || '',\n    application: options.application || {},\n    coordinatesOffset: options.coordinatesOffset || 0,\n    originOffset: options.originOffset || 0,\n    quantityName: String(options.quantityName) || '',\n    reciprocal: options.reciprocal || {},\n    period: options.period || 0,\n    complexFFT: options.complexFFT || false,\n  };\n}\n","// eslint-disable-next-line import/no-unassigned-import\nimport './text-encoding-polyfill';\nexport function decode(bytes, encoding = 'utf8') {\n    const decoder = new TextDecoder(encoding);\n    return decoder.decode(bytes);\n}\nconst encoder = new TextEncoder();\nexport function encode(str) {\n    return encoder.encode(str);\n}\n//# sourceMappingURL=text.browser.js.map","import { decode, encode } from './text';\nconst defaultByteLength = 1024 * 8;\nexport class IOBuffer {\n    /**\n     * @param data - The data to construct the IOBuffer with.\n     * If data is a number, it will be the new buffer's length<br>\n     * If data is `undefined`, the buffer will be initialized with a default length of 8Kb<br>\n     * If data is an ArrayBuffer, SharedArrayBuffer, an ArrayBufferView (Typed Array), an IOBuffer instance,\n     * or a Node.js Buffer, a view will be created over the underlying ArrayBuffer.\n     * @param options\n     */\n    constructor(data = defaultByteLength, options = {}) {\n        let dataIsGiven = false;\n        if (typeof data === 'number') {\n            data = new ArrayBuffer(data);\n        }\n        else {\n            dataIsGiven = true;\n            this.lastWrittenByte = data.byteLength;\n        }\n        const offset = options.offset ? options.offset >>> 0 : 0;\n        const byteLength = data.byteLength - offset;\n        let dvOffset = offset;\n        if (ArrayBuffer.isView(data) || data instanceof IOBuffer) {\n            if (data.byteLength !== data.buffer.byteLength) {\n                dvOffset = data.byteOffset + offset;\n            }\n            data = data.buffer;\n        }\n        if (dataIsGiven) {\n            this.lastWrittenByte = byteLength;\n        }\n        else {\n            this.lastWrittenByte = 0;\n        }\n        this.buffer = data;\n        this.length = byteLength;\n        this.byteLength = byteLength;\n        this.byteOffset = dvOffset;\n        this.offset = 0;\n        this.littleEndian = true;\n        this._data = new DataView(this.buffer, dvOffset, byteLength);\n        this._mark = 0;\n        this._marks = [];\n    }\n    /**\n     * Checks if the memory allocated to the buffer is sufficient to store more\n     * bytes after the offset.\n     * @param byteLength - The needed memory in bytes.\n     * @returns `true` if there is sufficient space and `false` otherwise.\n     */\n    available(byteLength = 1) {\n        return this.offset + byteLength <= this.length;\n    }\n    /**\n     * Check if little-endian mode is used for reading and writing multi-byte\n     * values.\n     * @returns `true` if little-endian mode is used, `false` otherwise.\n     */\n    isLittleEndian() {\n        return this.littleEndian;\n    }\n    /**\n     * Set little-endian mode for reading and writing multi-byte values.\n     */\n    setLittleEndian() {\n        this.littleEndian = true;\n        return this;\n    }\n    /**\n     * Check if big-endian mode is used for reading and writing multi-byte values.\n     * @returns `true` if big-endian mode is used, `false` otherwise.\n     */\n    isBigEndian() {\n        return !this.littleEndian;\n    }\n    /**\n     * Switches to big-endian mode for reading and writing multi-byte values.\n     */\n    setBigEndian() {\n        this.littleEndian = false;\n        return this;\n    }\n    /**\n     * Move the pointer n bytes forward.\n     * @param n - Number of bytes to skip.\n     */\n    skip(n = 1) {\n        this.offset += n;\n        return this;\n    }\n    /**\n     * Move the pointer n bytes backward.\n     * @param n - Number of bytes to move back.\n     */\n    back(n = 1) {\n        this.offset -= n;\n        return this;\n    }\n    /**\n     * Move the pointer to the given offset.\n     * @param offset\n     */\n    seek(offset) {\n        this.offset = offset;\n        return this;\n    }\n    /**\n     * Store the current pointer offset.\n     * @see {@link IOBuffer#reset}\n     */\n    mark() {\n        this._mark = this.offset;\n        return this;\n    }\n    /**\n     * Move the pointer back to the last pointer offset set by mark.\n     * @see {@link IOBuffer#mark}\n     */\n    reset() {\n        this.offset = this._mark;\n        return this;\n    }\n    /**\n     * Push the current pointer offset to the mark stack.\n     * @see {@link IOBuffer#popMark}\n     */\n    pushMark() {\n        this._marks.push(this.offset);\n        return this;\n    }\n    /**\n     * Pop the last pointer offset from the mark stack, and set the current\n     * pointer offset to the popped value.\n     * @see {@link IOBuffer#pushMark}\n     */\n    popMark() {\n        const offset = this._marks.pop();\n        if (offset === undefined) {\n            throw new Error('Mark stack empty');\n        }\n        this.seek(offset);\n        return this;\n    }\n    /**\n     * Move the pointer offset back to 0.\n     */\n    rewind() {\n        this.offset = 0;\n        return this;\n    }\n    /**\n     * Make sure the buffer has sufficient memory to write a given byteLength at\n     * the current pointer offset.\n     * If the buffer's memory is insufficient, this method will create a new\n     * buffer (a copy) with a length that is twice (byteLength + current offset).\n     * @param byteLength\n     */\n    ensureAvailable(byteLength = 1) {\n        if (!this.available(byteLength)) {\n            const lengthNeeded = this.offset + byteLength;\n            const newLength = lengthNeeded * 2;\n            const newArray = new Uint8Array(newLength);\n            newArray.set(new Uint8Array(this.buffer));\n            this.buffer = newArray.buffer;\n            this.length = this.byteLength = newLength;\n            this._data = new DataView(this.buffer);\n        }\n        return this;\n    }\n    /**\n     * Read a byte and return false if the byte's value is 0, or true otherwise.\n     * Moves pointer forward by one byte.\n     */\n    readBoolean() {\n        return this.readUint8() !== 0;\n    }\n    /**\n     * Read a signed 8-bit integer and move pointer forward by 1 byte.\n     */\n    readInt8() {\n        return this._data.getInt8(this.offset++);\n    }\n    /**\n     * Read an unsigned 8-bit integer and move pointer forward by 1 byte.\n     */\n    readUint8() {\n        return this._data.getUint8(this.offset++);\n    }\n    /**\n     * Alias for {@link IOBuffer#readUint8}.\n     */\n    readByte() {\n        return this.readUint8();\n    }\n    /**\n     * Read `n` bytes and move pointer forward by `n` bytes.\n     */\n    readBytes(n = 1) {\n        const bytes = new Uint8Array(n);\n        for (let i = 0; i < n; i++) {\n            bytes[i] = this.readByte();\n        }\n        return bytes;\n    }\n    /**\n     * Read a 16-bit signed integer and move pointer forward by 2 bytes.\n     */\n    readInt16() {\n        const value = this._data.getInt16(this.offset, this.littleEndian);\n        this.offset += 2;\n        return value;\n    }\n    /**\n     * Read a 16-bit unsigned integer and move pointer forward by 2 bytes.\n     */\n    readUint16() {\n        const value = this._data.getUint16(this.offset, this.littleEndian);\n        this.offset += 2;\n        return value;\n    }\n    /**\n     * Read a 32-bit signed integer and move pointer forward by 4 bytes.\n     */\n    readInt32() {\n        const value = this._data.getInt32(this.offset, this.littleEndian);\n        this.offset += 4;\n        return value;\n    }\n    /**\n     * Read a 32-bit unsigned integer and move pointer forward by 4 bytes.\n     */\n    readUint32() {\n        const value = this._data.getUint32(this.offset, this.littleEndian);\n        this.offset += 4;\n        return value;\n    }\n    /**\n     * Read a 32-bit floating number and move pointer forward by 4 bytes.\n     */\n    readFloat32() {\n        const value = this._data.getFloat32(this.offset, this.littleEndian);\n        this.offset += 4;\n        return value;\n    }\n    /**\n     * Read a 64-bit floating number and move pointer forward by 8 bytes.\n     */\n    readFloat64() {\n        const value = this._data.getFloat64(this.offset, this.littleEndian);\n        this.offset += 8;\n        return value;\n    }\n    /**\n     * Read a 64-bit signed integer number and move pointer forward by 8 bytes.\n     */\n    readBigInt64() {\n        const value = this._data.getBigInt64(this.offset, this.littleEndian);\n        this.offset += 8;\n        return value;\n    }\n    /**\n     * Read a 64-bit unsigned integer number and move pointer forward by 8 bytes.\n     */\n    readBigUint64() {\n        const value = this._data.getBigUint64(this.offset, this.littleEndian);\n        this.offset += 8;\n        return value;\n    }\n    /**\n     * Read a 1-byte ASCII character and move pointer forward by 1 byte.\n     */\n    readChar() {\n        return String.fromCharCode(this.readInt8());\n    }\n    /**\n     * Read `n` 1-byte ASCII characters and move pointer forward by `n` bytes.\n     */\n    readChars(n = 1) {\n        let result = '';\n        for (let i = 0; i < n; i++) {\n            result += this.readChar();\n        }\n        return result;\n    }\n    /**\n     * Read the next `n` bytes, return a UTF-8 decoded string and move pointer\n     * forward by `n` bytes.\n     */\n    readUtf8(n = 1) {\n        return decode(this.readBytes(n));\n    }\n    /**\n     * Read the next `n` bytes, return a string decoded with `encoding` and move pointer\n     * forward by `n` bytes.\n     * If no encoding is passed, the function is equivalent to @see {@link IOBuffer#readUtf8}\n     */\n    decodeText(n = 1, encoding = 'utf-8') {\n        return decode(this.readBytes(n), encoding);\n    }\n    /**\n     * Write 0xff if the passed value is truthy, 0x00 otherwise and move pointer\n     * forward by 1 byte.\n     */\n    writeBoolean(value) {\n        this.writeUint8(value ? 0xff : 0x00);\n        return this;\n    }\n    /**\n     * Write `value` as an 8-bit signed integer and move pointer forward by 1 byte.\n     */\n    writeInt8(value) {\n        this.ensureAvailable(1);\n        this._data.setInt8(this.offset++, value);\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as an 8-bit unsigned integer and move pointer forward by 1\n     * byte.\n     */\n    writeUint8(value) {\n        this.ensureAvailable(1);\n        this._data.setUint8(this.offset++, value);\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * An alias for {@link IOBuffer#writeUint8}.\n     */\n    writeByte(value) {\n        return this.writeUint8(value);\n    }\n    /**\n     * Write all elements of `bytes` as uint8 values and move pointer forward by\n     * `bytes.length` bytes.\n     */\n    writeBytes(bytes) {\n        this.ensureAvailable(bytes.length);\n        for (let i = 0; i < bytes.length; i++) {\n            this._data.setUint8(this.offset++, bytes[i]);\n        }\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 16-bit signed integer and move pointer forward by 2\n     * bytes.\n     */\n    writeInt16(value) {\n        this.ensureAvailable(2);\n        this._data.setInt16(this.offset, value, this.littleEndian);\n        this.offset += 2;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 16-bit unsigned integer and move pointer forward by 2\n     * bytes.\n     */\n    writeUint16(value) {\n        this.ensureAvailable(2);\n        this._data.setUint16(this.offset, value, this.littleEndian);\n        this.offset += 2;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 32-bit signed integer and move pointer forward by 4\n     * bytes.\n     */\n    writeInt32(value) {\n        this.ensureAvailable(4);\n        this._data.setInt32(this.offset, value, this.littleEndian);\n        this.offset += 4;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 32-bit unsigned integer and move pointer forward by 4\n     * bytes.\n     */\n    writeUint32(value) {\n        this.ensureAvailable(4);\n        this._data.setUint32(this.offset, value, this.littleEndian);\n        this.offset += 4;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 32-bit floating number and move pointer forward by 4\n     * bytes.\n     */\n    writeFloat32(value) {\n        this.ensureAvailable(4);\n        this._data.setFloat32(this.offset, value, this.littleEndian);\n        this.offset += 4;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 64-bit floating number and move pointer forward by 8\n     * bytes.\n     */\n    writeFloat64(value) {\n        this.ensureAvailable(8);\n        this._data.setFloat64(this.offset, value, this.littleEndian);\n        this.offset += 8;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 64-bit signed bigint and move pointer forward by 8\n     * bytes.\n     */\n    writeBigInt64(value) {\n        this.ensureAvailable(8);\n        this._data.setBigInt64(this.offset, value, this.littleEndian);\n        this.offset += 8;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 64-bit unsigned bigint and move pointer forward by 8\n     * bytes.\n     */\n    writeBigUint64(value) {\n        this.ensureAvailable(8);\n        this._data.setBigUint64(this.offset, value, this.littleEndian);\n        this.offset += 8;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write the charCode of `str`'s first character as an 8-bit unsigned integer\n     * and move pointer forward by 1 byte.\n     */\n    writeChar(str) {\n        return this.writeUint8(str.charCodeAt(0));\n    }\n    /**\n     * Write the charCodes of all `str`'s characters as 8-bit unsigned integers\n     * and move pointer forward by `str.length` bytes.\n     */\n    writeChars(str) {\n        for (let i = 0; i < str.length; i++) {\n            this.writeUint8(str.charCodeAt(i));\n        }\n        return this;\n    }\n    /**\n     * UTF-8 encode and write `str` to the current pointer offset and move pointer\n     * forward according to the encoded length.\n     */\n    writeUtf8(str) {\n        return this.writeBytes(encode(str));\n    }\n    /**\n     * Export a Uint8Array view of the internal buffer.\n     * The view starts at the byte offset and its length\n     * is calculated to stop at the last written byte or the original length.\n     */\n    toArray() {\n        return new Uint8Array(this.buffer, this.byteOffset, this.lastWrittenByte);\n    }\n    /**\n     * Update the last written byte offset\n     * @private\n     */\n    _updateLastWrittenByte() {\n        if (this.offset > this.lastWrittenByte) {\n            this.lastWrittenByte = this.offset;\n        }\n    }\n}\n//# sourceMappingURL=IOBuffer.js.map","export const endianness = {\n  0: 'bigEndian',\n  1: 'littleEndian',\n};\n\nexport const instrumentTable = {\n  0: 'NONE',\n  1: 'GSX',\n  2: 'ALPHA',\n  3: 'ECLIPSE',\n  4: 'MASS_SPEC',\n  5: 'COMPILER',\n  6: 'OTHER_NMR',\n  7: 'UNKNOWN',\n  8: 'GEMINI',\n  9: 'UNITY',\n  10: 'ASPECT',\n  11: 'UX',\n  12: 'FELIX',\n  13: 'LAMBDA',\n  14: 'GE_1280',\n  15: 'GE_OMEGA',\n  16: 'CHEMAGNETICS',\n  17: 'CDFF',\n  18: 'GALACTIC',\n  19: 'TRIAD',\n  20: 'GENERIC_NMR',\n  21: 'GAMMA',\n  22: 'JCAMP_DX',\n  23: 'AMX',\n  24: 'DMX',\n  25: 'ECA',\n  26: 'ALICE',\n  27: 'NMR_PIPE',\n  28: 'SIMPSON',\n};\n\nexport const dataTypeTable = {\n  0: '64Bit Float',\n  1: '32Bit Float',\n  2: 'Reserved',\n  3: 'Reserved',\n};\n\nexport const dataFormatTable = {\n  1: 'One_D',\n  2: 'Two_D',\n  3: 'Three_D',\n  4: 'Four_D',\n  5: 'Five_D',\n  6: 'Six_D',\n  7: 'Seven_D',\n  8: 'Eight_D',\n  9: 'not for NMR data formats',\n  10: 'not for NMR data formats',\n  11: 'not for NMR data formats',\n  12: 'Small_Two_D',\n  13: 'Small_Three_D',\n  14: 'Small_Four_D',\n};\n\nexport const dataAxisTypeTable = {\n  0: 'None', //Axis is not used.\n  1: 'Real', //Axis has real data only, no imaginary.\n  2: 'TPPI',\n  3: 'Complex',\n  4: 'Real_Complex',\n  /* Axis should be accessed as complex when it is the major axis,\n            accessed as real otherwise.  This is only valid when all axes in\n            use have this setting.*/\n  5: 'Envelope',\n  /* Behaves the same way as a Real_Complex dimension but the data\n        has different meaning.  Instead of being treated as real and\n        imaginary parts of a complex number, the data should be treated as minimum and maximum parts of a projection.  This is used\n        for the data that results from an envelope projection.*/\n};\n\nexport const prefixTable = {\n  '-8': 'Yotta',\n  '-6': 'Exa',\n  '-7': 'Zetta',\n  '-5': 'Pecta',\n  '-4': 'Tera',\n  '-3': 'Giga',\n  '-2': 'Mega',\n  '-1': 'Kilo',\n  0: 'None',\n  1: 'Milli',\n  2: 'Micro',\n  3: 'Nano',\n  4: 'Pico',\n  5: 'Femto',\n  6: 'Atto',\n  7: 'Zepto',\n};\n\nexport const unitPrefixTable = {\n  Yotta: 24,\n  Exa: 21,\n  Zetta: 18,\n  Pecta: 15,\n  Tera: 12,\n  Giga: 9,\n  Mega: 6,\n  Kilo: 3,\n  None: 0,\n  Milli: -3,\n  Micro: -6,\n  Nano: -9,\n  Pico: -12,\n  Femto: -15,\n  Atto: -18,\n  Zepto: -21,\n};\n\nexport const baseTable = {\n  0: 'None',\n  1: 'Abundance',\n  2: 'Ampere',\n  3: 'Candela',\n  4: 'Celsius',\n  5: 'Coulomb',\n  6: 'Degree',\n  7: 'Electronvolt',\n  8: 'Farad',\n  9: 'Sievert',\n  10: 'Gram',\n  11: 'Gray',\n  12: 'Henry',\n  13: 'Hertz',\n  14: 'Kelvin',\n  15: 'Joule',\n  16: 'Liter',\n  17: 'Lumen',\n  18: 'Lux',\n  19: 'Meter',\n  20: 'Mole',\n  21: 'Newton',\n  22: 'Ohm',\n  23: 'Pascal',\n  24: 'Percent',\n  25: 'Point',\n  26: 'Ppm',\n  27: 'Radian',\n  28: 'Second',\n  29: 'Siemens',\n  30: 'Steradian',\n  31: 'Tesla',\n  32: 'Volt',\n  33: 'Watt',\n  34: 'Weber',\n  35: 'Decibel',\n  36: 'Dalton',\n  37: 'Thompson',\n  38: 'Ugeneric', // Treated as None, but never displayed',\n  39: 'LPercent ', // Treated as percent for display, but different for comparison',\n  40: 'PPT', // Parts per trillion (Private, do not use)',\n  41: 'PPB ', // Parts per billion (Private, do not use)',\n  42: 'Index',\n};\n\nexport const dataAxisRangedTable = {\n  0: 'Ranged',\n  /* The ruler for the axis ranges from Data_Axis_Start[n] to\n        Data_Axis_Stop[n] with a step function of\n            (Data_Axis_Stop[n] - Data_Axis_Start[n]) /\n            (Data_Offset_Stop[n] - Data_Offset_Start[n]) */\n  1: 'Listed', // (deprecated)\n  /* The ruler for the axis is a list of doubles stored in the\n        List Section.  Values in the ruler may be anything.*/\n  2: 'Sparse',\n  /*The ruler for the axis is a list of doubles stored in the\n        List Section.  Values in the rulers must be strictly monotonically\n        increasing or decreasing.*/\n  3: 'Listed',\n  /* The ruler for the axis is a list of doubles stored in the\n        List Section.  Values in the rulers do not fit definition of Sparse.*/\n};\n\nexport const valueTypeTable = {\n  0: 'String',\n  1: 'Integer',\n  2: 'Float',\n  3: 'Complex',\n  4: 'Infinity',\n};\n","import * as table from './conversionTables';\n\nexport function getPar(param, searchStr) {\n  return param.paramArray.find((o) => o.name === searchStr) || '';\n}\n\nexport function getDigitalFilter(param) {\n  const orders = param.paramArray.find((e) => e.name === 'orders');\n  const factors = param.paramArray.find((e) => e.name === 'factors');\n  const sweep = param.paramArray.find((e) => e.name === 'x_sweep');\n  const acqTime = param.paramArray.find((e) => e.name === 'x_acq_time');\n  const nbPoints = param.paramArray.find((e) => e.name === 'x_points');\n\n  const shouldStop = [orders, factors, sweep, acqTime, nbPoints].some((e) => e === undefined);\n\n  if (shouldStop) {\n    new Error('There is not all parameters to calculate the number of point of digital filter')\n    return;\n  }\n\n  const s = parseInt(orders.value.slice(0, 1), 10);\n  const jump = orders.value.slice(1).length / s;\n\n  let arg = 0;\n  let factorNumber = new Int8Array(s);\n  let offsetO = 1;\n  let offsetF = 0;\n  for (let i = 0; i < s; i++) {\n    factorNumber[i] = parseInt(factors.value.slice(offsetF, offsetF + 1), 10);\n    offsetF += 1;\n  }\n\n  for (let i = 0; i < s; i++) {\n    let productorial = 1;\n    for (let j = i; j < s; j++) {\n      productorial *= factorNumber[j];\n    }\n    arg +=\n      (parseInt(orders.value.slice(offsetO, offsetO + jump), 10) - 1) /\n      productorial;\n    offsetO += jump;\n  }\n  arg /= 2;\n\n  const delaySec = arg / sweep.value;\n  return (delaySec / acqTime.value) * (nbPoints.value - 1);\n}\n\nexport function getMagnitude(param, searchStr) {\n  let par = getPar(param, searchStr) || 'NA';\n  if (par === 'NA') {\n    return { magnitude: 'NA', unit: 'NA' };\n  }\n  let unit = par.unit[0].base;\n  let unitMult = table.unitPrefixTable[par.unit[0].prefix];\n  let magnitude = par.value * 10 ** unitMult;\n  return { magnitude, unit };\n}\n\nexport function getUnit(buffer, size) {\n  let unit = [];\n  for (let i = 0; i < size; i++) {\n    let byte = buffer.readByte();\n    let prefix = table.prefixTable[byte >> 4];\n    let power = byte & 0b00001111;\n    let base = table.baseTable[buffer.readInt8()];\n    unit.push({ prefix, power, base });\n  }\n  return unit;\n}\n\nexport function getString(buffer, size) {\n  let string = [];\n  for (let i = 0; i < size; i++) {\n    let char = buffer.readChar();\n    if (char !== '\\u0000') {\n      string.push(char);\n    }\n  }\n  return string.join('');\n}\n\nexport function getParamName(buffer, size) {\n  let string = [];\n  for (let i = 0; i < size; i++) {\n    let char = buffer.readChar();\n    if (char !== ' ') {\n      string.push(char);\n    }\n  }\n  return string.join('');\n}\n\nexport function getArray(buffer, size, format) {\n  let double = [];\n  for (let i = 0; i < size; i++) {\n    switch (format) {\n      case 'readUint32':\n        double.push(buffer.readUint32());\n        break;\n      case 'readFloat64':\n        double.push(buffer.readFloat64());\n        break;\n      case 'readFloat32':\n        double.push(buffer.readFloat32());\n        break;\n      case 'readUint8':\n        double.push(buffer.readUint8());\n        break;\n      case 'readBoolean':\n        double.push(buffer.readBoolean());\n        break;\n      default:\n        break;\n    }\n  }\n  return double;\n}\n","import { IOBuffer } from 'iobuffer';\n\nimport * as table from './conversionTables';\nimport {\n  getPar,\n  getMagnitude,\n  getParamName,\n  getArray,\n  getUnit,\n  getString,\n  getDigitalFilter,\n} from './utils';\n\n/**\n * A parser for 1D and 2D JDL NMR Files\n * @param {ArrayBuffer} buffer - a buffer object containing the JDL file\n * @return {Object} - an Object with converted data\n */\nexport function parseJEOL(buffer) {\n  let ioBuffer = new IOBuffer(buffer);\n  ioBuffer.setBigEndian();\n\n  // read header section\n  let byte;\n  let header = {};\n  let byteArray = [];\n\n  header.fileIdentifier = ioBuffer.readChars(8);\n  header.endian = table.endianness[ioBuffer.readInt8()];\n  header.majorVersion = ioBuffer.readUint8();\n  header.minorVersion = ioBuffer.readUint16();\n  header.dataDimensionNumber = ioBuffer.readUint8();\n\n  header.dataDimensionExist = ioBuffer\n    .readByte()\n    .toString(2)\n    .split('')\n    .map((x) => Boolean(Number(x)));\n\n  byte = ioBuffer.readByte();\n  header.dataType = table.dataTypeTable[byte >> 6];\n  header.dataFormat = table.dataFormatTable[byte & 0b00111111];\n  header.dataInstrument = table.instrumentTable[ioBuffer.readInt8()];\n  header.translate = getArray(ioBuffer, 8, 'readUint8');\n  header.dataAxisType = getArray(ioBuffer, 8, 'readUint8').map(\n    (x) => table.dataAxisTypeTable[x],\n  );\n\n  header.dataUnits = getUnit(ioBuffer, 8);\n  header.title = getString(ioBuffer, 124);\n\n  for (byte in getArray(ioBuffer, 4, 'readUint8')) {\n    byteArray.push(table.dataAxisRangedTable[byte >> 4]);\n    byteArray.push(table.dataAxisRangedTable[byte & 0b00001111]);\n  }\n\n  header.dataAxisRanged = byteArray;\n  header.dataPoints = getArray(ioBuffer, 8, 'readUint32');\n  header.dataOffsetStart = getArray(ioBuffer, 8, 'readUint32');\n  header.dataOffsetStop = getArray(ioBuffer, 8, 'readUint32');\n  header.dataAxisStart = getArray(ioBuffer, 8, 'readFloat64');\n  header.dataAxisStop = getArray(ioBuffer, 8, 'readFloat64');\n\n  byteArray = new Uint8Array(4);\n  for (let i = 0; i < 4; i++) {\n    byteArray[i] = ioBuffer.readByte();\n  }\n  let year = 1990 + (byteArray[0] >> 1);\n  let month = ((byteArray[0] << 3) & 0b00001000) + (byteArray[1] >> 5);\n  let day = byteArray[2] & 0b00011111;\n  header.creationTime = { year, month, day };\n\n  for (let i = 0; i < 4; i++) {\n    byteArray[i] = ioBuffer.readByte();\n  }\n  year = 1990 + (byteArray[0] >> 1);\n  month = ((byteArray[0] << 3) & 0b00001000) + (byteArray[1] >> 5);\n  day = byteArray[2] & 0b00011111;\n  header.revisionTime = { year, month, day };\n\n  header.nodeName = getString(ioBuffer, 16);\n  header.site = getString(ioBuffer, 128);\n  header.author = getString(ioBuffer, 128);\n  header.comment = getString(ioBuffer, 128);\n\n  let dataAxisTitles = [];\n  for (let i = 0; i < 8; i++) {\n    dataAxisTitles.push(getString(ioBuffer, 32));\n  }\n  header.dataAxisTitles = dataAxisTitles;\n\n  header.baseFreq = getArray(ioBuffer, 8, 'readFloat64');\n  header.zeroPoint = getArray(ioBuffer, 8, 'readFloat64');\n  header.reversed = getArray(ioBuffer, 8, 'readBoolean');\n  ioBuffer.skip(3);\n  header.annotationOK = Boolean(ioBuffer.readByte() >> 7);\n  header.historyUsed = ioBuffer.readUint32();\n  header.historyLength = ioBuffer.readUint32();\n  header.paramStart = ioBuffer.readUint32();\n  header.paramLength = ioBuffer.readUint32();\n  header.ListStart = getArray(ioBuffer, 8, 'readUint32');\n  header.ListLength = getArray(ioBuffer, 8, 'readUint32');\n  header.dataStart = ioBuffer.readUint32();\n  header.dataLength = (ioBuffer.readUint32() << 32) | ioBuffer.readUint32();\n  header.contextStart = (ioBuffer.readUint32() << 32) | ioBuffer.readUint32();\n  header.contextLength = ioBuffer.readUint32();\n  header.annoteStart = (ioBuffer.readUint32() << 32) | ioBuffer.readUint32();\n  header.annoteLength = ioBuffer.readUint32();\n  header.totalSize = (ioBuffer.readUint32() << 32) | ioBuffer.readUint32();\n  header.unitLocation = getArray(ioBuffer, 8, 'readUint8');\n\n  let compoundUnit = [];\n  for (let i = 0; i < 2; i++) {\n    let unit = [];\n    let scaler = ioBuffer.readInt16();\n    for (let j = 0; j < 5; j++) {\n      byte = ioBuffer.readInt16();\n      unit.push(byte);\n    }\n    compoundUnit.push({ scaler, unit });\n  }\n  header.compoundUnit = compoundUnit;\n\n  // section parameters (param header and array)\n  if (header.endian === 'littleEndian') {\n    ioBuffer.setLittleEndian();\n  }\n  ioBuffer.seek(header.paramStart);\n\n  let parameters = {\n    parameterSize: ioBuffer.readUint32(),\n    lowIndex: ioBuffer.readUint32(),\n    highIndex: ioBuffer.readUint32(),\n    totalSize: ioBuffer.readUint32(),\n  };\n  let paramArray = [];\n  for (let p = 0; p < parameters.highIndex + 1; p++) {\n    ioBuffer.skip(4);\n    let scaler = ioBuffer.readInt16();\n    let unit = getUnit(ioBuffer, 5);\n    ioBuffer.skip(16);\n    let valueType = table.valueTypeTable[ioBuffer.readInt32()];\n    ioBuffer.seek(ioBuffer.offset - 20);\n    let value;\n    switch (valueType) {\n      case 'String':\n        value = getParamName(ioBuffer, 16);\n        break;\n      case 'Integer':\n        value = ioBuffer.readInt32();\n        ioBuffer.skip(12);\n        break;\n      case 'Float':\n        value = ioBuffer.readFloat64();\n        ioBuffer.skip(8);\n        break;\n      case 'Complex':\n        value.Real = ioBuffer.readFloat64();\n        value.Imag = ioBuffer.readFloat64();\n        break;\n      case 'Infinity':\n        value = ioBuffer.readInt32();\n        ioBuffer.skip(12);\n        break;\n      default:\n        ioBuffer.skip(16);\n        break;\n    }\n    ioBuffer.skip(4);\n    let name = getParamName(ioBuffer, 28);\n    paramArray.push({ name: name.toLowerCase(), scaler, unit, value, valueType });\n  }\n  parameters.paramArray = paramArray;\n\n  // data section\n  ioBuffer.seek(header.dataStart);\n  if (header.endian === 'littleEndian') {\n    ioBuffer.setLittleEndian();\n  }\n\n  let data = {};\n  let dataSectionCount = 1;\n  let realComplex = 0;\n  for (let type of header.dataAxisType) {\n    if (type === 'Real_Complex' && realComplex === 0) {\n      dataSectionCount += 1;\n      realComplex += 1;\n    }\n    if (type === 'Complex') {\n      dataSectionCount *= 2;\n    }\n  }\n\n  if (header.dataFormat !== 'One_D' && header.dataFormat !== 'Two_D') {\n    throw new Error('Only One_D and two_D data formats are implemented yet');\n  }\n\n  if (header.dataFormat === 'One_D') {\n    for (let s = 0; s < dataSectionCount; s++) {\n      let section;\n      if (header.dataType === '32Bit Float') {\n        section = getArray(ioBuffer, header.dataPoints[0], 'readFloat32');\n      } else if (header.dataType === '64Bit Float') {\n        section = getArray(ioBuffer, header.dataPoints[0], 'readFloat64');\n      }\n      if (s === 0) data.re = section;\n      if (s === 1) data.im = section;\n    }\n  }\n\n  if (header.dataFormat === 'Two_D') {\n    let me = 32;\n    let dim1 = header.dataPoints[0];\n    let dim2 = header.dataPoints[1];\n    // console.log(\n    // `dim1: ${dim1},\n    // dim2: ${dim2},\n    // total: ${dim1 * dim2},\n    // total(byte): ${dim1 * dim2 * 8},\n    // total(length): ${dim1 * dim2 * 8 * dataSectionCount}\n    // m size: ${dim1 / me} / ${dim2 / me}`,\n    // );\n    let I = dim2 / me;\n    let J = dim1 / me;\n\n    for (let s = 0; s < dataSectionCount; s++) {\n      let section;\n      for (let i = 0; i < I; i++) {\n        let row = [];\n        for (let j = 0; j < J; j++) {\n          for (let k = 0; k < me; k++) {\n            if (j === 0) {\n              if (header.dataType === '32Bit Float') {\n                row[k] = getArray(ioBuffer, me, 'readFloat32');\n              } else if (header.dataType === '64Bit Float') {\n                row[k] = getArray(ioBuffer, me, 'readFloat64');\n              }\n            } else {\n              if (header.dataType === '32Bit Float') {\n                row[k] = row[k].concat(getArray(ioBuffer, me, 'readFloat32'));\n              } else if (header.dataType === '64Bit Float') {\n                row[k] = row[k].concat(getArray(ioBuffer, me, 'readFloat64'));\n              }\n            }\n          }\n        }\n        if (i === 0) {\n          section = row;\n        } else {\n          section = section.concat(row);\n        }\n      }\n      if (dataSectionCount === 2) {\n        if (s === 0) data.re = section;\n        if (s === 1) data.im = section;\n      }\n      if (dataSectionCount === 4) {\n        if (s === 0) {\n          data.re = {};\n          data.re.re = section;\n        }\n        if (s === 1) data.re.im = section;\n        if (s === 2) {\n          data.im = {};\n          data.im.re = section;\n        }\n        if (s === 3) data.im.im = section;\n      }\n    }\n  }\n  // format output\n  let nucleus = [];\n  let acquisitionTime = [];\n  let spectralWidth = [];\n  let spectralWidthClipped = [];\n  let resolution = [];\n  let originFrequency = [];\n  let frequencyOffset = [];\n  let dataUnits = [];\n  if (header.dataFormat === 'One_D' || header.dataFormat === 'Two_D') {\n    nucleus.push(getPar(parameters, 'x_domain').value);\n    acquisitionTime.push(getMagnitude(parameters, 'x_acq_time'));\n    spectralWidth.push(getMagnitude(parameters, 'x_sweep'));\n    spectralWidthClipped.push(getMagnitude(parameters, 'x_sweep_clipped'));\n    resolution.push(getMagnitude(parameters, 'x_resolution'));\n    originFrequency.push(getMagnitude(parameters, 'x_freq'));\n    frequencyOffset.push(getMagnitude(parameters, 'x_offset'));\n    dataUnits.push(header.dataUnits[0].base);\n  }\n  if (header.dataFormat === 'Two_D') {\n    nucleus.push(getPar(parameters, 'y_domain').value);\n    acquisitionTime.push(getMagnitude(parameters, 'y_acq_time'));\n    spectralWidth.push(getMagnitude(parameters, 'y_sweep'));\n    resolution.push(getMagnitude(parameters, 'y_resolution'));\n    originFrequency.push(getMagnitude(parameters, 'y_freq'));\n    frequencyOffset.push(getMagnitude(parameters, 'y_offset'));\n    dataUnits.push(header.dataUnits[1].base);\n  }\n\n  let digest = {\n    info: {\n      sampleName: getPar(parameters, 'sample_id').value,\n      creationTime: header.creationTime,\n      revisionTime: header.revisionTime,\n      author: header.author,\n      comment: header.comment,\n      solvent: getPar(parameters, 'solvent').value,\n      temperature: getMagnitude(parameters, 'temp_get'),\n      probeName: getPar(parameters, 'probe_id').value,\n      fieldStrength: getMagnitude(parameters, 'field_strength'),\n      experiment: getPar(parameters, 'experiment').value,\n      dimension: header.dataDimensionNumber,\n      nucleus,\n      pulseStrength90: getMagnitude(parameters, 'x90'),\n      numberOfScans: getPar(parameters, 'scans').value,\n      relaxationTime: getMagnitude(parameters, 'relaxation_delay'),\n      dataPoints: header.dataPoints.slice(0, header.dataDimensionNumber),\n      dataOffsetStart: header.dataOffsetStart,\n      dataOffsetStop: header.dataOffsetStop,\n      dataUnits: dataUnits,\n      dataSections: Object.keys(data),\n      originFrequency,\n      frequencyOffset,\n      acquisitionTime,\n      spectralWidth,\n      spectralWidthClipped,\n      dataAxisStart: header.dataAxisStart,\n      dataAxisStop: header.dataAxisStop,\n      resolution: resolution,\n      decimationRate: getPar(parameters, 'decimation_rate').value,\n      paramList: JSON.stringify(parameters.paramArray.map((par) => par.name)),\n    },\n\n    headers: header,\n    parameters: parameters,\n    data: data,\n  };\n\n  digest.info.digitalFilter = getDigitalFilter(parameters);\n\n  return digest;\n}\n","export const gyromagneticRatio = {\n    '1H': 267.52218744e6,\n    '2H': 41.065e6,\n    '3H': 285.3508e6,\n    '3He': -203.789e6,\n    '7Li': 103.962e6,\n    '13C': 67.28284e6,\n    '14N': 19.331e6,\n    '15N': -27.116e6,\n    '17O': -36.264e6,\n    '19F': 251.662e6,\n    '23Na': 70.761e6,\n    '27Al': 69.763e6,\n    '29Si': -53.19e6,\n    '31P': 108.291e6,\n    '57Fe': 8.681e6,\n    '63Cu': 71.118e6,\n    '67Zn': 16.767e6,\n    '129Xe': -73.997e6,\n};\n//# sourceMappingURL=index.js.map","(function(){function a(d){for(var e=0,f=d.length-1,g=void 0,h=void 0,i=void 0,j=c(e,f);!0;){if(f<=e)return d[j];if(f==e+1)return d[e]>d[f]&&b(d,e,f),d[j];for(g=c(e,f),d[g]>d[f]&&b(d,g,f),d[e]>d[f]&&b(d,e,f),d[g]>d[e]&&b(d,g,e),b(d,g,e+1),h=e+1,i=f;!0;){do h++;while(d[e]>d[h]);do i--;while(d[i]>d[e]);if(i<h)break;b(d,h,i)}b(d,e,i),i<=j&&(e=h),i>=j&&(f=i-1)}}var b=function b(d,e,f){var _ref;return _ref=[d[f],d[e]],d[e]=_ref[0],d[f]=_ref[1],_ref},c=function c(d,e){return~~((d+e)/2)};'undefined'!=typeof module&&module.exports?module.exports=a:window.median=a})();\n","import { matrixCheck } from './matrixCheck';\n/**\n * Get min and max Z\n *\n * @param matrix - matrix [rows][cols].\n */\nexport function matrixMinMaxZ(matrix) {\n    matrixCheck(matrix);\n    const nbRows = matrix.length;\n    const nbColumns = matrix[0].length;\n    let min = matrix[0][0];\n    let max = matrix[0][0];\n    for (let column = 0; column < nbColumns; column++) {\n        for (let row = 0; row < nbRows; row++) {\n            if (matrix[row][column] < min)\n                min = matrix[row][column];\n            if (matrix[row][column] > max)\n                max = matrix[row][column];\n        }\n    }\n    return { min, max };\n}\n//# sourceMappingURL=matrixMinMaxZ.js.map","export function matrixCheck(data) {\n    if (data.length === 0 || data[0].length === 0) {\n        throw new RangeError('matrix should contain data');\n    }\n    const firstLength = data[0].length;\n    for (let i = 1; i < data.length; i++) {\n        if (data[i].length !== firstLength) {\n            throw new RangeError('All rows should has the same length');\n        }\n    }\n}\n//# sourceMappingURL=matrixCheck.js.map","/**\n * Create an array with numbers starting from \"from\" with step \"step\" of length \"length\"\n *\n * @param options - options\n * @return - array of distributed numbers with step \"step\" from \"from\"\n */\nexport function createStepArray(options = {}) {\n    let { from = 0, step = 1, length = 1000 } = options;\n    const array = new Float64Array(length);\n    let index = 0;\n    while (index < length) {\n        array[index] = from + step * index;\n        index++;\n    }\n    return array;\n}\n//# sourceMappingURL=createStepArray.js.map","import isutf8 from 'isutf8';\n/**\n * Ensure that the data is string. If it is an ArrayBuffer it will be converted to string using TextDecoder.\n * @param blob\n * @param options\n * @returns\n */\nexport function ensureString(blob, options = {}) {\n    if (typeof blob === 'string') {\n        return blob;\n    }\n    if (ArrayBuffer.isView(blob) || blob instanceof ArrayBuffer) {\n        const { encoding = guessEncoding(blob) } = options;\n        const decoder = new TextDecoder(encoding);\n        return decoder.decode(blob);\n    }\n    throw new TypeError(`blob must be a string, ArrayBuffer or ArrayBufferView`);\n}\nfunction guessEncoding(blob) {\n    const uint8 = ArrayBuffer.isView(blob)\n        ? new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength)\n        : new Uint8Array(blob);\n    if (uint8.length >= 2) {\n        if (uint8[0] === 0xfe && uint8[1] === 0xff) {\n            return 'utf-16be';\n        }\n        if (uint8[0] === 0xff && uint8[1] === 0xfe) {\n            return 'utf-16le';\n        }\n    }\n    //@ts-expect-error an ArrayBuffer is also ok\n    if (!isutf8(blob))\n        return 'latin1';\n    return 'utf-8';\n}\n//# sourceMappingURL=index.js.map","/*\n    https://tools.ietf.org/html/rfc3629\n\n    UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4\n\n    UTF8-1    = %x00-7F\n\n    UTF8-2    = %xC2-DF UTF8-tail\n\n    UTF8-3    = %xE0 %xA0-BF UTF8-tail\n                %xE1-EC 2( UTF8-tail )\n                %xED %x80-9F UTF8-tail\n                %xEE-EF 2( UTF8-tail )\n\n    UTF8-4    = %xF0 %x90-BF 2( UTF8-tail )\n                %xF1-F3 3( UTF8-tail )\n                %xF4 %x80-8F 2( UTF8-tail )\n\n    UTF8-tail = %x80-BF\n*/\n/**\n * Check if a Node.js Buffer or Uint8Array is UTF-8.\n */\nfunction isUtf8(buf) {\n    if (!buf) {\n        return false;\n    }\n    var i = 0;\n    var len = buf.length;\n    while (i < len) {\n        // UTF8-1 = %x00-7F\n        if (buf[i] <= 0x7F) {\n            i++;\n            continue;\n        }\n        // UTF8-2 = %xC2-DF UTF8-tail\n        if (buf[i] >= 0xC2 && buf[i] <= 0xDF) {\n            // if(buf[i + 1] >= 0x80 && buf[i + 1] <= 0xBF) {\n            if (buf[i + 1] >> 6 === 2) {\n                i += 2;\n                continue;\n            }\n            else {\n                return false;\n            }\n        }\n        // UTF8-3 = %xE0 %xA0-BF UTF8-tail\n        // UTF8-3 = %xED %x80-9F UTF8-tail\n        if (((buf[i] === 0xE0 && buf[i + 1] >= 0xA0 && buf[i + 1] <= 0xBF) ||\n            (buf[i] === 0xED && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x9F)) && buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-3 = %xE1-EC 2( UTF8-tail )\n        // UTF8-3 = %xEE-EF 2( UTF8-tail )\n        if (((buf[i] >= 0xE1 && buf[i] <= 0xEC) ||\n            (buf[i] >= 0xEE && buf[i] <= 0xEF)) &&\n            buf[i + 1] >> 6 === 2 &&\n            buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-4 = %xF0 %x90-BF 2( UTF8-tail )\n        //          %xF1-F3 3( UTF8-tail )\n        //          %xF4 %x80-8F 2( UTF8-tail )\n        if (((buf[i] === 0xF0 && buf[i + 1] >= 0x90 && buf[i + 1] <= 0xBF) ||\n            (buf[i] >= 0xF1 && buf[i] <= 0xF3 && buf[i + 1] >> 6 === 2) ||\n            (buf[i] === 0xF4 && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x8F)) &&\n            buf[i + 2] >> 6 === 2 &&\n            buf[i + 3] >> 6 === 2) {\n            i += 4;\n            continue;\n        }\n        return false;\n    }\n    return true;\n}\n\nexport { isUtf8 as default };\n","export function toKeyValue(object) {\n  let newObject = {};\n  for (let key in object) {\n    if (typeof object[key] !== 'string') {\n      newObject[key] = JSON.stringify(object[key]);\n    } else {\n      newObject[key] = object[key];\n    }\n  }\n  return newObject;\n}\n","import { parseJEOL } from 'jeolconverter';\nimport { gyromagneticRatio } from 'nmr-processing';\n\nimport packageJson from '../package.json';\n\nimport { formatDependentVariable } from './formatDependentVariable';\nimport { formatLinearDimension } from './formatLinearDimension';\nimport { toKeyValue } from './utils/toKeyValue';\n\nexport function fromJEOL(buffer) {\n  let parsedData = parseJEOL(buffer);\n  let info = parsedData.info;\n  let headers = parsedData.headers;\n  let parameters = parsedData.parameters;\n  let paramArray = { ...parameters.paramArray };\n  delete parameters.paramArray;\n  let data = parsedData.data;\n\n  // curation of parameters\n  let newInfo = {};\n  newInfo.title = `title: ${headers.title} / comment: ${headers.comment} / author:${headers.author} / site: ${headers.site}`;\n  newInfo.nucleus = info.nucleus.map((x) => {\n    if (x === 'Proton') {\n      x = '1H';\n    }\n    if (x === 'Carbon13') {\n      x = '13C';\n    }\n    if (x === 'Nitrogen15') {\n      x = '15N';\n    }\n    return x;\n  });\n  newInfo.sampleName = info.sampleName;\n  newInfo.date = JSON.stringify(info.creationTime);\n  newInfo.author = info.author;\n  //newInfo.comment = info.comment;\n  newInfo.solvent = info.solvent;\n  newInfo.temperature = info.temperature.magnitude;\n  newInfo.probeName = info.probeName || '';\n  newInfo.fieldStrength = info.fieldStrength.magnitude;\n\n  let gyromagneticRatioConstants = newInfo.nucleus.map(\n    (nucleus) => gyromagneticRatio[nucleus],\n  );\n  newInfo.baseFrequency = gyromagneticRatioConstants.map(\n    (gmr) => (info.fieldStrength.magnitude * gmr) / (2 * Math.PI * 1e6),\n  );\n  newInfo.pulseSequence = info.experiment;\n  newInfo.temperature =\n    info.temperature.unit.toLowerCase() === 'celsius'\n      ? 273.15 + info.temperature.magnitude\n      : info.temperature.magnitude;\n  newInfo.digitalFilter = info.digitalFilter;\n  newInfo.pulseStrength90 = 1 / (4 * info.pulseStrength90.magnitude);\n  newInfo.numberOfScans = info.numberOfScans;\n  newInfo.relaxationTime = info.relaxationTime.magnitude;\n\n  newInfo.isComplex = info.dataSections.includes('im');\n  newInfo.isFid = info.dataUnits[0] === 'Second';\n  newInfo.isFt = info.dataUnits[0] === 'Ppm';\n\n  newInfo.dimension = info.dimension;\n\n  const dimension = newInfo.dimension;\n  newInfo.originFrequency = info.originFrequency\n    .map((d) => d.magnitude / 1e6)\n    .slice(0, dimension);\n  newInfo.numberOfPoints = info.dataPoints.slice(0, 1);\n  newInfo.frequencyOffset = info.frequencyOffset\n    .map((f, i) => f.magnitude * newInfo.baseFrequency[i])\n    .slice(0, dimension);\n  newInfo.acquisitionTime = info.acquisitionTime\n    .map((a) => a.magnitude)\n    .slice(0, dimension);\n  newInfo.spectralWidth = info.spectralWidth\n    .map((sw, i) => (sw.magnitude / info.originFrequency[i].magnitude) * 1e6)\n    .slice(0, dimension);\n\n  // set options for dimensions\n  let dimensions = [];\n  let options = {};\n  let increment;\n  for (let d = 0; d < info.dimension; d++) {\n    increment = {\n      magnitude: info.acquisitionTime[d].magnitude / (info.dataPoints[d] - 1),\n      unit: 's',\n    };\n    if (info.dataUnits[d] === 'Second') {\n      options.quantityName = 'time';\n      options.originOffset = { magnitude: 0, unit: 's' };\n\n      if (d === 0) {\n        options.coordinatesOffset = {\n          magnitude: info.digitalFilter * increment.magnitude,\n          unit: 's',\n        };\n      } else {\n        options.coordinatesOffset = { magnitude: 0, unit: 's' };\n      }\n      options.reciprocal = {\n        originOffset: {\n          magnitude: info.originFrequency[d].magnitude,\n          unit: 'Hz',\n        },\n        quantityName: 'frequency',\n        coordinatesOffset: {\n          magnitude:\n            (info.frequencyOffset[d].magnitude *\n              info.originFrequency[d].magnitude) /\n            1000000,\n          unit: 'Hz',\n        },\n      };\n    } else if (info.dataUnits[d] === 'Ppm') {\n      options.quantityName = 'frequency';\n\n      let origin = info.originFrequency[d].magnitude;\n      options.originOffset = { magnitude: origin, unit: 'Hz' };\n\n      let firstPoint = info.dataOffsetStart[0];\n      let lastPoint = info.dataOffsetStop[0];\n      let dataLength = lastPoint - firstPoint + 1;\n\n      let spectralWidth = info.spectralWidthClipped[d].magnitude;\n      let incr = spectralWidth / info.dataPoints[d];\n      increment = { magnitude: incr, unit: 'Hz' };\n\n      let offset = (info.dataAxisStop[0] * origin) / 1000000;\n      options.coordinatesOffset = {\n        magnitude: offset,\n        unit: 'Hz',\n      };\n\n      // after increment is computed with whole frequency\n      // and original number of points, we recast the\n      // number of point for export\n      if (dataLength < info.dataPoints[d]) {\n        info.dataPoints[d] = dataLength;\n      }\n    }\n\n    if (d === 0) {\n      options.description = 'direct dimension';\n    } else {\n      options.description = 'indirect dimension';\n    }\n    dimensions.push(\n      formatLinearDimension(\n        headers.dataAxisTitles[d],\n        info.dataPoints[d],\n        increment,\n        options,\n      ),\n    );\n  }\n\n  // set options for dependentVariable\n  options = {\n    unit: 'none',\n    quantityName: 'relative intensity',\n    from: info.dataOffsetStart,\n    to: info.dataOffsetStop,\n  };\n\n  let dependentVariables = [];\n  dependentVariables.push(formatDependentVariable(data, 11, options));\n\n  let description = { ...newInfo };\n\n  delete description.paramList;\n  description.metadata = {\n    ...toKeyValue(headers),\n    ...toKeyValue(parameters),\n    ...toKeyValue(paramArray),\n  };\n\n  let dataStructure = {\n    timeStamp: Date.now(),\n    version: packageJson.version,\n    description,\n    tags: ['magnetic resonance'].concat(newInfo.nucleus),\n    application: {\n      spectralWidthClipped:\n        info.spectralWidthClipped[0].magnitude / newInfo.baseFrequency[0],\n    },\n    dimensions,\n    dependentVariables,\n  };\n  return [dataStructure];\n}\n","/**\n * Retrieve the list of files for further process\n * @param {FileCollection[]} fileList\n * @param {object} [options={}]\n * @param {number|number[]} [options.processingNumber] - processing number to select, default the smallest number\n * @param {number|number[]} [options.experimentNumber] - experiment number to select, default all\n * @param {boolean} [options.ignoreFID=false] - should we ignore fid\n * @param {boolean} [options.ignoreFT=false] - should we ignore the ft transformed fid\n * @param {boolean} [options.ignore1D=false] - should we ignore 1D spectra\n * @param {boolean} [options.ignore2D=false] - should we ignore 2D spectra\n * @param {boolean} [options.onlyFirstProcessedData=true] - should we take only the first processed data (procno).\n */\nexport function groupByExperiments(fileList, options = {}) {\n  let {\n    processingNumber,\n    experimentNumber,\n    ignoreFID = false,\n    ignoreFT = false,\n    ignore1D = false,\n    ignore2D = false,\n    onlyFirstProcessedData = true,\n  } = options;\n  if (typeof processingNumber === 'number') {\n    processingNumber = [processingNumber];\n  }\n  if (typeof experimentNumber === 'number') {\n    experimentNumber = [experimentNumber];\n  }\n\n  const experiments = {};\n  for (let file of fileList) {\n    let currentProcessingNo;\n    let currentExperimentNo;\n    let experiment;\n    let name;\n    let id;\n    const parts = file.relativePath.split('/');\n    if (file.relativePath.match(/\\/pdata\\/[0-9]+\\/.*$/)) {\n      currentProcessingNo = Number(parts[parts.length - 2]);\n      currentExperimentNo = Number(parts[parts.length - 4]);\n      name = parts[parts.length - 5];\n      id = parts.slice(0, -3).join('/');\n    } else if (file.relativePath.match(/[0-9]+\\/.*$/)) {\n      currentExperimentNo = Number(parts[parts.length - 2]);\n      name = parts[parts.length - 3] || parts[parts.length - 2];\n      id = parts.slice(0, -1).join('/');\n    } else {\n      continue;\n    }\n\n    if (experimentNumber && !experimentNumber.includes(currentExperimentNo)) {\n      continue;\n    }\n\n    if (!experiments[id]) {\n      experiments[id] = {\n        name,\n        expno: currentExperimentNo,\n        processedData: {},\n        fileList: [],\n      };\n    }\n    experiment = experiments[id];\n    if (currentProcessingNo) {\n      if (!experiment.processedData[currentProcessingNo]) {\n        experiment.processedData[currentProcessingNo] = {\n          fileList: [],\n          name,\n          expno: currentExperimentNo,\n        };\n      }\n      const processedData = experiment.processedData[currentProcessingNo];\n      processedData.fileList.push(file);\n      if (file.name.match(/^(1r|1i|2rr|procs|proc2s)$/)) {\n        processedData[file.name] = file;\n      }\n      if (file.name === '2rr') {\n        processedData.is2D = true;\n        processedData.isFT = true;\n      }\n      if (file.name === '1r') {\n        processedData.is1D = true;\n        processedData.isFT = true;\n      }\n    } else {\n      experiment.fileList.push(file);\n      if (file.name.match(/^(ser|fid|acqus|acqu2s)$/)) {\n        experiment[file.name] = file;\n      }\n      if (file.name === 'ser') {\n        experiment.is2D = true;\n        experiment.isFID = true;\n      }\n      if (file.name === 'fid') {\n        experiment.is1D = true;\n        experiment.isFID = true;\n      }\n    }\n  }\n  if (processingNumber) {\n    // we need to deal with the list of processingNumber that is specified\n    for (const key in experiments) {\n      const processedData = experiments[key].processedData;\n      const newProcessedData = {};\n      for (let key in processedData) {\n        if (!processingNumber.includes(parseInt(key, 10))) continue;\n        newProcessedData[key] = processedData[key];\n      }\n      experiments[key].processedData = newProcessedData;\n    }\n  } else if (onlyFirstProcessedData) {\n    // take the smallest processing and remove all the other\n    for (const key in experiments) {\n      const processedData = experiments[key].processedData;\n      const firstProcessedNumber = Object.keys(processedData).sort(\n        (a, b) => Number(a) - Number(b),\n      )[0];\n      if (firstProcessedNumber !== undefined) {\n        experiments[key].processedData = {\n          firstProcessedNumber: processedData[firstProcessedNumber],\n        };\n      }\n    }\n  }\n  // We convert the object to an array\n  // and before filtering we will move all the processedData\n  let experimentsArray = [];\n\n  for (let key in experiments) {\n    const experiment = { ...experiments[key] };\n    const processed = experiment.processedData;\n    delete experiment.processedData;\n    if (experiment.ser || experiment.fid) {\n      if (Object.keys(processed).length > 0) {\n        const firstProcessed = processed[Object.keys(processed)[0]];\n        if (firstProcessed.procs) {\n          experiment.fileList.push(firstProcessed.procs);\n          experiment.procs = firstProcessed.procs;\n        }\n        if (firstProcessed.proc2s) {\n          experiment.fileList.push(firstProcessed.proc2s);\n          experiment.proc2s = firstProcessed.proc2s;\n        }\n      }\n      experimentsArray.push(experiment);\n    }\n    for (let processedKey in processed) {\n      const oneProcessed = processed[processedKey];\n      if (oneProcessed['1r'] || oneProcessed['2rr']) {\n        if (experiment.acqus) {\n          oneProcessed.fileList.push(experiment.acqus);\n        }\n        if (experiment.acqu2s) {\n          oneProcessed.fileList.push(experiment.acqu2s);\n        }\n        experimentsArray.push({\n          acqus: experiment.acqus,\n          acqu2s: experiment.acqu2s,\n          ...oneProcessed,\n        });\n      }\n    }\n  }\n  // we can not easily filter\n  if (ignoreFID) {\n    experimentsArray = experimentsArray.filter((item) => !item.isFID);\n  }\n  if (ignoreFT) {\n    experimentsArray = experimentsArray.filter((item) => !item.isFT);\n  }\n  if (ignore1D) {\n    experimentsArray = experimentsArray.filter((item) => !item.is1D);\n  }\n  if (ignore2D) {\n    experimentsArray = experimentsArray.filter((item) => !item.is2D);\n  }\n\n  return experimentsArray;\n}\n","export function joinInfoMeta(target, toAppend) {\n  for (let key in toAppend.meta) {\n    if (target.meta[key] === undefined) {\n      target.meta[key] = toAppend.meta[key];\n    }\n  }\n\n  for (let key in toAppend.info) {\n    if (target.info[key] === undefined) {\n      target.info[key] = toAppend.info[key];\n    }\n  }\n\n  for (let key in target.meta) {\n    if (!Array.isArray(target.meta[key])) {\n      target.meta[key] = [target.meta[key]];\n    }\n  }\n}\n","/**\n * Dynamically type a string\n * @param {string} value String to dynamically type\n * @returns {boolean|string|number}\n */\nexport function parseString(value) {\n  if (value.length === 4 || value.length === 5) {\n    let lowercase = value.toLowerCase();\n\n    if (lowercase === 'true') return true;\n    if (lowercase === 'false') return false;\n  }\n  let number = Number(value);\n  if (number === 0 && !value.includes('0')) {\n    return value;\n  }\n  if (!Number.isNaN(number)) return number;\n  return value;\n}\n","const GC_MS_FIELDS = ['TIC', '.RIC', 'SCANNUMBER'];\nexport function complexChromatogram(result) {\n    let spectra = result.spectra;\n    let length = spectra.length;\n    let chromatogram = {\n        times: new Array(length),\n        series: {\n            ms: {\n                dimension: 2,\n                data: new Array(length),\n            },\n        },\n    };\n    let existingGCMSFields = [];\n    for (let i = 0; i < GC_MS_FIELDS.length; i++) {\n        let label = convertMSFieldToLabel(GC_MS_FIELDS[i]);\n        if (spectra[0][label]) {\n            existingGCMSFields.push(label);\n            chromatogram.series[label] = {\n                dimension: 1,\n                data: new Array(length),\n            };\n        }\n    }\n    for (let i = 0; i < length; i++) {\n        let spectrum = spectra[i];\n        chromatogram.times[i] = spectrum.pageValue;\n        for (let j = 0; j < existingGCMSFields.length; j++) {\n            chromatogram.series[existingGCMSFields[j]].data[i] = Number(spectrum[existingGCMSFields[j]]);\n        }\n        if (spectrum.data) {\n            chromatogram.series.ms.data[i] = [spectrum.data.x, spectrum.data.y];\n        }\n    }\n    result.chromatogram = chromatogram;\n}\nexport function isMSField(canonicDataLabel) {\n    return GC_MS_FIELDS.indexOf(canonicDataLabel) !== -1;\n}\nexport function convertMSFieldToLabel(value) {\n    return value.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n//# sourceMappingURL=complexChromatogram.js.map","export default function convertToFloatArray(stringArray) {\n    let floatArray = [];\n    for (let i = 0; i < stringArray.length; i++) {\n        floatArray.push(Number(stringArray[i]));\n    }\n    return floatArray;\n}\n//# sourceMappingURL=convertToFloatArray.js.map","export default function fastParseXYData(spectrum, value) {\n    // TODO need to deal with result\n    //  console.log(value);\n    // we check if deltaX is defined otherwise we calculate it\n    let yFactor = spectrum.yFactor;\n    let deltaX = spectrum.deltaX;\n    spectrum.isXYdata = true;\n    let currentData = { x: [], y: [] };\n    spectrum.data = currentData;\n    let currentX = spectrum.firstX;\n    let currentY = spectrum.firstY;\n    // we skip the first line\n    //\n    let endLine = false;\n    let ascii;\n    let i = 0;\n    for (; i < value.length; i++) {\n        ascii = value.charCodeAt(i);\n        if (ascii === 13 || ascii === 10) {\n            endLine = true;\n        }\n        else if (endLine) {\n            break;\n        }\n    }\n    // we proceed taking the i after the first line\n    let newLine = true;\n    let isDifference = false;\n    let isLastDifference = false;\n    let lastDifference = 0;\n    let isDuplicate = false;\n    let inComment = false;\n    let currentValue = 0; // can be a difference or a duplicate\n    let lastValue = 0; // must be the real last value\n    let isNegative = false;\n    let inValue = false;\n    let skipFirstValue = false;\n    let decimalPosition = 0;\n    for (; i <= value.length; i++) {\n        if (i === value.length)\n            ascii = 13;\n        else\n            ascii = value.charCodeAt(i);\n        if (inComment) {\n            // we should ignore the text if we are after $$\n            if (ascii === 13 || ascii === 10) {\n                newLine = true;\n                inComment = false;\n            }\n        }\n        else {\n            // when is it a new value ?\n            // when it is not a digit, . or comma\n            // it is a number that is either new or we continue\n            // eslint-disable-next-line no-lonely-if\n            if (ascii <= 57 && ascii >= 48) {\n                // a number\n                inValue = true;\n                if (decimalPosition > 0) {\n                    currentValue += (ascii - 48) / Math.pow(10, decimalPosition++);\n                }\n                else {\n                    currentValue *= 10;\n                    currentValue += ascii - 48;\n                }\n            }\n            else if (ascii === 44 || ascii === 46) {\n                // a \",\" or \".\"\n                inValue = true;\n                decimalPosition++;\n            }\n            else {\n                if (inValue) {\n                    // need to process the previous value\n                    if (newLine) {\n                        newLine = false; // we don't check the X value\n                        // console.log(\"NEW LINE\",isDifference, lastDifference);\n                        // if new line and lastDifference, the first value is just a check !\n                        // that we don't check ...\n                        if (isLastDifference)\n                            skipFirstValue = true;\n                    }\n                    else {\n                        // need to deal with duplicate and differences\n                        // eslint-disable-next-line no-lonely-if\n                        if (skipFirstValue) {\n                            skipFirstValue = false;\n                        }\n                        else {\n                            if (isDifference) {\n                                lastDifference = isNegative ? 0 - currentValue : currentValue;\n                                isLastDifference = true;\n                                isDifference = false;\n                            }\n                            else if (!isDuplicate) {\n                                lastValue = isNegative ? 0 - currentValue : currentValue;\n                            }\n                            let duplicate = isDuplicate ? currentValue - 1 : 1;\n                            for (let j = 0; j < duplicate; j++) {\n                                if (isLastDifference) {\n                                    currentY += lastDifference;\n                                }\n                                else {\n                                    currentY = lastValue;\n                                }\n                                currentData.x.push(currentX);\n                                currentData.y.push(currentY * yFactor);\n                                currentX += deltaX;\n                            }\n                        }\n                    }\n                    isNegative = false;\n                    currentValue = 0;\n                    decimalPosition = 0;\n                    inValue = false;\n                    isDuplicate = false;\n                }\n                // positive SQZ digits @ A B C D E F G H I (ascii 64-73)\n                if (ascii < 74 && ascii > 63) {\n                    inValue = true;\n                    isLastDifference = false;\n                    currentValue = ascii - 64;\n                }\n                else if (ascii > 96 && ascii < 106) {\n                    // negative SQZ digits a b c d e f g h i (ascii 97-105)\n                    inValue = true;\n                    isLastDifference = false;\n                    currentValue = ascii - 96;\n                    isNegative = true;\n                }\n                else if (ascii === 115) {\n                    // DUP digits S T U V W X Y Z s (ascii 83-90, 115)\n                    inValue = true;\n                    isDuplicate = true;\n                    currentValue = 9;\n                }\n                else if (ascii > 82 && ascii < 91) {\n                    inValue = true;\n                    isDuplicate = true;\n                    currentValue = ascii - 82;\n                }\n                else if (ascii > 73 && ascii < 83) {\n                    // positive DIF digits % J K L M N O P Q R (ascii 37, 74-82)\n                    inValue = true;\n                    isDifference = true;\n                    currentValue = ascii - 73;\n                }\n                else if (ascii > 105 && ascii < 115) {\n                    // negative DIF digits j k l m n o p q r (ascii 106-114)\n                    inValue = true;\n                    isDifference = true;\n                    currentValue = ascii - 105;\n                    isNegative = true;\n                }\n                else if (ascii === 36 && value.charCodeAt(i + 1) === 36) {\n                    // $ sign, we need to check the next one\n                    inValue = true;\n                    inComment = true;\n                }\n                else if (ascii === 37) {\n                    // positive DIF digits % J K L M N O P Q R (ascii 37, 74-82)\n                    inValue = true;\n                    isDifference = true;\n                    currentValue = 0;\n                    isNegative = false;\n                }\n                else if (ascii === 45) {\n                    // a \"-\"\n                    // check if after there is a number, decimal or comma\n                    let ascii2 = value.charCodeAt(i + 1);\n                    if ((ascii2 >= 48 && ascii2 <= 57) ||\n                        ascii2 === 44 ||\n                        ascii2 === 46) {\n                        inValue = true;\n                        if (!newLine)\n                            isLastDifference = false;\n                        isNegative = true;\n                    }\n                }\n                else if (ascii === 13 || ascii === 10) {\n                    newLine = true;\n                    inComment = false;\n                }\n                // and now analyse the details ... space or tabulation\n                // if \"+\" we just don't care\n            }\n        }\n    }\n}\n//# sourceMappingURL=fastParseXYData.js.map","const removeCommentRegExp = /\\$\\$.*/;\nconst peakTableSplitRegExp = /[,\\t ]+/;\nexport default function parsePeakTable(spectrum, value, result) {\n    spectrum.isPeaktable = true;\n    if (!spectrum.variables || Object.keys(spectrum.variables) === 2) {\n        parseXY(spectrum, value, result);\n    }\n    else {\n        parseXYZ(spectrum, value, result);\n    }\n    // we will add the data in the variables\n    if (spectrum.variables) {\n        for (let key in spectrum.variables) {\n            spectrum.variables[key].data = spectrum.data[key];\n        }\n    }\n}\nfunction parseXY(spectrum, value, result) {\n    let currentData = { x: [], y: [] };\n    spectrum.data = currentData;\n    // counts for around 20% of the time\n    let lines = value.split(/,? *,?[;\\r\\n]+ */);\n    for (let i = 1; i < lines.length; i++) {\n        let values = lines[i]\n            .trim()\n            .replace(removeCommentRegExp, '')\n            .split(peakTableSplitRegExp);\n        if (values.length % 2 === 0) {\n            for (let j = 0; j < values.length; j = j + 2) {\n                // takes around 40% of the time to add and parse the 2 values nearly exclusively because of Number\n                currentData.x.push(Number(values[j]) * spectrum.xFactor);\n                currentData.y.push(Number(values[j + 1]) * spectrum.yFactor);\n            }\n        }\n        else {\n            result.logs.push(`Format error: ${values}`);\n        }\n    }\n}\nfunction parseXYZ(spectrum, value, result) {\n    let currentData = {};\n    let variables = Object.keys(spectrum.variables);\n    let numberOfVariables = variables.length;\n    variables.forEach((variable) => (currentData[variable] = []));\n    spectrum.data = currentData;\n    // counts for around 20% of the time\n    let lines = value.split(/,? *,?[;\\r\\n]+ */);\n    for (let i = 1; i < lines.length; i++) {\n        let values = lines[i]\n            .trim()\n            .replace(removeCommentRegExp, '')\n            .split(peakTableSplitRegExp);\n        if (values.length % numberOfVariables === 0) {\n            for (let j = 0; j < values.length; j++) {\n                // todo should try to find a xFactor (y, ...)\n                currentData[variables[j % numberOfVariables]].push(Number(values[j]));\n            }\n        }\n        else {\n            result.logs.push(`Format error: ${values}`);\n        }\n    }\n}\n//# sourceMappingURL=parsePeakTable.js.map","export default function parseXYA(spectrum, value) {\n    let removeSymbolRegExp = /(\\(+|\\)+|<+|>+|\\s+)/g;\n    spectrum.isXYAdata = true;\n    let values;\n    let currentData = { x: [], y: [] };\n    spectrum.data = currentData;\n    let lines = value.split(/,? *,?[;\\r\\n]+ */);\n    for (let i = 1; i < lines.length; i++) {\n        values = lines[i].trim().replace(removeSymbolRegExp, '').split(',');\n        currentData.x.push(Number(values[0]));\n        currentData.y.push(Number(values[1]));\n    }\n}\n//# sourceMappingURL=parseXYA.js.map","import { isAnyArray } from 'is-any-array';\nimport quickSelectMedian from 'median-quickselect';\n\nfunction median(input) {\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  return quickSelectMedian(input.slice());\n}\n\nexport { median as default };\n","import convertTo3DZ from './convertTo3DZ';\nimport generateContourLines from './generateContourLines';\nexport default function add2D(result, options) {\n    let zData = convertTo3DZ(result.spectra);\n    if (!options.noContour) {\n        result.contourLines = generateContourLines(zData, options);\n        delete zData.z;\n    }\n    result.minMax = zData;\n}\n//# sourceMappingURL=add2D.js.map","import getMedian from 'ml-array-median';\nexport default function convertTo3DZ(spectra) {\n    let minZ = spectra[0].data.y[0];\n    let maxZ = minZ;\n    let ySize = spectra.length;\n    let xSize = spectra[0].data.x.length;\n    let z = new Array(ySize);\n    for (let i = 0; i < ySize; i++) {\n        z[i] = spectra[i].data.y;\n        for (let j = 0; j < xSize; j++) {\n            let value = z[i][j];\n            if (value < minZ)\n                minZ = value;\n            if (value > maxZ)\n                maxZ = value;\n        }\n    }\n    const firstX = spectra[0].data.x[0];\n    const lastX = spectra[0].data.x[spectra[0].data.x.length - 1]; // has to be -2 because it is a 1D array [x,y,x,y,...]\n    const firstY = spectra[0].pageValue;\n    const lastY = spectra[ySize - 1].pageValue;\n    // Because the min / max value are the only information about the matrix if we invert\n    // min and max we need to invert the array\n    if (firstX > lastX) {\n        for (let spectrum of z) {\n            spectrum.reverse();\n        }\n    }\n    if (firstY > lastY) {\n        z.reverse();\n    }\n    const medians = [];\n    for (let i = 0; i < z.length; i++) {\n        const row = Float64Array.from(z[i]);\n        for (let i = 0; i < row.length; i++) {\n            if (row[i] < 0)\n                row[i] = -row[i];\n        }\n        medians.push(getMedian(row));\n    }\n    const median = getMedian(medians);\n    return {\n        z,\n        minX: Math.min(firstX, lastX),\n        maxX: Math.max(firstX, lastX),\n        minY: Math.min(firstY, lastY),\n        maxY: Math.max(firstY, lastY),\n        minZ,\n        maxZ,\n        noise: median,\n    };\n}\n//# sourceMappingURL=convertTo3DZ.js.map","export default function generateContourLines(zData, options) {\n    let noise = zData.noise;\n    let z = zData.z;\n    let povarHeight0, povarHeight1, povarHeight2, povarHeight3;\n    let isOver0, isOver1, isOver2, isOver3;\n    let nbSubSpectra = z.length;\n    let nbPovars = z[0].length;\n    let pAx, pAy, pBx, pBy;\n    let x0 = zData.minX;\n    let xN = zData.maxX;\n    let dx = (xN - x0) / (nbPovars - 1);\n    let y0 = zData.minY;\n    let yN = zData.maxY;\n    let dy = (yN - y0) / (nbSubSpectra - 1);\n    let minZ = zData.minZ;\n    let maxZ = zData.maxZ;\n    // System.out.prvarln('y0 '+y0+' yN '+yN);\n    // -------------------------\n    // Povars attribution\n    //\n    // 0----1\n    // |  / |\n    // | /  |\n    // 2----3\n    //\n    // ---------------------d------\n    let iter = options.nbContourLevels * 2;\n    let contourLevels = new Array(iter);\n    let lineZValue;\n    for (let level = 0; level < iter; level++) {\n        // multiply by 2 for positif and negatif\n        let contourLevel = {};\n        contourLevels[level] = contourLevel;\n        let side = level % 2;\n        let factor = (maxZ - options.noiseMultiplier * noise) *\n            Math.exp((level >> 1) - options.nbContourLevels);\n        if (side === 0) {\n            lineZValue = factor + options.noiseMultiplier * noise;\n        }\n        else {\n            lineZValue = 0 - factor - options.noiseMultiplier * noise;\n        }\n        let lines = [];\n        contourLevel.zValue = lineZValue;\n        contourLevel.lines = lines;\n        if (lineZValue <= minZ || lineZValue >= maxZ)\n            continue;\n        for (let iSubSpectra = 0; iSubSpectra < nbSubSpectra - 1; iSubSpectra++) {\n            let subSpectra = z[iSubSpectra];\n            let subSpectraAfter = z[iSubSpectra + 1];\n            for (let povar = 0; povar < nbPovars - 1; povar++) {\n                povarHeight0 = subSpectra[povar];\n                povarHeight1 = subSpectra[povar + 1];\n                povarHeight2 = subSpectraAfter[povar];\n                povarHeight3 = subSpectraAfter[povar + 1];\n                isOver0 = povarHeight0 > lineZValue;\n                isOver1 = povarHeight1 > lineZValue;\n                isOver2 = povarHeight2 > lineZValue;\n                isOver3 = povarHeight3 > lineZValue;\n                // Example povar0 is over the plane and povar1 and\n                // povar2 are below, we find the varersections and add\n                // the segment\n                if (isOver0 !== isOver1 && isOver0 !== isOver2) {\n                    pAx =\n                        povar + (lineZValue - povarHeight0) / (povarHeight1 - povarHeight0);\n                    pAy = iSubSpectra;\n                    pBx = povar;\n                    pBy =\n                        iSubSpectra +\n                            (lineZValue - povarHeight0) / (povarHeight2 - povarHeight0);\n                    lines.push(pAx * dx + x0);\n                    lines.push(pAy * dy + y0);\n                    lines.push(pBx * dx + x0);\n                    lines.push(pBy * dy + y0);\n                }\n                // remove push does not help !!!!\n                if (isOver3 !== isOver1 && isOver3 !== isOver2) {\n                    pAx = povar + 1;\n                    pAy =\n                        iSubSpectra +\n                            1 -\n                            (lineZValue - povarHeight3) / (povarHeight1 - povarHeight3);\n                    pBx =\n                        povar +\n                            1 -\n                            (lineZValue - povarHeight3) / (povarHeight2 - povarHeight3);\n                    pBy = iSubSpectra + 1;\n                    lines.push(pAx * dx + x0);\n                    lines.push(pAy * dy + y0);\n                    lines.push(pBx * dx + x0);\n                    lines.push(pBy * dy + y0);\n                }\n                // test around the diagonal\n                if (isOver1 !== isOver2) {\n                    pAx =\n                        (povar +\n                            1 -\n                            (lineZValue - povarHeight1) / (povarHeight2 - povarHeight1)) *\n                            dx +\n                            x0;\n                    pAy =\n                        (iSubSpectra +\n                            (lineZValue - povarHeight1) / (povarHeight2 - povarHeight1)) *\n                            dy +\n                            y0;\n                    if (isOver1 !== isOver0) {\n                        pBx =\n                            povar +\n                                1 -\n                                (lineZValue - povarHeight1) / (povarHeight0 - povarHeight1);\n                        pBy = iSubSpectra;\n                        lines.push(pAx);\n                        lines.push(pAy);\n                        lines.push(pBx * dx + x0);\n                        lines.push(pBy * dy + y0);\n                    }\n                    if (isOver2 !== isOver0) {\n                        pBx = povar;\n                        pBy =\n                            iSubSpectra +\n                                1 -\n                                (lineZValue - povarHeight2) / (povarHeight0 - povarHeight2);\n                        lines.push(pAx);\n                        lines.push(pAy);\n                        lines.push(pBx * dx + x0);\n                        lines.push(pBy * dy + y0);\n                    }\n                    if (isOver1 !== isOver3) {\n                        pBx = povar + 1;\n                        pBy =\n                            iSubSpectra +\n                                (lineZValue - povarHeight1) / (povarHeight3 - povarHeight1);\n                        lines.push(pAx);\n                        lines.push(pAy);\n                        lines.push(pBx * dx + x0);\n                        lines.push(pBy * dy + y0);\n                    }\n                    if (isOver2 !== isOver3) {\n                        pBx =\n                            povar +\n                                (lineZValue - povarHeight2) / (povarHeight3 - povarHeight2);\n                        pBy = iSubSpectra + 1;\n                        lines.push(pAx);\n                        lines.push(pAy);\n                        lines.push(pBx * dx + x0);\n                        lines.push(pBy * dy + y0);\n                    }\n                }\n            }\n        }\n    }\n    return {\n        minX: zData.minX,\n        maxX: zData.maxX,\n        minY: zData.minY,\n        maxY: zData.maxY,\n        segments: contourLevels,\n    };\n}\n//# sourceMappingURL=generateContourLines.js.map","export default function profiling(result, action, options) {\n    if (result.profiling) {\n        result.profiling.push({\n            action,\n            time: Date.now() - options.start,\n        });\n    }\n}\n//# sourceMappingURL=profiling.js.map","export default function simpleChromatogram(result) {\n    let data = result.spectra[0].data;\n    result.chromatogram = {\n        times: data.x.slice(),\n        series: {\n            intensity: {\n                dimension: 1,\n                data: data.y.slice(),\n            },\n        },\n    };\n}\n//# sourceMappingURL=simpleChromatogram.js.map","import add2D from './2d/add2D';\nimport { complexChromatogram } from './complexChromatogram';\nimport postProcessingNMR from './postProcessingNMR';\nimport profiling from './profiling';\nimport simpleChromatogram from './simpleChromatogram';\nexport default function postProcessing(entriesFlat, result, options) {\n    // converting Hz to ppm\n    postProcessingNMR(entriesFlat);\n    for (let entry of entriesFlat) {\n        if (Object.keys(entry.ntuples).length > 0) {\n            let newNtuples = [];\n            let keys = Object.keys(entry.ntuples);\n            for (let i = 0; i < keys.length; i++) {\n                let key = keys[i];\n                let values = entry.ntuples[key];\n                for (let j = 0; j < values.length; j++) {\n                    if (!newNtuples[j])\n                        newNtuples[j] = {};\n                    newNtuples[j][key] = values[j];\n                }\n            }\n            entry.ntuples = newNtuples;\n        }\n        if (entry.twoD && options.wantXY) {\n            add2D(entry, options);\n            profiling(result, 'Finished countour plot calculation', options);\n            if (!options.keepSpectra) {\n                delete entry.spectra;\n            }\n        }\n        // maybe it is a GC (HPLC) / MS. In this case we add a new format\n        if (options.chromatogram) {\n            if (entry.spectra.length > 1) {\n                complexChromatogram(entry);\n            }\n            else {\n                simpleChromatogram(entry);\n            }\n            profiling(result, 'Finished chromatogram calculation', options);\n        }\n        delete entry.tmp;\n    }\n}\n//# sourceMappingURL=postProcessing.js.map","import { gyromagneticRatio } from 'gyromagnetic-ratio';\nexport default function postProcessingNMR(entriesFlat) {\n    // specific NMR functions\n    for (let entry of entriesFlat) {\n        let observeFrequency = 0;\n        let shiftOffsetVal = 0;\n        for (let spectrum of entry.spectra) {\n            if (entry.ntuples && entry.ntuples.symbol) {\n                if (!observeFrequency && spectrum.observeFrequency) {\n                    observeFrequency = spectrum.observeFrequency;\n                }\n                if (!shiftOffsetVal && spectrum.shiftOffsetVal) {\n                    shiftOffsetVal = spectrum.shiftOffsetVal;\n                }\n            }\n            else {\n                observeFrequency = spectrum.observeFrequency;\n                shiftOffsetVal = spectrum.shiftOffsetVal;\n            }\n            if (observeFrequency) {\n                if (spectrum.xUnits && spectrum.xUnits.toUpperCase().includes('HZ')) {\n                    spectrum.xUnits = 'PPM';\n                    spectrum.xFactor = spectrum.xFactor / observeFrequency;\n                    spectrum.firstX = spectrum.firstX / observeFrequency;\n                    spectrum.lastX = spectrum.lastX / observeFrequency;\n                    spectrum.deltaX = spectrum.deltaX / observeFrequency;\n                    for (let i = 0; i < spectrum.data.x.length; i++) {\n                        spectrum.data.x[i] /= observeFrequency;\n                    }\n                }\n            }\n            if (shiftOffsetVal) {\n                let shift = spectrum.firstX - shiftOffsetVal;\n                spectrum.firstX = spectrum.firstX - shift;\n                spectrum.lastX = spectrum.lastX - shift;\n                for (let i = 0; i < spectrum.data.x.length; i++) {\n                    spectrum.data.x[i] -= shift;\n                }\n            }\n            // we will check if some nucleus are missing ...\n            if (entry.ntuples && entry.ntuples.nucleus && entry.ntuples.symbol) {\n                for (let i = 0; i < entry.ntuples.nucleus.length; i++) {\n                    let symbol = entry.ntuples.symbol[i];\n                    let nucleus = entry.ntuples.nucleus[i];\n                    if (symbol.startsWith('F') && !nucleus) {\n                        if (symbol === 'F1') {\n                            // if F1 is defined we will use F2\n                            if (entry.tmp.$NUC2) {\n                                entry.ntuples.nucleus[i] = entry.tmp.$NUC2;\n                            }\n                            else {\n                                let f2index = entry.ntuples.symbol.indexOf('F2');\n                                if (f2index && entry.ntuples.nucleus[f2index]) {\n                                    entry.ntuples.nucleus[i] = entry.ntuples.nucleus[f2index];\n                                }\n                            }\n                        }\n                        if (symbol === 'F2')\n                            entry.ntuples.nucleus[i] = entry.tmp.$NUC1;\n                    }\n                    if (symbol === 'F2') {\n                        entry.yType = entry.ntuples.nucleus[0];\n                    }\n                }\n            }\n            if (observeFrequency &&\n                entry.ntuples &&\n                entry.ntuples.symbol &&\n                entry.ntuples.nucleus) {\n                let unit = '';\n                let pageSymbolIndex = entry.ntuples.symbol.indexOf(spectrum.pageSymbol);\n                if (entry.ntuples.units && entry.ntuples.units[pageSymbolIndex]) {\n                    unit = entry.ntuples.units[pageSymbolIndex];\n                }\n                if (unit !== 'PPM') {\n                    if (pageSymbolIndex !== 0) {\n                        throw Error('Not sure about this ntuples format');\n                    }\n                    let ratio0 = gyromagneticRatio[entry.ntuples.nucleus[0]];\n                    let ratio1 = gyromagneticRatio[entry.ntuples.nucleus[1]];\n                    if (!ratio0 || !ratio1) {\n                        throw Error('Problem with determination of gyromagnetic ratio');\n                    }\n                    let ratio = (ratio0 / ratio1) * observeFrequency;\n                    spectrum.pageValue /= ratio;\n                }\n            }\n        }\n    }\n}\n//# sourceMappingURL=postProcessingNMR.js.map","export default function prepareNtuplesDatatable(currentEntry, spectrum, kind) {\n    let xIndex = -1;\n    let yIndex = -1;\n    let firstVariable = '';\n    let secondVariable = '';\n    if (kind.indexOf('++') > 0) {\n        firstVariable = kind.replace(/.*\\(([a-zA-Z0-9]+)\\+\\+.*/, '$1');\n        secondVariable = kind.replace(/.*\\.\\.([a-zA-Z0-9]+).*/, '$1');\n    }\n    else {\n        kind = kind.replace(/[^a-zA-Z]/g, '');\n        firstVariable = kind.charAt(0);\n        secondVariable = kind.charAt(1);\n        spectrum.variables = {};\n        for (let symbol of kind) {\n            let lowerCaseSymbol = symbol.toLowerCase();\n            let index = currentEntry.ntuples.symbol.indexOf(symbol);\n            if (index === -1)\n                throw Error(`Symbol undefined: ${symbol}`);\n            spectrum.variables[lowerCaseSymbol] = {};\n            for (let key in currentEntry.ntuples) {\n                if (currentEntry.ntuples[key][index]) {\n                    spectrum.variables[lowerCaseSymbol][key.replace(/^var/, '')] =\n                        currentEntry.ntuples[key][index];\n                }\n            }\n        }\n    }\n    xIndex = currentEntry.ntuples.symbol.indexOf(firstVariable);\n    yIndex = currentEntry.ntuples.symbol.indexOf(secondVariable);\n    if (xIndex === -1)\n        xIndex = 0;\n    if (yIndex === -1)\n        yIndex = 0;\n    if (currentEntry.ntuples.first) {\n        if (currentEntry.ntuples.first.length > xIndex) {\n            spectrum.firstX = currentEntry.ntuples.first[xIndex];\n        }\n        if (currentEntry.ntuples.first.length > yIndex) {\n            spectrum.firstY = currentEntry.ntuples.first[yIndex];\n        }\n    }\n    if (currentEntry.ntuples.last) {\n        if (currentEntry.ntuples.last.length > xIndex) {\n            spectrum.lastX = currentEntry.ntuples.last[xIndex];\n        }\n        if (currentEntry.ntuples.last.length > yIndex) {\n            spectrum.lastY = currentEntry.ntuples.last[yIndex];\n        }\n    }\n    if (currentEntry.ntuples.vardim &&\n        currentEntry.ntuples.vardim.length > xIndex) {\n        spectrum.nbPoints = currentEntry.ntuples.vardim[xIndex];\n    }\n    if (currentEntry.ntuples.factor) {\n        if (currentEntry.ntuples.factor.length > xIndex) {\n            spectrum.xFactor = currentEntry.ntuples.factor[xIndex];\n        }\n        if (currentEntry.ntuples.factor.length > yIndex) {\n            spectrum.yFactor = currentEntry.ntuples.factor[yIndex];\n        }\n    }\n    if (currentEntry.ntuples.units) {\n        if (currentEntry.ntuples.units.length > xIndex) {\n            if (currentEntry.ntuples.varname &&\n                currentEntry.ntuples.varname[xIndex]) {\n                spectrum.xUnits = `${currentEntry.ntuples.varname[xIndex]} [${currentEntry.ntuples.units[xIndex]}]`;\n            }\n            else {\n                spectrum.xUnits = currentEntry.ntuples.units[xIndex];\n            }\n        }\n        if (currentEntry.ntuples.units.length > yIndex) {\n            if (currentEntry.ntuples.varname &&\n                currentEntry.ntuples.varname[yIndex]) {\n                spectrum.yUnits = `${currentEntry.ntuples.varname[yIndex]} [${currentEntry.ntuples.units[yIndex]}]`;\n            }\n            else {\n                spectrum.yUnits = currentEntry.ntuples.units[yIndex];\n            }\n        }\n    }\n}\n//# sourceMappingURL=prepareNtuplesDatatable.js.map","export default function prepareSpectrum(spectrum) {\n    if (!spectrum.xFactor)\n        spectrum.xFactor = 1;\n    if (!spectrum.yFactor)\n        spectrum.yFactor = 1;\n}\n//# sourceMappingURL=prepareSpectrum.js.map","import { parseString } from 'dynamic-typing';\nimport { ensureString } from 'ensure-string';\nimport { isMSField, convertMSFieldToLabel } from './complexChromatogram';\nimport convertToFloatArray from './convertToFloatArray';\nimport fastParseXYData from './parse/fastParseXYData';\nimport parsePeakTable from './parse/parsePeakTable';\nimport parseXYA from './parse/parseXYA';\nimport postProcessing from './postProcessing';\nimport prepareNtuplesDatatable from './prepareNtuplesDatatable';\nimport prepareSpectrum from './prepareSpectrum';\nimport profiling from './profiling';\n// the following RegExp can only be used for XYdata, some peakTables have values with a \"E-5\" ...\nconst ntuplesSeparatorRegExp = /[ \\t]*,[ \\t]*/;\nconst defaultOptions = {\n    keepRecordsRegExp: /^$/,\n    canonicDataLabels: true,\n    canonicMetadataLabels: false,\n    dynamicTyping: true,\n    withoutXY: false,\n    chromatogram: false,\n    keepSpectra: false,\n    noContour: false,\n    nbContourLevels: 7,\n    noiseMultiplier: 5,\n    profiling: false,\n};\n/**\n *\n * @typedef {object} ConvertOptions\n * @property {RegExp} [options.keepRecordsRegExp=/^$/] - By default we don't keep meta information.\n * @property {boolean} [options.canonicDataLabels=true] - Canonize the Labels (uppercase without symbol).\n * @property {boolean} [options.canonicMetadataLabels=false] - Canonize the metadata Labels (uppercase without symbol).\n * @property {boolean} [options.dynamicTyping=false] - Convert numbers to Number.\n * @property {boolean} [options.withoutXY=false] - Remove the XY data.\n * @property {boolean} [options.chromatogram=false] - Special post-processing for GC / HPLC / MS.\n * @property {boolean} [options.keepSpectra=false] - Force to keep the spectra in case of 2D.\n * @property {boolean} [options.noContour=false] - Don't calculate countour in case of 2D.\n * @property {number} [options.nbContourLevels=7] - Number of positive / negative contour levels to calculate.\n * @property {number} [options.noiseMultiplier=5] - Define for 2D the level as 5 times the median as default.\n * @property {boolean} [options.profiling=false] - Add profiling information.\n */\n/**\n *\n * @typedef {object} Ntuples\n * @property {string[]} [varname]\n * @property {string[]} [symbol]\n * @property {string[]} [vartype]\n * @property {string[]} [varform]\n * @property {number[]} [vardim]\n * @property {string[]} [units]\n * @property {number[]} [factor]\n * @property {number[]} [first]\n * @property {number[]} [last]\n * @property {number[]} [min]\n * @property {number[]} [max]\n * @property {string[]} [nucleus]\n */\n/**\n * @typedef { Record<string, any> } Spectrum\n * @property {Record<string, number[]>} [data]\n * @property {number} [firstX]\n * @property {number} [lastX]\n * @property {number} [deltaX]\n * @property {number} [yFactor]\n * @property {number} [xFactor]\n * @property {number} [nbPoints]\n */\n/**\n *\n * @typedef {object} Entry\n * @property {Spectrum[]} spectra\n * @property {Ntuples} ntuples\n * @property {object} meta\n * @property {object} info\n * @property {object} tmp\n * @property {string} [title]\n * @property {string} [dataType]\n * @property {string} [dataClass]\n * @property {boolean} [twoD]\n */\n/**\n *\n * @typedef { object } ConvertResult\n * @property { object[] | boolean } profiling\n * @property { string[] } logs\n * @property { object[] } entries\n * @property { Entry[] } flatten\n */\n/**\n * Parse a jcamp.\n *\n * @param {string|ArrayBuffer|Uint8Array} jcamp\n * @param {ConvertOptions} [options]\n * @returns {ConvertResult}\n */\nexport function convert(jcamp, options = {}) {\n    jcamp = ensureString(jcamp);\n    options = { ...defaultOptions, ...options };\n    options.wantXY = !options.withoutXY;\n    options.start = Date.now();\n    let entriesFlat = [];\n    let result = {\n        profiling: options.profiling ? [] : false,\n        logs: [],\n        entries: [],\n    };\n    let tmpResult = { children: [] };\n    let currentEntry = tmpResult;\n    let parentsStack = [];\n    let spectrum = {};\n    if (typeof jcamp !== 'string') {\n        throw new TypeError('the JCAMP should be a string');\n    }\n    profiling(result, 'Before split to LDRS', options);\n    let ldrs = jcamp.replace(/[\\r\\n]+##/g, '\\n##').split('\\n##');\n    profiling(result, 'Split to LDRS', options);\n    if (ldrs[0])\n        ldrs[0] = ldrs[0].replace(/^[\\r\\n ]*##/, '');\n    for (let ldr of ldrs) {\n        // This is a new LDR\n        let position = ldr.indexOf('=');\n        let dataLabel = position > 0 ? ldr.substring(0, position) : ldr;\n        let dataValue = position > 0 ? ldr.substring(position + 1).trim() : '';\n        let canonicDataLabel = dataLabel.replace(/[_ -]/g, '').toUpperCase();\n        if (canonicDataLabel === 'DATATABLE') {\n            let endLine = dataValue.indexOf('\\n');\n            if (endLine === -1)\n                endLine = dataValue.indexOf('\\r');\n            if (endLine > 0) {\n                // ##DATA TABLE= (X++(I..I)), XYDATA\n                // We need to find the variables\n                let infos = dataValue.substring(0, endLine).split(/[ ,;\\t]+/);\n                prepareNtuplesDatatable(currentEntry, spectrum, infos[0]);\n                spectrum.datatable = infos[0];\n                if (infos[1] && infos[1].indexOf('PEAKS') > -1) {\n                    canonicDataLabel = 'PEAKTABLE';\n                }\n                else if (infos[1] &&\n                    (infos[1].indexOf('XYDATA') || infos[0].indexOf('++') > 0)) {\n                    canonicDataLabel = 'XYDATA';\n                    if (spectrum.nbPoints) {\n                        spectrum.deltaX =\n                            (spectrum.lastX - spectrum.firstX) / (spectrum.nbPoints - 1);\n                    }\n                }\n            }\n        }\n        if (canonicDataLabel === 'XYDATA') {\n            if (options.wantXY) {\n                prepareSpectrum(spectrum);\n                // well apparently we should still consider it is a PEAK TABLE if there are no '++' after\n                if (dataValue.match(/.*\\+\\+.*/)) {\n                    // ex: (X++(Y..Y))\n                    if (spectrum.nbPoints) {\n                        spectrum.deltaX =\n                            (spectrum.lastX - spectrum.firstX) / (spectrum.nbPoints - 1);\n                    }\n                    fastParseXYData(spectrum, dataValue, result);\n                }\n                else {\n                    parsePeakTable(spectrum, dataValue, result);\n                }\n                currentEntry.spectra.push(spectrum);\n                spectrum = {};\n            }\n            continue;\n        }\n        else if (canonicDataLabel === 'PEAKTABLE') {\n            if (options.wantXY) {\n                prepareSpectrum(spectrum);\n                parsePeakTable(spectrum, dataValue, result);\n                currentEntry.spectra.push(spectrum);\n                spectrum = {};\n            }\n            continue;\n        }\n        if (canonicDataLabel === 'PEAKASSIGNMENTS') {\n            if (options.wantXY) {\n                if (dataValue.match(/.*(XYA).*/)) {\n                    // ex: (XYA)\n                    parseXYA(spectrum, dataValue);\n                }\n                currentEntry.spectra.push(spectrum);\n                spectrum = {};\n            }\n            continue;\n        }\n        if (canonicDataLabel === 'TITLE') {\n            let parentEntry = currentEntry;\n            if (!parentEntry.children) {\n                parentEntry.children = [];\n            }\n            currentEntry = {\n                spectra: [],\n                ntuples: {},\n                info: {},\n                meta: {},\n                tmp: {}, // tmp information we need to keep for postprocessing\n            };\n            parentEntry.children.push(currentEntry);\n            parentsStack.push(parentEntry);\n            entriesFlat.push(currentEntry);\n            currentEntry.title = dataValue;\n        }\n        else if (canonicDataLabel === 'DATATYPE') {\n            currentEntry.dataType = dataValue;\n            if (dataValue.match(/(^nd|\\snd\\s)/i)) {\n                currentEntry.twoD = true;\n            }\n        }\n        else if (canonicDataLabel === 'NTUPLES') {\n            if (dataValue.match(/(^nd|\\snd\\s)/i)) {\n                currentEntry.twoD = true;\n            }\n        }\n        else if (canonicDataLabel === 'DATACLASS') {\n            currentEntry.dataClass = dataValue;\n        }\n        else if (canonicDataLabel === 'XUNITS') {\n            spectrum.xUnits = dataValue;\n        }\n        else if (canonicDataLabel === 'YUNITS') {\n            spectrum.yUnits = dataValue;\n        }\n        else if (canonicDataLabel === 'FIRSTX') {\n            spectrum.firstX = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'LASTX') {\n            spectrum.lastX = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'FIRSTY') {\n            spectrum.firstY = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'LASTY') {\n            spectrum.lastY = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'NPOINTS') {\n            spectrum.nbPoints = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'XFACTOR') {\n            spectrum.xFactor = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'YFACTOR') {\n            spectrum.yFactor = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'MAXX') {\n            spectrum.maxX = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'MINX') {\n            spectrum.minX = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'MAXY') {\n            spectrum.maxY = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'MINY') {\n            spectrum.minY = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'DELTAX') {\n            spectrum.deltaX = Number(dataValue);\n        }\n        else if (canonicDataLabel === '.OBSERVEFREQUENCY' ||\n            canonicDataLabel === '$SFO1') {\n            if (!spectrum.observeFrequency) {\n                spectrum.observeFrequency = Number(dataValue);\n            }\n        }\n        else if (canonicDataLabel === '.OBSERVENUCLEUS') {\n            if (!spectrum.xType) {\n                currentEntry.xType = dataValue.replace(/[^a-zA-Z0-9]/g, '');\n            }\n        }\n        else if (canonicDataLabel === '$OFFSET') {\n            // OFFSET for Bruker spectra\n            currentEntry.shiftOffsetNum = 0;\n            if (!spectrum.shiftOffsetVal) {\n                spectrum.shiftOffsetVal = Number(dataValue);\n            }\n        }\n        else if (canonicDataLabel === '$REFERENCEPOINT') {\n            // OFFSET for Varian spectra\n            // if we activate this part it does not work for ACD specmanager\n            //         } else if (canonicDataLabel=='.SHIFTREFERENCE') {   // OFFSET FOR Bruker Spectra\n            //                 var parts = dataValue.split(/ *, */);\n            //                 currentEntry.shiftOffsetNum = parseInt(parts[2].trim());\n            //                 spectrum.shiftOffsetVal = Number(parts[3].trim());\n        }\n        else if (canonicDataLabel === 'VARNAME') {\n            currentEntry.ntuples.varname = dataValue.split(ntuplesSeparatorRegExp);\n        }\n        else if (canonicDataLabel === 'SYMBOL') {\n            currentEntry.ntuples.symbol = dataValue.split(ntuplesSeparatorRegExp);\n        }\n        else if (canonicDataLabel === 'VARTYPE') {\n            currentEntry.ntuples.vartype = dataValue.split(ntuplesSeparatorRegExp);\n        }\n        else if (canonicDataLabel === 'VARFORM') {\n            currentEntry.ntuples.varform = dataValue.split(ntuplesSeparatorRegExp);\n        }\n        else if (canonicDataLabel === 'VARDIM') {\n            currentEntry.ntuples.vardim = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === 'UNITS') {\n            currentEntry.ntuples.units = dataValue.split(ntuplesSeparatorRegExp);\n        }\n        else if (canonicDataLabel === 'FACTOR') {\n            currentEntry.ntuples.factor = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === 'FIRST') {\n            currentEntry.ntuples.first = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === 'LAST') {\n            currentEntry.ntuples.last = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === 'MIN') {\n            currentEntry.ntuples.min = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === 'MAX') {\n            currentEntry.ntuples.max = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === '.NUCLEUS') {\n            if (currentEntry.ntuples) {\n                currentEntry.ntuples.nucleus = dataValue.split(ntuplesSeparatorRegExp);\n            }\n        }\n        else if (canonicDataLabel === 'PAGE') {\n            spectrum.page = dataValue.trim();\n            spectrum.pageValue = Number(dataValue.replace(/^.*=/, ''));\n            spectrum.pageSymbol = spectrum.page.replace(/[=].*/, '');\n        }\n        else if (canonicDataLabel === 'RETENTIONTIME') {\n            spectrum.pageValue = Number(dataValue);\n        }\n        else if (isMSField(canonicDataLabel)) {\n            spectrum[convertMSFieldToLabel(canonicDataLabel)] = dataValue;\n        }\n        else if (canonicDataLabel === 'SAMPLEDESCRIPTION') {\n            spectrum.sampleDescription = dataValue;\n        }\n        else if (canonicDataLabel.startsWith('$NUC')) {\n            if (!currentEntry.tmp[canonicDataLabel] && !dataValue.includes('off')) {\n                currentEntry.tmp[canonicDataLabel] = dataValue.replace(/[<>]/g, '');\n            }\n        }\n        else if (canonicDataLabel === 'END') {\n            currentEntry = parentsStack.pop();\n        }\n        if (currentEntry &&\n            currentEntry.info &&\n            currentEntry.meta &&\n            canonicDataLabel.match(options.keepRecordsRegExp)) {\n            let value = dataValue.trim();\n            let target, label;\n            if (dataLabel.startsWith('$')) {\n                label = options.canonicMetadataLabels\n                    ? canonicDataLabel.substring(1)\n                    : dataLabel.substring(1);\n                target = currentEntry.meta;\n            }\n            else {\n                label = options.canonicDataLabels ? canonicDataLabel : dataLabel;\n                target = currentEntry.info;\n            }\n            if (options.dynamicTyping) {\n                value = parseString(value);\n            }\n            if (target[label]) {\n                if (!Array.isArray(target[label])) {\n                    target[label] = [target[label]];\n                }\n                target[label].push(value);\n            }\n            else {\n                target[label] = value;\n            }\n        }\n    }\n    profiling(result, 'Finished parsing', options);\n    postProcessing(entriesFlat, result, options);\n    profiling(result, 'Total time', options);\n    /*\n    if (result.children && result.children.length>0) {\n      result = { ...result, ...result.children[0] };\n    }\n    */\n    result.entries = tmpResult.children;\n    result.flatten = entriesFlat;\n    return result;\n}\n//# sourceMappingURL=convert.js.map","import { convert as convertJcamp } from 'jcampconverter';\n\n/**\n *\n * @param {File} file\n * @param {object} [options={}]\n * @param {RegExp} [options.keepRecordsRegExp={}]\n * @returns\n */\nexport async function parseData(file, options) {\n  if (!file) return { info: {}, meta: {} };\n  const data = await file.text();\n  let { keepRecordsRegExp = /.*/ } = options;\n  let result = convertJcamp(data, {\n    keepRecordsRegExp,\n  });\n  const firstSpectrum = result.flatten.length === 0 ? {} : result.flatten[0];\n  return firstSpectrum;\n}\n","import { IOBuffer } from 'iobuffer';\nimport { createStepArray } from 'ml-spectra-processing';\n\nexport async function setFIDSpectrumData(file, spectra) {\n  let td = parseInt(spectra.meta.TD[0], 10);\n  let ioBuffer = new IOBuffer(await file.arrayBuffer());\n\n  if (td * spectra.meta.nbSubSpectra * 4 > ioBuffer.length) {\n    throw new RangeError(\n      `td: ${td} and nbSubSpectra: ${nbSubSpectra} exceed the buffer size`,\n    );\n  }\n\n  let SW_H = Number(spectra.meta.SW_h[0]);\n\n  let SF = Number(spectra.meta.SFO1[0]);\n\n  spectra.meta.DATATYPE = 'NMR FID';\n\n  let DW = 1 / (2 * SW_H);\n  let AQ = td * DW;\n\n  let endian = parseInt(spectra.meta.BYTORDA, 10);\n  endian = endian ? 0 : 1;\n\n  if (endian) {\n    ioBuffer.setLittleEndian();\n  } else {\n    ioBuffer.setBigEndian();\n  }\n\n  let nbSubSpectra = spectra.meta.nbSubSpectra\n    ? spectra.meta.nbSubSpectra / 2\n    : 1;\n\n  spectra.spectra = new Array(nbSubSpectra);\n\n  const stopReading = td / 2;\n  for (let j = 0; j < nbSubSpectra; j++) {\n    let toSave = {\n      dataType: 'NMR FID',\n      dataTable: '(X++(R..R))',\n      nbPoints: td,\n      firstX: 0,\n      lastX: AQ,\n      nucleus: spectra.meta.NUC1,\n      xUnit: 'Sec',\n      yUnit: 'Arbitrary',\n      data: {\n        x: createStepArray({ length: td, step: DW }),\n        re: new Float64Array(td),\n        im: new Float64Array(td),\n      },\n      isXYdata: true,\n      observeFrequency: SF,\n      title: spectra.meta.TITLE,\n      deltaX: DW,\n    };\n    spectra.spectra[j] = toSave;\n\n    for (let i = 0; i < stopReading; i++) {\n      spectra.spectra[j].data.re[i] = ioBuffer.readInt32();\n      spectra.spectra[j].data.im[i] = ioBuffer.readInt32();\n    }\n  }\n}\n","import { IOBuffer } from 'iobuffer';\nimport { isAnyArray } from 'is-any-array';\n\nexport async function setXYSpectrumData(file, spectra) {\n  let ioBufferReal = file.re ? new IOBuffer(await file.re.arrayBuffer()) : null;\n  let ioBufferImaginary = file.im\n    ? new IOBuffer(await file.im.arrayBuffer())\n    : null;\n  let td = getDirectParameter(spectra.meta.SI);\n  let swP = getDirectParameter(spectra.meta.SW_p);\n  let sf = getDirectParameter(spectra.meta.SF);\n  let bf = sf;\n  let offset = getDirectParameter(\n    spectra.shiftOffsetVal || spectra.meta.OFFSET,\n  );\n  spectra.meta.observeFrequency = sf;\n  spectra.meta.brukerReference = bf;\n  spectra.meta.DATATYPE = 'NMR Spectrum';\n\n  let endian = parseInt(spectra.meta.BYTORDP, 10);\n  endian = endian ? 0 : 1;\n\n  let nbSubSpectra = spectra.meta.nbSubSpectra ? spectra.meta.nbSubSpectra : 1;\n  if (endian) {\n    if (file.re) ioBufferReal.setLittleEndian();\n    if (file.im) ioBufferImaginary.setLittleEndian();\n  } else {\n    if (file.re) ioBufferReal.setBigEndian();\n    if (file.im) ioBufferImaginary.setBigEndian();\n  }\n\n  for (let i = 0; i < nbSubSpectra; i++) {\n    let toSave = {\n      dataType: 'NMR Spectrum',\n      nbPoints: td,\n      firstX: offset,\n      lastX: offset - swP / sf,\n      xUnit: 'PPM',\n      yUnit: 'Arbitrary',\n      isXYdata: true,\n      nucleus: spectra.meta.NUC1,\n      observeFrequency: sf,\n      title: spectra.meta.TITLE,\n      deltaX: -(swP / sf) / (td - 1),\n    };\n\n    let deltaX = toSave.deltaX;\n    let x = new Float64Array(td);\n    let re = new Float64Array(td);\n    let im = file.im ? new Float64Array(td) : null;\n\n    if (im) {\n      for (let k = 0; k < td; ++k) {\n        x[k] = offset + k * deltaX;\n        re[k] = ioBufferReal.readInt32();\n        im[k] = ioBufferImaginary.readInt32();\n      }\n    } else {\n      for (let k = 0; k < td; ++k) {\n        x[k] = offset + k * deltaX;\n        re[k] = ioBufferReal.readInt32();\n      }\n    }\n\n    toSave.data = im ? { x, re, im } : { x, re };\n\n    spectra.spectra.push(toSave);\n  }\n}\n\nfunction getDirectParameter(meta) {\n  return Number(isAnyArray(meta) ? meta[0] : meta);\n}\n","import { joinInfoMeta } from './joinMetaInfo.js';\nimport { parseData } from './parseData';\nimport { setFIDSpectrumData } from './setFIDSpectrumData';\nimport { setXYSpectrumData } from './setXYSpectrumData';\n\nexport async function convert1D(files, options) {\n  const result = await parseData(files.procs, options);\n  const acqus = await parseData(files.acqus, options);\n  joinInfoMeta(result, acqus);\n\n  if (files['1r'] || files['1i']) {\n    await setXYSpectrumData(\n      {\n        re: files['1r'],\n        im: files['1i'],\n      },\n      result,\n    );\n  } else if (files.fid) {\n    await setFIDSpectrumData(files.fid, result);\n  }\n\n  return result;\n}\n","export function mergeMetadata(main, complement) {\n  for (let key in complement.meta) {\n    if (main.meta[key]) {\n      if (!Array.isArray(main.meta[key])) {\n        main.meta[key] = [main.meta[key]];\n      }\n      main.meta[key].push(complement.meta[key]);\n    } else if (main.meta[key] === undefined) {\n      main.meta[key] = [complement.meta[key]];\n    }\n  }\n  return main;\n}\n","import { joinInfoMeta } from './joinMetaInfo.js';\nimport { mergeMetadata } from './mergeMetadata';\nimport { parseData } from './parseData';\nimport { setFIDSpectrumData } from './setFIDSpectrumData';\nimport { setXYSpectrumData } from './setXYSpectrumData';\n\nexport async function convert2D(files, options) {\n  const result = mergeMetadata(\n    await parseData(files.procs, options),\n    await parseData(files.proc2s, options),\n  );\n\n  const acqus = mergeMetadata(\n    await parseData(files.acqus, options),\n    await parseData(files.acqu2s, options),\n  );\n\n  joinInfoMeta(result, acqus);\n\n  result.meta.nbSubSpectra = files['2rr']\n    ? parseInt(result.meta.SI[1], 10)\n    : parseInt(result.meta.TD[1], 10);\n\n  if (!result.meta.SW_p) {\n    // eslint-disable-next-line camelcase\n    result.meta.SW_p = result.meta.SW_h;\n  }\n  if (!result.meta.SF) {\n    result.meta.SF = result.meta.SFO1;\n  }\n\n  let firstY, lastY, xOffset, yOffset;\n  if (files['2rr']) {\n    let sf = Number(result.meta.SF[1]);\n    let swP = Number(result.meta.SW_p[1] || result.meta.SW[1]);\n    yOffset = Number(result.meta.OFFSET[1]);\n    xOffset = Number(result.meta.OFFSET[0]);\n    firstY = yOffset;\n    lastY = yOffset - swP / sf;\n    result.meta.firstY = firstY;\n    result.meta.lastY = lastY;\n    await setXYSpectrumData({ re: files['2rr'] }, result, true);\n  } else if (files.ser) {\n    firstY = 0;\n    lastY = result.meta.nbSubSpectra;\n    let xWindowSize = Number(result.meta.SW[0]);\n    let yWindowSize = Number(result.meta.SW[1]);\n    let xTransmitterFrequency = Number(result.meta.SFO1[0]);\n    let yTransmitterFrequency = Number(result.meta.SFO1[1]);\n    let xTransmitterFrequencyOffset = Number(result.meta.O1[0]);\n    let yTransmitterFrequencyOffset = Number(result.meta.O1[1]);\n    xOffset =\n      xTransmitterFrequencyOffset / xTransmitterFrequency + xWindowSize / 2;\n    yOffset =\n      yTransmitterFrequencyOffset / yTransmitterFrequency + yWindowSize / 2;\n    await setFIDSpectrumData(files.ser, result);\n  }\n\n  let pageValue = firstY;\n  let nbSubSpectra = result.meta.nbSubSpectra / (files['2rr'] ? 1 : 2);\n  let deltaY = (lastY - firstY) / (nbSubSpectra - 1);\n  for (let i = 0; i < nbSubSpectra; i++) {\n    pageValue += deltaY;\n    result.spectra[i].pageValue = pageValue;\n  }\n  let { NUC1: nuc1, AXNUC: axnuc, SF: sf } = result.meta;\n  const nucleus = axnuc ? axnuc : nuc1 ? nuc1 : [];\n  result.info['2D_Y_NUCLEUS'] = nucleus[1];\n  result.info['2D_X_NUCLEUS'] = nucleus[0];\n  result.info['2D_Y_FRECUENCY'] = sf[1];\n  result.info['2D_X_FRECUENCY'] = sf[0];\n  result.info['2D_Y_OFFSET'] = yOffset;\n  result.info['2D_X_OFFSET'] = xOffset;\n  result.info.twoD = true;\n  result.twoD = true;\n\n  return result;\n}\n","import { matrixMinMaxZ } from 'ml-spectra-processing';\n/**\n * Those functions should disappear if add2D becomes accessible in jcampconvert\n * @param spectra\n * @returns {{z: Array, minX: *, maxX: *, minY: *, maxY: *, minZ: *, maxZ: *, noise: number}}\n */\n\nexport default function convertTo3DZ(spectra) {\n  let ySize = spectra.length;\n  let xSize = spectra[0].data.re.length;\n  let z = new Array(ySize);\n\n  for (let i = 0; i < ySize; i++) {\n    z[i] = new Float64Array(spectra[i].data.re);\n  }\n  const firstX = spectra[0].data.x[0];\n  const lastX = spectra[0].data.x[xSize - 1];\n  const firstY = spectra[0].pageValue;\n  const lastY = spectra[ySize - 1].pageValue;\n\n  // Because the min / max value are the only information about the matrix if we invert\n  // min and max we need to invert the array\n  if (firstX > lastX) {\n    for (let spectrum of z) {\n      spectrum.reverse();\n    }\n  }\n  if (firstY > lastY) {\n    z.reverse();\n  }\n\n  let minMaxX =\n    firstX < lastX\n      ? { minX: firstX, maxX: lastX }\n      : { minX: lastX, maxX: firstX };\n  let minMaxY =\n    firstY < lastY\n      ? { minY: firstY, maxY: lastY }\n      : { minY: lastY, maxY: firstY };\n\n  const { min: minZ, max: maxZ } = matrixMinMaxZ(z);\n\n  return {\n    z,\n    minZ,\n    maxZ,\n    ...minMaxX,\n    ...minMaxY,\n  };\n}\n","import { convert1D } from './convert1D';\nimport { convert2D } from './convert2D';\nimport convertTo3DZ from './convertTo3DZ.js';\n\n/**\n * Extract information and data from bruker files.\n * @param {File[]} brukerFiles - Needed bruker files to parse raw data.\n * @param {object} [options = {}] - options.\n * @param {boolean} [options.xy] - if true, spectra data is a object with x and y\n * @param {boolean} [options.keepSpectra=false] - for 2D should we keep the spectra or just the matrix ?\n * @param {RegExp} [options.keepRecordsRegExp='\\/.*\\/'] - regular expresion to parse the metadata of the spectrum.\n * @returns\n */\n\nexport async function convertOneExperiment(brukerFiles, options = {}) {\n  let result;\n  if (brukerFiles.ser || brukerFiles['2rr']) {\n    result = await convert2D(brukerFiles, options);\n  } else if (brukerFiles['1r'] || brukerFiles['1i'] || brukerFiles.fid) {\n    result = await convert1D(brukerFiles, options);\n  } else {\n    throw new RangeError('The current files are invalid');\n  }\n\n  result.source = {};\n  for (let key in brukerFiles) {\n    if ((typeof brukerFiles[key]).match(/number|string|boolean/)) {\n      result.source[key] = brukerFiles[key];\n    }\n    // todo we could as well keep the FileList at this level if\n    // we want to keep the original data\n  }\n\n  //normalizing info\n  result.meta.DATE = Number(result.meta.DATE);\n  if (result.meta.GRPDLY) {\n    result.meta.GRPDLY = Number(result.meta.GRPDLY);\n    result.meta.DSPFVS = Number(result.meta.DSPFVS);\n    result.meta.DECIM = Number(result.meta.DECIM);\n  }\n\n  for (let key in result.meta) {\n    if (!Array.isArray(result.meta[key])) {\n      continue;\n    }\n    if (result.meta[key].length === 1) {\n      result.meta[key] = result.meta[key][0];\n    } else if (\n      typeof result.meta[key][0] === 'string' &&\n      result.meta[key][0].indexOf('(0..') > -1\n    ) {\n      result.meta[key] = result.meta[key][0];\n    }\n  }\n\n  if (result.twoD) {\n    result.minMax = convertTo3DZ(result.spectra);\n\n    if (!options.keepSpectra) {\n      delete result.spectra;\n    }\n  }\n\n  return result;\n}\n","import { groupByExperiments } from './groupByExperiments';\nimport { convertOneExperiment } from './util/convertOneExperiment.js';\n\n/**\n *\n * @param {*} fileCollection\n * @param {object} [options={}]\n * @param {object} [options.filter]\n * @param {object} [options.converter]\n * @returns\n */\nexport async function convertFileCollection(fileCollection, options = {}) {\n  const { filter, converter } = options;\n  const results = [];\n  const experiments = groupByExperiments(fileCollection, filter);\n  for (let experiment of experiments) {\n    const result = await convertOneExperiment(experiment, converter);\n    if (result) {\n      results.push(result);\n    }\n  }\n  return results;\n}\n","import { isAnyArray } from 'is-any-array';\n\nexport function convertToFloatArray(data) {\n  if (isAnyArray(data[0])) {\n    return data.map((e) => Float64Array.from(e));\n  } else if (isAnyArray(data)) {\n    return Float64Array.from(data);\n  } else if (typeof data === 'object') {\n    let keys = Object.keys(data);\n    for (let key of keys) {\n      data[key] = convertToFloatArray(data[key]);\n    }\n    return data;\n  }\n  return data;\n}\n","/* eslint-disable no-loss-of-precision */\n/**\n * Returns the group delay for old Bruker NMR spectra\n * @param {number} gspfvs\n * @param {number} decim\n * @return {number}\n */\nexport function getDigitalFilterParameters(grpdly, dspfvs, decim) {\n  let value;\n  if (grpdly > 0) {\n    value = Number(grpdly);\n  } else if (dspfvs > 14) {\n    value = 0;\n  } else if (!brukerDspTable[dspfvs]) {\n    throw new Error('dspfvs not in lookup table');\n  } else {\n    const dspfvsList = brukerDspTable[dspfvs];\n    if (!dspfvsList[decim]) throw new Error('decim not in lookup table');\n    value = dspfvsList[decim];\n  }\n\n  return value;\n}\n\nconst brukerDspTable = {\n  10: {\n    2: 44.75,\n    3: 33.5,\n    4: 66.625,\n    6: 59.083333333333333,\n    8: 68.5625,\n    12: 60.375,\n    16: 69.53125,\n    24: 61.020833333333333,\n    32: 70.015625,\n    48: 61.34375,\n    64: 70.2578125,\n    96: 61.505208333333333,\n    128: 70.37890625,\n    192: 61.5859375,\n    256: 70.439453125,\n    384: 61.626302083333333,\n    512: 70.4697265625,\n    768: 61.646484375,\n    1024: 70.48486328125,\n    1536: 61.656575520833333,\n    2048: 70.492431640625,\n  },\n  11: {\n    2: 46,\n    3: 36.5,\n    4: 48,\n    6: 50.166666666666667,\n    8: 53.25,\n    12: 69.5,\n    16: 72.25,\n    24: 70.166666666666667,\n    32: 72.75,\n    48: 70.5,\n    64: 73,\n    96: 70.666666666666667,\n    128: 72.5,\n    192: 71.333333333333333,\n    256: 72.25,\n    384: 71.666666666666667,\n    512: 72.125,\n    768: 71.833333333333333,\n    1024: 72.0625,\n    1536: 71.916666666666667,\n    2048: 72.03125,\n  },\n  12: {\n    2: 46,\n    3: 36.5,\n    4: 48,\n    6: 50.166666666666667,\n    8: 53.25,\n    12: 69.5,\n    16: 71.625,\n    24: 70.166666666666667,\n    32: 72.125,\n    48: 70.5,\n    64: 72.375,\n    96: 70.666666666666667,\n    128: 72.5,\n    192: 71.333333333333333,\n    256: 72.25,\n    384: 71.666666666666667,\n    512: 72.125,\n    768: 71.833333333333333,\n    1024: 72.0625,\n    1536: 71.916666666666667,\n    2048: 72.03125,\n  },\n  13: {\n    2: 2.75,\n    3: 2.8333333333333333,\n    4: 2.875,\n    6: 2.9166666666666667,\n    8: 2.9375,\n    12: 2.9583333333333333,\n    16: 2.96875,\n    24: 2.9791666666666667,\n    32: 2.984375,\n    48: 2.9895833333333333,\n    64: 2.9921875,\n    96: 2.9947916666666667,\n  },\n};\n","export function getNucleusFromMetadata(metaData, info, subfix) {\n  let nucleus = [];\n  if (metaData[`${subfix}AXNUC`]) {\n    nucleus = metaData[`${subfix}AXNUC`];\n    if (!Array.isArray(nucleus)) nucleus = [nucleus];\n    nucleus = checkForNucleus(nucleus);\n  }\n\n  if (nucleus.length < 1 && metaData[`${subfix}NUC1`]) {\n    nucleus = metaData[`${subfix}NUC1`];\n    if (!Array.isArray(nucleus)) nucleus = [nucleus];\n    nucleus = checkForNucleus(nucleus);\n  }\n\n  if (nucleus.length === 0) {\n    if (metaData['.NUCLEUS']) {\n      nucleus = metaData['.NUCLEUS'].split(',').map((nuc) => nuc.trim());\n    } else if (metaData['.OBSERVENUCLEUS']) {\n      nucleus = [metaData['.OBSERVENUCLEUS'].replace(/[^A-Za-z0-9]/g, '')];\n    } else {\n      nucleus = getNucleusFrom2DExperiment(info.experiment);\n    }\n    nucleus = checkForNucleus(nucleus);\n  }\n\n  if (metaData['2D_X_NUCLEUS'] && metaData['2D_Y_NUCLEUS']) {\n    if (nucleus.length < 2) {\n      nucleus = [\n        metaData['2D_X_NUCLEUS'].replace(/[^A-Za-z0-9]/g, ''),\n        metaData['2D_Y_NUCLEUS'].replace(/[^A-Za-z0-9]/g, ''),\n      ];\n    }\n  }\n  return nucleus;\n}\n\n/**\n * Returns a list of likely nuclei based on an experiment string\n * This is really an hypothesis and should not be used\n * @param {string} experiment\n * @return {string[]}\n */\n\nfunction getNucleusFrom2DExperiment(experiment) {\n  if (typeof experiment !== 'string') {\n    return [];\n  }\n  experiment = experiment.toLowerCase();\n  if (experiment.includes('jres')) {\n    return ['1H', 'Hz'];\n  }\n  if (experiment.includes('hmbc') || experiment.includes('hsqc')) {\n    return ['1H', '13C'];\n  }\n  if (experiment.includes('cosy') || experiment.includes('tocsy')) {\n    return ['1H', '1H'];\n  }\n  return [];\n}\n\nfunction checkForNucleus(nucleus) {\n  nucleus = nucleus.map((value) =>\n    value\n      .replace(/[^A-Za-z0-9]/g, '')\n      .replace('NA', '')\n      .replace('off', ''),\n  );\n  let beforeLength = nucleus.length;\n  nucleus = nucleus.filter((value) => value);\n  return nucleus.length !== beforeLength ? [] : nucleus;\n}\n","/**\n * Returns an experiment string based on a pulse sequence\n * @param {string} pulse\n * @return {string}\n */\nexport function getSpectrumType(meta = {}, info = {}, options = {}) {\n  const { subfix = '' } = options;\n\n  if (meta === null) meta = {};\n  if (typeof meta === 'string') meta = { pulseSequence: meta };\n\n  let spectyp = info[`${subfix}SPECTYP`];\n  spectyp = (Array.isArray(spectyp) ? spectyp[0] : spectyp || '')\n    .replace(/^<(.*)>$/, '$1') // eslint-disable-line prefer-named-capture-group\n    .toLowerCase();\n\n  if (spectyp.length > 0 && spectyp !== 'undefined') return spectyp;\n\n  let pulse = Array.isArray(meta.pulseSequence)\n    ? meta.pulseSequence[0]\n    : meta.pulseSequence || '';\n\n  if (typeof pulse !== 'string') {\n    return meta.dimension ? `${meta.dimension}d` : '';\n  }\n\n  pulse = pulse.toLowerCase();\n  if (\n    pulse.includes('zg') ||\n    pulse.includes('single_pulse_dec') ||\n    pulse.includes('udeft')\n  ) {\n    return '1d';\n  }\n\n  if (\n    pulse.includes('hsqct') ||\n    (pulse.includes('invi') && (pulse.includes('ml') || pulse.includes('di')))\n  ) {\n    return 'hsqctocsy';\n  }\n\n  if (pulse.includes('hsqc') || pulse.includes('invi')) {\n    return 'hsqc';\n  }\n\n  if (\n    pulse.includes('hmbc') ||\n    (pulse.includes('inv4') && pulse.includes('lp'))\n  ) {\n    return 'hmbc';\n  }\n\n  if (pulse.includes('hmqc')) {\n    return 'hmqc';\n  }\n\n  if (pulse.includes('cosy')) {\n    return 'cosy';\n  }\n\n  if (pulse.includes('jres')) {\n    return 'jres';\n  }\n\n  if (\n    pulse.includes('tocsy') ||\n    pulse.includes('mlev') ||\n    pulse.includes('dipsi')\n  ) {\n    return 'tocsy';\n  }\n\n  if (pulse.includes('noesy')) {\n    return 'noesy';\n  }\n\n  if (pulse.includes('roesy')) {\n    return 'roesy';\n  }\n\n  if (pulse.includes('dept')) {\n    return 'dept';\n  }\n\n  if (pulse.includes('jmod') || pulse.includes('apt')) {\n    return 'aptjmod';\n  }\n\n  if (pulse.includes('inad')) {\n    return 'inadequate';\n  }\n\n  if (pulse.includes('adeq')) {\n    return 'adequate';\n  }\n\n  return meta.dimension ? `${meta.dimension}d` : '';\n}\n","import { gyromagneticRatio } from 'nmr-processing';\n\nimport { getDigitalFilterParameters } from './getDigitalFilterParameters';\nimport { getNucleusFromMetadata } from './getNucleusFromMetadata';\nimport { getSpectrumType } from './getSpectrumType';\n\nexport function getInfoFromJCAMP(metaData, options = {}) {\n  const { subfix = '' } = options;\n  const info = {\n    dimension: 0,\n    nucleus: [],\n    isFid: false,\n    isFt: false,\n    isComplex: false,\n  };\n  let metadataString = JSON.stringify(metaData);\n  const separator = metadataString.match('\\r\\n') ? '\\r\\n' : '\\n';\n\n  let { JCAMPDX: jcampdx = '', ORIGIN: origin = '' } = metaData;\n  let creator = String(jcampdx).toLowerCase() + origin.toLowerCase();\n\n  if (creator.includes('mestre') || creator.includes('nova')) {\n    creator = 'mnova';\n  }\n\n  if (creator === 'mnova') {\n    if (metaData.LONGDATE) {\n      info.date = metaData.LONGDATE;\n    }\n  }\n\n  info.nucleus = getNucleusFromMetadata(metaData, info, subfix);\n  info.dimension = info.nucleus.length;\n\n  maybeAdd(info, 'title', metaData.TITLE);\n  maybeAdd(info, 'solvent', metaData['.SOLVENTNAME']);\n  maybeAdd(info, 'temperature', metaData[`${subfix}TE`] || metaData['.TE']);\n  maybeAdd(info, 'type', metaData.DATATYPE);\n\n  if (info.type) {\n    let typeLowerCase = info.type[0].toUpperCase();\n    if (typeLowerCase.indexOf('FID') >= 0) {\n      info.isFid = true;\n      info.isComplex = true;\n    } else if (typeLowerCase.indexOf('SPECTRUM') >= 0) {\n      info.isFt = true;\n      info.isComplex = true;\n    }\n  }\n\n  maybeAdd(\n    info,\n    'pulseSequence',\n    metaData['.PULSESEQUENCE'] ||\n      metaData['.PULPROG'] ||\n      metaData[`${subfix}PULPROG`],\n  );\n  maybeAdd(info, 'experiment', getSpectrumType(info, metaData, { subfix }));\n\n  maybeAddNumber(info, 'originFrequency', metaData['.OBSERVEFREQUENCY']);\n  if (creator !== 'mnova' && creator !== 'mestre') {\n    const gyromagneticRatioConst = gyromagneticRatio[info.nucleus[0]];\n    maybeAdd(info, 'probeName', metaData[`${subfix}PROBHD`]);\n    maybeAdd(info, 'originFrequency', metaData[`${subfix}SFO1`]);\n    maybeAdd(info, 'baseFrequency', metaData[`${subfix}BF1`]);\n    if (!('baseFrequency' in info) && 'originFrequency' in info) {\n      maybeAdd(info, 'baseFrequency', info.originFrequency);\n    }\n\n    if (!['baseFrequency', 'originFrequency'].some((e) => !info[e])) {\n      const { baseFrequency, originFrequency } = info;\n      let fieldStrength =\n        2 * Math.PI * (baseFrequency[0] / gyromagneticRatioConst) * 1e6;\n\n      let frequencyOffset = baseFrequency.map(\n        (bf, i) => (originFrequency[i] - bf) * 1e6,\n      );\n\n      maybeAdd(info, 'fieldStrength', fieldStrength);\n      maybeAdd(info, 'frequencyOffset', frequencyOffset);\n    }\n    maybeAddNumber(info, 'spectralWidth', metaData[`${subfix}SW`]);\n    maybeAddNumber(\n      info,\n      'spectralWidth',\n      metaData[`${subfix}QM_SPECTRAL_WIDTH`],\n    );\n\n    maybeAdd(info, 'numberOfPoints', metaData[`${subfix}TD`]);\n\n    const numberOfPoints = info.numberOfPoints;\n\n    maybeAdd(info, 'sampleName', metaData[`${subfix}NAME`]);\n\n    if (metaData[`${subfix}FNTYPE`] !== undefined) {\n      maybeAdd(\n        info,\n        'acquisitionMode',\n        parseInt(metaData[`${subfix}FNTYPE`], 10),\n      );\n    }\n    let varName = metaData[`${subfix}VARNAME`]\n      ? metaData[`${subfix}VARNAME`].split(',')[0]\n      : '';\n    if (varName === 'TIME') {\n      let value =\n        typeof metaData.LAST === 'string' || metaData.LAST instanceof String\n          ? metaData.LAST.replace(' ', '').split(',')[0]\n          : metaData.LAST;\n      maybeAddNumber(info, 'acquisitionTime', value);\n    }\n\n    if (!info.acquisitionTime) {\n      if (!['numberOfPoints', 'spectralWidth'].some((e) => !info[e])) {\n        const { spectralWidth, originFrequency } = info;\n        maybeAdd(\n          info,\n          'acquisitionTime',\n          Number(\n            (numberOfPoints[0] - 1) /\n              (2 * spectralWidth[0] * originFrequency[0]),\n          ),\n        );\n      }\n    }\n\n    if (metaData[`${subfix}P`]) {\n      let pulseStrength =\n        1e6 / (metaData[`${subfix}P`].split(separator)[1].split(' ')[1] * 4);\n      maybeAdd(info, 'pulseStrength90', pulseStrength);\n    }\n    if (metaData[`${subfix}D`]) {\n      let relaxationTime = metaData[`${subfix}D`]\n        .split(separator)[1]\n        .split(' ')[1];\n      maybeAddNumber(info, 'relaxationTime', relaxationTime);\n    }\n\n    maybeAddNumber(info, 'numberOfScans', metaData[`${subfix}NS`]);\n    maybeAddNumber(info, 'numberOfScans', metaData[`${subfix}QM_NSCANS`]);\n\n    let increment;\n    if (!['numberOfPoints', 'spectralWidth'].some((e) => !info[e])) {\n      const { spectralWidth, numberOfPoints } = info;\n      if (info.isFid) {\n        maybeAdd(info, 'groupDelay', metaData[`${subfix}GRPDLY`] || 0);\n        maybeAdd(info, 'DSPFVS', metaData[`${subfix}DSPFVS`]);\n        maybeAdd(info, 'DECIM', metaData[`${subfix}DECIM`]);\n\n        if (!['groupDelay', 'DSPFVS', 'DECIM'].some((e) => !info[e])) {\n          let { groupDelay, DSPFVS, DECIM } = info;\n          let digitalFilterParameters = getDigitalFilterParameters(\n            groupDelay[0],\n            DSPFVS[0],\n            DECIM[0],\n          );\n          maybeAdd(info, 'digitalFilter', digitalFilterParameters);\n        }\n\n        increment = numberOfPoints.map((nb) => {\n          return info.acquisitionTime[0] / (nb - 1);\n        });\n      } else {\n        increment = numberOfPoints.map((nb, i) => {\n          return spectralWidth[i] / (nb - 1);\n        });\n      }\n    }\n\n    maybeAdd(info, 'increment', increment);\n    if (metaData[`${subfix}DATE`]) {\n      info.date = new Date(\n        parseInt(metaData[`${subfix}DATE`], 10) * 1000,\n      ).toISOString();\n    }\n\n    if (!info.solvent) {\n      maybeAdd(\n        info,\n        'solvent',\n        Array.isArray(metaData[`${subfix}SOLVENT`])\n          ? metaData[`${subfix}SOLVENT`][0]\n          : metaData[`${subfix}SOLVENT`],\n      );\n    }\n  }\n\n  if (metaData.SYMBOL) {\n    let symbols = metaData.SYMBOL.split(/[, ]+/);\n    if (symbols.includes('R') && symbols.includes('I')) {\n      info.isComplex = true;\n    }\n  }\n\n  for (let key in info) {\n    if (info[key].length === 1) info[key] = info[key][0];\n  }\n\n  if (!Array.isArray(info.nucleus)) info.nucleus = [info.nucleus];\n\n  return info;\n}\n\nfunction maybeAddNumber(obj, name, value) {\n  if (value === undefined) return;\n  if (typeof value === 'string') {\n    value = Number(value.replace(/\\$.*/, ''));\n  }\n  maybeAdd(obj, name, value);\n}\n\nfunction maybeAdd(obj, name, value) {\n  if (value === undefined) return;\n  if (Array.isArray(value)) {\n    obj[name] = value.map(cleanValue);\n  } else {\n    obj[name] = [cleanValue(value)];\n  }\n}\n\nfunction cleanValue(value) {\n  if (typeof value === 'string') {\n    if (value.startsWith('<') && value.endsWith('>')) {\n      value = value.substring(1, value.length - 1);\n    }\n    value = value.trim();\n  }\n  return value;\n}\n","import { convertFileCollection } from 'brukerconverter';\n\nimport packageJson from '../package.json';\n\nimport { convertToFloatArray } from './utils/convertToFloatArray';\nimport { getInfoFromJCAMP } from './utils/getInfoFromJCAMP';\n\n/**\n * convert/export all the file with a Bruker structure like. It is a wrapper of brukerconverter\n * the same options you can pass.\n */\n\nconst defaultOptions = {\n  converter: {\n    xy: true,\n    noContour: true,\n    keepRecordsRegExp: /.*/,\n    profiling: true,\n  },\n};\n\nexport async function fromBruker(fileCollection, options = {}) {\n  let parseData = await convertFileCollection(fileCollection, {\n    ...defaultOptions,\n    ...options,\n  });\n  let dataStructure = [];\n  for (let entry of parseData) {\n    let metadata = { ...entry.info, ...entry.meta };\n    let info = getInfoFromJCAMP(metadata);\n\n    let dimensions = [];\n    let dependentVariables = [];\n\n    let dependentVariable = {};\n\n    if (info.dimension === 1) {\n      dependentVariable.components = entry.spectra;\n    } else if (info.dimension === 2) {\n      entry.minMax.z = convertToFloatArray(entry.minMax.z);\n      dependentVariable.components = entry.minMax;\n    }\n\n    let dimension = {\n      increment: info.increment,\n      numberOfPoints: info.numberOfPoints,\n    };\n\n    if (info.fid) {\n      dimension.coordinatesOffset = {\n        magnitude: -info.digitalFilter * info.increment,\n        units: 'second',\n      };\n    } else {\n      dimension.coordinatesOffset = {\n        magnitude:\n          info.frequencyOffset / info.baseFrequency - 0.5 * info.spectraWidth,\n        units: 'ppm',\n      };\n    }\n\n    dimensions.push(dimension);\n    dependentVariables.push(dependentVariable);\n\n    const { source } = entry;\n\n    dataStructure.push({\n      dimensions,\n      dependentVariables,\n      source,\n      info,\n      meta: metadata,\n      timeStamp: new Date().valueOf(),\n      version: packageJson.version,\n    });\n  }\n  return dataStructure;\n}\n","import { convert } from 'jcampconverter';\n\nimport packageJson from '../package.json';\n\nimport { convertToFloatArray } from './utils/convertToFloatArray';\nimport { getInfoFromJCAMP } from './utils/getInfoFromJCAMP';\n\nconst expectedTypes = ['ndnmrspectrum', 'ndnmrfid', 'nmrspectrum', 'nmrfid'];\n\nexport function fromJCAMP(buffer, options = {}) {\n  const {\n    noContour = true,\n    xy = true,\n    keepRecordsRegExp = /.*/,\n    profiling = true,\n  } = options;\n\n  let parsedData = convert(buffer, {\n    noContour,\n    xy,\n    keepRecordsRegExp,\n    profiling,\n  });\n\n  let dataStructure = [];\n  let entries = parsedData.flatten;\n  for (let entry of entries) {\n    if (!isSpectraData(entry)) continue;\n    if ((entry.spectra && entry.spectra.length > 0) || entry.minMax) {\n      let metadata = { ...entry.info, ...entry.meta };\n      let info = getInfoFromJCAMP(metadata);\n\n      if (info.experiment === 'wobble_curve') continue;\n\n      let dimensions = [];\n      let dependentVariables = [];\n\n      let dependentVariable = {};\n      if (info.dimension === 1) {\n        for (let i = 0; i < entry.spectra.length; i++) {\n          let data = entry.spectra[i].data;\n          data = convertToFloatArray(data);\n        }\n        dependentVariable.components = entry.spectra;\n      } else if (info.dimension === 2) {\n        entry.minMax.z = convertToFloatArray(entry.minMax.z);\n        dependentVariable.components = entry.minMax;\n      }\n      let dimension = {\n        increment: info.increment,\n        numberOfPoints: info.numberOfPoints,\n      };\n\n      if (info.fid) {\n        dimension.coordinatesOffset = {\n          magnitude: -info.digitalFilter * info.increment,\n          units: 'second',\n        };\n      } else {\n        dimension.coordinatesOffset = {\n          magnitude:\n            info.frequencyOffset / info.baseFrequency - 0.5 * info.spectraWidth,\n          units: 'ppm',\n        };\n      }\n      dimensions.push(dimension);\n      dependentVariables.push(dependentVariable);\n\n      const data = {\n        dimensions,\n        dependentVariables,\n        info,\n        meta: metadata,\n        timeStamp: new Date().valueOf(),\n        version: packageJson.version,\n      };\n\n      dataStructure.push(data);\n    }\n  }\n\n  return dataStructure;\n}\n\nfunction isSpectraData(entry) {\n  const { dataType = '', dataClass = '' } = entry;\n\n  const inputDataType = dataType.replace(/\\s/g, '').toLowerCase();\n  const inputDataClass = dataClass.replace(/\\s/g, '').toLowerCase();\n  return (\n    expectedTypes.some((type) => type === inputDataType) &&\n    inputDataClass !== 'peak table'\n  );\n}\n","import { fromBruker } from './fromBruker';\nimport { fromJCAMP } from './fromJCAMP';\nimport { fromJEOL } from './fromJEOL';\n\nexport async function read(fileCollection, options = {}) {\n  const {\n    bruker: BrukerOptions = {},\n    jcamp: jcampOptions = {},\n    jeol: jeolOptions = {},\n  } = options;\n\n  const result = await fromBruker(fileCollection, BrukerOptions);\n  for (const file of fileCollection) {\n    const extension = getFileExtension(file.name);\n    let processed = [];\n    if (extension === 'jdf') {\n      processed = fromJEOL(await file.arrayBuffer(), jeolOptions);\n    } else if (extension.match(/dx/) || extension === 'jcamp') {\n      processed = fromJCAMP(await file.arrayBuffer(), jcampOptions);\n    }\n\n    if (processed.length > 0) result.push(...processed);\n  }\n  return result;\n}\n\nfunction getFileExtension(name) {\n  return name.replace(/^.*\\./, '').toLowerCase();\n}\n"],"names":["toString","Object","prototype","isAnyArray","value","call","endsWith","numericTypeTable","quantityTypeTable","formatDependentVariable","data","numericType","components","options","arguments","length","undefined","quantityType","encoding","name","unit","quantityName","componentLabels","sparseSampling","from","to","Error","keys","fromReIm","type","description","application","dataLength","reIm","re","im","setLengthComplex","component","Float64Array","i","idx","push","setLength","j","formatLinearDimension","label","count","increment","String","Number","coordinatesOffset","originOffset","reciprocal","period","complexFFT","decode","bytes","decoder","TextDecoder","encoder","TextEncoder","IOBuffer","constructor","dataIsGiven","ArrayBuffer","this","lastWrittenByte","byteLength","offset","dvOffset","isView","buffer","byteOffset","littleEndian","_data","DataView","_mark","_marks","available","isLittleEndian","setLittleEndian","isBigEndian","setBigEndian","skip","n","back","seek","mark","reset","pushMark","popMark","pop","rewind","ensureAvailable","newLength","newArray","Uint8Array","set","readBoolean","readUint8","readInt8","getInt8","getUint8","readByte","readBytes","readInt16","getInt16","readUint16","getUint16","readInt32","getInt32","readUint32","getUint32","readFloat32","getFloat32","readFloat64","getFloat64","readBigInt64","getBigInt64","readBigUint64","getBigUint64","readChar","fromCharCode","readChars","result","readUtf8","decodeText","writeBoolean","writeUint8","writeInt8","setInt8","_updateLastWrittenByte","setUint8","writeByte","writeBytes","writeInt16","setInt16","writeUint16","setUint16","writeInt32","setInt32","writeUint32","setUint32","writeFloat32","setFloat32","writeFloat64","setFloat64","writeBigInt64","setBigInt64","writeBigUint64","setBigUint64","writeChar","str","charCodeAt","writeChars","writeUtf8","encode","toArray","endianness","instrumentTable","dataTypeTable","dataFormatTable","dataAxisTypeTable","prefixTable","unitPrefixTable","Yotta","Exa","Zetta","Pecta","Tera","Giga","Mega","Kilo","None","Milli","Micro","Nano","Pico","Femto","Atto","Zepto","baseTable","dataAxisRangedTable","valueTypeTable","getPar","param","searchStr","paramArray","find","o","getMagnitude","par","magnitude","base","unitMult","table","prefix","getUnit","size","byte","power","getString","string","char","join","getParamName","getArray","format","double","parseJEOL","ioBuffer","header","byteArray","fileIdentifier","endian","majorVersion","minorVersion","dataDimensionNumber","dataDimensionExist","split","map","x","Boolean","dataType","dataFormat","dataInstrument","translate","dataAxisType","dataUnits","title","dataAxisRanged","dataPoints","dataOffsetStart","dataOffsetStop","dataAxisStart","dataAxisStop","year","month","day","creationTime","revisionTime","nodeName","site","author","comment","dataAxisTitles","baseFreq","zeroPoint","reversed","annotationOK","historyUsed","historyLength","paramStart","paramLength","ListStart","ListLength","dataStart","contextStart","contextLength","annoteStart","annoteLength","totalSize","unitLocation","compoundUnit","scaler","parameters","parameterSize","lowIndex","highIndex","p","valueType","Real","Imag","toLowerCase","dataSectionCount","realComplex","s","section","me","dim1","I","J","row","k","concat","nucleus","acquisitionTime","spectralWidth","spectralWidthClipped","resolution","originFrequency","frequencyOffset","digest","info","sampleName","solvent","temperature","probeName","fieldStrength","experiment","dimension","pulseStrength90","numberOfScans","relaxationTime","slice","dataSections","decimationRate","paramList","JSON","stringify","headers","digitalFilter","orders","e","factors","sweep","acqTime","nbPoints","some","parseInt","jump","arg","factorNumber","Int8Array","offsetO","offsetF","productorial","getDigitalFilter","gyromagneticRatio","a","d","f","g","h","c","b","_ref","module","exports","window","median","matrixMinMaxZ","matrix","RangeError","firstLength","matrixCheck","nbRows","nbColumns","min","max","column","createStepArray","step","array","index","ensureString","blob","guessEncoding","TypeError","uint8","buf","len","isutf8","toKeyValue","object","newObject","key","fromJEOL","parsedData","newInfo","date","gyromagneticRatioConstants","baseFrequency","gmr","Math","PI","pulseSequence","isComplex","includes","isFid","isFt","numberOfPoints","sw","dimensions","origin","firstPoint","dependentVariables","metadata","timeStamp","Date","now","version","packageJson","tags","groupByExperiments","fileList","processingNumber","experimentNumber","ignoreFID","ignoreFT","ignore1D","ignore2D","onlyFirstProcessedData","experiments","file","currentProcessingNo","currentExperimentNo","id","parts","relativePath","match","expno","processedData","is2D","isFT","is1D","isFID","newProcessedData","firstProcessedNumber","sort","experimentsArray","processed","ser","fid","firstProcessed","procs","proc2s","processedKey","oneProcessed","acqus","acqu2s","filter","item","joinInfoMeta","target","toAppend","meta","Array","isArray","parseString","lowercase","number","isNaN","GC_MS_FIELDS","complexChromatogram","spectra","chromatogram","times","series","ms","existingGCMSFields","convertMSFieldToLabel","spectrum","pageValue","y","isMSField","canonicDataLabel","indexOf","replace","convertToFloatArray","stringArray","floatArray","fastParseXYData","yFactor","deltaX","isXYdata","currentData","ascii","currentX","firstX","currentY","firstY","endLine","newLine","isDifference","isLastDifference","lastDifference","isDuplicate","inComment","currentValue","lastValue","isNegative","inValue","skipFirstValue","decimalPosition","pow","duplicate","ascii2","removeCommentRegExp","peakTableSplitRegExp","parsePeakTable","isPeaktable","variables","numberOfVariables","forEach","variable","lines","values","trim","logs","parseXYZ","xFactor","parseXY","parseXYA","removeSymbolRegExp","isXYAdata","input","quickSelectMedian","add2D","zData","minZ","maxZ","ySize","xSize","z","lastX","lastY","reverse","medians","getMedian","minX","maxX","minY","maxY","noise","convertTo3DZ","noContour","contourLines","povarHeight0","povarHeight1","povarHeight2","povarHeight3","isOver0","isOver1","isOver2","isOver3","pAx","pAy","pBx","pBy","lineZValue","nbSubSpectra","nbPovars","x0","dx","y0","dy","iter","nbContourLevels","contourLevels","level","contourLevel","side","factor","noiseMultiplier","exp","zValue","iSubSpectra","subSpectra","subSpectraAfter","povar","segments","generateContourLines","minMax","profiling","action","time","start","simpleChromatogram","intensity","postProcessing","entriesFlat","entry","observeFrequency","shiftOffsetVal","ntuples","symbol","xUnits","toUpperCase","shift","startsWith","tmp","$NUC2","f2index","$NUC1","yType","pageSymbolIndex","pageSymbol","units","ratio0","ratio1","ratio","postProcessingNMR","newNtuples","twoD","wantXY","keepSpectra","prepareNtuplesDatatable","currentEntry","kind","xIndex","yIndex","firstVariable","secondVariable","charAt","lowerCaseSymbol","first","last","vardim","varname","yUnits","prepareSpectrum","ntuplesSeparatorRegExp","defaultOptions","keepRecordsRegExp","canonicDataLabels","canonicMetadataLabels","dynamicTyping","withoutXY","convert","jcamp","entries","tmpResult","children","parentsStack","ldrs","ldr","position","dataLabel","substring","dataValue","infos","datatable","parentEntry","dataClass","xType","shiftOffsetNum","vartype","varform","page","sampleDescription","flatten","async","parseData","text","convertJcamp","setFIDSpectrumData","td","TD","arrayBuffer","SW_H","SW_h","SF","SFO1","DATATYPE","DW","AQ","BYTORDA","stopReading","toSave","dataTable","NUC1","xUnit","yUnit","TITLE","setXYSpectrumData","ioBufferReal","ioBufferImaginary","getDirectParameter","SI","swP","SW_p","sf","bf","OFFSET","brukerReference","BYTORDP","convert1D","files","mergeMetadata","main","complement","convert2D","xOffset","yOffset","SW","xWindowSize","yWindowSize","xTransmitterFrequency","yTransmitterFrequency","O1","deltaY","nuc1","AXNUC","axnuc","minMaxX","minMaxY","convertOneExperiment","brukerFiles","source","DATE","GRPDLY","DSPFVS","DECIM","convertFileCollection","fileCollection","converter","results","getDigitalFilterParameters","grpdly","dspfvs","decim","brukerDspTable","dspfvsList","getNucleusFromMetadata","metaData","subfix","checkForNucleus","nuc","getNucleusFrom2DExperiment","beforeLength","getSpectrumType","spectyp","pulse","getInfoFromJCAMP","metadataString","separator","JCAMPDX","jcampdx","ORIGIN","creator","LONGDATE","maybeAdd","typeLowerCase","maybeAddNumber","gyromagneticRatioConst","LAST","pulseStrength","groupDelay","digitalFilterParameters","nb","toISOString","SYMBOL","symbols","obj","cleanValue","xy","fromBruker","dataStructure","dependentVariable","spectraWidth","valueOf","expectedTypes","fromJCAMP","isSpectraData","inputDataType","inputDataClass","getFileExtension","bruker","BrukerOptions","jcampOptions","jeol","jeolOptions","extension"],"mappings":"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"}