{"version":3,"file":"pellet-hardness.min.js","sources":["../node_modules/ml-array-median/node_modules/is-any-array/lib-esm/index.js","../node_modules/median-quickselect/lib/median-quickselect.min.js","../node_modules/ml-array-median/lib-es6/index.js","../node_modules/is-any-array/src/index.js","../node_modules/common-spectrum/node_modules/ml-spectra-processing/src/x/xAdd.js","../node_modules/common-spectrum/node_modules/ml-spectra-processing/src/x/xMultiply.js","../node_modules/common-spectrum/node_modules/ml-spectra-processing/src/x/xDivide.js","../node_modules/ml-array-sequential-fill/node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-sequential-fill/lib-es6/index.js","../node_modules/common-spectrum/node_modules/ml-spectra-processing/src/x/xIsMonotone.js","../node_modules/ml-array-variance/node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-sum/node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-sum/lib-es6/index.js","../node_modules/ml-array-mean/lib-es6/index.js","../node_modules/ml-array-variance/lib-es6/index.js","../node_modules/ml-array-standard-deviation/lib-es6/index.js","../node_modules/ml-array-min/node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-max/node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/common-spectrum/node_modules/ml-spectra-processing/src/x/xSubtract.js","../node_modules/common-spectrum/node_modules/ml-spectra-processing/src/xy/xyCheck.js","../node_modules/common-spectrum/node_modules/ml-spectra-processing/src/xy/xyEnsureGrowingX.js","../node_modules/common-spectrum/node_modules/ml-spectra-processing/src/xy/xyFilterXPositive.js","../node_modules/ml-matrix/node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-rescale/node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-matrix/src/inspect.js","../node_modules/ml-matrix/src/util.js","../node_modules/ml-matrix/src/matrix.js","../node_modules/ml-matrix/src/stat.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/ml-matrix/src/views/base.js","../node_modules/ml-matrix/src/views/transpose.js","../node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","../node_modules/ml-matrix/src/dc/lu.js","../node_modules/ml-matrix/src/dc/util.js","../node_modules/ml-matrix/src/dc/qr.js","../node_modules/ml-matrix/src/dc/svd.js","../node_modules/ml-matrix/src/decompositions.js","../node_modules/common-spectrum/lib-esm/jsgraph/addStyle.js","../node_modules/common-spectrum/lib-esm/jsgraph/colors.js","../node_modules/common-spectrum/lib-esm/util/appendDistinctParameter.js","../node_modules/common-spectrum/lib-esm/util/appendDistinctValue.js","../node_modules/ml-airpls/src/choleskySolver.js","../node_modules/cuthill-mckee/cuthill-mckee.js","../node_modules/ml-airpls/src/utils.js","../node_modules/ml-airpls/src/index.js","../node_modules/baselines/src/airPLS.js","../node_modules/ml-regression-base/node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-regression-base/src/maybeToPrecision.js","../node_modules/ml-regression-base/src/index.js","../node_modules/ml-regression-polynomial/src/index.js","../node_modules/ml-regression-base/src/checkArrayLength.js","../node_modules/ml-baseline-correction-regression/src/index.js","../node_modules/baselines/src/iterativePolynomial.js","../node_modules/baselines/node_modules/is-any-array/lib-esm/index.js","../node_modules/baselines/node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/baselines/node_modules/ml-spectra-processing/lib-esm/x/xPadding.js","../node_modules/baselines/node_modules/ml-spectra-processing/lib-esm/x/xRolling.js","../node_modules/baselines/node_modules/ml-spectra-processing/lib-esm/x/xRollingAverage.js","../node_modules/baselines/node_modules/ml-spectra-processing/lib-esm/x/xRollingMedian.js","../node_modules/baselines/src/rollingAverage.js","../node_modules/ml-rolling-ball-baseline/src/rollingBall.js","../node_modules/baselines/src/rollingBall.js","../node_modules/baselines/src/rollingMedian.js","../node_modules/ml-array-normed/node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-normed/lib-es6/index.js","../node_modules/ml-zones/src/normalize.js","../node_modules/ml-zones/src/invert.js","../node_modules/ml-zones/src/zonesWithPoints.js","../node_modules/ml-array-xy-equally-spaced/src/integral.js","../node_modules/ml-array-xy-equally-spaced/src/index.js","../node_modules/ml-array-xy-equally-spaced/src/equallySpacedSlot.js","../node_modules/ml-array-xy-equally-spaced/src/equallySpacedSmooth.js","../node_modules/ml-array-xy-filter-x/src/getZones.js","../node_modules/ml-array-xy-filter-x/src/index.js","../node_modules/ml-pad-array/src/index.js","../node_modules/ml-savitzky-golay/lib-esm/index.js","../node_modules/ml-stat/array.js","../node_modules/js-quantities/build/quantities.js","../node_modules/common-spectrum/lib-esm/util/convertUnit.js","../node_modules/common-spectrum/lib-esm/util/ensureRegexp.js","../node_modules/common-spectrum/lib-esm/util/getConvertedVariable.js","../node_modules/common-spectrum/lib-esm/util/getXYSpectrum.js","../node_modules/common-spectrum/lib-esm/Analysis.js","../node_modules/common-spectrum/lib-esm/util/getNormalizedSpectrum.js","../node_modules/jcampconverter/node_modules/ensure-string/lib-esm/index.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/jcampconverter/lib-esm/2d/add2D.js","../node_modules/jcampconverter/lib-esm/2d/convertTo3DZ.js","../node_modules/jcampconverter/lib-esm/2d/generateContourLines.js","../node_modules/nmr-processing/lib-esm/constants/gyromagneticRatio.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/common-spectrum/lib-esm/from/fromJcamp.js","../node_modules/convert-to-jcamp/src/creatorNtuples.js","../node_modules/convert-to-jcamp/src/utils/getNumber.js","../node_modules/convert-to-jcamp/src/utils/peakTableCreator.js","../node_modules/convert-to-jcamp/src/utils/xyDataCreator.js","../node_modules/convert-to-jcamp/src/fromJSON.js","../node_modules/common-spectrum/lib-esm/to/toJcamps.js","../node_modules/convert-to-jcamp/src/fromVariables.js","../node_modules/common-spectrum/lib-esm/index.js","../node_modules/common-spectrum/lib-esm/jsgraph/getJSGraph.js","../node_modules/common-spectrum/lib-esm/jsgraph/getNormalizationAnnotations.js","../node_modules/physical-chemistry-parser/node_modules/ensure-string/lib-esm/index.js","../node_modules/physical-chemistry-parser/src/pelletHardness/hitec/pelletHardnessParseHitec.js","../node_modules/physical-chemistry-parser/src/pelletHardness/hitec/utils/parseDT0.js","../node_modules/physical-chemistry-parser/src/pelletHardness/hitec/utils/parseRes.js","../node_modules/common-spectrum/lib-esm/AnalysesManager.js","../src/from/fromHitec.js","../node_modules/common-spectrum/lib-esm/to/toJcamp.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","(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 { 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","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isAnyArray from 'is-any-array';\n\n/**\n * This function xAdd the first array by the second array or a constant value to each element of the first array\n * @param {Array<Number>} array1 - the array that will be rotated\n * @param {Array|Number} array2\n * @return {Array}\n */\nexport function xAdd(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (isAnyArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] + constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] + array2[i];\n    }\n  }\n\n  return array3;\n}\n","import isAnyArray from 'is-any-array';\n/**\n * This function xMultiply the first array by the second array or a constant value to each element of the first array\n * @param {Array} array1 - the array that will be rotated\n * @param {Array|Number} array2\n * @return {Float64Array}\n */\nexport function xMultiply(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (isAnyArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Float64Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] * constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] * array2[i];\n    }\n  }\n\n  return array3;\n}\n","import isAnyArray from 'is-any-array';\n\n/**\n * This function divide the first array by the second array or a constant value to each element of the first array\n * @param {Array<Number>} array1 - the array that will be rotated\n * @param {Array<Number>|Number} array2\n * @return {Array}\n */\nexport function xDivide(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (isAnyArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] / constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] / array2[i];\n    }\n  }\n\n  return array3;\n}\n","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","import { isAnyArray } from 'is-any-array';\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\n/**\n * Fill an array with sequential numbers\n * @param {Array<number>} [input] - optional destination array (if not provided a new array will be created)\n * @param {object} [options={}]\n * @param {number} [options.from=0] - first value in the array\n * @param {number} [options.to=10] - last value in the array\n * @param {number} [options.size=input.length] - size of the array (if not provided calculated from step)\n * @param {number} [options.step] - if not provided calculated from size\n * @return {Array<number>}\n */\n\nfunction sequentialFill() {\n  var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (_typeof(input) === 'object' && !isAnyArray(input)) {\n    options = input;\n    input = [];\n  }\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  var _options = options,\n      _options$from = _options.from,\n      from = _options$from === void 0 ? 0 : _options$from,\n      _options$to = _options.to,\n      to = _options$to === void 0 ? 10 : _options$to,\n      _options$size = _options.size,\n      size = _options$size === void 0 ? input.length : _options$size,\n      step = _options.step;\n\n  if (size !== 0 && step) {\n    throw new Error('step is defined by the array size');\n  }\n\n  if (!size) {\n    if (step) {\n      size = Math.floor((to - from) / step) + 1;\n    } else {\n      size = to - from + 1;\n    }\n  }\n\n  if (!step && size) {\n    step = (to - from) / (size - 1);\n  }\n\n  if (Array.isArray(input)) {\n    // only works with normal array\n    input.length = 0;\n\n    for (var i = 0; i < size; i++) {\n      input.push(from);\n      from += step;\n    }\n  } else {\n    if (input.length !== size) {\n      throw new Error('sequentialFill typed array must have the correct length');\n    }\n\n    for (var _i = 0; _i < size; _i++) {\n      input[_i] = from;\n      from += step;\n    }\n  }\n\n  return input;\n}\n\nexport { sequentialFill as default };\n","/**\n * Returns true if x is monotone\n * @param {Array} array\n * @return {boolean}\n */\nexport function xIsMonotone(array) {\n  if (array.length <= 2) {\n    return true;\n  }\n  if (array[0] === array[1]) {\n    // maybe a constant series\n    for (let i = 1; i < array.length - 1; i++) {\n      if (array[i] !== array[i + 1]) return false;\n    }\n    return true;\n  }\n\n  if (array[0] < array[array.length - 1]) {\n    for (let i = 0; i < array.length - 1; i++) {\n      if (array[i] >= array[i + 1]) return false;\n    }\n  } else {\n    for (let i = 0; i < array.length - 1; i++) {\n      if (array[i] <= array[i + 1]) return false;\n    }\n  }\n  return true;\n}\n","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","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","import { isAnyArray } from 'is-any-array';\n\nfunction sum(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  var sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += input[i];\n  }\n\n  return sumValue;\n}\n\nexport { sum as default };\n","import sum from 'ml-array-sum';\n\nfunction mean(input) {\n  return sum(input) / input.length;\n}\n\nexport { mean as default };\n","import { isAnyArray } from 'is-any-array';\nimport arrayMean from 'ml-array-mean';\n\nfunction variance(values) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(values)) {\n    throw new TypeError('input must be an array');\n  }\n\n  var _options$unbiased = options.unbiased,\n      unbiased = _options$unbiased === void 0 ? true : _options$unbiased,\n      _options$mean = options.mean,\n      mean = _options$mean === void 0 ? arrayMean(values) : _options$mean;\n  var sqrError = 0;\n\n  for (var i = 0; i < values.length; i++) {\n    var x = values[i] - mean;\n    sqrError += x * x;\n  }\n\n  if (unbiased) {\n    return sqrError / (values.length - 1);\n  } else {\n    return sqrError / values.length;\n  }\n}\n\nexport { variance as default };\n","import variance from 'ml-array-variance';\n\nfunction standardDeviation(values) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  return Math.sqrt(variance(values, options));\n}\n\nexport { standardDeviation as default };\n","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","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\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  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","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","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\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  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","import isAnyArray from 'is-any-array';\n/**\n * This function xSubtract the first array by the second array or a constant value from each element of the first array\n * @param {Array} array1 - the array that will be rotated\n * @param {Array|Number} array2\n * @return {Array}\n */\nexport function xSubtract(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (isAnyArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] - constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] - array2[i];\n    }\n  }\n\n  return array3;\n}\n","import isAnyArray from 'is-any-array';\n\n/**\n * Throw an error in no an object of x,y arrays\n * @param {DataXY} [data={}]\n */\nexport function xyCheck(data = {}) {\n  if (!isAnyArray(data.x) || !isAnyArray(data.y)) {\n    throw new Error('Data must be an object of x and y arrays');\n  }\n  if (data.x.length !== data.y.length) {\n    throw new Error('The x and y arrays mush have the same length');\n  }\n}\n","import { xyCheck } from './xyCheck';\n\n/**\n * Filters x,y values to allow strictly growing values in x axis.\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @return {DataXY}\n */\nexport function xyEnsureGrowingX(data = {}) {\n  xyCheck(data);\n  const x = Array.from(data.x);\n  const y = Array.from(data.y);\n  let prevX = -Infinity;\n  let ansX = [];\n  let ansY = [];\n\n  for (let index = 0; index < x.length; index++) {\n    if (prevX < x[index]) {\n      ansX.push(x[index]);\n      ansY.push(y[index]);\n      prevX = x[index];\n    }\n  }\n  return { x: ansX, y: ansY };\n}\n","import { xyCheck } from './xyCheck';\n/**\n * Filter out all the points for which x <= 0. Useful to display log scale data\n * @param {DataXY} [data={}]\n * @return {{x:[],y:[]}} An object with the filtered data\n */\n\nexport function xyFilterXPositive(data = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  const newX = [];\n  const newY = [];\n  for (let i = 0; i < x.length; i++) {\n    if (x[i] > 0) {\n      newX.push(x[i]);\n      newY.push(y[i]);\n    }\n  }\n\n  return { x: newX, y: newY };\n}\n","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","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","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.slice(eIndex);\n  return exponential.slice(0, maxNumSize - e.length) + e;\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkNonEmpty,\n  checkRowIndices,\n  checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (isAnyArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class BaseView extends AbstractMatrix {\n  constructor(matrix, rows, columns) {\n    super();\n    this.matrix = matrix;\n    this.rows = rows;\n    this.columns = columns;\n  }\n}\n","import BaseView from './base';\n\nexport default class MatrixTransposeView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.columns, matrix.rows);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(columnIndex, rowIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(columnIndex, rowIndex);\n  }\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n  constructor(data) {\n    super();\n    this.data = data;\n    this.rows = data.length;\n    this.columns = data[0].length;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n  constructor(matrix) {\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n    let lu = matrix.clone();\n    let rows = lu.rows;\n    let columns = lu.columns;\n    let pivotVector = new Float64Array(rows);\n    let pivotSign = 1;\n    let i, j, k, p, s, t, v;\n    let LUcolj, kmax;\n\n    for (i = 0; i < rows; i++) {\n      pivotVector[i] = i;\n    }\n\n    LUcolj = new Float64Array(rows);\n\n    for (j = 0; j < columns; j++) {\n      for (i = 0; i < rows; i++) {\n        LUcolj[i] = lu.get(i, j);\n      }\n\n      for (i = 0; i < rows; i++) {\n        kmax = Math.min(i, j);\n        s = 0;\n        for (k = 0; k < kmax; k++) {\n          s += lu.get(i, k) * LUcolj[k];\n        }\n        LUcolj[i] -= s;\n        lu.set(i, j, LUcolj[i]);\n      }\n\n      p = j;\n      for (i = j + 1; i < rows; i++) {\n        if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n          p = i;\n        }\n      }\n\n      if (p !== j) {\n        for (k = 0; k < columns; k++) {\n          t = lu.get(p, k);\n          lu.set(p, k, lu.get(j, k));\n          lu.set(j, k, t);\n        }\n\n        v = pivotVector[p];\n        pivotVector[p] = pivotVector[j];\n        pivotVector[j] = v;\n\n        pivotSign = -pivotSign;\n      }\n\n      if (j < rows && lu.get(j, j) !== 0) {\n        for (i = j + 1; i < rows; i++) {\n          lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n        }\n      }\n    }\n\n    this.LU = lu;\n    this.pivotVector = pivotVector;\n    this.pivotSign = pivotSign;\n  }\n\n  isSingular() {\n    let data = this.LU;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      if (data.get(j, j) === 0) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let lu = this.LU;\n    let rows = lu.rows;\n\n    if (rows !== value.rows) {\n      throw new Error('Invalid matrix dimensions');\n    }\n    if (this.isSingular()) {\n      throw new Error('LU matrix is singular');\n    }\n\n    let count = value.columns;\n    let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n    let columns = lu.columns;\n    let i, j, k;\n\n    for (k = 0; k < columns; k++) {\n      for (i = k + 1; i < columns; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    for (k = columns - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / lu.get(k, k));\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    return X;\n  }\n\n  get determinant() {\n    let data = this.LU;\n    if (!data.isSquare()) {\n      throw new Error('Matrix must be square');\n    }\n    let determinant = this.pivotSign;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      determinant *= data.get(j, j);\n    }\n    return determinant;\n  }\n\n  get lowerTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i > j) {\n          X.set(i, j, data.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, 1);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get upperTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i <= j) {\n          X.set(i, j, data.get(i, j));\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get pivotPermutationVector() {\n    return Array.from(this.pivotVector);\n  }\n}\n","export function hypotenuse(a, b) {\n  let r = 0;\n  if (Math.abs(a) > Math.abs(b)) {\n    r = b / a;\n    return Math.abs(a) * Math.sqrt(1 + r * r);\n  }\n  if (b !== 0) {\n    r = a / b;\n    return Math.abs(b) * Math.sqrt(1 + r * r);\n  }\n  return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let qr = value.clone();\n    let m = value.rows;\n    let n = value.columns;\n    let rdiag = new Float64Array(n);\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      let nrm = 0;\n      for (i = k; i < m; i++) {\n        nrm = hypotenuse(nrm, qr.get(i, k));\n      }\n      if (nrm !== 0) {\n        if (qr.get(k, k) < 0) {\n          nrm = -nrm;\n        }\n        for (i = k; i < m; i++) {\n          qr.set(i, k, qr.get(i, k) / nrm);\n        }\n        qr.set(k, k, qr.get(k, k) + 1);\n        for (j = k + 1; j < n; j++) {\n          s = 0;\n          for (i = k; i < m; i++) {\n            s += qr.get(i, k) * qr.get(i, j);\n          }\n          s = -s / qr.get(k, k);\n          for (i = k; i < m; i++) {\n            qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n      rdiag[k] = -nrm;\n    }\n\n    this.QR = qr;\n    this.Rdiag = rdiag;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let qr = this.QR;\n    let m = qr.rows;\n\n    if (value.rows !== m) {\n      throw new Error('Matrix row dimensions must agree');\n    }\n    if (!this.isFullRank()) {\n      throw new Error('Matrix is rank deficient');\n    }\n\n    let count = value.columns;\n    let X = value.clone();\n    let n = qr.columns;\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      for (j = 0; j < count; j++) {\n        s = 0;\n        for (i = k; i < m; i++) {\n          s += qr.get(i, k) * X.get(i, j);\n        }\n        s = -s / qr.get(k, k);\n        for (i = k; i < m; i++) {\n          X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n        }\n      }\n    }\n    for (k = n - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n        }\n      }\n    }\n\n    return X.subMatrix(0, n - 1, 0, count - 1);\n  }\n\n  isFullRank() {\n    let columns = this.QR.columns;\n    for (let i = 0; i < columns; i++) {\n      if (this.Rdiag[i] === 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  get upperTriangularMatrix() {\n    let qr = this.QR;\n    let n = qr.columns;\n    let X = new Matrix(n, n);\n    let i, j;\n    for (i = 0; i < n; i++) {\n      for (j = 0; j < n; j++) {\n        if (i < j) {\n          X.set(i, j, qr.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, this.Rdiag[i]);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get orthogonalMatrix() {\n    let qr = this.QR;\n    let rows = qr.rows;\n    let columns = qr.columns;\n    let X = new Matrix(rows, columns);\n    let i, j, k, s;\n\n    for (k = columns - 1; k >= 0; k--) {\n      for (i = 0; i < rows; i++) {\n        X.set(i, k, 0);\n      }\n      X.set(k, k, 1);\n      for (j = k; j < columns; j++) {\n        if (qr.get(k, k) !== 0) {\n          s = 0;\n          for (i = k; i < rows; i++) {\n            s += qr.get(i, k) * X.get(i, j);\n          }\n\n          s = -s / qr.get(k, k);\n\n          for (i = k; i < rows; i++) {\n            X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n    }\n    return X;\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n  constructor(value, options = {}) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    if (value.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let m = value.rows;\n    let n = value.columns;\n\n    const {\n      computeLeftSingularVectors = true,\n      computeRightSingularVectors = true,\n      autoTranspose = false,\n    } = options;\n\n    let wantu = Boolean(computeLeftSingularVectors);\n    let wantv = Boolean(computeRightSingularVectors);\n\n    let swapped = false;\n    let a;\n    if (m < n) {\n      if (!autoTranspose) {\n        a = value.clone();\n        // eslint-disable-next-line no-console\n        console.warn(\n          'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n        );\n      } else {\n        a = value.transpose();\n        m = a.rows;\n        n = a.columns;\n        swapped = true;\n        let aux = wantu;\n        wantu = wantv;\n        wantv = aux;\n      }\n    } else {\n      a = value.clone();\n    }\n\n    let nu = Math.min(m, n);\n    let ni = Math.min(m + 1, n);\n    let s = new Float64Array(ni);\n    let U = new Matrix(m, nu);\n    let V = new Matrix(n, n);\n\n    let e = new Float64Array(n);\n    let work = new Float64Array(m);\n\n    let si = new Float64Array(ni);\n    for (let i = 0; i < ni; i++) si[i] = i;\n\n    let nct = Math.min(m - 1, n);\n    let nrt = Math.max(0, Math.min(n - 2, m));\n    let mrc = Math.max(nct, nrt);\n\n    for (let k = 0; k < mrc; k++) {\n      if (k < nct) {\n        s[k] = 0;\n        for (let i = k; i < m; i++) {\n          s[k] = hypotenuse(s[k], a.get(i, k));\n        }\n        if (s[k] !== 0) {\n          if (a.get(k, k) < 0) {\n            s[k] = -s[k];\n          }\n          for (let i = k; i < m; i++) {\n            a.set(i, k, a.get(i, k) / s[k]);\n          }\n          a.set(k, k, a.get(k, k) + 1);\n        }\n        s[k] = -s[k];\n      }\n\n      for (let j = k + 1; j < n; j++) {\n        if (k < nct && s[k] !== 0) {\n          let t = 0;\n          for (let i = k; i < m; i++) {\n            t += a.get(i, k) * a.get(i, j);\n          }\n          t = -t / a.get(k, k);\n          for (let i = k; i < m; i++) {\n            a.set(i, j, a.get(i, j) + t * a.get(i, k));\n          }\n        }\n        e[j] = a.get(k, j);\n      }\n\n      if (wantu && k < nct) {\n        for (let i = k; i < m; i++) {\n          U.set(i, k, a.get(i, k));\n        }\n      }\n\n      if (k < nrt) {\n        e[k] = 0;\n        for (let i = k + 1; i < n; i++) {\n          e[k] = hypotenuse(e[k], e[i]);\n        }\n        if (e[k] !== 0) {\n          if (e[k + 1] < 0) {\n            e[k] = 0 - e[k];\n          }\n          for (let i = k + 1; i < n; i++) {\n            e[i] /= e[k];\n          }\n          e[k + 1] += 1;\n        }\n        e[k] = -e[k];\n        if (k + 1 < m && e[k] !== 0) {\n          for (let i = k + 1; i < m; i++) {\n            work[i] = 0;\n          }\n          for (let i = k + 1; i < m; i++) {\n            for (let j = k + 1; j < n; j++) {\n              work[i] += e[j] * a.get(i, j);\n            }\n          }\n          for (let j = k + 1; j < n; j++) {\n            let t = -e[j] / e[k + 1];\n            for (let i = k + 1; i < m; i++) {\n              a.set(i, j, a.get(i, j) + t * work[i]);\n            }\n          }\n        }\n        if (wantv) {\n          for (let i = k + 1; i < n; i++) {\n            V.set(i, k, e[i]);\n          }\n        }\n      }\n    }\n\n    let p = Math.min(n, m + 1);\n    if (nct < n) {\n      s[nct] = a.get(nct, nct);\n    }\n    if (m < p) {\n      s[p - 1] = 0;\n    }\n    if (nrt + 1 < p) {\n      e[nrt] = a.get(nrt, p - 1);\n    }\n    e[p - 1] = 0;\n\n    if (wantu) {\n      for (let j = nct; j < nu; j++) {\n        for (let i = 0; i < m; i++) {\n          U.set(i, j, 0);\n        }\n        U.set(j, j, 1);\n      }\n      for (let k = nct - 1; k >= 0; k--) {\n        if (s[k] !== 0) {\n          for (let j = k + 1; j < nu; j++) {\n            let t = 0;\n            for (let i = k; i < m; i++) {\n              t += U.get(i, k) * U.get(i, j);\n            }\n            t = -t / U.get(k, k);\n            for (let i = k; i < m; i++) {\n              U.set(i, j, U.get(i, j) + t * U.get(i, k));\n            }\n          }\n          for (let i = k; i < m; i++) {\n            U.set(i, k, -U.get(i, k));\n          }\n          U.set(k, k, 1 + U.get(k, k));\n          for (let i = 0; i < k - 1; i++) {\n            U.set(i, k, 0);\n          }\n        } else {\n          for (let i = 0; i < m; i++) {\n            U.set(i, k, 0);\n          }\n          U.set(k, k, 1);\n        }\n      }\n    }\n\n    if (wantv) {\n      for (let k = n - 1; k >= 0; k--) {\n        if (k < nrt && e[k] !== 0) {\n          for (let j = k + 1; j < n; j++) {\n            let t = 0;\n            for (let i = k + 1; i < n; i++) {\n              t += V.get(i, k) * V.get(i, j);\n            }\n            t = -t / V.get(k + 1, k);\n            for (let i = k + 1; i < n; i++) {\n              V.set(i, j, V.get(i, j) + t * V.get(i, k));\n            }\n          }\n        }\n        for (let i = 0; i < n; i++) {\n          V.set(i, k, 0);\n        }\n        V.set(k, k, 1);\n      }\n    }\n\n    let pp = p - 1;\n    let iter = 0;\n    let eps = Number.EPSILON;\n    while (p > 0) {\n      let k, kase;\n      for (k = p - 2; k >= -1; k--) {\n        if (k === -1) {\n          break;\n        }\n        const alpha =\n          Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n        if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n          e[k] = 0;\n          break;\n        }\n      }\n      if (k === p - 2) {\n        kase = 4;\n      } else {\n        let ks;\n        for (ks = p - 1; ks >= k; ks--) {\n          if (ks === k) {\n            break;\n          }\n          let t =\n            (ks !== p ? Math.abs(e[ks]) : 0) +\n            (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n          if (Math.abs(s[ks]) <= eps * t) {\n            s[ks] = 0;\n            break;\n          }\n        }\n        if (ks === k) {\n          kase = 3;\n        } else if (ks === p - 1) {\n          kase = 1;\n        } else {\n          kase = 2;\n          k = ks;\n        }\n      }\n\n      k++;\n\n      switch (kase) {\n        case 1: {\n          let f = e[p - 2];\n          e[p - 2] = 0;\n          for (let j = p - 2; j >= k; j--) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            if (j !== k) {\n              f = -sn * e[j - 1];\n              e[j - 1] = cs * e[j - 1];\n            }\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n                V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n                V.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 2: {\n          let f = e[k - 1];\n          e[k - 1] = 0;\n          for (let j = k; j < p; j++) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            f = -sn * e[j];\n            e[j] = cs * e[j];\n            if (wantu) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n                U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 3: {\n          const scale = Math.max(\n            Math.abs(s[p - 1]),\n            Math.abs(s[p - 2]),\n            Math.abs(e[p - 2]),\n            Math.abs(s[k]),\n            Math.abs(e[k]),\n          );\n          const sp = s[p - 1] / scale;\n          const spm1 = s[p - 2] / scale;\n          const epm1 = e[p - 2] / scale;\n          const sk = s[k] / scale;\n          const ek = e[k] / scale;\n          const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n          const c = sp * epm1 * (sp * epm1);\n          let shift = 0;\n          if (b !== 0 || c !== 0) {\n            if (b < 0) {\n              shift = 0 - Math.sqrt(b * b + c);\n            } else {\n              shift = Math.sqrt(b * b + c);\n            }\n            shift = c / (b + shift);\n          }\n          let f = (sk + sp) * (sk - sp) + shift;\n          let g = sk * ek;\n          for (let j = k; j < p - 1; j++) {\n            let t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            let cs = f / t;\n            let sn = g / t;\n            if (j !== k) {\n              e[j - 1] = t;\n            }\n            f = cs * s[j] + sn * e[j];\n            e[j] = cs * e[j] - sn * s[j];\n            g = sn * s[j + 1];\n            s[j + 1] = cs * s[j + 1];\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n                V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n                V.set(i, j, t);\n              }\n            }\n            t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            cs = f / t;\n            sn = g / t;\n            s[j] = t;\n            f = cs * e[j] + sn * s[j + 1];\n            s[j + 1] = -sn * e[j] + cs * s[j + 1];\n            g = sn * e[j + 1];\n            e[j + 1] = cs * e[j + 1];\n            if (wantu && j < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n                U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          e[p - 2] = f;\n          iter = iter + 1;\n          break;\n        }\n        case 4: {\n          if (s[k] <= 0) {\n            s[k] = s[k] < 0 ? -s[k] : 0;\n            if (wantv) {\n              for (let i = 0; i <= pp; i++) {\n                V.set(i, k, -V.get(i, k));\n              }\n            }\n          }\n          while (k < pp) {\n            if (s[k] >= s[k + 1]) {\n              break;\n            }\n            let t = s[k];\n            s[k] = s[k + 1];\n            s[k + 1] = t;\n            if (wantv && k < n - 1) {\n              for (let i = 0; i < n; i++) {\n                t = V.get(i, k + 1);\n                V.set(i, k + 1, V.get(i, k));\n                V.set(i, k, t);\n              }\n            }\n            if (wantu && k < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = U.get(i, k + 1);\n                U.set(i, k + 1, U.get(i, k));\n                U.set(i, k, t);\n              }\n            }\n            k++;\n          }\n          iter = 0;\n          p--;\n          break;\n        }\n        // no default\n      }\n    }\n\n    if (swapped) {\n      let tmp = V;\n      V = U;\n      U = tmp;\n    }\n\n    this.m = m;\n    this.n = n;\n    this.s = s;\n    this.U = U;\n    this.V = V;\n  }\n\n  solve(value) {\n    let Y = value;\n    let e = this.threshold;\n    let scols = this.s.length;\n    let Ls = Matrix.zeros(scols, scols);\n\n    for (let i = 0; i < scols; i++) {\n      if (Math.abs(this.s[i]) <= e) {\n        Ls.set(i, i, 0);\n      } else {\n        Ls.set(i, i, 1 / this.s[i]);\n      }\n    }\n\n    let U = this.U;\n    let V = this.rightSingularVectors;\n\n    let VL = V.mmul(Ls);\n    let vrows = V.rows;\n    let urows = U.rows;\n    let VLU = Matrix.zeros(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < scols; k++) {\n          sum += VL.get(i, k) * U.get(j, k);\n        }\n        VLU.set(i, j, sum);\n      }\n    }\n\n    return VLU.mmul(Y);\n  }\n\n  solveForDiagonal(value) {\n    return this.solve(Matrix.diag(value));\n  }\n\n  inverse() {\n    let V = this.V;\n    let e = this.threshold;\n    let vrows = V.rows;\n    let vcols = V.columns;\n    let X = new Matrix(vrows, this.s.length);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < vcols; j++) {\n        if (Math.abs(this.s[j]) > e) {\n          X.set(i, j, V.get(i, j) / this.s[j]);\n        }\n      }\n    }\n\n    let U = this.U;\n\n    let urows = U.rows;\n    let ucols = U.columns;\n    let Y = new Matrix(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < ucols; k++) {\n          sum += X.get(i, k) * U.get(j, k);\n        }\n        Y.set(i, j, sum);\n      }\n    }\n\n    return Y;\n  }\n\n  get condition() {\n    return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n  }\n\n  get norm2() {\n    return this.s[0];\n  }\n\n  get rank() {\n    let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n    let r = 0;\n    let s = this.s;\n    for (let i = 0, ii = s.length; i < ii; i++) {\n      if (s[i] > tol) {\n        r++;\n      }\n    }\n    return r;\n  }\n\n  get diagonal() {\n    return Array.from(this.s);\n  }\n\n  get threshold() {\n    return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n  }\n\n  get leftSingularVectors() {\n    return this.U;\n  }\n\n  get rightSingularVectors() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    return Matrix.diag(this.s);\n  }\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n  matrix = WrapperMatrix2D.checkMatrix(matrix);\n  if (useSVD) {\n    return new SingularValueDecomposition(matrix).inverse();\n  } else {\n    return solve(matrix, Matrix.eye(matrix.rows));\n  }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n  leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n  rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n  if (useSVD) {\n    return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n  } else {\n    return leftHandSide.isSquare()\n      ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n      : new QrDecomposition(leftHandSide).solve(rightHandSide);\n  }\n}\n","export function addStyle(serie, spectrum, options = {}) {\n    let { color = '#A9A9A9', opacity = 1, lineWidth = 1 } = options;\n    // eslint-disable-next-line @typescript-eslint/prefer-regexp-exec\n    if (color.match(/#[0-9A-F]{6}$/i)) {\n        color = (color + ((opacity * 255) >> 0).toString(16)).toUpperCase();\n    }\n    else {\n        color = color.replace(/rgb ?\\((.*)\\)/, `rgba($1,${opacity})`);\n    }\n    serie.style = [\n        {\n            name: 'unselected',\n            style: {\n                line: {\n                    color,\n                    width: lineWidth,\n                    dash: 1,\n                },\n            },\n        },\n        {\n            name: 'selected',\n            style: {\n                line: {\n                    color,\n                    width: lineWidth + 2,\n                    dash: 1,\n                },\n            },\n        },\n    ];\n    serie.name = spectrum.label || spectrum.id;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkU3R5bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvanNncmFwaC9hZGRTdHlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxNQUFNLFVBQVUsUUFBUSxDQUN0QixLQUE4QixFQUM5QixRQUFrQixFQUNsQixVQUF3QixFQUFFO0lBRTFCLElBQUksRUFBRSxLQUFLLEdBQUcsU0FBUyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNoRSxpRUFBaUU7SUFDakUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDakMsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDckU7U0FBTTtRQUNMLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxXQUFXLE9BQU8sR0FBRyxDQUFDLENBQUM7S0FDL0Q7SUFDRCxLQUFLLENBQUMsS0FBSyxHQUFHO1FBQ1o7WUFDRSxJQUFJLEVBQUUsWUFBWTtZQUNsQixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFO29CQUNKLEtBQUs7b0JBQ0wsS0FBSyxFQUFFLFNBQVM7b0JBQ2hCLElBQUksRUFBRSxDQUFDO2lCQUNSO2FBQ0Y7U0FDRjtRQUNEO1lBQ0UsSUFBSSxFQUFFLFVBQVU7WUFDaEIsS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRTtvQkFDSixLQUFLO29CQUNMLEtBQUssRUFBRSxTQUFTLEdBQUcsQ0FBQztvQkFDcEIsSUFBSSxFQUFFLENBQUM7aUJBQ1I7YUFDRjtTQUNGO0tBQ0YsQ0FBQztJQUNGLEtBQUssQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDO0FBQzdDLENBQUMifQ==","export const COLORS = [\n    '#FFB300',\n    '#803E75',\n    '#FF6800',\n    '#A6BDD7',\n    '#C10020',\n    '#CEA262',\n    '#817066',\n    '#007D34',\n    '#F6768E',\n    '#00538A',\n    '#FF7A5C',\n    '#53377A',\n    '#FF8E00',\n    '#B32851',\n    '#F4C800',\n    '#7F180D',\n    '#93AA00',\n    '#593315',\n    '#F13A13',\n    '#232C16',\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2pzZ3JhcGgvY29sb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRztJQUNwQixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztDQUNWLENBQUMifQ==","export function appendDistinctParameter(values, key, value) {\n    if (!values[key]) {\n        values[key] = {\n            key,\n            values: [],\n            count: 0,\n        };\n    }\n    if (!values[key].values.includes(value)) {\n        values[key].values.push(value);\n    }\n    values[key].count++;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZW5kRGlzdGluY3RQYXJhbWV0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9hcHBlbmREaXN0aW5jdFBhcmFtZXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLE1BQXFDLEVBQ3JDLEdBQVcsRUFDWCxLQUFhO0lBRWIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUc7WUFDWixHQUFHO1lBQ0gsTUFBTSxFQUFFLEVBQUU7WUFDVixLQUFLLEVBQUUsQ0FBQztTQUNULENBQUM7S0FDSDtJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNoQztJQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN0QixDQUFDIn0=","export function appendDistinctValue(values, key) {\n    if (!values[key]) {\n        values[key] = {\n            key,\n            count: 0,\n        };\n    }\n    values[key].count++;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZW5kRGlzdGluY3RWYWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2FwcGVuZERpc3RpbmN0VmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxNQUFtQyxFQUNuQyxHQUFXO0lBRVgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUc7WUFDWixHQUFHO1lBQ0gsS0FBSyxFQUFFLENBQUM7U0FDVCxDQUFDO0tBQ0g7SUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDdEIsQ0FBQyJ9","// Based on https://github.com/scijs/cholesky-solve\r\n\r\n/*\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2013 Eric Arnebäck\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nfunction ldlSymbolic(\r\n  n /* A and L are n-by-n, where n >= 0 */,\r\n  Ap /* input of size n + 1, not modified */,\r\n  Ai /* input of size nz=Ap[n], not modified */,\r\n  Lp /* output of size n + 1, not defined on input */,\r\n  Parent /* output of size n, not defined on input */,\r\n  Lnz /* output of size n, not defined on input */,\r\n  Flag /* workspace of size n, not defn. on input or output */,\r\n) {\r\n  let i, k, p, kk, p2;\r\n\r\n  for (k = 0; k < n; k++) {\r\n    /* L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k) */\r\n    Parent[k] = -1; /* parent of k is not yet known */\r\n    Flag[k] = k; /* mark node k as visited */\r\n    Lnz[k] = 0; /* count of nonzeros in column k of L */\r\n    kk = k; /* kth original, or permuted, column */\r\n    p2 = Ap[kk + 1];\r\n    for (p = Ap[kk]; p < p2; p++) {\r\n      /* A (i,k) is nonzero (original or permuted A) */\r\n      i = Ai[p];\r\n\r\n      if (i < k) {\r\n        /* follow path from i to root of etree, stop at flagged node */\r\n        for (; Flag[i] !== k; i = Parent[i]) {\r\n          /* find parent of i if not yet determined */\r\n          if (Parent[i] === -1) Parent[i] = k;\r\n          Lnz[i]++; /* L (k,i) is nonzero */\r\n          Flag[i] = k; /* mark i as visited */\r\n        }\r\n      }\r\n    }\r\n  }\r\n  /* construct Lp index array from Lnz column counts */\r\n  Lp[0] = 0;\r\n  for (k = 0; k < n; k++) {\r\n    Lp[k + 1] = Lp[k] + Lnz[k];\r\n  }\r\n}\r\n\r\nfunction ldlNumeric(\r\n  n /* A and L are n-by-n, where n >= 0 */,\r\n  Ap /* input of size n+1, not modified */,\r\n  Ai /* input of size nz=Ap[n], not modified */,\r\n  Ax /* input of size nz=Ap[n], not modified */,\r\n  Lp /* input of size n+1, not modified */,\r\n  Parent /* input of size n, not modified */,\r\n  Lnz /* output of size n, not defn. on input */,\r\n  Li /* output of size lnz=Lp[n], not defined on input */,\r\n  Lx /* output of size lnz=Lp[n], not defined on input */,\r\n  D /* output of size n, not defined on input */,\r\n  Y /* workspace of size n, not defn. on input or output */,\r\n  Pattern /* workspace of size n, not defn. on input or output */,\r\n  Flag /* workspace of size n, not defn. on input or output */,\r\n) {\r\n  let yi, lKi;\r\n  let i, k, p, kk, p2, len, top;\r\n  for (k = 0; k < n; k++) {\r\n    /* compute nonzero Pattern of kth row of L, in topological order */\r\n    Y[k] = 0.0; /* Y(0:k) is now all zero */\r\n    top = n; /* stack for pattern is empty */\r\n    Flag[k] = k; /* mark node k as visited */\r\n    Lnz[k] = 0; /* count of nonzeros in column k of L */\r\n    kk = k; /* kth original, or permuted, column */\r\n    p2 = Ap[kk + 1];\r\n    for (p = Ap[kk]; p < p2; p++) {\r\n      i = Ai[p]; /* get A(i,k) */\r\n      if (i <= k) {\r\n        Y[i] += Ax[p]; /* scatter A(i,k) into Y (sum duplicates) */\r\n        for (len = 0; Flag[i] !== k; i = Parent[i]) {\r\n          Pattern[len++] = i; /* L(k,i) is nonzero */\r\n          Flag[i] = k; /* mark i as visited */\r\n        }\r\n        while (len > 0) Pattern[--top] = Pattern[--len];\r\n      }\r\n    }\r\n    /* compute numerical values kth row of L (a sparse triangular solve) */\r\n    D[k] = Y[k]; /* get D(k,k) and clear Y(k) */\r\n    Y[k] = 0.0;\r\n    for (; top < n; top++) {\r\n      i = Pattern[top]; /* Pattern[top:n-1] is pattern of L(:,k) */\r\n      yi = Y[i]; /* get and clear Y(i) */\r\n      Y[i] = 0.0;\r\n      p2 = Lp[i] + Lnz[i];\r\n      for (p = Lp[i]; p < p2; p++) {\r\n        Y[Li[p]] -= Lx[p] * yi;\r\n      }\r\n      lKi = yi / D[i]; /* the nonzero entry L(k,i) */\r\n      D[k] -= lKi * yi;\r\n      Li[p] = k; /* store L(k,i) in column form of L */\r\n      Lx[p] = lKi;\r\n      Lnz[i]++; /* increment count of nonzeros in col i */\r\n    }\r\n\r\n    if (D[k] === 0.0) return k; /* failure, D(k,k) is zero */\r\n  }\r\n\r\n  return n; /* success, diagonal of D is all nonzero */\r\n}\r\n\r\nfunction ldlLsolve(\r\n  n /* L is n-by-n, where n >= 0 */,\r\n  X /* size n. right-hand-side on input, soln. on output */,\r\n  Lp /* input of size n+1, not modified */,\r\n  Li /* input of size lnz=Lp[n], not modified */,\r\n  Lx /* input of size lnz=Lp[n], not modified */,\r\n) {\r\n  let j, p, p2;\r\n  for (j = 0; j < n; j++) {\r\n    p2 = Lp[j + 1];\r\n    for (p = Lp[j]; p < p2; p++) {\r\n      X[Li[p]] -= Lx[p] * X[j];\r\n    }\r\n  }\r\n}\r\nfunction ldlDsolve(\r\n  n /* D is n-by-n, where n >= 0 */,\r\n  X /* size n. right-hand-side on input, soln. on output */,\r\n  D /* input of size n, not modified */,\r\n) {\r\n  let j;\r\n  for (j = 0; j < n; j++) {\r\n    X[j] /= D[j];\r\n  }\r\n}\r\nfunction ldlLTsolve(\r\n  n /* L is n-by-n, where n >= 0 */,\r\n  X /* size n. right-hand-side on input, soln. on output */,\r\n  Lp /* input of size n+1, not modified */,\r\n  Li /* input of size lnz=Lp[n], not modified */,\r\n  Lx /* input of size lnz=Lp[n], not modified */,\r\n) {\r\n  let j, p, p2;\r\n  for (j = n - 1; j >= 0; j--) {\r\n    p2 = Lp[j + 1];\r\n    for (p = Lp[j]; p < p2; p++) {\r\n      X[j] -= Lx[p] * X[Li[p]];\r\n    }\r\n  }\r\n}\r\n\r\nfunction ldlPerm(\r\n  n /* size of X, B, and P */,\r\n  X /* output of size n. */,\r\n  B /* input of size n. */,\r\n  P /* input permutation array of size n. */,\r\n) {\r\n  let j;\r\n  for (j = 0; j < n; j++) {\r\n    X[j] = B[P[j]];\r\n  }\r\n}\r\n\r\nfunction ldlPermt(\r\n  n /* size of X, B, and P */,\r\n  X /* output of size n. */,\r\n  B /* input of size n. */,\r\n  P /* input permutation array of size n. */,\r\n) {\r\n  let j;\r\n  for (j = 0; j < n; j++) {\r\n    X[P[j]] = B[j];\r\n  }\r\n}\r\n\r\nfunction prepare(M, n, P) {\r\n  // if a permutation was specified, apply it.\r\n  if (P) {\r\n    let Pinv = new Array(n);\r\n\r\n    for (let k = 0; k < n; k++) {\r\n      Pinv[P[k]] = k;\r\n    }\r\n\r\n    let Mt = []; // scratch memory\r\n    // Apply permutation. We make M into P*M*P^T\r\n    for (let a = 0; a < M.length; ++a) {\r\n      let ar = Pinv[M[a][0]];\r\n      let ac = Pinv[M[a][1]];\r\n\r\n      // we only store the upper-diagonal elements(since we assume matrix is symmetric, we only need to store these)\r\n      // if permuted element is below diagonal, we simply transpose it.\r\n      if (ac < ar) {\r\n        let t = ac;\r\n        ac = ar;\r\n        ar = t;\r\n      }\r\n\r\n      Mt[a] = [];\r\n      Mt[a][0] = ar;\r\n      Mt[a][1] = ac;\r\n      Mt[a][2] = M[a][2];\r\n    }\r\n\r\n    M = Mt; // copy scratch memory.\r\n  } else {\r\n    // if P argument is null, we just use an identity permutation.\r\n    P = [];\r\n    for (let i = 0; i < n; ++i) {\r\n      P[i] = i;\r\n    }\r\n  }\r\n\r\n  // The sparse matrix we are decomposing is A.\r\n  // Now we shall create A from M.\r\n  let Ap = new Array(n + 1);\r\n  let Ai = new Array(M.length);\r\n  let Ax = new Array(M.length);\r\n\r\n  // count number of non-zero elements in columns.\r\n  let LNZ = [];\r\n  for (let i = 0; i < n; ++i) {\r\n    LNZ[i] = 0;\r\n  }\r\n  for (let a = 0; a < M.length; ++a) {\r\n    LNZ[M[a][1]]++;\r\n  }\r\n\r\n  Ap[0] = 0;\r\n  for (let i = 0; i < n; ++i) {\r\n    Ap[i + 1] = Ap[i] + LNZ[i];\r\n  }\r\n\r\n  let coloffset = [];\r\n  for (let a = 0; a < n; ++a) {\r\n    coloffset[a] = 0;\r\n  }\r\n\r\n  // go through all elements in M, and add them to sparse matrix A.\r\n  for (let i = 0; i < M.length; ++i) {\r\n    let e = M[i];\r\n    let col = e[1];\r\n\r\n    let adr = Ap[col] + coloffset[col];\r\n    Ai[adr] = e[0];\r\n    Ax[adr] = e[2];\r\n\r\n    coloffset[col]++;\r\n  }\r\n\r\n  let D = new Array(n);\r\n  let Y = new Array(n);\r\n  let Lp = new Array(n + 1);\r\n  let Parent = new Array(n);\r\n  let Lnz = new Array(n);\r\n  let Flag = new Array(n);\r\n  let Pattern = new Array(n);\r\n  let bp1 = new Array(n);\r\n  let x = new Array(n);\r\n  let d;\r\n\r\n  ldlSymbolic(n, Ap, Ai, Lp, Parent, Lnz, Flag);\r\n\r\n  let Lx = new Array(Lp[n]);\r\n  let Li = new Array(Lp[n]);\r\n\r\n  d = ldlNumeric(n, Ap, Ai, Ax, Lp, Parent, Lnz, Li, Lx, D, Y, Pattern, Flag);\r\n\r\n  if (d === n) {\r\n    return function (b) {\r\n      ldlPerm(n, bp1, b, P);\r\n      ldlLsolve(n, bp1, Lp, Li, Lx);\r\n      ldlDsolve(n, bp1, D);\r\n      ldlLTsolve(n, bp1, Lp, Li, Lx);\r\n      ldlPermt(n, x, bp1, P);\r\n\r\n      return x;\r\n    };\r\n  } else {\r\n    return null;\r\n  }\r\n}\r\n\r\nexport { prepare as default };\r\n","'use strict'\n\nmodule.exports = cuthillMckee\n\nfunction compareNum(a, b) { return a - b }\n\nfunction cuthillMckee(list, n) {\n  var adj = new Array(n)\n  var visited = new Array(n)\n  for(var i=0; i<n; ++i) {\n    adj[i]     = []\n    visited[i] = false\n  }\n\n  for(var i=0; i<list.length; ++i) {\n    var l = list[i]\n    adj[l[0]].push(l[1])\n  }\n\n  var toVisit = new Array(n)\n  var eol = 0\n  var ptr = 0\n  for(var i=0; i<n; ++i) {\n    if(visited[i]) {\n      continue\n    }\n    toVisit[eol++] = i\n    visited[i] = true\n    while(ptr < eol) {\n      var v = toVisit[ptr++]\n      var nbhd = adj[v]\n      nbhd.sort(compareNum)\n      for(var j=0; j<nbhd.length; ++j) {\n        var u = nbhd[j]\n        if(visited[u]) {\n          continue\n        }\n        visited[u] = true\n        toVisit[eol++] = u\n      }\n    }\n  }\n\n  var result = new Array(n)\n  for(var i=0; i<n; ++i) {\n    result[toVisit[i]] = i\n  }\n\n  return result\n}\n","import cuthillMckee from 'cuthill-mckee';\r\n\r\nconst getClosestNumber = (array = [], goal = 0) => {\r\n  const closest = array.reduce((prev, curr) => {\r\n    return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev;\r\n  });\r\n  return closest;\r\n};\r\n\r\nconst getCloseIndex = (array = [], goal = 0) => {\r\n  const closest = getClosestNumber(array, goal);\r\n  return array.indexOf(closest);\r\n};\r\n\r\nconst updateSystem = (matrix, y, weights) => {\r\n  let nbPoints = y.length;\r\n  let l = nbPoints - 1;\r\n  let newMatrix = new Array(matrix.length);\r\n  let newVector = new Float64Array(nbPoints);\r\n  for (let i = 0; i < l; i++) {\r\n    let w = weights[i];\r\n    let diag = i * 2;\r\n    let next = diag + 1;\r\n    newMatrix[diag] = matrix[diag].slice();\r\n    newMatrix[next] = matrix[next].slice();\r\n    if (w === 0) {\r\n      newVector[i] = 0;\r\n    } else {\r\n      newVector[i] = y[i] * w;\r\n      newMatrix[diag][2] += w;\r\n    }\r\n  }\r\n  newVector[l] = y[l] * weights[l];\r\n  newMatrix[l * 2] = matrix[l * 2].slice();\r\n  newMatrix[l * 2][2] += weights[l];\r\n\r\n  return [newMatrix, newVector];\r\n};\r\n\r\nconst getDeltaMatrix = (nbPoints, lambda) => {\r\n  let matrix = [];\r\n  let last = nbPoints - 1;\r\n  for (let i = 0; i < last; i++) {\r\n    matrix.push([i, i, lambda * 2]);\r\n    matrix.push([i + 1, i, -1 * lambda]);\r\n  }\r\n  matrix[0][2] = lambda;\r\n  matrix.push([last, last, lambda]);\r\n  return {\r\n    lowerTriangularNonZeros: matrix,\r\n    permutationEncodedArray: cuthillMckee(matrix, nbPoints),\r\n  };\r\n};\r\n\r\nexport { updateSystem, getDeltaMatrix, getCloseIndex, getClosestNumber };\r\n","import Cholesky from './choleskySolver';\r\nimport { updateSystem, getDeltaMatrix, getCloseIndex } from './utils';\r\n\r\n/**\r\n * Fit the baseline drift by iteratively changing weights of sum square error between the fitted baseline and original signals,\r\n * for further information about the parameters you can get the [paper of airPLS](https://github.com/zmzhang/airPLS/blob/master/airPLS_manuscript.pdf)\r\n * @param {Array<number>} x - x axis data useful when control points or zones are submitted\r\n * @param {Array<number>} y - Original data\r\n * @param {object} [options={}] - Options object\r\n * @param {number} [options.maxIterations = 100] - Maximal number of iterations if the method does not reach the stop criterion\r\n * @param {number} [options.factorCriterion = 0.001] - Factor of the sum of absolute value of original data, to compute stop criterion\r\n * @param {Array<number>} [options.weights = [1,1,...]] - Initial weights vector, default each point has the same weight\r\n * @param {number} [options.lambda = 100] - Factor of weights matrix in -> [I + lambda D'D]z = x\r\n * @param {Array<number>} [options.controlPoints = []] - Array of x axis values to force that baseline cross those points.\r\n * @param {Array<number>} [options.baseLineZones = []] - Array of x axis values (as from - to), to force that baseline cross those zones.\r\n * @returns {{corrected: Array<number>, error: number, iteration: number, baseline: Array<number>}}\r\n */\r\nfunction airPLS(x, y, options = {}) {\r\n  let {\r\n    maxIterations = 100,\r\n    lambda = 100,\r\n    factorCriterion = 0.001,\r\n    weights = new Array(y.length).fill(1),\r\n    controlPoints = [],\r\n    baseLineZones = [],\r\n  } = options;\r\n\r\n  if (controlPoints.length > 0) {\r\n    controlPoints.forEach((e, i, arr) => (arr[i] = getCloseIndex(x, e)));\r\n  }\r\n  if (baseLineZones.length > 0) {\r\n    baseLineZones.forEach((range) => {\r\n      let indexFrom = getCloseIndex(x, range.from);\r\n      let indexTo = getCloseIndex(x, range.to);\r\n      if (indexFrom > indexTo) [indexFrom, indexTo] = [indexTo, indexFrom];\r\n      for (let i = indexFrom; i < indexTo; i++) {\r\n        controlPoints.push(i);\r\n      }\r\n    });\r\n  }\r\n\r\n  let baseline, iteration;\r\n  let nbPoints = y.length;\r\n  let l = nbPoints - 1;\r\n  let sumNegDifferences = Number.MAX_SAFE_INTEGER;\r\n  let stopCriterion =\r\n    factorCriterion * y.reduce((sum, e) => Math.abs(e) + sum, 0);\r\n\r\n  let { lowerTriangularNonZeros, permutationEncodedArray } = getDeltaMatrix(\r\n    nbPoints,\r\n    lambda,\r\n  );\r\n\r\n  for (\r\n    iteration = 0;\r\n    iteration < maxIterations && Math.abs(sumNegDifferences) > stopCriterion;\r\n    iteration++\r\n  ) {\r\n    let [leftHandSide, rightHandSide] = updateSystem(\r\n      lowerTriangularNonZeros,\r\n      y,\r\n      weights,\r\n    );\r\n\r\n    let cho = Cholesky(leftHandSide, nbPoints, permutationEncodedArray);\r\n\r\n    baseline = cho(rightHandSide);\r\n\r\n    sumNegDifferences = 0;\r\n\r\n    let difference = y.map(calculateError);\r\n\r\n    let maxNegativeDiff = -1 * Number.MAX_SAFE_INTEGER;\r\n    for (let i = 1; i < l; i++) {\r\n      let diff = difference[i];\r\n      if (diff >= 0) {\r\n        weights[i] = 0;\r\n      } else {\r\n        weights[i] = Math.exp((iteration * diff) / sumNegDifferences);\r\n        if (maxNegativeDiff < diff) maxNegativeDiff = diff;\r\n      }\r\n    }\r\n\r\n    let value = Math.exp((iteration * maxNegativeDiff) / sumNegDifferences);\r\n    weights[0] = value;\r\n    weights[l] = value;\r\n    controlPoints.forEach((i) => (weights[i] = value));\r\n  }\r\n\r\n  return {\r\n    corrected: y.map((e, i) => e - baseline[i]),\r\n    baseline,\r\n    iteration,\r\n    error: sumNegDifferences,\r\n  };\r\n\r\n  function calculateError(e, i) {\r\n    let diff = e - baseline[i];\r\n    if (diff < 0) sumNegDifferences += diff;\r\n    return diff;\r\n  }\r\n}\r\n\r\nexport { airPLS as default };\r\n","import airpls from 'ml-airpls';\nimport sequentialFill from 'ml-array-sequential-fill';\n/**\n * Adaptive iteratively reweighted penalized least squares [1]\n *\n * This function calls ml-airpls\n *\n * References:\n * [1] Zhang, Z.-M.; Chen, S.; Liang, Y.-Z.\n * Baseline Correction Using Adaptive Iteratively Reweighted Penalized Least Squares.\n * Analyst 2010, 135 (5), 1138–1146. https://doi.org/10.1039/B922045C.\n * @export\n * @param {Array<number>} ys\n * @param {object} [options] - Options object\n * @param {Array<number>} [options.x] Optional, Independent axis variable. If not specified, we use a linear grid\n * @param {object} [options.regression] - Options for the regression\n * @param {number} [options.regression.maxIterations = 100] - Maximum number of allowed iterations\n * @param {function} [options.regression.§Regression = PolynomialRegression] - Regression class with a predict method\n * @param {*} [options.regression.regressionOptions] - Options for regressionFunction\n * @param {number} [options.regression.tolerance = 0.001] - Convergence error tolerance\n * @returns {BaselineOutput}\n */\nexport function airPLSBaseline(ys, options = {}) {\n  const numberPoints = ys.length;\n  let { x, regressionOptions } = options;\n  if (!x) {\n    x = sequentialFill({ from: 0, to: numberPoints - 1, size: numberPoints });\n  }\n  let output = airpls(x, ys, regressionOptions);\n\n  return { baseline: output.baseline, correctedSpectrum: output.corrected };\n}\n","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","export default function maybeToPrecision(value, digits) {\n  if (value < 0) {\n    value = 0 - value;\n    if (typeof digits === 'number') {\n      return `- ${value.toPrecision(digits)}`;\n    } else {\n      return `- ${value.toString()}`;\n    }\n  } else {\n    if (typeof digits === 'number') {\n      return value.toPrecision(digits);\n    } else {\n      return value.toString();\n    }\n  }\n}\n","import { isAnyArray } from 'is-any-array';\n\nexport { default as maybeToPrecision } from './maybeToPrecision';\nexport { default as checkArrayLength } from './checkArrayLength';\n\nexport default class BaseRegression {\n  constructor() {\n    if (new.target === BaseRegression) {\n      throw new Error('BaseRegression must be subclassed');\n    }\n  }\n\n  predict(x) {\n    if (typeof x === 'number') {\n      return this._predict(x);\n    } else if (isAnyArray(x)) {\n      const y = [];\n      for (let i = 0; i < x.length; i++) {\n        y.push(this._predict(x[i]));\n      }\n      return y;\n    } else {\n      throw new TypeError('x must be a number or array');\n    }\n  }\n\n  _predict() {\n    throw new Error('_predict must be implemented');\n  }\n\n  train() {\n    // Do nothing for this package\n  }\n\n  toString() {\n    return '';\n  }\n\n  toLaTeX() {\n    return '';\n  }\n\n  /**\n   * Return the correlation coefficient of determination (r) and chi-square.\n   * @param {Array<number>} x\n   * @param {Array<number>} y\n   * @return {object}\n   */\n  score(x, y) {\n    if (!isAnyArray(x) || !isAnyArray(y) || x.length !== y.length) {\n      throw new Error('x and y must be arrays of the same length');\n    }\n\n    const n = x.length;\n    const y2 = new Array(n);\n    for (let i = 0; i < n; i++) {\n      y2[i] = this._predict(x[i]);\n    }\n\n    let xSum = 0;\n    let ySum = 0;\n    let chi2 = 0;\n    let rmsd = 0;\n    let xSquared = 0;\n    let ySquared = 0;\n    let xY = 0;\n    for (let i = 0; i < n; i++) {\n      xSum += y2[i];\n      ySum += y[i];\n      xSquared += y2[i] * y2[i];\n      ySquared += y[i] * y[i];\n      xY += y2[i] * y[i];\n      if (y[i] !== 0) {\n        chi2 += ((y[i] - y2[i]) * (y[i] - y2[i])) / y[i];\n      }\n      rmsd += (y[i] - y2[i]) * (y[i] - y2[i]);\n    }\n\n    const r =\n      (n * xY - xSum * ySum) /\n      Math.sqrt((n * xSquared - xSum * xSum) * (n * ySquared - ySum * ySum));\n\n    return {\n      r: r,\n      r2: r * r,\n      chi2: chi2,\n      rmsd: Math.sqrt(rmsd / n),\n    };\n  }\n}\n","import { Matrix, MatrixTransposeView, solve } from 'ml-matrix';\nimport BaseRegression, {\n  checkArrayLength,\n  maybeToPrecision,\n} from 'ml-regression-base';\n\nexport default class PolynomialRegression extends BaseRegression {\n  constructor(x, y, degree) {\n    super();\n    if (x === true) {\n      this.degree = y.degree;\n      this.powers = y.powers;\n      this.coefficients = y.coefficients;\n    } else {\n      checkArrayLength(x, y);\n      regress(this, x, y, degree);\n    }\n  }\n\n  _predict(x) {\n    let y = 0;\n    for (let k = 0; k < this.powers.length; k++) {\n      y += this.coefficients[k] * Math.pow(x, this.powers[k]);\n    }\n    return y;\n  }\n\n  toJSON() {\n    return {\n      name: 'polynomialRegression',\n      degree: this.degree,\n      powers: this.powers,\n      coefficients: this.coefficients,\n    };\n  }\n\n  toString(precision) {\n    return this._toFormula(precision, false);\n  }\n\n  toLaTeX(precision) {\n    return this._toFormula(precision, true);\n  }\n\n  _toFormula(precision, isLaTeX) {\n    let sup = '^';\n    let closeSup = '';\n    let times = ' * ';\n    if (isLaTeX) {\n      sup = '^{';\n      closeSup = '}';\n      times = '';\n    }\n\n    let fn = '';\n    let str = '';\n    for (let k = 0; k < this.coefficients.length; k++) {\n      str = '';\n      if (this.coefficients[k] !== 0) {\n        if (this.powers[k] === 0) {\n          str = maybeToPrecision(this.coefficients[k], precision);\n        } else {\n          if (this.powers[k] === 1) {\n            str = `${maybeToPrecision(this.coefficients[k], precision) +\n              times}x`;\n          } else {\n            str = `${maybeToPrecision(this.coefficients[k], precision) +\n              times}x${sup}${this.powers[k]}${closeSup}`;\n          }\n        }\n\n        if (this.coefficients[k] > 0 && k !== this.coefficients.length - 1) {\n          str = ` + ${str}`;\n        } else if (k !== this.coefficients.length - 1) {\n          str = ` ${str}`;\n        }\n      }\n      fn = str + fn;\n    }\n    if (fn.charAt(0) === '+') {\n      fn = fn.slice(1);\n    }\n\n    return `f(x) = ${fn}`;\n  }\n\n  static load(json) {\n    if (json.name !== 'polynomialRegression') {\n      throw new TypeError('not a polynomial regression model');\n    }\n    return new PolynomialRegression(true, json);\n  }\n}\n\nfunction regress(pr, x, y, degree) {\n  const n = x.length;\n  let powers;\n  if (Array.isArray(degree)) {\n    powers = degree;\n    degree = powers.length;\n  } else {\n    degree++;\n    powers = new Array(degree);\n    for (let k = 0; k < degree; k++) {\n      powers[k] = k;\n    }\n  }\n  const F = new Matrix(n, degree);\n  const Y = new Matrix([y]);\n  for (let k = 0; k < degree; k++) {\n    for (let i = 0; i < n; i++) {\n      if (powers[k] === 0) {\n        F.set(i, k, 1);\n      } else {\n        F.set(i, k, Math.pow(x[i], powers[k]));\n      }\n    }\n  }\n\n  const FT = new MatrixTransposeView(F);\n  const A = FT.mmul(F);\n  const B = FT.mmul(new MatrixTransposeView(Y));\n\n  pr.degree = degree - 1;\n  pr.powers = powers;\n  pr.coefficients = solve(A, B).to1DArray();\n}\n","import { isAnyArray } from 'is-any-array';\n\nexport default function checkArraySize(x, y) {\n  if (!isAnyArray(x) || !isAnyArray(y)) {\n    throw new TypeError('x and y must be arrays');\n  }\n  if (x.length !== y.length) {\n    throw new RangeError('x and y arrays must have the same length');\n  }\n}\n","import PolynomialRegression from 'ml-regression-polynomial';\r\n\r\n/**\r\n * Iterative regression-based baseline correction\r\n * @param {Array<number>} x - Independent axis variable\r\n * @param {Array<number>} y - Dependent axis variable\r\n * @param {object} [options] - Options object\r\n * @param {number} [options.maxIterations = 100] - Maximum number of allowed iterations\r\n * @param {function} [options.Regression = PolynomialRegression] - Regression class with a predict method\r\n * @param {*} [options.regressionOptions] - Options for regressionFunction\r\n * @param {number} [options.tolerance = 0.001] - Convergence error tolerance\r\n * @return {{corrected: Array<number>, delta: number, iteration: number, baseline: Array<number>}}\r\n */\r\nexport default function baselineCorrectionRegression(x, y, options = {}) {\r\n  let {\r\n    maxIterations = 100,\r\n    Regression = PolynomialRegression,\r\n    regressionOptions,\r\n    tolerance = 0.001,\r\n  } = options;\r\n\r\n  if (!regressionOptions && Regression === PolynomialRegression) {\r\n    regressionOptions = 3;\r\n  }\r\n\r\n  let baseline = y.slice();\r\n  let fitting = y.slice();\r\n  let oldFitting = y;\r\n  let iteration = 0;\r\n  let delta;\r\n  let regression;\r\n  while (iteration < maxIterations) {\r\n    // Calculate the fitting result\r\n    regression = new Regression(x, baseline, regressionOptions);\r\n\r\n    delta = 0;\r\n    for (let i = 0; i < baseline.length; i++) {\r\n      fitting[i] = regression.predict(x[i]);\r\n      if (baseline[i] > fitting[i]) {\r\n        baseline[i] = fitting[i];\r\n      }\r\n\r\n      delta += Math.abs((fitting[i] - oldFitting[i]) / oldFitting[i]);\r\n    }\r\n\r\n    // Stop criterion\r\n    if (delta < tolerance) {\r\n      break;\r\n    } else {\r\n      oldFitting = fitting.slice();\r\n      iteration++;\r\n    }\r\n  }\r\n\r\n  // removes baseline\r\n  let corrected = new Array(baseline.length);\r\n  for (let j = 0; j < baseline.length; j++) {\r\n    corrected[j] = y[j] - baseline[j];\r\n  }\r\n\r\n  return {\r\n    corrected,\r\n    delta,\r\n    iteration,\r\n    baseline,\r\n    regression: regression,\r\n  };\r\n}\r\n","import sequentialFill from 'ml-array-sequential-fill';\nimport baselineCorrection from 'ml-baseline-correction-regression';\n\n/**\n * Iterative polynomial fitting [1]\n *\n * Implementation based on ml-baseline-correction-regression\n *\n * References:\n * [1] Gan, F.; Ruan, G.; Mo, J.\n * Baseline Correction by Improved Iterative Polynomial Fitting with Automatic Threshold.\n *  Chemometrics and Intelligent Laboratory Systems 2006, 82 (1), 59–65.\n * https://doi.org/10.1016/j.chemolab.2005.08.009.\n * @export\n * @param {Array<number>} ys\n * @param {object} [options] - Options object\n * @param {Array<number>} [options.x] Optional, Independent axis variable. If not specified, we use a linear grid\n * @param {Object} [options.regression]\n * @param {number} [options.regression.maxIterations = 100] - Maximum number of allowed iterations\n * @param {Object} [options.regression]\n * @param {function} [options.regression.Regression = PolynomialRegression] - Regression class with a predict method\n * @param {Object} [options.regression.regressionOptions] - Options for regressionFunction\n * @param {number} [options.regression.tolerance = 0.001] - Convergence error tolerance\n * @returns {BaselineOutput}\n */\nexport function iterativePolynomialBaseline(ys, options = {}) {\n  const numberPoints = ys.length;\n  let { x, regressionOptions } = options;\n  if (!x) {\n    x = sequentialFill({ from: 0, to: numberPoints - 1, size: numberPoints });\n  }\n\n  let output = baselineCorrection(x, ys, regressionOptions);\n\n  return { baseline: output.baseline, correctedSpectrum: output.corrected };\n}\n","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","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is valdi\n *\n * @param input - input\n */\nexport function xCheck(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n}\n/**\n * XCheckLengths.\n *\n * @param array1 - First array.\n * @param array2 - Second array.\n */\nexport function xCheckLengths(array1, array2) {\n    if (array1.length !== array2.length) {\n        throw new TypeError('Length of array1 and array2 must be identical');\n    }\n}\n//# sourceMappingURL=xCheck.js.map","import { xCheck } from './xCheck';\n/**\n * This function pads an array\n *\n *\n * @param array - the array that will be padded\n * @param options - options\n */\nexport function xPadding(array, options = {}) {\n    const { size = 0, value = 0, algorithm = '' } = options;\n    xCheck(array);\n    if (!algorithm) {\n        if (array instanceof Float64Array) {\n            return array.slice();\n        }\n        else {\n            return Float64Array.from(array);\n        }\n    }\n    let result = new Float64Array(array.length + size * 2);\n    for (let i = 0; i < array.length; i++) {\n        result[i + size] = array[i];\n    }\n    let fromEnd = size + array.length;\n    let toEnd = 2 * size + array.length;\n    switch (algorithm.toLowerCase()) {\n        case 'value':\n            for (let i = 0; i < size; i++) {\n                result[i] = value;\n            }\n            for (let i = fromEnd; i < toEnd; i++) {\n                result[i] = value;\n            }\n            break;\n        case 'duplicate':\n            for (let i = 0; i < size; i++) {\n                result[i] = array[0];\n            }\n            for (let i = fromEnd; i < toEnd; i++) {\n                result[i] = array[array.length - 1];\n            }\n            break;\n        case 'circular':\n            for (let i = 0; i < size; i++) {\n                result[i] =\n                    array[(array.length - (size % array.length) + i) % array.length];\n            }\n            for (let i = 0; i < size; i++) {\n                result[i + fromEnd] = array[i % array.length];\n            }\n            break;\n        default:\n            throw Error('xPadding: unknown algorithm');\n    }\n    return result;\n}\n//# sourceMappingURL=xPadding.js.map","import { xCheck } from './xCheck';\nimport { xPadding } from './xPadding';\n/**\n * This function calculates a rolling average\n *\n * @param array - the array that will be rotated\n * @param fct - callback function that from an array returns a value.\n * @param options - options\n */\nexport function xRolling(array, fct, options = {}) {\n    xCheck(array);\n    if (typeof fct !== 'function')\n        throw Error('fct has to be a function');\n    const { window = 5, padding = {} } = options;\n    const { size = window - 1, algorithm, value } = padding;\n    array = xPadding(array, { size, algorithm, value }); // ensure we get a copy and it is float64\n    const newArray = [];\n    for (let i = 0; i < array.length - window + 1; i++) {\n        let subArray = new Float64Array(array.buffer, i * 8, window);\n        // we will send a view to the original buffer\n        newArray.push(fct(subArray));\n    }\n    return newArray;\n}\n//# sourceMappingURL=xRolling.js.map","import mean from 'ml-array-mean';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a rolling average\n *\n * @param array - the array that will be rotated\n * @param options - option\n */\nexport function xRollingAverage(array, options = {}) {\n    return xRolling(array, mean, options);\n}\n//# sourceMappingURL=xRollingAverage.js.map","import median from 'ml-array-median';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a rolling average\n *\n * @param array - the array that will be rotated\n * @param options - options\n */\nexport function xRollingMedian(array, options = {}) {\n    return xRolling(array, median, options);\n}\n//# sourceMappingURL=xRollingMedian.js.map","import { xRollingAverage } from 'ml-spectra-processing';\n\n/**\n\n *\n * @export\n * @param {Array<number>} ys\n * @param {Object} [options={}]\n * @param {number} [options.window] rolling window size, defaults to 10% of the length of the spectrum\n * @param {string} [options.padding.size=window-1] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm='duplicate'] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @returns {BaselineOutput}\n */\nexport function rollingAverageBaseline(ys, options = {}) {\n  let window = Math.max(Math.round(ys.length * 0.1), 2);\n  let defaults = {\n    window: window,\n    padding: {\n      size: window - 1,\n      algorithm: 'duplicate',\n      value: 0,\n    },\n  };\n  let actualOptions = Object.assign({}, defaults, options);\n  let baseline = xRollingAverage(ys, actualOptions);\n  let corrected = new Float64Array(ys.length);\n  for (let i = 0; i < corrected.length; i++) {\n    corrected[i] = ys[i] - baseline[i];\n  }\n\n  return { baseline: baseline, correctedSpectrum: corrected };\n}\n","import isAnyArray from 'is-any-array';\nimport max from 'ml-array-max';\nimport mean from 'ml-array-mean';\nimport min from 'ml-array-min';\n\n/**\n * Rolling ball baseline correction algorithm.\n * From the abstract of (1):\n * \"This algorithm behaves equivalently to traditional polynomial backgrounds in simple spectra,\n * [...] and is considerably more robust for multiple overlapping peaks, rapidly varying background [...]\n *\n * The baseline is the trace one gets by rolling a ball below a spectrum. Algorithm has three steps:\n * Finding the minima in each window, find maxima among minima and then smooth over them by averaging.\n *\n * Reference:\n * (1) Kneen, M. A.; Annegarn, H. J.\n *     Algorithm for Fitting XRF, SEM and PIXE X-Ray Spectra Backgrounds.\n *     Nuclear Instruments and Methods in Physics Research Section B: Beam Interactions with Materials and Atoms 1996, 109–110, 209–213.\n *     https://doi.org/10.1016/0168-583X(95)00908-6.\n * (2) Kristian Hovde Liland, Bjørn-Helge Mevik, Roberto Canteri: baseline.\n *     https://cran.r-project.org/web/packages/baseline/index.html\n * @export\n * @param {Array} spectrum\n * @param {Object} [options={}]\n * @param {Number} [options.windowM] - width of local window for minimization/maximization, defaults to 4% of the spectrum length\n * @param {Number} [options.windowS] - width of local window for smoothing, defaults to 8% of the specturm length\n */\nexport function rollingBall(spectrum, options = {}) {\n  if (!isAnyArray(spectrum)) {\n    throw new Error('Spectrum must be an array');\n  }\n\n  if (spectrum.length === 0) {\n    throw new TypeError('Spectrum must not be empty');\n  }\n\n  const numberPoints = spectrum.length;\n  const maxima = new Float64Array(numberPoints);\n  const minima = new Float64Array(numberPoints);\n  const baseline = new Float64Array(numberPoints);\n\n  // windowM 4 percent of spectrum length\n  // windowS 8 percent of spectrum length\n  const {\n    windowM = Math.round(numberPoints * 0.04),\n    windowS = Math.round(numberPoints * 0.08),\n  } = options;\n\n  // fi(1) in original paper\n  for (let i = 0; i < spectrum.length; i++) {\n    let windowLeft = max([0, i - windowM]);\n    let windowRight = min([i + windowM + 1, spectrum.length]);\n    minima[i] = min(spectrum.slice(windowLeft, windowRight));\n  }\n\n  // fi in original paper\n  for (let i = 0; i < minima.length; i++) {\n    let windowLeft = max([0, i - windowM]);\n    let windowRight = min([i + windowM + 1, minima.length]);\n    maxima[i] = max(minima.slice(windowLeft, windowRight));\n  }\n\n  for (let i = 0; i < minima.length; i++) {\n    let windowLeft = max([0, i - windowS]);\n    let windowRight = min([i + windowS + 1, maxima.length]);\n    baseline[i] = mean(maxima.slice(windowLeft, windowRight));\n  }\n\n  return baseline;\n}\n","import { rollingBall } from 'ml-rolling-ball-baseline';\n\n/**\n * Rolling ball baseline correction algorithm.\n * From the abstract of (1):\n * \"This algorithm behaves equivalently to traditional polynomial backgrounds in simple spectra,\n * [...] and is considerably more robust for multiple overlapping peaks, rapidly varying background [...]\n *\n * The baseline is the trace one gets by rolling a ball below a spectrum. Algorithm has three steps:\n * Finding the minima in each window, find maxima among minima and then smooth over them by averaging.\n *\n * Algorithm described in (1), but in the implementation here the window width does not change.\n *\n * Reference:\n * (1) Kneen, M. A.; Annegarn, H. J.\n *     Algorithm for Fitting XRF, SEM and PIXE X-Ray Spectra Backgrounds.\n *     Nuclear Instruments and Methods in Physics Research Section B: Beam Interactions with Materials and Atoms 1996, 109–110, 209–213.\n *     https://doi.org/10.1016/0168-583X(95)00908-6.\n * (2) Kristian Hovde Liland, Bjørn-Helge Mevik, Roberto Canteri: baseline.\n *     https://cran.r-project.org/web/packages/baseline/index.html\n *\n * @export\n * @param {Array<number>} ys\n * @param {Object} [options={}]\n * @param {Number} [options.windowM] - width of local window for minimization/maximization, defaults to 4% of the spectrum length\n * @param {Number} [options.windowS] - width of local window for smoothing, defaults to 8% of the specturm length\n * @returns {BaselineOutput}\n */\nexport function rollingBallBaseline(ys, options = {}) {\n  const baseline = rollingBall(ys, options);\n  let corrected = new Float64Array(ys.length);\n  for (let i = 0; i < corrected.length; i++) {\n    corrected[i] = ys[i] - baseline[i];\n  }\n\n  return { baseline: baseline, correctedSpectrum: corrected };\n}\n","import { xRollingMedian } from 'ml-spectra-processing';\n\n/**\n\n *\n * @export\n * @param {Array<number>} ys\n * @param {Object} [options={}]\n * @param {number} [options.window] rolling window size, defaults to 10% of the length of the spectrum\n * @param {string} [options.padding.size=window-1] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm='duplicate'] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @returns {BaselineOutput}\n */\nexport function rollingMedianBaseline(ys, options = {}) {\n  let window = Math.max(Math.round(ys.length * 0.1), 2);\n  let defaults = {\n    window: window,\n    padding: {\n      size: window - 1,\n      algorithm: 'duplicate',\n      value: 0,\n    },\n  };\n  let actualOptions = Object.assign({}, defaults, options);\n  let baseline = xRollingMedian(ys, actualOptions);\n  let corrected = new Float64Array(ys.length);\n  for (let i = 0; i < corrected.length; i++) {\n    corrected[i] = ys[i] - baseline[i];\n  }\n\n  return { baseline: baseline, correctedSpectrum: corrected };\n}\n","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","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport sum from 'ml-array-sum';\n\nfunction norm(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var _options$algorithm = options.algorithm,\n      algorithm = _options$algorithm === void 0 ? 'absolute' : _options$algorithm,\n      _options$sumValue = options.sumValue,\n      sumValue = _options$sumValue === void 0 ? 1 : _options$sumValue,\n      _options$maxValue = options.maxValue,\n      maxValue = _options$maxValue === void 0 ? 1 : _options$maxValue;\n\n  if (!isAnyArray(input)) {\n    throw new Error('input must be an array');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  if (input.length === 0) {\n    throw new Error('input must not be empty');\n  }\n\n  switch (algorithm.toLowerCase()) {\n    case 'absolute':\n      {\n        var absoluteSumValue = absoluteSum(input) / sumValue;\n        if (absoluteSumValue === 0) return input.slice(0);\n\n        for (var i = 0; i < input.length; i++) {\n          output[i] = input[i] / absoluteSumValue;\n        }\n\n        return output;\n      }\n\n    case 'max':\n      {\n        var currentMaxValue = max(input);\n        if (currentMaxValue === 0) return input.slice(0);\n        var factor = maxValue / currentMaxValue;\n\n        for (var _i = 0; _i < input.length; _i++) {\n          output[_i] = input[_i] * factor;\n        }\n\n        return output;\n      }\n\n    case 'sum':\n      {\n        var sumFactor = sum(input) / sumValue;\n        if (sumFactor === 0) return input.slice(0);\n\n        for (var _i2 = 0; _i2 < input.length; _i2++) {\n          output[_i2] = input[_i2] / sumFactor;\n        }\n\n        return output;\n      }\n\n    default:\n      throw new Error(\"norm: unknown algorithm: \".concat(algorithm));\n  }\n}\n\nfunction absoluteSum(input) {\n  var sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += Math.abs(input[i]);\n  }\n\n  return sumValue;\n}\n\nexport { norm as default };\n","/**\n * Normalize an array of zones:\n * - ensure than from < to\n * - merge overlapping zones\n *\n * The method will always check if from if lower than to and will swap if required.\n * @param {Array} [zones=[]]\n * @param {object} [options={}]\n * @param {number} [options.from=Number.NEGATIVE_INFINITY] Specify min value of a zone\n * @param {number} [options.to=Number.POSITIVE_INFINITY] Specify max value of a zone\n */\n\nexport function normalize(zones = [], options = {}) {\n  if (zones.length === 0) return [];\n  let {\n    from = Number.NEGATIVE_INFINITY,\n    to = Number.POSITIVE_INFINITY,\n  } = options;\n  if (from > to) [from, to] = [to, from];\n\n  zones = JSON.parse(JSON.stringify(zones)).map((zone) =>\n    zone.from > zone.to ? { from: zone.to, to: zone.from } : zone,\n  );\n  zones = zones.sort((a, b) => {\n    if (a.from !== b.from) return a.from - b.from;\n    return a.to - b.to;\n  });\n\n  zones.forEach((zone) => {\n    if (from > zone.from) zone.from = from;\n    if (to < zone.to) zone.to = to;\n  });\n\n  zones = zones.filter((zone) => zone.from <= zone.to);\n  if (zones.length === 0) return [];\n\n  let currentZone = zones[0];\n  let result = [currentZone];\n  for (let i = 1; i < zones.length; i++) {\n    let zone = zones[i];\n    if (zone.from <= currentZone.to) {\n      currentZone.to = zone.to;\n    } else {\n      currentZone = zone;\n      result.push(currentZone);\n    }\n  }\n  return result;\n}\n","import { normalize } from './normalize';\n\n/**\n * Convert an array of exclusions and keep only from / to\n *\n * The method will always check if from if lower than to and will swap if required.\n * @param {Array} [exclusions=[]]\n * @param {object} [options={}]\n * @param {number} [options.from=Number.NEGATIVE_INFINITY] Specify min value of zones (after inversion)\n * @param {number} [options.to=Number.POSITIVE_INFINITY] Specify max value of zones (after inversion)\n */\n\nexport function invert(exclusions = [], options = {}) {\n  let {\n    from = Number.NEGATIVE_INFINITY,\n    to = Number.POSITIVE_INFINITY,\n  } = options;\n  if (from > to) [from, to] = [to, from];\n\n  exclusions = normalize(exclusions, { from, to });\n  if (exclusions.length === 0) return [{ from, to }];\n\n  let zones = [];\n  for (let i = 0; i < exclusions.length; i++) {\n    let exclusion = exclusions[i];\n    let nextExclusion = exclusions[i + 1];\n    if (i === 0) {\n      if (exclusion.from > from) {\n        zones.push({ from, to: exclusion.from });\n      }\n    }\n    if (i === exclusions.length - 1) {\n      if (exclusion.to < to) {\n        zones.push({ from: exclusion.to, to });\n      }\n    } else {\n      zones.push({ from: exclusion.to, to: nextExclusion.from });\n    }\n  }\n\n  return zones;\n}\n","import { normalize } from './normalize';\n\n/**\n * Add the number of points per zone to reach a specified total\n * @param {Array} [zones=[]]\n * @param {number} [numberOfPoints] Total number of points to distribute between zones\n * @param {object} [options={}]\n * @param {number} [options.from=Number.NEGATIVE_INFINITY] Specify min value of a zone\n * @param {number} [options.to=Number.POSITIVE_INFINITY] Specify max value of a zone\n */\n\nexport function zonesWithPoints(zones, numberOfPoints, options = {}) {\n  if (zones.length === 0) return zones;\n  zones = normalize(zones, options);\n\n  const totalSize = zones.reduce((previous, current) => {\n    return previous + (current.to - current.from);\n  }, 0);\n\n  let unitsPerPoint = totalSize / numberOfPoints;\n  let currentTotal = 0;\n  for (let i = 0; i < zones.length - 1; i++) {\n    let zone = zones[i];\n    zone.numberOfPoints = Math.min(\n      Math.round((zone.to - zone.from) / unitsPerPoint),\n      numberOfPoints - currentTotal,\n    );\n    currentTotal += zone.numberOfPoints;\n  }\n\n  zones[zones.length - 1].numberOfPoints = numberOfPoints - currentTotal;\n\n  return zones;\n}\n","/**\n * Function that calculates the integral of the line between two\n * x-coordinates, given the slope and intercept of the line.\n * @param {number} x0\n * @param {number} x1\n * @param {number} slope\n * @param {number} intercept\n * @return {number} integral value.\n */\nexport default function integral(x0, x1, slope, intercept) {\n  return (\n    0.5 * slope * x1 * x1 +\n    intercept * x1 -\n    (0.5 * slope * x0 * x0 + intercept * x0)\n  );\n}\n","import sequentialFill from 'ml-array-sequential-fill';\nimport { zonesWithPoints, invert } from 'ml-zones';\n\nimport equallySpacedSlot from './equallySpacedSlot';\nimport equallySpacedSmooth from './equallySpacedSmooth';\n\n/**\n * Function that returns a Number array of equally spaced numberOfPoints\n * containing a representation of intensities of the spectra arguments x\n * and y.\n *\n * The options parameter contains an object in the following form:\n * from: starting point\n * to: last point\n * numberOfPoints: number of points between from and to\n * variant: \"slot\" or \"smooth\" - smooth is the default option\n *\n * The slot variant consist that each point in the new array is calculated\n * averaging the existing points between the slot that belongs to the current\n * value. The smooth variant is the same but takes the integral of the range\n * of the slot and divide by the step size between two points in the new array.\n *\n * If exclusions zone are present, zones are ignored !\n * @param {object} [arrayXY={}] - object containing 2 properties x and y (both an array)\n * @param {object} [options={}]\n * @param {number} [options.from=x[0]]\n * @param {number} [options.to=x[x.length-1]]\n * @param {string} [options.variant='smooth']\n * @param {number} [options.numberOfPoints=100]\n * @param {Array} [options.exclusions=[]] array of from / to that should be skipped for the generation of the points\n * @param {Array} [options.zones=[]] array of from / to that should be kept\n * @return {object<x: Array, y:Array>} new object with x / y array with the equally spaced data.\n */\n\nexport default function equallySpaced(arrayXY = {}, options = {}) {\n  let { x, y } = arrayXY;\n  let xLength = x.length;\n  let reverse = false;\n  if (x.length > 1 && x[0] > x[1]) {\n    x = x.slice().reverse();\n    y = y.slice().reverse();\n    reverse = true;\n  }\n\n  let {\n    from = x[0],\n    to = x[xLength - 1],\n    variant = 'smooth',\n    numberOfPoints = 100,\n    exclusions = [],\n    zones = [],\n  } = options;\n\n  if (xLength !== y.length) {\n    throw new RangeError(\"the x and y vector doesn't have the same size.\");\n  }\n\n  if (typeof from !== 'number' || isNaN(from)) {\n    throw new RangeError(\"'from' option must be a number\");\n  }\n\n  if (typeof to !== 'number' || isNaN(to)) {\n    throw new RangeError(\"'to' option must be a number\");\n  }\n\n  if (typeof numberOfPoints !== 'number' || isNaN(numberOfPoints)) {\n    throw new RangeError(\"'numberOfPoints' option must be a number\");\n  }\n\n  if (numberOfPoints < 2) {\n    throw new RangeError(\"'numberOfPoints' option must be greater than 1\");\n  }\n\n  if (zones.length === 0) {\n    zones = invert(exclusions, { from, to });\n  }\n\n  zones = zonesWithPoints(zones, numberOfPoints, { from, to });\n\n  let xResult = [];\n  let yResult = [];\n  for (let zone of zones) {\n    let zoneResult = processZone(\n      x,\n      y,\n      zone.from,\n      zone.to,\n      zone.numberOfPoints,\n      variant,\n      reverse,\n    );\n\n    xResult = xResult.concat(zoneResult.x);\n    yResult = yResult.concat(zoneResult.y);\n  }\n  if (reverse) {\n    if (from < to) {\n      return { x: xResult.reverse(), y: yResult.reverse() };\n    } else {\n      return { x: xResult, y: yResult };\n    }\n  } else {\n    if (from < to) {\n      return { x: xResult, y: yResult };\n    } else {\n      return { x: xResult.reverse(), y: yResult.reverse() };\n    }\n  }\n}\n\nfunction processZone(x, y, from, to, numberOfPoints, variant) {\n  if (numberOfPoints < 1) {\n    throw new RangeError('the number of points must be at least 1');\n  }\n  let output =\n    variant === 'slot'\n      ? equallySpacedSlot(x, y, from, to, numberOfPoints)\n      : equallySpacedSmooth(x, y, from, to, numberOfPoints);\n\n  return {\n    x: sequentialFill({\n      from,\n      to,\n      size: numberOfPoints,\n    }),\n    y: output,\n  };\n}\n","/**\n * function that retrieves the getEquallySpacedData with the variant \"slot\"\n *\n * @param {Array<number>} x\n * @param {Array<number>} y\n * @param {number} from - Initial point\n * @param {number} to - Final point\n * @param {number} numberOfPoints\n * @return {Array} - Array of y's equally spaced with the variant \"slot\"\n */\nexport default function equallySpacedSlot(x, y, from, to, numberOfPoints) {\n  let xLength = x.length;\n\n  let step = (to - from) / (numberOfPoints > 1 ? numberOfPoints - 1 : 1);\n  let halfStep = step / 2;\n  let lastStep = x[x.length - 1] - x[x.length - 2];\n\n  let start = from - halfStep;\n  let output = new Array(numberOfPoints);\n\n  // Init main variables\n  let min = start;\n  let max = start + step;\n\n  let previousX = -Number.MAX_VALUE;\n  let previousY = 0;\n  let nextX = x[0];\n  let nextY = y[0];\n  let frontOutsideSpectra = 0;\n  let backOutsideSpectra = true;\n\n  let currentValue = 0;\n\n  // for slot algorithm\n  let currentPoints = 0;\n\n  let i = 1; // index of input\n  let j = 0; // index of output\n\n  main: while (true) {\n    if (previousX >= nextX) throw new Error('x must be a growing series');\n    while (previousX - max > 0) {\n      // no overlap with original point, just consume current value\n      if (backOutsideSpectra) {\n        currentPoints++;\n        backOutsideSpectra = false;\n      }\n\n      output[j] = currentPoints <= 0 ? 0 : currentValue / currentPoints;\n      j++;\n\n      if (j === numberOfPoints) {\n        break main;\n      }\n\n      min = max;\n      max += step;\n      currentValue = 0;\n      currentPoints = 0;\n    }\n\n    if (previousX > min) {\n      currentValue += previousY;\n      currentPoints++;\n    }\n\n    if (previousX === -Number.MAX_VALUE || frontOutsideSpectra > 1) {\n      currentPoints--;\n    }\n\n    previousX = nextX;\n    previousY = nextY;\n\n    if (i < xLength) {\n      nextX = x[i];\n      nextY = y[i];\n      i++;\n    } else {\n      nextX += lastStep;\n      nextY = 0;\n      frontOutsideSpectra++;\n    }\n  }\n\n  return output;\n}\n","import integral from './integral';\n\n/**\n * function that retrieves the getEquallySpacedData with the variant \"smooth\"\n *\n * @param {Array<number>} x\n * @param {Array<number>} y\n * @param {number} from - Initial point\n * @param {number} to - Final point\n * @param {number} numberOfPoints\n * @return {Array} - Array of y's equally spaced with the variant \"smooth\"\n */\nexport default function equallySpacedSmooth(x, y, from, to, numberOfPoints) {\n  let xLength = x.length;\n\n  let step = (to - from) / (numberOfPoints > 1 ? numberOfPoints - 1 : 1);\n  let halfStep = step / 2;\n\n  let output = new Array(numberOfPoints);\n\n  let initialOriginalStep = x[1] - x[0];\n  let lastOriginalStep = x[xLength - 1] - x[xLength - 2];\n\n  // Init main variables\n  let min = from - halfStep;\n  let max = from + halfStep;\n\n  let previousX = Number.MIN_SAFE_INTEGER;\n  let previousY = 0;\n  let nextX = x[0] - initialOriginalStep;\n  let nextY = 0;\n\n  let currentValue = 0;\n  let slope = 0;\n  let intercept = 0;\n  let sumAtMin = 0;\n  let sumAtMax = 0;\n\n  let i = 0; // index of input\n  let j = 0; // index of output\n\n  function getSlope(x0, y0, x1, y1) {\n    return (y1 - y0) / (x1 - x0);\n  }\n\n  let add = 0;\n  main: while (true) {\n    if (previousX >= nextX) throw new Error('x must be a growing series');\n    if (previousX <= min && min <= nextX) {\n      add = integral(0, min - previousX, slope, previousY);\n      sumAtMin = currentValue + add;\n    }\n    while (nextX - max >= 0) {\n      // no overlap with original point, just consume current value\n      add = integral(0, max - previousX, slope, previousY);\n      sumAtMax = currentValue + add;\n\n      output[j++] = (sumAtMax - sumAtMin) / step;\n\n      if (j === numberOfPoints) {\n        break main;\n      }\n\n      min = max;\n      max += step;\n      sumAtMin = sumAtMax;\n    }\n\n    currentValue += integral(previousX, nextX, slope, intercept);\n\n    previousX = nextX;\n    previousY = nextY;\n\n    if (i < xLength) {\n      nextX = x[i];\n      nextY = y[i];\n      i++;\n    } else if (i === xLength) {\n      nextX += lastOriginalStep;\n      nextY = 0;\n    }\n\n    slope = getSlope(previousX, previousY, nextX, nextY);\n    intercept = -slope * previousX + previousY;\n  }\n\n  return output;\n}\n","export default function getZones(from, to, exclusions = []) {\n  if (from > to) {\n    [from, to] = [to, from];\n  }\n\n  // in exclusions from and to have to be defined\n  exclusions = exclusions.filter(\n    (exclusion) => exclusion.from !== undefined && exclusion.to !== undefined,\n  );\n\n  exclusions = JSON.parse(JSON.stringify(exclusions));\n  // we ensure that from before to\n  exclusions.forEach((exclusion) => {\n    if (exclusion.from > exclusion.to) {\n      [exclusion.to, exclusion.from] = [exclusion.from, exclusion.to];\n    }\n  });\n\n  exclusions.sort((a, b) => a.from - b.from);\n\n  // we will rework the exclusions in order to remove overlap and outside range (from / to)\n  exclusions.forEach((exclusion) => {\n    if (exclusion.from < from) exclusion.from = from;\n    if (exclusion.to > to) exclusion.to = to;\n  });\n  for (let i = 0; i < exclusions.length - 1; i++) {\n    if (exclusions[i].to > exclusions[i + 1].from) {\n      exclusions[i].to = exclusions[i + 1].from;\n    }\n  }\n  exclusions = exclusions.filter((exclusion) => exclusion.from < exclusion.to);\n\n  if (!exclusions || exclusions.length === 0) {\n    return [{ from, to }];\n  }\n\n  let zones = [];\n  let currentFrom = from;\n  for (let exclusion of exclusions) {\n    if (currentFrom < exclusion.from) {\n      zones.push({\n        from: currentFrom,\n        to: exclusion.from,\n      });\n    }\n\n    currentFrom = exclusion.to;\n  }\n  if (currentFrom < to) {\n    zones.push({\n      from: currentFrom,\n      to: to,\n    });\n  }\n\n  return zones;\n}\n","import getZones from './getZones';\n\n/**\n * Filter an array x/y based on various criteria\n * x points are expected to be sorted\n *\n * @param {object} points\n * @param {object} [options={}]\n * @param {array} [options.from]\n * @param {array} [options.to]\n * @param {array} [options.exclusions=[]]\n * @return {{x: Array<number>, y: Array<number>}}\n */\n\nexport default function filterX(points, options = {}) {\n  const { x, y } = points;\n  const { from = x[0], to = x[x.length - 1], exclusions = [] } = options;\n\n  let zones = getZones(from, to, exclusions);\n\n  let currentZoneIndex = 0;\n  let newX = [];\n  let newY = [];\n  let position = 0;\n  while (position < x.length) {\n    if (\n      x[position] <= zones[currentZoneIndex].to &&\n      x[position] >= zones[currentZoneIndex].from\n    ) {\n      newX.push(x[position]);\n      newY.push(y[position]);\n    } else {\n      if (x[position] > zones[currentZoneIndex].to) {\n        currentZoneIndex++;\n        if (!zones[currentZoneIndex]) break;\n      }\n    }\n    position++;\n  }\n\n  return {\n    x: newX,\n    y: newY,\n  };\n}\n","'use strict';\n\nvar defaultOptions = {\n  size: 1,\n  value: 0\n};\n\n/**\n * Case when the entry is an array\n * @param data\n * @param options\n * @returns {Array}\n */\nfunction arrayCase(data, options) {\n  var len = data.length;\n  if (typeof options.size === 'number') {\n    options.size = [options.size, options.size];\n  }\n\n  var cond = len + options.size[0] + options.size[1];\n\n  var output;\n  if (options.output) {\n    if (options.output.length !== cond) {\n      throw new RangeError('Wrong output size');\n    }\n    output = options.output;\n  } else {\n    output = new Array(cond);\n  }\n\n  var i;\n  if (options.value === 'circular') {\n    for (i = 0; i < cond; i++) {\n      if (i < options.size[0]) {\n        output[i] = data[(len - (options.size[0] % len) + i) % len];\n      } else if (i < options.size[0] + len) {\n        output[i] = data[i - options.size[0]];\n      } else {\n        output[i] = data[(i - options.size[0]) % len];\n      }\n    }\n  } else if (options.value === 'replicate') {\n    for (i = 0; i < cond; i++) {\n      if (i < options.size[0]) output[i] = data[0];\n      else if (i < options.size[0] + len) output[i] = data[i - options.size[0]];\n      else output[i] = data[len - 1];\n    }\n  } else if (options.value === 'symmetric') {\n    if (options.size[0] > len || options.size[1] > len) {\n      throw new RangeError(\n        'expanded value should not be bigger than the data length'\n      );\n    }\n    for (i = 0; i < cond; i++) {\n      if (i < options.size[0]) output[i] = data[options.size[0] - 1 - i];\n      else if (i < options.size[0] + len) output[i] = data[i - options.size[0]];\n      else output[i] = data[2 * len + options.size[0] - i - 1];\n    }\n  } else {\n    for (i = 0; i < cond; i++) {\n      if (i < options.size[0]) output[i] = options.value;\n      else if (i < options.size[0] + len) output[i] = data[i - options.size[0]];\n      else output[i] = options.value;\n    }\n  }\n\n  return output;\n}\n\n/**\n * Case when the entry is a matrix\n * @param data\n * @param options\n * @returns {Array}\n */\nfunction matrixCase(data, options) {\n  // var row = data.length;\n  // var col = data[0].length;\n  if (options.size[0] === undefined) {\n    options.size = [options.size, options.size, options.size, options.size];\n  }\n  throw new Error('matrix not supported yet, sorry');\n}\n\n/**\n * Pads and array\n * @param {Array <number>} data\n * @param {object} options\n */\nfunction padArray(data, options) {\n  options = Object.assign({}, defaultOptions, options);\n  if (Array.isArray(data)) {\n    if (Array.isArray(data[0])) return matrixCase(data, options);\n    else return arrayCase(data, options);\n  } else {\n    throw new TypeError('data should be an array');\n  }\n}\n\nmodule.exports = padArray;\n","import { Matrix, MatrixTransposeView, inverse } from 'ml-matrix';\nimport padArray from 'ml-pad-array';\nfunction factorial(n) {\n    let r = 1;\n    while (n > 0)\n        r *= n--;\n    return r;\n}\nexport default function savitzkyGolay(data, h, options = {}) {\n    const { windowSize = 5, derivative = 1, polynomial = 2, pad = 'none', padValue = 'replicate', } = options;\n    if (windowSize % 2 === 0 || windowSize < 5 || !Number.isInteger(windowSize)) {\n        throw new RangeError('Invalid window size (should be odd and at least 5 integer number)');\n    }\n    if (derivative < 0 || !Number.isInteger(derivative)) {\n        throw new RangeError('Derivative should be a positive integer');\n    }\n    if (polynomial < 1 || !Number.isInteger(polynomial)) {\n        throw new RangeError('Polynomial should be a positive integer');\n    }\n    let C, norm;\n    let step = Math.floor(windowSize / 2);\n    if (pad === 'pre') {\n        data = padArray(data, { size: step, value: padValue });\n    }\n    let ans = new Array(data.length - 2 * step);\n    if (windowSize === 5 &&\n        polynomial === 2 &&\n        (derivative === 1 || derivative === 2)) {\n        if (derivative === 1) {\n            C = [-2, -1, 0, 1, 2];\n            norm = 10;\n        }\n        else {\n            C = [2, -1, -2, -1, 2];\n            norm = 7;\n        }\n    }\n    else {\n        let J = Matrix.ones(windowSize, polynomial + 1);\n        let inic = -(windowSize - 1) / 2;\n        for (let i = 0; i < J.rows; i++) {\n            for (let j = 0; j < J.columns; j++) {\n                if (inic + 1 !== 0 || j !== 0)\n                    J.set(i, j, Math.pow(inic + i, j));\n            }\n        }\n        let Jtranspose = new MatrixTransposeView(J);\n        let Jinv = inverse(Jtranspose.mmul(J));\n        C = Jinv.mmul(Jtranspose);\n        C = C.getRow(derivative);\n        norm = 1 / factorial(derivative);\n    }\n    let det = norm * Math.pow(h, derivative);\n    for (let k = 0; k < data.length - 2 * step; k++) {\n        let d = 0;\n        for (let l = 0; l < C.length; l++)\n            d += (C[l] * data[l + k]) / det;\n        ans[k] = d;\n    }\n    if (pad === 'post') {\n        ans = padArray(ans, { size: step, value: padValue });\n    }\n    return ans;\n}\n//# sourceMappingURL=index.js.map","'use strict';\n\nfunction compareNumbers(a, b) {\n    return a - b;\n}\n\n/**\n * Computes the sum of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.sum = function sum(values) {\n    var sum = 0;\n    for (var i = 0; i < values.length; i++) {\n        sum += values[i];\n    }\n    return sum;\n};\n\n/**\n * Computes the maximum of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.max = function max(values) {\n    var max = values[0];\n    var l = values.length;\n    for (var i = 1; i < l; i++) {\n        if (values[i] > max) max = values[i];\n    }\n    return max;\n};\n\n/**\n * Computes the minimum of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.min = function min(values) {\n    var min = values[0];\n    var l = values.length;\n    for (var i = 1; i < l; i++) {\n        if (values[i] < min) min = values[i];\n    }\n    return min;\n};\n\n/**\n * Computes the min and max of the given values\n * @param {Array} values\n * @returns {{min: number, max: number}}\n */\nexports.minMax = function minMax(values) {\n    var min = values[0];\n    var max = values[0];\n    var l = values.length;\n    for (var i = 1; i < l; i++) {\n        if (values[i] < min) min = values[i];\n        if (values[i] > max) max = values[i];\n    }\n    return {\n        min: min,\n        max: max\n    };\n};\n\n/**\n * Computes the arithmetic mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.arithmeticMean = function arithmeticMean(values) {\n    var sum = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        sum += values[i];\n    }\n    return sum / l;\n};\n\n/**\n * {@link arithmeticMean}\n */\nexports.mean = exports.arithmeticMean;\n\n/**\n * Computes the geometric mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.geometricMean = function geometricMean(values) {\n    var mul = 1;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        mul *= values[i];\n    }\n    return Math.pow(mul, 1 / l);\n};\n\n/**\n * Computes the mean of the log of the given values\n * If the return value is exponentiated, it gives the same result as the\n * geometric mean.\n * @param {Array} values\n * @returns {number}\n */\nexports.logMean = function logMean(values) {\n    var lnsum = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        lnsum += Math.log(values[i]);\n    }\n    return lnsum / l;\n};\n\n/**\n * Computes the weighted grand mean for a list of means and sample sizes\n * @param {Array} means - Mean values for each set of samples\n * @param {Array} samples - Number of original values for each set of samples\n * @returns {number}\n */\nexports.grandMean = function grandMean(means, samples) {\n    var sum = 0;\n    var n = 0;\n    var l = means.length;\n    for (var i = 0; i < l; i++) {\n        sum += samples[i] * means[i];\n        n += samples[i];\n    }\n    return sum / n;\n};\n\n/**\n * Computes the truncated mean of the given values using a given percentage\n * @param {Array} values\n * @param {number} percent - The percentage of values to keep (range: [0,1])\n * @param {boolean} [alreadySorted=false]\n * @returns {number}\n */\nexports.truncatedMean = function truncatedMean(values, percent, alreadySorted) {\n    if (alreadySorted === undefined) alreadySorted = false;\n    if (!alreadySorted) {\n        values = [].concat(values).sort(compareNumbers);\n    }\n    var l = values.length;\n    var k = Math.floor(l * percent);\n    var sum = 0;\n    for (var i = k; i < (l - k); i++) {\n        sum += values[i];\n    }\n    return sum / (l - 2 * k);\n};\n\n/**\n * Computes the harmonic mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.harmonicMean = function harmonicMean(values) {\n    var sum = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        if (values[i] === 0) {\n            throw new RangeError('value at index ' + i + 'is zero');\n        }\n        sum += 1 / values[i];\n    }\n    return l / sum;\n};\n\n/**\n * Computes the contraharmonic mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.contraHarmonicMean = function contraHarmonicMean(values) {\n    var r1 = 0;\n    var r2 = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        r1 += values[i] * values[i];\n        r2 += values[i];\n    }\n    if (r2 < 0) {\n        throw new RangeError('sum of values is negative');\n    }\n    return r1 / r2;\n};\n\n/**\n * Computes the median of the given values\n * @param {Array} values\n * @param {boolean} [alreadySorted=false]\n * @returns {number}\n */\nexports.median = function median(values, alreadySorted) {\n    if (alreadySorted === undefined) alreadySorted = false;\n    if (!alreadySorted) {\n        values = [].concat(values).sort(compareNumbers);\n    }\n    var l = values.length;\n    var half = Math.floor(l / 2);\n    if (l % 2 === 0) {\n        return (values[half - 1] + values[half]) * 0.5;\n    } else {\n        return values[half];\n    }\n};\n\n/**\n * Computes the variance of the given values\n * @param {Array} values\n * @param {boolean} [unbiased=true] - if true, divide by (n-1); if false, divide by n.\n * @returns {number}\n */\nexports.variance = function variance(values, unbiased) {\n    if (unbiased === undefined) unbiased = true;\n    var theMean = exports.mean(values);\n    var theVariance = 0;\n    var l = values.length;\n\n    for (var i = 0; i < l; i++) {\n        var x = values[i] - theMean;\n        theVariance += x * x;\n    }\n\n    if (unbiased) {\n        return theVariance / (l - 1);\n    } else {\n        return theVariance / l;\n    }\n};\n\n/**\n * Computes the standard deviation of the given values\n * @param {Array} values\n * @param {boolean} [unbiased=true] - if true, divide by (n-1); if false, divide by n.\n * @returns {number}\n */\nexports.standardDeviation = function standardDeviation(values, unbiased) {\n    return Math.sqrt(exports.variance(values, unbiased));\n};\n\nexports.standardError = function standardError(values) {\n    return exports.standardDeviation(values) / Math.sqrt(values.length);\n};\n\n/**\n * IEEE Transactions on biomedical engineering, vol. 52, no. 1, january 2005, p. 76-\n * Calculate the standard deviation via the Median of the absolute deviation\n *  The formula for the standard deviation only holds for Gaussian random variables.\n * @returns {{mean: number, stdev: number}}\n */\nexports.robustMeanAndStdev = function robustMeanAndStdev(y) {\n    var mean = 0, stdev = 0;\n    var length = y.length, i = 0;\n    for (i = 0; i < length; i++) {\n        mean += y[i];\n    }\n    mean /= length;\n    var averageDeviations = new Array(length);\n    for (i = 0; i < length; i++)\n        averageDeviations[i] = Math.abs(y[i] - mean);\n    averageDeviations.sort(compareNumbers);\n    if (length % 2 === 1) {\n        stdev = averageDeviations[(length - 1) / 2] / 0.6745;\n    } else {\n        stdev = 0.5 * (averageDeviations[length / 2] + averageDeviations[length / 2 - 1]) / 0.6745;\n    }\n\n    return {\n        mean: mean,\n        stdev: stdev\n    };\n};\n\nexports.quartiles = function quartiles(values, alreadySorted) {\n    if (typeof (alreadySorted) === 'undefined') alreadySorted = false;\n    if (!alreadySorted) {\n        values = [].concat(values).sort(compareNumbers);\n    }\n\n    var quart = values.length / 4;\n    var q1 = values[Math.ceil(quart) - 1];\n    var q2 = exports.median(values, true);\n    var q3 = values[Math.ceil(quart * 3) - 1];\n\n    return {q1: q1, q2: q2, q3: q3};\n};\n\nexports.pooledStandardDeviation = function pooledStandardDeviation(samples, unbiased) {\n    return Math.sqrt(exports.pooledVariance(samples, unbiased));\n};\n\nexports.pooledVariance = function pooledVariance(samples, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var sum = 0;\n    var length = 0, l = samples.length;\n    for (var i = 0; i < l; i++) {\n        var values = samples[i];\n        var vari = exports.variance(values);\n\n        sum += (values.length - 1) * vari;\n\n        if (unbiased)\n            length += values.length - 1;\n        else\n            length += values.length;\n    }\n    return sum / length;\n};\n\nexports.mode = function mode(values) {\n    var l = values.length,\n        itemCount = new Array(l),\n        i;\n    for (i = 0; i < l; i++) {\n        itemCount[i] = 0;\n    }\n    var itemArray = new Array(l);\n    var count = 0;\n\n    for (i = 0; i < l; i++) {\n        var index = itemArray.indexOf(values[i]);\n        if (index >= 0)\n            itemCount[index]++;\n        else {\n            itemArray[count] = values[i];\n            itemCount[count] = 1;\n            count++;\n        }\n    }\n\n    var maxValue = 0, maxIndex = 0;\n    for (i = 0; i < count; i++) {\n        if (itemCount[i] > maxValue) {\n            maxValue = itemCount[i];\n            maxIndex = i;\n        }\n    }\n\n    return itemArray[maxIndex];\n};\n\nexports.covariance = function covariance(vector1, vector2, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var mean1 = exports.mean(vector1);\n    var mean2 = exports.mean(vector2);\n\n    if (vector1.length !== vector2.length)\n        throw 'Vectors do not have the same dimensions';\n\n    var cov = 0, l = vector1.length;\n    for (var i = 0; i < l; i++) {\n        var x = vector1[i] - mean1;\n        var y = vector2[i] - mean2;\n        cov += x * y;\n    }\n\n    if (unbiased)\n        return cov / (l - 1);\n    else\n        return cov / l;\n};\n\nexports.skewness = function skewness(values, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var theMean = exports.mean(values);\n\n    var s2 = 0, s3 = 0, l = values.length;\n    for (var i = 0; i < l; i++) {\n        var dev = values[i] - theMean;\n        s2 += dev * dev;\n        s3 += dev * dev * dev;\n    }\n    var m2 = s2 / l;\n    var m3 = s3 / l;\n\n    var g = m3 / (Math.pow(m2, 3 / 2.0));\n    if (unbiased) {\n        var a = Math.sqrt(l * (l - 1));\n        var b = l - 2;\n        return (a / b) * g;\n    } else {\n        return g;\n    }\n};\n\nexports.kurtosis = function kurtosis(values, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var theMean = exports.mean(values);\n    var n = values.length, s2 = 0, s4 = 0;\n\n    for (var i = 0; i < n; i++) {\n        var dev = values[i] - theMean;\n        s2 += dev * dev;\n        s4 += dev * dev * dev * dev;\n    }\n    var m2 = s2 / n;\n    var m4 = s4 / n;\n\n    if (unbiased) {\n        var v = s2 / (n - 1);\n        var a = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3));\n        var b = s4 / (v * v);\n        var c = ((n - 1) * (n - 1)) / ((n - 2) * (n - 3));\n\n        return a * b - 3 * c;\n    } else {\n        return m4 / (m2 * m2) - 3;\n    }\n};\n\nexports.entropy = function entropy(values, eps) {\n    if (typeof (eps) === 'undefined') eps = 0;\n    var sum = 0, l = values.length;\n    for (var i = 0; i < l; i++)\n        sum += values[i] * Math.log(values[i] + eps);\n    return -sum;\n};\n\nexports.weightedMean = function weightedMean(values, weights) {\n    var sum = 0, l = values.length;\n    for (var i = 0; i < l; i++)\n        sum += values[i] * weights[i];\n    return sum;\n};\n\nexports.weightedStandardDeviation = function weightedStandardDeviation(values, weights) {\n    return Math.sqrt(exports.weightedVariance(values, weights));\n};\n\nexports.weightedVariance = function weightedVariance(values, weights) {\n    var theMean = exports.weightedMean(values, weights);\n    var vari = 0, l = values.length;\n    var a = 0, b = 0;\n\n    for (var i = 0; i < l; i++) {\n        var z = values[i] - theMean;\n        var w = weights[i];\n\n        vari += w * (z * z);\n        b += w;\n        a += w * w;\n    }\n\n    return vari * (b / (b * b - a));\n};\n\nexports.center = function center(values, inPlace) {\n    if (typeof (inPlace) === 'undefined') inPlace = false;\n\n    var result = values;\n    if (!inPlace)\n        result = [].concat(values);\n\n    var theMean = exports.mean(result), l = result.length;\n    for (var i = 0; i < l; i++)\n        result[i] -= theMean;\n};\n\nexports.standardize = function standardize(values, standardDev, inPlace) {\n    if (typeof (standardDev) === 'undefined') standardDev = exports.standardDeviation(values);\n    if (typeof (inPlace) === 'undefined') inPlace = false;\n    var l = values.length;\n    var result = inPlace ? values : new Array(l);\n    for (var i = 0; i < l; i++)\n        result[i] = values[i] / standardDev;\n    return result;\n};\n\nexports.cumulativeSum = function cumulativeSum(array) {\n    var l = array.length;\n    var result = new Array(l);\n    result[0] = array[0];\n    for (var i = 1; i < l; i++)\n        result[i] = result[i - 1] + array[i];\n    return result;\n};\n","/*\nThe MIT License (MIT)\nCopyright © 2006-2007 Kevin C. Olbrich\nCopyright © 2010-2016 LIM SAS (http://lim.eu) - Julien Sanchez\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Qty = factory());\n}(this, (function () { 'use strict';\n\n  /**\n   * Tests if a value is a string\n   *\n   * @param {*} value - Value to test\n   *\n   * @returns {boolean} true if value is a string, false otherwise\n   */\n  function isString(value) {\n    return typeof value === \"string\" || value instanceof String;\n  }\n\n  /*\n   * Prefer stricter Number.isFinite if currently supported.\n   * To be dropped when ES6 is finalized. Obsolete browsers will\n   * have to use ES6 polyfills.\n   */\n  var isFiniteImpl = Number.isFinite || window.isFinite;\n  /**\n   * Tests if a value is a number\n   *\n   * @param {*} value - Value to test\n   *\n   * @returns {boolean} true if value is a number, false otherwise\n   */\n  function isNumber(value) {\n    // Number.isFinite allows not to consider NaN or '1' as numbers\n    return isFiniteImpl(value);\n  }\n\n  /*\n   * Identity function\n   */\n  function identity(value) {\n    return value;\n  }\n\n  /**\n   * Returns unique strings from list\n   *\n   * @param {string[]} strings - array of strings\n   *\n   *\n   * @returns {string[]} a new array of strings without duplicates\n   */\n  function uniq(strings) {\n    var seen = {};\n    return strings.filter(function(item) {\n      return seen.hasOwnProperty(item) ? false : (seen[item] = true);\n    });\n  }\n\n  function compareArray(array1, array2) {\n    if (array2.length !== array1.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array2[i].compareArray) {\n        if (!array2[i].compareArray(array1[i])) {\n          return false;\n        }\n      }\n      if (array2[i] !== array1[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  function assign(target, properties) {\n    Object.keys(properties).forEach(function(key) {\n      target[key] = properties[key];\n    });\n  }\n\n  /**\n   * Safely multiplies numbers while avoiding floating errors\n   * like 0.1 * 0.1 => 0.010000000000000002\n   *\n   * @param {...number} numbers - numbers to multiply\n   *\n   * @returns {number} result\n   */\n  function mulSafe() {\n    var result = 1, decimals = 0;\n    for (var i = 0; i < arguments.length; i++) {\n      var arg = arguments[i];\n      decimals = decimals + getFractional(arg);\n      result *= arg;\n    }\n\n    return decimals !== 0 ? round(result, decimals) : result;\n  }\n\n  /**\n   * Safely divides two numbers while avoiding floating errors\n   * like 0.3 / 0.05 => 5.999999999999999\n   *\n   * @returns {number} result\n   * @param {number} num Numerator\n   * @param {number} den Denominator\n   */\n  function divSafe(num, den) {\n    if (den === 0) {\n      throw new Error(\"Divide by zero\");\n    }\n\n    var factor = Math.pow(10, getFractional(den));\n    var invDen = factor / (factor * den);\n\n    return mulSafe(num, invDen);\n  }\n\n  /**\n   * Rounds value at the specified number of decimals\n   *\n   * @param {number} val - value to round\n   * @param {number} decimals - number of decimals\n   *\n   * @returns {number} rounded number\n   */\n  function round(val, decimals) {\n    return Math.round(val * Math.pow(10, decimals)) / Math.pow(10, decimals);\n  }\n\n  function getFractional(num) {\n    // Check for NaNs or Infinities\n    if (!isFinite(num)) {\n      return 0;\n    }\n\n    // Faster than parsing strings\n    // http://jsperf.com/count-decimals/2\n    var count = 0;\n    while (num % 1 !== 0) {\n      num *= 10;\n      count++;\n    }\n    return count;\n  }\n\n  /**\n   * Custom error type definition\n   * @constructor\n   */\n  function QtyError() {\n    var err;\n    if (!this) { // Allows to instantiate QtyError without new()\n      err = Object.create(QtyError.prototype);\n      QtyError.apply(err, arguments);\n      return err;\n    }\n    err = Error.apply(this, arguments);\n    this.name = \"QtyError\";\n    this.message = err.message;\n    this.stack = err.stack;\n  }\n  QtyError.prototype = Object.create(Error.prototype, {constructor: { value: QtyError }});\n\n  /*\n   * Throws incompatible units error\n   * @param {string} left - units\n   * @param {string} right - units incompatible with first argument\n   * @throws \"Incompatible units\" error\n   */\n  function throwIncompatibleUnits(left, right) {\n    throw new QtyError(\"Incompatible units: \" + left + \" and \" + right);\n  }\n\n  var UNITS = {\n    /* prefixes */\n    \"<googol>\" : [[\"googol\"], 1e100, \"prefix\"],\n    \"<kibi>\"  :  [[\"Ki\",\"Kibi\",\"kibi\"], Math.pow(2,10), \"prefix\"],\n    \"<mebi>\"  :  [[\"Mi\",\"Mebi\",\"mebi\"], Math.pow(2,20), \"prefix\"],\n    \"<gibi>\"  :  [[\"Gi\",\"Gibi\",\"gibi\"], Math.pow(2,30), \"prefix\"],\n    \"<tebi>\"  :  [[\"Ti\",\"Tebi\",\"tebi\"], Math.pow(2,40), \"prefix\"],\n    \"<pebi>\"  :  [[\"Pi\",\"Pebi\",\"pebi\"], Math.pow(2,50), \"prefix\"],\n    \"<exi>\"   :  [[\"Ei\",\"Exi\",\"exi\"], Math.pow(2,60), \"prefix\"],\n    \"<zebi>\"  :  [[\"Zi\",\"Zebi\",\"zebi\"], Math.pow(2,70), \"prefix\"],\n    \"<yebi>\"  :  [[\"Yi\",\"Yebi\",\"yebi\"], Math.pow(2,80), \"prefix\"],\n    \"<yotta>\" :  [[\"Y\",\"Yotta\",\"yotta\"], 1e24, \"prefix\"],\n    \"<zetta>\" :  [[\"Z\",\"Zetta\",\"zetta\"], 1e21, \"prefix\"],\n    \"<exa>\"   :  [[\"E\",\"Exa\",\"exa\"], 1e18, \"prefix\"],\n    \"<peta>\"  :  [[\"P\",\"Peta\",\"peta\"], 1e15, \"prefix\"],\n    \"<tera>\"  :  [[\"T\",\"Tera\",\"tera\"], 1e12, \"prefix\"],\n    \"<giga>\"  :  [[\"G\",\"Giga\",\"giga\"], 1e9, \"prefix\"],\n    \"<mega>\"  :  [[\"M\",\"Mega\",\"mega\"], 1e6, \"prefix\"],\n    \"<kilo>\"  :  [[\"k\",\"kilo\"], 1e3, \"prefix\"],\n    \"<hecto>\" :  [[\"h\",\"Hecto\",\"hecto\"], 1e2, \"prefix\"],\n    \"<deca>\"  :  [[\"da\",\"Deca\",\"deca\",\"deka\"], 1e1, \"prefix\"],\n    \"<deci>\"  :  [[\"d\",\"Deci\",\"deci\"], 1e-1, \"prefix\"],\n    \"<centi>\"  : [[\"c\",\"Centi\",\"centi\"], 1e-2, \"prefix\"],\n    \"<milli>\" :  [[\"m\",\"Milli\",\"milli\"], 1e-3, \"prefix\"],\n    \"<micro>\"  : [\n      [\"u\",\"\\u03BC\"/*µ as greek letter*/,\"\\u00B5\"/*µ as micro sign*/,\"Micro\",\"mc\",\"micro\"],\n      1e-6,\n      \"prefix\"\n    ],\n    \"<nano>\"  :  [[\"n\",\"Nano\",\"nano\"], 1e-9, \"prefix\"],\n    \"<pico>\"  :  [[\"p\",\"Pico\",\"pico\"], 1e-12, \"prefix\"],\n    \"<femto>\" :  [[\"f\",\"Femto\",\"femto\"], 1e-15, \"prefix\"],\n    \"<atto>\"  :  [[\"a\",\"Atto\",\"atto\"], 1e-18, \"prefix\"],\n    \"<zepto>\" :  [[\"z\",\"Zepto\",\"zepto\"], 1e-21, \"prefix\"],\n    \"<yocto>\" :  [[\"y\",\"Yocto\",\"yocto\"], 1e-24, \"prefix\"],\n\n    \"<1>\"     :  [[\"1\", \"<1>\"], 1, \"\"],\n    /* length units */\n    \"<meter>\" :  [[\"m\",\"meter\",\"meters\",\"metre\",\"metres\"], 1.0, \"length\", [\"<meter>\"] ],\n    \"<inch>\"  :  [[\"in\",\"inch\",\"inches\",\"\\\"\"], 0.0254, \"length\", [\"<meter>\"]],\n    \"<foot>\"  :  [[\"ft\",\"foot\",\"feet\",\"'\"], 0.3048, \"length\", [\"<meter>\"]],\n    \"<yard>\"  :  [[\"yd\",\"yard\",\"yards\"], 0.9144, \"length\", [\"<meter>\"]],\n    \"<mile>\"  :  [[\"mi\",\"mile\",\"miles\"], 1609.344, \"length\", [\"<meter>\"]],\n    \"<naut-mile>\" : [[\"nmi\",\"naut-mile\"], 1852, \"length\", [\"<meter>\"]],\n    \"<league>\":  [[\"league\",\"leagues\"], 4828, \"length\", [\"<meter>\"]],\n    \"<furlong>\": [[\"furlong\",\"furlongs\"], 201.2, \"length\", [\"<meter>\"]],\n    \"<rod>\"   :  [[\"rd\",\"rod\",\"rods\"], 5.029, \"length\", [\"<meter>\"]],\n    \"<mil>\"   :  [[\"mil\",\"mils\"], 0.0000254, \"length\", [\"<meter>\"]],\n    \"<angstrom>\"  :[[\"ang\",\"angstrom\",\"angstroms\"], 1e-10, \"length\", [\"<meter>\"]],\n    \"<fathom>\" : [[\"fathom\",\"fathoms\"], 1.829, \"length\", [\"<meter>\"]],\n    \"<pica>\"  : [[\"pica\",\"picas\"], 0.00423333333, \"length\", [\"<meter>\"]],\n    \"<point>\" : [[\"pt\",\"point\",\"points\"], 0.000352777778, \"length\", [\"<meter>\"]],\n    \"<redshift>\" : [[\"z\",\"red-shift\", \"redshift\"], 1.302773e26, \"length\", [\"<meter>\"]],\n    \"<AU>\"    : [[\"AU\",\"astronomical-unit\"], 149597900000, \"length\", [\"<meter>\"]],\n    \"<light-second>\":[[\"ls\",\"light-second\"], 299792500, \"length\", [\"<meter>\"]],\n    \"<light-minute>\":[[\"lmin\",\"light-minute\"], 17987550000, \"length\", [\"<meter>\"]],\n    \"<light-year>\" : [[\"ly\",\"light-year\"], 9460528000000000, \"length\", [\"<meter>\"]],\n    \"<parsec>\"  : [[\"pc\",\"parsec\",\"parsecs\"], 30856780000000000, \"length\", [\"<meter>\"]],\n    \"<datamile>\"  :  [[\"DM\",\"datamile\"], 1828.8, \"length\", [\"<meter>\"]],\n\n    /* mass */\n    \"<kilogram>\" : [[\"kg\",\"kilogram\",\"kilograms\"], 1.0, \"mass\", [\"<kilogram>\"]],\n    \"<AMU>\" : [[\"u\",\"AMU\",\"amu\"], 1.660538921e-27, \"mass\", [\"<kilogram>\"]],\n    \"<dalton>\" : [[\"Da\",\"Dalton\",\"Daltons\",\"dalton\",\"daltons\"], 1.660538921e-27, \"mass\", [\"<kilogram>\"]],\n    \"<slug>\" : [[\"slug\",\"slugs\"], 14.5939029, \"mass\", [\"<kilogram>\"]],\n    \"<short-ton>\" : [[\"tn\",\"ton\",\"short-ton\"], 907.18474, \"mass\", [\"<kilogram>\"]],\n    \"<metric-ton>\":[[\"tonne\",\"metric-ton\"], 1000, \"mass\", [\"<kilogram>\"]],\n    \"<carat>\" : [[\"ct\",\"carat\",\"carats\"], 0.0002, \"mass\", [\"<kilogram>\"]],\n    \"<pound>\" : [[\"lbs\",\"lb\",\"pound\",\"pounds\",\"#\"], 0.45359237, \"mass\", [\"<kilogram>\"]],\n    \"<ounce>\" : [[\"oz\",\"ounce\",\"ounces\"], 0.0283495231, \"mass\", [\"<kilogram>\"]],\n    \"<gram>\"    :  [[\"g\",\"gram\",\"grams\",\"gramme\",\"grammes\"], 1e-3, \"mass\", [\"<kilogram>\"]],\n    \"<grain>\" : [[\"grain\",\"grains\",\"gr\"], 6.479891e-5, \"mass\", [\"<kilogram>\"]],\n    \"<dram>\"  : [[\"dram\",\"drams\",\"dr\"], 0.0017718452, \"mass\",[\"<kilogram>\"]],\n    \"<stone>\" : [[\"stone\",\"stones\",\"st\"],6.35029318, \"mass\",[\"<kilogram>\"]],\n\n    /* area */\n    \"<hectare>\":[[\"hectare\"], 10000, \"area\", [\"<meter>\",\"<meter>\"]],\n    \"<acre>\":[[\"acre\",\"acres\"], 4046.85642, \"area\", [\"<meter>\",\"<meter>\"]],\n    \"<sqft>\":[[\"sqft\"], 1, \"area\", [\"<foot>\",\"<foot>\"]],\n\n    /* volume */\n    \"<liter>\" : [[\"l\",\"L\",\"liter\",\"liters\",\"litre\",\"litres\"], 0.001, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<gallon>\":  [[\"gal\",\"gallon\",\"gallons\"], 0.0037854118, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<gallon-imp>\":  [[\"galimp\",\"gallon-imp\",\"gallons-imp\"], 0.0045460900, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<quart>\":  [[\"qt\",\"quart\",\"quarts\"], 0.00094635295, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<pint>\":  [[\"pt\",\"pint\",\"pints\"], 0.000473176475, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<pint-imp>\":  [[\"ptimp\",\"pint-imp\",\"pints-imp\"], 5.6826125e-4, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<cup>\":  [[\"cu\",\"cup\",\"cups\"], 0.000236588238, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<fluid-ounce>\":  [[\"floz\",\"fluid-ounce\",\"fluid-ounces\"], 2.95735297e-5, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<fluid-ounce-imp>\":  [[\"flozimp\", \"floz-imp\",\"fluid-ounce-imp\",\"fluid-ounces-imp\"], 2.84130625e-5, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<tablespoon>\":  [[\"tb\",\"tbsp\",\"tbs\",\"tablespoon\",\"tablespoons\"], 1.47867648e-5, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<teaspoon>\":  [[\"tsp\",\"teaspoon\",\"teaspoons\"], 4.92892161e-6, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<bushel>\":  [[\"bu\",\"bsh\",\"bushel\",\"bushels\"], 0.035239072, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<oilbarrel>\":  [[\"bbl\",\"oilbarrel\", \"oilbarrels\", \"oil-barrel\",\"oil-barrels\"], 0.158987294928, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<beerbarrel>\":  [[\"bl\",\"bl-us\",\"beerbarrel\", \"beerbarrels\", \"beer-barrel\",\"beer-barrels\"], 0.1173477658, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<beerbarrel-imp>\":  [[\"blimp\",\"bl-imp\",\"beerbarrel-imp\", \"beerbarrels-imp\", \"beer-barrel-imp\",\"beer-barrels-imp\"], 0.16365924, \"volume\", [\"<meter>\",\"<meter>\",\"<meter>\"]],\n\n    /* speed */\n    \"<kph>\" : [[\"kph\"], 0.277777778, \"speed\", [\"<meter>\"], [\"<second>\"]],\n    \"<mph>\" : [[\"mph\"], 0.44704, \"speed\", [\"<meter>\"], [\"<second>\"]],\n    \"<knot>\" : [[\"kt\",\"kn\",\"kts\",\"knot\",\"knots\"], 0.514444444, \"speed\", [\"<meter>\"], [\"<second>\"]],\n    \"<fps>\"  : [[\"fps\"], 0.3048, \"speed\", [\"<meter>\"], [\"<second>\"]],\n\n    /* acceleration */\n    \"<gee>\" : [[\"gee\"], 9.80665, \"acceleration\", [\"<meter>\"], [\"<second>\",\"<second>\"]],\n    \"<Gal>\" : [[\"Gal\"], 1e-2, \"acceleration\", [\"<meter>\"], [\"<second>\",\"<second>\"]],\n\n    /* temperature_difference */\n    \"<kelvin>\" : [[\"degK\",\"kelvin\"], 1.0, \"temperature\", [\"<kelvin>\"]],\n    \"<celsius>\" : [[\"degC\",\"celsius\",\"celsius\",\"centigrade\"], 1.0, \"temperature\", [\"<kelvin>\"]],\n    \"<fahrenheit>\" : [[\"degF\",\"fahrenheit\"], 5 / 9, \"temperature\", [\"<kelvin>\"]],\n    \"<rankine>\" : [[\"degR\",\"rankine\"], 5 / 9, \"temperature\", [\"<kelvin>\"]],\n    \"<temp-K>\"  : [[\"tempK\",\"temp-K\"], 1.0, \"temperature\", [\"<temp-K>\"]],\n    \"<temp-C>\"  : [[\"tempC\",\"temp-C\"], 1.0, \"temperature\", [\"<temp-K>\"]],\n    \"<temp-F>\"  : [[\"tempF\",\"temp-F\"], 5 / 9, \"temperature\", [\"<temp-K>\"]],\n    \"<temp-R>\"  : [[\"tempR\",\"temp-R\"], 5 / 9, \"temperature\", [\"<temp-K>\"]],\n\n    /* time */\n    \"<second>\":  [[\"s\",\"sec\",\"secs\",\"second\",\"seconds\"], 1.0, \"time\", [\"<second>\"]],\n    \"<minute>\":  [[\"min\",\"mins\",\"minute\",\"minutes\"], 60.0, \"time\", [\"<second>\"]],\n    \"<hour>\":  [[\"h\",\"hr\",\"hrs\",\"hour\",\"hours\"], 3600.0, \"time\", [\"<second>\"]],\n    \"<day>\":  [[\"d\",\"day\",\"days\"], 3600 * 24, \"time\", [\"<second>\"]],\n    \"<week>\":  [[\"wk\",\"week\",\"weeks\"], 7 * 3600 * 24, \"time\", [\"<second>\"]],\n    \"<fortnight>\": [[\"fortnight\",\"fortnights\"], 1209600, \"time\", [\"<second>\"]],\n    \"<year>\":  [[\"y\",\"yr\",\"year\",\"years\",\"annum\"], 31556926, \"time\", [\"<second>\"]],\n    \"<decade>\":[[\"decade\",\"decades\"], 315569260, \"time\", [\"<second>\"]],\n    \"<century>\":[[\"century\",\"centuries\"], 3155692600, \"time\", [\"<second>\"]],\n\n    /* pressure */\n    \"<pascal>\" : [[\"Pa\",\"pascal\",\"Pascal\"], 1.0, \"pressure\", [\"<kilogram>\"],[\"<meter>\",\"<second>\",\"<second>\"]],\n    \"<bar>\" : [[\"bar\",\"bars\"], 100000, \"pressure\", [\"<kilogram>\"],[\"<meter>\",\"<second>\",\"<second>\"]],\n    \"<mmHg>\" : [[\"mmHg\"], 133.322368, \"pressure\", [\"<kilogram>\"],[\"<meter>\",\"<second>\",\"<second>\"]],\n    \"<inHg>\" : [[\"inHg\"], 3386.3881472, \"pressure\", [\"<kilogram>\"],[\"<meter>\",\"<second>\",\"<second>\"]],\n    \"<torr>\" : [[\"torr\"], 133.322368, \"pressure\", [\"<kilogram>\"],[\"<meter>\",\"<second>\",\"<second>\"]],\n    \"<atm>\" : [[\"atm\",\"ATM\",\"atmosphere\",\"atmospheres\"], 101325, \"pressure\", [\"<kilogram>\"],[\"<meter>\",\"<second>\",\"<second>\"]],\n    \"<psi>\" : [[\"psi\"], 6894.76, \"pressure\", [\"<kilogram>\"],[\"<meter>\",\"<second>\",\"<second>\"]],\n    \"<cmh2o>\" : [[\"cmH2O\",\"cmh2o\"], 98.0638, \"pressure\", [\"<kilogram>\"],[\"<meter>\",\"<second>\",\"<second>\"]],\n    \"<inh2o>\" : [[\"inH2O\",\"inh2o\"], 249.082052, \"pressure\", [\"<kilogram>\"],[\"<meter>\",\"<second>\",\"<second>\"]],\n\n    /* viscosity */\n    \"<poise>\"  : [[\"P\",\"poise\"], 0.1, \"viscosity\", [\"<kilogram>\"],[\"<meter>\",\"<second>\"] ],\n    \"<stokes>\" : [[\"St\",\"stokes\"], 1e-4, \"viscosity\", [\"<meter>\",\"<meter>\"], [\"<second>\"]],\n\n    /* substance */\n    \"<mole>\"  :  [[\"mol\",\"mole\"], 1.0, \"substance\", [\"<mole>\"]],\n\n    /* concentration */\n    \"<molar>\" : [[\"M\",\"molar\"], 1000, \"concentration\", [\"<mole>\"], [\"<meter>\",\"<meter>\",\"<meter>\"]],\n    \"<wtpercent>\"  : [[\"wt%\",\"wtpercent\"], 10, \"concentration\", [\"<kilogram>\"], [\"<meter>\",\"<meter>\",\"<meter>\"]],\n\n    /* activity */\n    \"<katal>\" :  [[\"kat\",\"katal\",\"Katal\"], 1.0, \"activity\", [\"<mole>\"], [\"<second>\"]],\n    \"<unit>\"  :  [[\"U\",\"enzUnit\",\"unit\"], 16.667e-16, \"activity\", [\"<mole>\"], [\"<second>\"]],\n\n    /* capacitance */\n    \"<farad>\" :  [[\"F\",\"farad\",\"Farad\"], 1.0, \"capacitance\", [\"<second>\",\"<second>\",\"<second>\",\"<second>\",\"<ampere>\",\"<ampere>\"], [\"<meter>\", \"<meter>\", \"<kilogram>\"]],\n\n    /* charge */\n    \"<coulomb>\" :  [[\"C\",\"coulomb\",\"Coulomb\"], 1.0, \"charge\", [\"<ampere>\",\"<second>\"]],\n    \"<Ah>\" :  [[\"Ah\"], 3600, \"charge\", [\"<ampere>\",\"<second>\"]],\n\n    /* current */\n    \"<ampere>\"  :  [[\"A\",\"Ampere\",\"ampere\",\"amp\",\"amps\"], 1.0, \"current\", [\"<ampere>\"]],\n\n    /* conductance */\n    \"<siemens>\" : [[\"S\",\"Siemens\",\"siemens\"], 1.0, \"conductance\", [\"<second>\",\"<second>\",\"<second>\",\"<ampere>\",\"<ampere>\"], [\"<kilogram>\",\"<meter>\",\"<meter>\"]],\n\n    /* inductance */\n    \"<henry>\" :  [[\"H\",\"Henry\",\"henry\"], 1.0, \"inductance\", [\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\",\"<ampere>\",\"<ampere>\"]],\n\n    /* potential */\n    \"<volt>\"  :  [[\"V\",\"Volt\",\"volt\",\"volts\"], 1.0, \"potential\", [\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\",\"<second>\",\"<ampere>\"]],\n\n    /* resistance */\n    \"<ohm>\" :  [\n      [\"Ohm\",\"ohm\",\"\\u03A9\"/*Ω as greek letter*/,\"\\u2126\"/*Ω as ohm sign*/],\n      1.0,\n      \"resistance\",\n      [\"<meter>\",\"<meter>\",\"<kilogram>\"],[\"<second>\",\"<second>\",\"<second>\",\"<ampere>\",\"<ampere>\"]\n    ],\n    /* magnetism */\n    \"<weber>\" : [[\"Wb\",\"weber\",\"webers\"], 1.0, \"magnetism\", [\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\",\"<ampere>\"]],\n    \"<tesla>\"  : [[\"T\",\"tesla\",\"teslas\"], 1.0, \"magnetism\", [\"<kilogram>\"], [\"<second>\",\"<second>\",\"<ampere>\"]],\n    \"<gauss>\" : [[\"G\",\"gauss\"], 1e-4, \"magnetism\",  [\"<kilogram>\"], [\"<second>\",\"<second>\",\"<ampere>\"]],\n    \"<maxwell>\" : [[\"Mx\",\"maxwell\",\"maxwells\"], 1e-8, \"magnetism\", [\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\",\"<ampere>\"]],\n    \"<oersted>\"  : [[\"Oe\",\"oersted\",\"oersteds\"], 250.0 / Math.PI, \"magnetism\", [\"<ampere>\"], [\"<meter>\"]],\n\n    /* energy */\n    \"<joule>\" :  [[\"J\",\"joule\",\"Joule\",\"joules\"], 1.0, \"energy\", [\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\"]],\n    \"<erg>\"   :  [[\"erg\",\"ergs\"], 1e-7, \"energy\", [\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\"]],\n    \"<btu>\"   :  [[\"BTU\",\"btu\",\"BTUs\"], 1055.056, \"energy\", [\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\"]],\n    \"<calorie>\" :  [[\"cal\",\"calorie\",\"calories\"], 4.18400, \"energy\",[\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\"]],\n    \"<Calorie>\" :  [[\"Cal\",\"Calorie\",\"Calories\"], 4184.00, \"energy\",[\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\"]],\n    \"<therm-US>\" : [[\"th\",\"therm\",\"therms\",\"Therm\",\"therm-US\"], 105480400, \"energy\",[\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\"]],\n    \"<Wh>\" : [[\"Wh\"], 3600, \"energy\",[\"<meter>\",\"<meter>\",\"<kilogram>\"], [\"<second>\",\"<second>\"]],\n\n    /* force */\n    \"<newton>\"  : [[\"N\",\"Newton\",\"newton\"], 1.0, \"force\", [\"<kilogram>\",\"<meter>\"], [\"<second>\",\"<second>\"]],\n    \"<dyne>\"  : [[\"dyn\",\"dyne\"], 1e-5, \"force\", [\"<kilogram>\",\"<meter>\"], [\"<second>\",\"<second>\"]],\n    \"<pound-force>\"  : [[\"lbf\",\"pound-force\"], 4.448222, \"force\", [\"<kilogram>\",\"<meter>\"], [\"<second>\",\"<second>\"]],\n\n    /* frequency */\n    \"<hertz>\" : [[\"Hz\",\"hertz\",\"Hertz\"], 1.0, \"frequency\", [\"<1>\"], [\"<second>\"]],\n\n    /* angle */\n    \"<radian>\" :[[\"rad\",\"radian\",\"radians\"], 1.0, \"angle\", [\"<radian>\"]],\n    \"<degree>\" :[[\"deg\",\"degree\",\"degrees\"], Math.PI / 180.0, \"angle\", [\"<radian>\"]],\n    \"<gradian>\"   :[[\"gon\",\"grad\",\"gradian\",\"grads\"], Math.PI / 200.0, \"angle\", [\"<radian>\"]],\n    \"<steradian>\"  : [[\"sr\",\"steradian\",\"steradians\"], 1.0, \"solid_angle\", [\"<steradian>\"]],\n\n    /* rotation */\n    \"<rotation>\" : [[\"rotation\"], 2.0 * Math.PI, \"angle\", [\"<radian>\"]],\n    \"<rpm>\"   :[[\"rpm\"], 2.0 * Math.PI / 60.0, \"angular_velocity\", [\"<radian>\"], [\"<second>\"]],\n\n    /* information */\n    \"<byte>\"  :[[\"B\",\"byte\",\"bytes\"], 1.0, \"information\", [\"<byte>\"]],\n    \"<bit>\"  :[[\"b\",\"bit\",\"bits\"], 0.125, \"information\", [\"<byte>\"]],\n\n    /* information rate */\n    \"<Bps>\" : [[\"Bps\"], 1.0, \"information_rate\", [\"<byte>\"], [\"<second>\"]],\n    \"<bps>\" : [[\"bps\"], 0.125, \"information_rate\", [\"<byte>\"], [\"<second>\"]],\n\n    /* currency */\n    \"<dollar>\":[[\"USD\",\"dollar\"], 1.0, \"currency\", [\"<dollar>\"]],\n    \"<cents>\" :[[\"cents\"], 0.01, \"currency\", [\"<dollar>\"]],\n\n    /* luminosity */\n    \"<candela>\" : [[\"cd\",\"candela\"], 1.0, \"luminosity\", [\"<candela>\"]],\n    \"<lumen>\" : [[\"lm\",\"lumen\"], 1.0, \"luminous_power\", [\"<candela>\",\"<steradian>\"]],\n    \"<lux>\" :[[\"lux\"], 1.0, \"illuminance\", [\"<candela>\",\"<steradian>\"], [\"<meter>\",\"<meter>\"]],\n\n    /* power */\n    \"<watt>\"  : [[\"W\",\"watt\",\"watts\"], 1.0, \"power\", [\"<kilogram>\",\"<meter>\",\"<meter>\"], [\"<second>\",\"<second>\",\"<second>\"]],\n    \"<volt-ampere>\"  : [[\"VA\",\"volt-ampere\"], 1.0, \"power\", [\"<kilogram>\",\"<meter>\",\"<meter>\"], [\"<second>\",\"<second>\",\"<second>\"]],\n    \"<volt-ampere-reactive>\"  : [[\"var\",\"Var\",\"VAr\",\"VAR\",\"volt-ampere-reactive\"], 1.0, \"power\", [\"<kilogram>\",\"<meter>\",\"<meter>\"], [\"<second>\",\"<second>\",\"<second>\"]],\n    \"<horsepower>\"  :  [[\"hp\",\"horsepower\"], 745.699872, \"power\", [\"<kilogram>\",\"<meter>\",\"<meter>\"], [\"<second>\",\"<second>\",\"<second>\"]],\n\n    /* radiation */\n    \"<gray>\" : [[\"Gy\",\"gray\",\"grays\"], 1.0, \"radiation\", [\"<meter>\",\"<meter>\"], [\"<second>\",\"<second>\"]],\n    \"<roentgen>\" : [[\"R\",\"roentgen\"], 0.009330, \"radiation\", [\"<meter>\",\"<meter>\"], [\"<second>\",\"<second>\"]],\n    \"<sievert>\" : [[\"Sv\",\"sievert\",\"sieverts\"], 1.0, \"radiation\", [\"<meter>\",\"<meter>\"], [\"<second>\",\"<second>\"]],\n    \"<becquerel>\" : [[\"Bq\",\"becquerel\",\"becquerels\"], 1.0, \"radiation\", [\"<1>\"],[\"<second>\"]],\n    \"<curie>\" : [[\"Ci\",\"curie\",\"curies\"], 3.7e10, \"radiation\", [\"<1>\"],[\"<second>\"]],\n\n    /* rate */\n    \"<cpm>\" : [[\"cpm\"], 1.0 / 60.0, \"rate\", [\"<count>\"],[\"<second>\"]],\n    \"<dpm>\" : [[\"dpm\"], 1.0 / 60.0, \"rate\", [\"<count>\"],[\"<second>\"]],\n    \"<bpm>\" : [[\"bpm\"], 1.0 / 60.0, \"rate\", [\"<count>\"],[\"<second>\"]],\n\n    /* resolution / typography */\n    \"<dot>\" : [[\"dot\",\"dots\"], 1, \"resolution\", [\"<each>\"]],\n    \"<pixel>\" : [[\"pixel\",\"px\"], 1, \"resolution\", [\"<each>\"]],\n    \"<ppi>\" : [[\"ppi\"], 1, \"resolution\", [\"<pixel>\"], [\"<inch>\"]],\n    \"<dpi>\" : [[\"dpi\"], 1, \"typography\", [\"<dot>\"], [\"<inch>\"]],\n\n    /* other */\n    \"<cell>\" : [[\"cells\",\"cell\"], 1, \"counting\", [\"<each>\"]],\n    \"<each>\" : [[\"each\"], 1.0, \"counting\", [\"<each>\"]],\n    \"<count>\" : [[\"count\"], 1.0, \"counting\", [\"<each>\"]],\n    \"<base-pair>\"  : [[\"bp\",\"base-pair\"], 1.0, \"counting\", [\"<each>\"]],\n    \"<nucleotide>\" : [[\"nt\",\"nucleotide\"], 1.0, \"counting\", [\"<each>\"]],\n    \"<molecule>\" : [[\"molecule\",\"molecules\"], 1.0, \"counting\", [\"<1>\"]],\n    \"<dozen>\" :  [[\"doz\",\"dz\",\"dozen\"],12.0,\"prefix_only\", [\"<each>\"]],\n    \"<percent>\": [[\"%\",\"percent\"], 0.01, \"prefix_only\", [\"<1>\"]],\n    \"<ppm>\" :  [[\"ppm\"],1e-6, \"prefix_only\", [\"<1>\"]],\n    \"<ppt>\" :  [[\"ppt\"],1e-9, \"prefix_only\", [\"<1>\"]],\n    \"<gross>\" :  [[\"gr\",\"gross\"],144.0, \"prefix_only\", [\"<dozen>\",\"<dozen>\"]],\n    \"<decibel>\"  : [[\"dB\",\"decibel\",\"decibels\"], 1.0, \"logarithmic\", [\"<decibel>\"]]\n  };\n\n  var BASE_UNITS = [\"<meter>\",\"<kilogram>\",\"<second>\",\"<mole>\", \"<ampere>\",\"<radian>\",\"<kelvin>\",\"<temp-K>\",\"<byte>\",\"<dollar>\",\"<candela>\",\"<each>\",\"<steradian>\",\"<decibel>\"];\n\n  var UNITY = \"<1>\";\n  var UNITY_ARRAY = [UNITY];\n\n  // Setup\n\n  /**\n   * Asserts unit definition is valid\n   *\n   * @param {string} unitDef - Name of unit to test\n   * @param {Object} definition - Definition of unit to test\n   *\n   * @returns {void}\n   * @throws {QtyError} if unit definition is not valid\n   */\n  function validateUnitDefinition(unitDef, definition) {\n    var scalar = definition[1];\n    var numerator = definition[3] || [];\n    var denominator = definition[4] || [];\n    if (!isNumber(scalar)) {\n      throw new QtyError(unitDef + \": Invalid unit definition. \" +\n                         \"'scalar' must be a number\");\n    }\n\n    numerator.forEach(function(unit) {\n      if (UNITS[unit] === undefined) {\n        throw new QtyError(unitDef + \": Invalid unit definition. \" +\n                           \"Unit \" + unit + \" in 'numerator' is not recognized\");\n      }\n    });\n\n    denominator.forEach(function(unit) {\n      if (UNITS[unit] === undefined) {\n        throw new QtyError(unitDef + \": Invalid unit definition. \" +\n                           \"Unit \" + unit + \" in 'denominator' is not recognized\");\n      }\n    });\n  }\n\n  var PREFIX_VALUES = {};\n  var PREFIX_MAP = {};\n  var UNIT_VALUES = {};\n  var UNIT_MAP = {};\n  var OUTPUT_MAP = {};\n  for (var unitDef in UNITS) {\n    if (UNITS.hasOwnProperty(unitDef)) {\n      var definition = UNITS[unitDef];\n      if (definition[2] === \"prefix\") {\n        PREFIX_VALUES[unitDef] = definition[1];\n        for (var i = 0; i < definition[0].length; i++) {\n          PREFIX_MAP[definition[0][i]] = unitDef;\n        }\n      }\n      else {\n        validateUnitDefinition(unitDef, definition);\n        UNIT_VALUES[unitDef] = {\n          scalar: definition[1],\n          numerator: definition[3],\n          denominator: definition[4]\n        };\n        for (var j = 0; j < definition[0].length; j++) {\n          UNIT_MAP[definition[0][j]] = unitDef;\n        }\n      }\n      OUTPUT_MAP[unitDef] = definition[0][0];\n    }\n  }\n\n  /**\n   * Returns a list of available units of kind\n   *\n   * @param {string} [kind] - kind of units\n   * @returns {array} names of units\n   * @throws {QtyError} if kind is unknown\n   */\n  function getUnits(kind) {\n    var i;\n    var units = [];\n    var unitKeys = Object.keys(UNITS);\n    if (typeof kind === \"undefined\") {\n      for (i = 0; i < unitKeys.length; i++) {\n        if ([\"\", \"prefix\"].indexOf(UNITS[unitKeys[i]][2]) === -1) {\n          units.push(unitKeys[i].substr(1, unitKeys[i].length - 2));\n        }\n      }\n    }\n    else if (this.getKinds().indexOf(kind) === -1) {\n      throw new QtyError(\"Kind not recognized\");\n    }\n    else {\n      for (i = 0; i < unitKeys.length; i++) {\n        if (UNITS[unitKeys[i]][2] === kind) {\n          units.push(unitKeys[i].substr(1, unitKeys[i].length - 2));\n        }\n      }\n    }\n\n    return units.sort(function(a, b) {\n      if (a.toLowerCase() < b.toLowerCase()) {\n        return -1;\n      }\n      if (a.toLowerCase() > b.toLowerCase()) {\n        return 1;\n      }\n      return 0;\n    });\n  }\n\n  /**\n   * Returns a list of alternative names for a unit\n   *\n   * @param {string} unitName - name of unit\n   * @returns {string[]} aliases for unit\n   * @throws {QtyError} if unit is unknown\n   */\n  function getAliases(unitName) {\n    if (!UNIT_MAP[unitName]) {\n      throw new QtyError(\"Unit not recognized\");\n    }\n    return UNITS[UNIT_MAP[unitName]][0];\n  }\n\n  var SIGNATURE_VECTOR = [\"length\", \"time\", \"temperature\", \"mass\", \"current\", \"substance\", \"luminosity\", \"currency\", \"information\", \"angle\"];\n\n  /*\n  calculates the unit signature id for use in comparing compatible units and simplification\n  the signature is based on a simple classification of units and is based on the following publication\n\n  Novak, G.S., Jr. \"Conversion of units of measurement\", IEEE Transactions on Software Engineering,\n  21(8), Aug 1995, pp.651-661\n  doi://10.1109/32.403789\n  http://ieeexplore.ieee.org/Xplore/login.jsp?url=/iel1/32/9079/00403789.pdf?isnumber=9079&prod=JNL&arnumber=403789&arSt=651&ared=661&arAuthor=Novak%2C+G.S.%2C+Jr.\n  */\n  function unitSignature() {\n    if (this.signature) {\n      return this.signature;\n    }\n    var vector = unitSignatureVector.call(this);\n    for (var i = 0; i < vector.length; i++) {\n      vector[i] *= Math.pow(20, i);\n    }\n\n    return vector.reduce(\n      function(previous, current) {\n        return previous + current;\n      },\n      0\n    );\n  }\n\n  // calculates the unit signature vector used by unit_signature\n  function unitSignatureVector() {\n    if (!this.isBase()) {\n      return unitSignatureVector.call(this.toBase());\n    }\n\n    var vector = new Array(SIGNATURE_VECTOR.length);\n    for (var i = 0; i < vector.length; i++) {\n      vector[i] = 0;\n    }\n    var r, n;\n    for (var j = 0; j < this.numerator.length; j++) {\n      if ((r = UNITS[this.numerator[j]])) {\n        n = SIGNATURE_VECTOR.indexOf(r[2]);\n        if (n >= 0) {\n          vector[n] = vector[n] + 1;\n        }\n      }\n    }\n\n    for (var k = 0; k < this.denominator.length; k++) {\n      if ((r = UNITS[this.denominator[k]])) {\n        n = SIGNATURE_VECTOR.indexOf(r[2]);\n        if (n >= 0) {\n          vector[n] = vector[n] - 1;\n        }\n      }\n    }\n    return vector;\n  }\n\n  var SIGN = \"[+-]\";\n  var INTEGER = \"\\\\d+\";\n  var SIGNED_INTEGER = SIGN + \"?\" + INTEGER;\n  var FRACTION = \"\\\\.\" + INTEGER;\n  var FLOAT = \"(?:\" + INTEGER + \"(?:\" + FRACTION + \")?\" + \")\" +\n              \"|\" +\n              \"(?:\" + FRACTION + \")\";\n  var EXPONENT = \"[Ee]\" + SIGNED_INTEGER;\n  var SCI_NUMBER = \"(?:\" + FLOAT + \")(?:\" + EXPONENT + \")?\";\n  var SIGNED_NUMBER = SIGN + \"?\\\\s*\" + SCI_NUMBER;\n  var QTY_STRING = \"(\" + SIGNED_NUMBER + \")?\" + \"\\\\s*([^/]*)(?:\\/(.+))?\";\n  var QTY_STRING_REGEX = new RegExp(\"^\" + QTY_STRING + \"$\");\n\n  var POWER_OP = \"\\\\^|\\\\*{2}\";\n  // Allow unit powers representing scalar, length, area, volume; 4 is for some\n  // special case representations in SI base units.\n  var SAFE_POWER = \"[01234]\";\n  var TOP_REGEX = new RegExp (\"([^ \\\\*\\\\d]+?)(?:\" + POWER_OP + \")?(-?\" + SAFE_POWER + \"(?![a-zA-Z]))\");\n  var BOTTOM_REGEX = new RegExp(\"([^ \\\\*\\\\d]+?)(?:\" + POWER_OP + \")?(\" + SAFE_POWER + \"(?![a-zA-Z]))\");\n\n  /* parse a string into a unit object.\n   * Typical formats like :\n   * \"5.6 kg*m/s^2\"\n   * \"5.6 kg*m*s^-2\"\n   * \"5.6 kilogram*meter*second^-2\"\n   * \"2.2 kPa\"\n   * \"37 degC\"\n   * \"1\"  -- creates a unitless constant with value 1\n   * \"GPa\"  -- creates a unit with scalar 1 with units 'GPa'\n   * 6'4\"  -- recognized as 6 feet + 4 inches\n   * 8 lbs 8 oz -- recognized as 8 lbs + 8 ounces\n   */\n  function parse(val) {\n    if (!isString(val)) {\n      val = val.toString();\n    }\n    val = val.trim();\n\n    var result = QTY_STRING_REGEX.exec(val);\n    if (!result) {\n      throw new QtyError(val + \": Quantity not recognized\");\n    }\n\n    var scalarMatch = result[1];\n    if (scalarMatch) {\n      // Allow whitespaces between sign and scalar for loose parsing\n      scalarMatch = scalarMatch.replace(/\\s/g, \"\");\n      this.scalar = parseFloat(scalarMatch);\n    }\n    else {\n      this.scalar = 1;\n    }\n    var top = result[2];\n    var bottom = result[3];\n\n    var n, x, nx;\n    // TODO DRY me\n    while ((result = TOP_REGEX.exec(top))) {\n      n = parseFloat(result[2]);\n      if (isNaN(n)) {\n        // Prevents infinite loops\n        throw new QtyError(\"Unit exponent is not a number\");\n      }\n      // Disallow unrecognized unit even if exponent is 0\n      if (n === 0 && !UNIT_TEST_REGEX.test(result[1])) {\n        throw new QtyError(\"Unit not recognized\");\n      }\n      x = result[1] + \" \";\n      nx = \"\";\n      for (var i = 0; i < Math.abs(n) ; i++) {\n        nx += x;\n      }\n      if (n >= 0) {\n        top = top.replace(result[0], nx);\n      }\n      else {\n        bottom = bottom ? bottom + nx : nx;\n        top = top.replace(result[0], \"\");\n      }\n    }\n\n    while ((result = BOTTOM_REGEX.exec(bottom))) {\n      n = parseFloat(result[2]);\n      if (isNaN(n)) {\n        // Prevents infinite loops\n        throw new QtyError(\"Unit exponent is not a number\");\n      }\n      // Disallow unrecognized unit even if exponent is 0\n      if (n === 0 && !UNIT_TEST_REGEX.test(result[1])) {\n        throw new QtyError(\"Unit not recognized\");\n      }\n      x = result[1] + \" \";\n      nx = \"\";\n      for (var j = 0; j < n ; j++) {\n        nx += x;\n      }\n\n      bottom = bottom.replace(result[0], nx);\n    }\n\n    if (top) {\n      this.numerator = parseUnits(top.trim());\n    }\n    if (bottom) {\n      this.denominator = parseUnits(bottom.trim());\n    }\n  }\n\n  var PREFIX_REGEX = Object.keys(PREFIX_MAP).sort(function(a, b) {\n    return b.length - a.length;\n  }).join(\"|\");\n  var UNIT_REGEX = Object.keys(UNIT_MAP).sort(function(a, b) {\n    return b.length - a.length;\n  }).join(\"|\");\n  /*\n   * Minimal boundary regex to support units with Unicode characters\n   * \\b only works for ASCII\n   */\n  var BOUNDARY_REGEX = \"\\\\b|$\";\n  var UNIT_MATCH = \"(\" + PREFIX_REGEX + \")??(\" +\n                   UNIT_REGEX +\n                   \")(?:\" + BOUNDARY_REGEX + \")\";\n  var UNIT_TEST_REGEX = new RegExp(\"^\\\\s*(\" + UNIT_MATCH + \"[\\\\s\\\\*]*)+$\");\n  var UNIT_MATCH_REGEX = new RegExp(UNIT_MATCH, \"g\"); // g flag for multiple occurences\n  var parsedUnitsCache = {};\n  /**\n   * Parses and converts units string to normalized unit array.\n   * Result is cached to speed up next calls.\n   *\n   * @param {string} units Units string\n   * @returns {string[]} Array of normalized units\n   *\n   * @example\n   * // Returns [\"<second>\", \"<meter>\", \"<second>\"]\n   * parseUnits(\"s m s\");\n   *\n   */\n  function parseUnits(units) {\n    var cached = parsedUnitsCache[units];\n    if (cached) {\n      return cached;\n    }\n\n    var unitMatch, normalizedUnits = [];\n\n    // Scan\n    if (!UNIT_TEST_REGEX.test(units)) {\n      throw new QtyError(\"Unit not recognized\");\n    }\n\n    while ((unitMatch = UNIT_MATCH_REGEX.exec(units))) {\n      normalizedUnits.push(unitMatch.slice(1));\n    }\n\n    normalizedUnits = normalizedUnits.map(function(item) {\n      return PREFIX_MAP[item[0]] ? [PREFIX_MAP[item[0]], UNIT_MAP[item[1]]] : [UNIT_MAP[item[1]]];\n    });\n\n    // Flatten and remove null elements\n    normalizedUnits = normalizedUnits.reduce(function(a,b) {\n      return a.concat(b);\n    }, []);\n    normalizedUnits = normalizedUnits.filter(function(item) {\n      return item;\n    });\n\n    parsedUnitsCache[units] = normalizedUnits;\n\n    return normalizedUnits;\n  }\n\n  /**\n   * Parses a string as a quantity\n   * @param {string} value - quantity as text\n   * @throws if value is not a string\n   * @returns {Qty|null} Parsed quantity or null if unrecognized\n   */\n  function globalParse(value) {\n    if (!isString(value)) {\n      throw new QtyError(\"Argument should be a string\");\n    }\n\n    try {\n      return this(value);\n    }\n    catch (e) {\n      return null;\n    }\n  }\n\n  /**\n   * Tests if a value is a Qty instance\n   *\n   * @param {*} value - Value to test\n   *\n   * @returns {boolean} true if value is a Qty instance, false otherwise\n   */\n  function isQty(value) {\n    return value instanceof Qty;\n  }\n\n  function Qty(initValue, initUnits) {\n    assertValidConstructorArgs.apply(null, arguments);\n\n    if (!(isQty(this))) {\n      return new Qty(initValue, initUnits);\n    }\n\n    this.scalar = null;\n    this.baseScalar = null;\n    this.signature = null;\n    this._conversionCache = {};\n    this.numerator = UNITY_ARRAY;\n    this.denominator = UNITY_ARRAY;\n\n    if (isDefinitionObject(initValue)) {\n      this.scalar = initValue.scalar;\n      this.numerator = (initValue.numerator && initValue.numerator.length !== 0) ? initValue.numerator : UNITY_ARRAY;\n      this.denominator = (initValue.denominator && initValue.denominator.length !== 0) ? initValue.denominator : UNITY_ARRAY;\n    }\n    else if (initUnits) {\n      parse.call(this, initUnits);\n      this.scalar = initValue;\n    }\n    else {\n      parse.call(this, initValue);\n    }\n\n    // math with temperatures is very limited\n    if (this.denominator.join(\"*\").indexOf(\"temp\") >= 0) {\n      throw new QtyError(\"Cannot divide with temperatures\");\n    }\n    if (this.numerator.join(\"*\").indexOf(\"temp\") >= 0) {\n      if (this.numerator.length > 1) {\n        throw new QtyError(\"Cannot multiply by temperatures\");\n      }\n      if (!compareArray(this.denominator, UNITY_ARRAY)) {\n        throw new QtyError(\"Cannot divide with temperatures\");\n      }\n    }\n\n    this.initValue = initValue;\n    updateBaseScalar.call(this);\n\n    if (this.isTemperature() && this.baseScalar < 0) {\n      throw new QtyError(\"Temperatures must not be less than absolute zero\");\n    }\n  }\n\n  Qty.prototype = {\n    // Properly set up constructor\n    constructor: Qty,\n  };\n\n  /**\n   * Asserts constructor arguments are valid\n   *\n   * @param {*} value - Value to test\n   * @param {string} [units] - Optional units when value is passed as a number\n   *\n   * @returns {void}\n   * @throws {QtyError} if constructor arguments are invalid\n   */\n  function assertValidConstructorArgs(value, units) {\n    if (units) {\n      if (!(isNumber(value) && isString(units))) {\n        throw new QtyError(\"Only number accepted as initialization value \" +\n                           \"when units are explicitly provided\");\n      }\n    }\n    else {\n      if (!(isString(value) ||\n            isNumber(value) ||\n            isQty(value)    ||\n            isDefinitionObject(value))) {\n        throw new QtyError(\"Only string, number or quantity accepted as \" +\n                           \"single initialization value\");\n      }\n    }\n  }\n\n  /**\n   * Tests if a value is a Qty definition object\n   *\n   * @param {*} value - Value to test\n   *\n   * @returns {boolean} true if value is a definition object, false otherwise\n   */\n  function isDefinitionObject(value) {\n    return value && typeof value === \"object\" && value.hasOwnProperty(\"scalar\");\n  }\n\n  function updateBaseScalar() {\n    if (this.baseScalar) {\n      return this.baseScalar;\n    }\n    if (this.isBase()) {\n      this.baseScalar = this.scalar;\n      this.signature = unitSignature.call(this);\n    }\n    else {\n      var base = this.toBase();\n      this.baseScalar = base.scalar;\n      this.signature = base.signature;\n    }\n  }\n\n  var KINDS = {\n    \"-312078\": \"elastance\",\n    \"-312058\": \"resistance\",\n    \"-312038\": \"inductance\",\n    \"-152058\": \"potential\",\n    \"-152040\": \"magnetism\",\n    \"-152038\": \"magnetism\",\n    \"-7997\": \"specific_volume\",\n    \"-79\": \"snap\",\n    \"-59\": \"jolt\",\n    \"-39\": \"acceleration\",\n    \"-38\": \"radiation\",\n    \"-20\": \"frequency\",\n    \"-19\": \"speed\",\n    \"-18\": \"viscosity\",\n    \"-17\": \"volumetric_flow\",\n    \"-1\": \"wavenumber\",\n    \"0\": \"unitless\",\n    \"1\": \"length\",\n    \"2\": \"area\",\n    \"3\": \"volume\",\n    \"20\": \"time\",\n    \"400\": \"temperature\",\n    \"7941\": \"yank\",\n    \"7942\": \"power\",\n    \"7959\": \"pressure\",\n    \"7961\": \"force\",\n    \"7962\": \"energy\",\n    \"7979\": \"viscosity\",\n    \"7981\": \"momentum\",\n    \"7982\": \"angular_momentum\",\n    \"7997\": \"density\",\n    \"7998\": \"area_density\",\n    \"8000\": \"mass\",\n    \"152020\": \"radiation_exposure\",\n    \"159999\": \"magnetism\",\n    \"160000\": \"current\",\n    \"160020\": \"charge\",\n    \"312058\": \"conductance\",\n    \"312078\": \"capacitance\",\n    \"3199980\": \"activity\",\n    \"3199997\": \"molar_concentration\",\n    \"3200000\": \"substance\",\n    \"63999998\": \"illuminance\",\n    \"64000000\": \"luminous_power\",\n    \"1280000000\": \"currency\",\n    \"25599999980\": \"information_rate\",\n    \"25600000000\": \"information\",\n    \"511999999980\": \"angular_velocity\",\n    \"512000000000\": \"angle\"\n  };\n\n  /**\n   * Returns the list of available well-known kinds of units, e.g.\n   * \"radiation\" or \"length\".\n   *\n   * @returns {string[]} names of kinds of units\n   */\n  function getKinds() {\n    return uniq(Object.keys(KINDS).map(function(knownSignature) {\n      return KINDS[knownSignature];\n    }));\n  }\n\n  Qty.prototype.kind = function() {\n    return KINDS[this.signature.toString()];\n  };\n\n  assign(Qty.prototype, {\n    isDegrees: function() {\n      // signature may not have been calculated yet\n      return (this.signature === null || this.signature === 400) &&\n        this.numerator.length === 1 &&\n        compareArray(this.denominator, UNITY_ARRAY) &&\n        (this.numerator[0].match(/<temp-[CFRK]>/) || this.numerator[0].match(/<(kelvin|celsius|rankine|fahrenheit)>/));\n    },\n\n    isTemperature: function() {\n      return this.isDegrees() && this.numerator[0].match(/<temp-[CFRK]>/);\n    }\n  });\n\n  function subtractTemperatures(lhs,rhs) {\n    var lhsUnits = lhs.units();\n    var rhsConverted = rhs.to(lhsUnits);\n    var dstDegrees = Qty(getDegreeUnits(lhsUnits));\n    return Qty({\"scalar\": lhs.scalar - rhsConverted.scalar, \"numerator\": dstDegrees.numerator, \"denominator\": dstDegrees.denominator});\n  }\n\n  function subtractTempDegrees(temp,deg) {\n    var tempDegrees = deg.to(getDegreeUnits(temp.units()));\n    return Qty({\"scalar\": temp.scalar - tempDegrees.scalar, \"numerator\": temp.numerator, \"denominator\": temp.denominator});\n  }\n\n  function addTempDegrees(temp,deg) {\n    var tempDegrees = deg.to(getDegreeUnits(temp.units()));\n    return Qty({\"scalar\": temp.scalar + tempDegrees.scalar, \"numerator\": temp.numerator, \"denominator\": temp.denominator});\n  }\n\n  function getDegreeUnits(units) {\n    if (units === \"tempK\") {\n      return \"degK\";\n    }\n    else if (units === \"tempC\") {\n      return \"degC\";\n    }\n    else if (units === \"tempF\") {\n      return \"degF\";\n    }\n    else if (units === \"tempR\") {\n      return \"degR\";\n    }\n    else {\n      throw new QtyError(\"Unknown type for temp conversion from: \" + units);\n    }\n  }\n\n  function toDegrees(src,dst) {\n    var srcDegK = toDegK(src);\n    var dstUnits = dst.units();\n    var dstScalar;\n\n    if (dstUnits === \"degK\") {\n      dstScalar = srcDegK.scalar;\n    }\n    else if (dstUnits === \"degC\") {\n      dstScalar = srcDegK.scalar ;\n    }\n    else if (dstUnits === \"degF\") {\n      dstScalar = srcDegK.scalar * 9 / 5;\n    }\n    else if (dstUnits === \"degR\") {\n      dstScalar = srcDegK.scalar * 9 / 5;\n    }\n    else {\n      throw new QtyError(\"Unknown type for degree conversion to: \" + dstUnits);\n    }\n\n    return Qty({\"scalar\": dstScalar, \"numerator\": dst.numerator, \"denominator\": dst.denominator});\n  }\n\n  function toDegK(qty) {\n    var units = qty.units();\n    var q;\n    if (units.match(/(deg)[CFRK]/)) {\n      q = qty.baseScalar;\n    }\n    else if (units === \"tempK\") {\n      q = qty.scalar;\n    }\n    else if (units === \"tempC\") {\n      q = qty.scalar;\n    }\n    else if (units === \"tempF\") {\n      q = qty.scalar * 5 / 9;\n    }\n    else if (units === \"tempR\") {\n      q = qty.scalar * 5 / 9;\n    }\n    else {\n      throw new QtyError(\"Unknown type for temp conversion from: \" + units);\n    }\n\n    return Qty({\"scalar\": q, \"numerator\": [\"<kelvin>\"], \"denominator\": UNITY_ARRAY});\n  }\n\n  function toTemp(src,dst) {\n    var dstUnits = dst.units();\n    var dstScalar;\n\n    if (dstUnits === \"tempK\") {\n      dstScalar = src.baseScalar;\n    }\n    else if (dstUnits === \"tempC\") {\n      dstScalar = src.baseScalar - 273.15;\n    }\n    else if (dstUnits === \"tempF\") {\n      dstScalar = (src.baseScalar * 9 / 5) - 459.67;\n    }\n    else if (dstUnits === \"tempR\") {\n      dstScalar = src.baseScalar * 9 / 5;\n    }\n    else {\n      throw new QtyError(\"Unknown type for temp conversion to: \" + dstUnits);\n    }\n\n    return Qty({\"scalar\": dstScalar, \"numerator\": dst.numerator, \"denominator\": dst.denominator});\n  }\n\n  function toTempK(qty) {\n    var units = qty.units();\n    var q;\n    if (units.match(/(deg)[CFRK]/)) {\n      q = qty.baseScalar;\n    }\n    else if (units === \"tempK\") {\n      q = qty.scalar;\n    }\n    else if (units === \"tempC\") {\n      q = qty.scalar + 273.15;\n    }\n    else if (units === \"tempF\") {\n      q = (qty.scalar + 459.67) * 5 / 9;\n    }\n    else if (units === \"tempR\") {\n      q = qty.scalar * 5 / 9;\n    }\n    else {\n      throw new QtyError(\"Unknown type for temp conversion from: \" + units);\n    }\n\n    return Qty({\"scalar\": q, \"numerator\": [\"<temp-K>\"], \"denominator\": UNITY_ARRAY});\n  }\n\n  assign(Qty.prototype, {\n    /**\n     * Converts to other compatible units.\n     * Instance's converted quantities are cached for faster subsequent calls.\n     *\n     * @param {(string|Qty)} other - Target units as string or retrieved from\n     *                               other Qty instance (scalar is ignored)\n     *\n     * @returns {Qty} New converted Qty instance with target units\n     *\n     * @throws {QtyError} if target units are incompatible\n     *\n     * @example\n     * var weight = Qty(\"25 kg\");\n     * weight.to(\"lb\"); // => Qty(\"55.11556554621939 lbs\");\n     * weight.to(Qty(\"3 g\")); // => Qty(\"25000 g\"); // scalar of passed Qty is ignored\n     */\n    to: function(other) {\n      var cached, target;\n\n      if (other === undefined || other === null) {\n        return this;\n      }\n\n      if (!isString(other)) {\n        return this.to(other.units());\n      }\n\n      cached = this._conversionCache[other];\n      if (cached) {\n        return cached;\n      }\n\n      // Instantiating target to normalize units\n      target = Qty(other);\n      if (target.units() === this.units()) {\n        return this;\n      }\n\n      if (!this.isCompatible(target)) {\n        if (this.isInverse(target)) {\n          target = this.inverse().to(other);\n        }\n        else {\n          throwIncompatibleUnits(this.units(), target.units());\n        }\n      }\n      else {\n        if (target.isTemperature()) {\n          target = toTemp(this,target);\n        }\n        else if (target.isDegrees()) {\n          target = toDegrees(this,target);\n        }\n        else {\n          var q = divSafe(this.baseScalar, target.baseScalar);\n          target = Qty({\"scalar\": q, \"numerator\": target.numerator, \"denominator\": target.denominator});\n        }\n      }\n\n      this._conversionCache[other] = target;\n      return target;\n    },\n\n    // convert to base SI units\n    // results of the conversion are cached so subsequent calls to this will be fast\n    toBase: function() {\n      if (this.isBase()) {\n        return this;\n      }\n\n      if (this.isTemperature()) {\n        return toTempK(this);\n      }\n\n      var cached = baseUnitCache[this.units()];\n      if (!cached) {\n        cached = toBaseUnits(this.numerator,this.denominator);\n        baseUnitCache[this.units()] = cached;\n      }\n      return cached.mul(this.scalar);\n    },\n\n    // Converts the unit back to a float if it is unitless.  Otherwise raises an exception\n    toFloat: function() {\n      if (this.isUnitless()) {\n        return this.scalar;\n      }\n      throw new QtyError(\"Can't convert to Float unless unitless.  Use Unit#scalar\");\n    },\n\n    /**\n     * Returns the nearest multiple of quantity passed as\n     * precision\n     *\n     * @param {(Qty|string|number)} precQuantity - Quantity, string formated\n     *   quantity or number as expected precision\n     *\n     * @returns {Qty} Nearest multiple of precQuantity\n     *\n     * @example\n     * Qty('5.5 ft').toPrec('2 ft'); // returns 6 ft\n     * Qty('0.8 cu').toPrec('0.25 cu'); // returns 0.75 cu\n     * Qty('6.3782 m').toPrec('cm'); // returns 6.38 m\n     * Qty('1.146 MPa').toPrec('0.1 bar'); // returns 1.15 MPa\n     *\n     */\n    toPrec: function(precQuantity) {\n      if (isString(precQuantity)) {\n        precQuantity = Qty(precQuantity);\n      }\n      if (isNumber(precQuantity)) {\n        precQuantity = Qty(precQuantity + \" \" + this.units());\n      }\n\n      if (!this.isUnitless()) {\n        precQuantity = precQuantity.to(this.units());\n      }\n      else if (!precQuantity.isUnitless()) {\n        throwIncompatibleUnits(this.units(), precQuantity.units());\n      }\n\n      if (precQuantity.scalar === 0) {\n        throw new QtyError(\"Divide by zero\");\n      }\n\n      var precRoundedResult = mulSafe(\n        Math.round(this.scalar / precQuantity.scalar),\n        precQuantity.scalar\n      );\n\n      return Qty(precRoundedResult + this.units());\n    }\n  });\n\n  /**\n   * Configures and returns a fast function to convert\n   * Number values from units to others.\n   * Useful to efficiently convert large array of values\n   * with same units into others with iterative methods.\n   * Does not take care of rounding issues.\n   *\n   * @param {string} srcUnits Units of values to convert\n   * @param {string} dstUnits Units to convert to\n   *\n   * @returns {Function} Converting function accepting Number value\n   *   and returning converted value\n   *\n   * @throws \"Incompatible units\" if units are incompatible\n   *\n   * @example\n   * // Converting large array of numbers with the same units\n   * // into other units\n   * var converter = Qty.swiftConverter(\"m/h\", \"ft/s\");\n   * var convertedSerie = largeSerie.map(converter);\n   *\n   */\n  function swiftConverter(srcUnits, dstUnits) {\n    var srcQty = Qty(srcUnits);\n    var dstQty = Qty(dstUnits);\n\n    if (srcQty.eq(dstQty)) {\n      return identity;\n    }\n\n    var convert;\n    if (!srcQty.isTemperature()) {\n      convert = function(value) {\n        return value * srcQty.baseScalar / dstQty.baseScalar;\n      };\n    }\n    else {\n      convert = function(value) {\n        // TODO Not optimized\n        return srcQty.mul(value).to(dstQty).scalar;\n      };\n    }\n\n    return function converter(value) {\n      var i, length, result;\n      if (!Array.isArray(value)) {\n        return convert(value);\n      }\n      else {\n        length = value.length;\n        result = [];\n        for (i = 0; i < length; i++) {\n          result.push(convert(value[i]));\n        }\n        return result;\n      }\n    };\n  }\n\n  var baseUnitCache = {};\n\n  function toBaseUnits(numerator,denominator) {\n    var num = [];\n    var den = [];\n    var q = 1;\n    var unit;\n    for (var i = 0; i < numerator.length; i++) {\n      unit = numerator[i];\n      if (PREFIX_VALUES[unit]) {\n        // workaround to fix\n        // 0.1 * 0.1 => 0.010000000000000002\n        q = mulSafe(q, PREFIX_VALUES[unit]);\n      }\n      else {\n        if (UNIT_VALUES[unit]) {\n          q *= UNIT_VALUES[unit].scalar;\n\n          if (UNIT_VALUES[unit].numerator) {\n            num.push(UNIT_VALUES[unit].numerator);\n          }\n          if (UNIT_VALUES[unit].denominator) {\n            den.push(UNIT_VALUES[unit].denominator);\n          }\n        }\n      }\n    }\n    for (var j = 0; j < denominator.length; j++) {\n      unit = denominator[j];\n      if (PREFIX_VALUES[unit]) {\n        q /= PREFIX_VALUES[unit];\n      }\n      else {\n        if (UNIT_VALUES[unit]) {\n          q /= UNIT_VALUES[unit].scalar;\n\n          if (UNIT_VALUES[unit].numerator) {\n            den.push(UNIT_VALUES[unit].numerator);\n          }\n          if (UNIT_VALUES[unit].denominator) {\n            num.push(UNIT_VALUES[unit].denominator);\n          }\n        }\n      }\n    }\n\n    // Flatten\n    num = num.reduce(function(a,b) {\n      return a.concat(b);\n    }, []);\n    den = den.reduce(function(a,b) {\n      return a.concat(b);\n    }, []);\n\n    return Qty({\"scalar\": q, \"numerator\": num, \"denominator\": den});\n  }\n\n  Qty.parse = globalParse;\n\n  Qty.getUnits = getUnits;\n  Qty.getAliases = getAliases;\n\n  Qty.mulSafe = mulSafe;\n  Qty.divSafe = divSafe;\n\n  Qty.getKinds = getKinds;\n\n  Qty.swiftConverter = swiftConverter;\n\n  Qty.Error = QtyError;\n\n  assign(Qty.prototype, {\n    // Returns new instance with units of this\n    add: function(other) {\n      if (isString(other)) {\n        other = Qty(other);\n      }\n\n      if (!this.isCompatible(other)) {\n        throwIncompatibleUnits(this.units(), other.units());\n      }\n\n      if (this.isTemperature() && other.isTemperature()) {\n        throw new QtyError(\"Cannot add two temperatures\");\n      }\n      else if (this.isTemperature()) {\n        return addTempDegrees(this, other);\n      }\n      else if (other.isTemperature()) {\n        return addTempDegrees(other, this);\n      }\n\n      return Qty({\"scalar\": this.scalar + other.to(this).scalar, \"numerator\": this.numerator, \"denominator\": this.denominator});\n    },\n\n    sub: function(other) {\n      if (isString(other)) {\n        other = Qty(other);\n      }\n\n      if (!this.isCompatible(other)) {\n        throwIncompatibleUnits(this.units(), other.units());\n      }\n\n      if (this.isTemperature() && other.isTemperature()) {\n        return subtractTemperatures(this,other);\n      }\n      else if (this.isTemperature()) {\n        return subtractTempDegrees(this,other);\n      }\n      else if (other.isTemperature()) {\n        throw new QtyError(\"Cannot subtract a temperature from a differential degree unit\");\n      }\n\n      return Qty({\"scalar\": this.scalar - other.to(this).scalar, \"numerator\": this.numerator, \"denominator\": this.denominator});\n    },\n\n    mul: function(other) {\n      if (isNumber(other)) {\n        return Qty({\"scalar\": mulSafe(this.scalar, other), \"numerator\": this.numerator, \"denominator\": this.denominator});\n      }\n      else if (isString(other)) {\n        other = Qty(other);\n      }\n\n      if ((this.isTemperature() || other.isTemperature()) && !(this.isUnitless() || other.isUnitless())) {\n        throw new QtyError(\"Cannot multiply by temperatures\");\n      }\n\n      // Quantities should be multiplied with same units if compatible, with base units else\n      var op1 = this;\n      var op2 = other;\n\n      // so as not to confuse results, multiplication and division between temperature degrees will maintain original unit info in num/den\n      // multiplication and division between deg[CFRK] can never factor each other out, only themselves: \"degK*degC/degC^2\" == \"degK/degC\"\n      if (op1.isCompatible(op2) && op1.signature !== 400) {\n        op2 = op2.to(op1);\n      }\n      var numdenscale = cleanTerms(op1.numerator, op1.denominator, op2.numerator, op2.denominator);\n\n      return Qty({\"scalar\": mulSafe(op1.scalar, op2.scalar, numdenscale[2]), \"numerator\": numdenscale[0], \"denominator\": numdenscale[1]});\n    },\n\n    div: function(other) {\n      if (isNumber(other)) {\n        if (other === 0) {\n          throw new QtyError(\"Divide by zero\");\n        }\n        return Qty({\"scalar\": this.scalar / other, \"numerator\": this.numerator, \"denominator\": this.denominator});\n      }\n      else if (isString(other)) {\n        other = Qty(other);\n      }\n\n      if (other.scalar === 0) {\n        throw new QtyError(\"Divide by zero\");\n      }\n\n      if (other.isTemperature()) {\n        throw new QtyError(\"Cannot divide with temperatures\");\n      }\n      else if (this.isTemperature() && !other.isUnitless()) {\n        throw new QtyError(\"Cannot divide with temperatures\");\n      }\n\n      // Quantities should be multiplied with same units if compatible, with base units else\n      var op1 = this;\n      var op2 = other;\n\n      // so as not to confuse results, multiplication and division between temperature degrees will maintain original unit info in num/den\n      // multiplication and division between deg[CFRK] can never factor each other out, only themselves: \"degK*degC/degC^2\" == \"degK/degC\"\n      if (op1.isCompatible(op2) && op1.signature !== 400) {\n        op2 = op2.to(op1);\n      }\n      var numdenscale = cleanTerms(op1.numerator, op1.denominator, op2.denominator, op2.numerator);\n\n      return Qty({\"scalar\": mulSafe(op1.scalar, numdenscale[2]) / op2.scalar, \"numerator\": numdenscale[0], \"denominator\": numdenscale[1]});\n    },\n\n    // Returns a Qty that is the inverse of this Qty,\n    inverse: function() {\n      if (this.isTemperature()) {\n        throw new QtyError(\"Cannot divide with temperatures\");\n      }\n      if (this.scalar === 0) {\n        throw new QtyError(\"Divide by zero\");\n      }\n      return Qty({\"scalar\": 1 / this.scalar, \"numerator\": this.denominator, \"denominator\": this.numerator});\n    }\n  });\n\n  function cleanTerms(num1, den1, num2, den2) {\n    function notUnity(val) {\n      return val !== UNITY;\n    }\n\n    num1 = num1.filter(notUnity);\n    num2 = num2.filter(notUnity);\n    den1 = den1.filter(notUnity);\n    den2 = den2.filter(notUnity);\n\n    var combined = {};\n\n    function combineTerms(terms, direction) {\n      var k;\n      var prefix;\n      var prefixValue;\n      for (var i = 0; i < terms.length; i++) {\n        if (PREFIX_VALUES[terms[i]]) {\n          k = terms[i + 1];\n          prefix = terms[i];\n          prefixValue = PREFIX_VALUES[prefix];\n          i++;\n        }\n        else {\n          k = terms[i];\n          prefix = null;\n          prefixValue = 1;\n        }\n        if (k && k !== UNITY) {\n          if (combined[k]) {\n            combined[k][0] += direction;\n            var combinedPrefixValue = combined[k][2] ? PREFIX_VALUES[combined[k][2]] : 1;\n            combined[k][direction === 1 ? 3 : 4] *= divSafe(prefixValue, combinedPrefixValue);\n          }\n          else {\n            combined[k] = [direction, k, prefix, 1, 1];\n          }\n        }\n      }\n    }\n\n    combineTerms(num1, 1);\n    combineTerms(den1, -1);\n    combineTerms(num2, 1);\n    combineTerms(den2, -1);\n\n    var num = [];\n    var den = [];\n    var scale = 1;\n\n    for (var prop in combined) {\n      if (combined.hasOwnProperty(prop)) {\n        var item = combined[prop];\n        var n;\n        if (item[0] > 0) {\n          for (n = 0; n < item[0]; n++) {\n            num.push(item[2] === null ? item[1] : [item[2], item[1]]);\n          }\n        }\n        else if (item[0] < 0) {\n          for (n = 0; n < -item[0]; n++) {\n            den.push(item[2] === null ? item[1] : [item[2], item[1]]);\n          }\n        }\n        scale *= divSafe(item[3], item[4]);\n      }\n    }\n\n    if (num.length === 0) {\n      num = UNITY_ARRAY;\n    }\n    if (den.length === 0) {\n      den = UNITY_ARRAY;\n    }\n\n    // Flatten\n    num = num.reduce(function(a,b) {\n      return a.concat(b);\n    }, []);\n    den = den.reduce(function(a,b) {\n      return a.concat(b);\n    }, []);\n\n    return [num, den, scale];\n  }\n\n  assign(Qty.prototype, {\n    eq: function(other) {\n      return this.compareTo(other) === 0;\n    },\n\n    lt: function(other) {\n      return this.compareTo(other) === -1;\n    },\n\n    lte: function(other) {\n      return this.eq(other) || this.lt(other);\n    },\n\n    gt: function(other) {\n      return this.compareTo(other) === 1;\n    },\n\n    gte: function(other) {\n      return this.eq(other) || this.gt(other);\n    },\n\n    // Compare two Qty objects. Throws an exception if they are not of compatible types.\n    // Comparisons are done based on the value of the quantity in base SI units.\n    //\n    // NOTE: We cannot compare inverses as that breaks the general compareTo contract:\n    //   if a.compareTo(b) < 0 then b.compareTo(a) > 0\n    //   if a.compareTo(b) == 0 then b.compareTo(a) == 0\n    //\n    //   Since \"10S\" == \".1ohm\" (10 > .1) and \"10ohm\" == \".1S\" (10 > .1)\n    //     Qty(\"10S\").inverse().compareTo(\"10ohm\") == -1\n    //     Qty(\"10ohm\").inverse().compareTo(\"10S\") == -1\n    //\n    //   If including inverses in the sort is needed, I suggest writing: Qty.sort(qtyArray,units)\n    compareTo: function(other) {\n      if (isString(other)) {\n        return this.compareTo(Qty(other));\n      }\n      if (!this.isCompatible(other)) {\n        throwIncompatibleUnits(this.units(), other.units());\n      }\n      if (this.baseScalar < other.baseScalar) {\n        return -1;\n      }\n      else if (this.baseScalar === other.baseScalar) {\n        return 0;\n      }\n      else if (this.baseScalar > other.baseScalar) {\n        return 1;\n      }\n    },\n\n    // Return true if quantities and units match\n    // Unit(\"100 cm\").same(Unit(\"100 cm\"))  # => true\n    // Unit(\"100 cm\").same(Unit(\"1 m\"))     # => false\n    same: function(other) {\n      return (this.scalar === other.scalar) && (this.units() === other.units());\n    }\n  });\n\n  assign(Qty.prototype, {\n    // returns true if no associated units\n    // false, even if the units are \"unitless\" like 'radians, each, etc'\n    isUnitless: function() {\n      return [this.numerator, this.denominator].every(function(item) {\n        return compareArray(item, UNITY_ARRAY);\n      });\n    },\n\n    /*\n    check to see if units are compatible, but not the scalar part\n    this check is done by comparing signatures for performance reasons\n    if passed a string, it will create a unit object with the string and then do the comparison\n    this permits a syntax like:\n    unit =~ \"mm\"\n    if you want to do a regexp on the unit string do this ...\n    unit.units =~ /regexp/\n    */\n    isCompatible: function(other) {\n      if (isString(other)) {\n        return this.isCompatible(Qty(other));\n      }\n\n      if (!(isQty(other))) {\n        return false;\n      }\n\n      if (other.signature !== undefined) {\n        return this.signature === other.signature;\n      }\n      else {\n        return false;\n      }\n    },\n\n    /*\n    check to see if units are inverse of each other, but not the scalar part\n    this check is done by comparing signatures for performance reasons\n    if passed a string, it will create a unit object with the string and then do the comparison\n    this permits a syntax like:\n    unit =~ \"mm\"\n    if you want to do a regexp on the unit string do this ...\n    unit.units =~ /regexp/\n    */\n    isInverse: function(other) {\n      return this.inverse().isCompatible(other);\n    },\n\n    // Returns 'true' if the Unit is represented in base units\n    isBase: function() {\n      if (this._isBase !== undefined) {\n        return this._isBase;\n      }\n      if (this.isDegrees() && this.numerator[0].match(/<(kelvin|temp-K)>/)) {\n        this._isBase = true;\n        return this._isBase;\n      }\n\n      this.numerator.concat(this.denominator).forEach(function(item) {\n        if (item !== UNITY && BASE_UNITS.indexOf(item) === -1 ) {\n          this._isBase = false;\n        }\n      }, this);\n      if (this._isBase === false) {\n        return this._isBase;\n      }\n      this._isBase = true;\n      return this._isBase;\n    }\n  });\n\n  function NestedMap() {}\n\n  NestedMap.prototype.get = function(keys) {\n\n    // Allows to pass key1, key2, ... instead of [key1, key2, ...]\n    if (arguments.length > 1) {\n      // Slower with Firefox but faster with Chrome than\n      // Array.prototype.slice.call(arguments)\n      // See http://jsperf.com/array-apply-versus-array-prototype-slice-call\n      keys = Array.apply(null, arguments);\n    }\n\n    return keys.reduce(function(map, key, index) {\n      if (map) {\n\n        var childMap = map[key];\n\n        if (index === keys.length - 1) {\n          return childMap ? childMap.data : undefined;\n        }\n        else {\n          return childMap;\n        }\n      }\n    },\n    this);\n  };\n\n  NestedMap.prototype.set = function(keys, value) {\n\n    if (arguments.length > 2) {\n      keys = Array.prototype.slice.call(arguments, 0, -1);\n      value = arguments[arguments.length - 1];\n    }\n\n    return keys.reduce(function(map, key, index) {\n\n      var childMap = map[key];\n      if (childMap === undefined) {\n        childMap = map[key] = {};\n      }\n\n      if (index === keys.length - 1) {\n        childMap.data = value;\n        return value;\n      }\n      else {\n        return childMap;\n      }\n    }, this);\n  };\n\n  /**\n   * Default formatter\n   *\n   * @param {number} scalar - scalar value\n   * @param {string} units - units as string\n   *\n   * @returns {string} formatted result\n   */\n  function defaultFormatter(scalar, units) {\n    return (scalar + \" \" + units).trim();\n  }\n\n  /**\n   *\n   * Configurable Qty default formatter\n   *\n   * @type {function}\n   *\n   * @param {number} scalar\n   * @param {string} units\n   *\n   * @returns {string} formatted result\n   */\n  Qty.formatter = defaultFormatter;\n\n  assign(Qty.prototype, {\n\n    // returns the 'unit' part of the Unit object without the scalar\n    units: function() {\n      if (this._units !== undefined) {\n        return this._units;\n      }\n\n      var numIsUnity = compareArray(this.numerator, UNITY_ARRAY);\n      var denIsUnity = compareArray(this.denominator, UNITY_ARRAY);\n      if (numIsUnity && denIsUnity) {\n        this._units = \"\";\n        return this._units;\n      }\n\n      var numUnits = stringifyUnits(this.numerator);\n      var denUnits = stringifyUnits(this.denominator);\n      this._units = numUnits + (denIsUnity ? \"\" : (\"/\" + denUnits));\n      return this._units;\n    },\n\n    /**\n     * Stringifies the quantity\n     * Deprecation notice: only units parameter is supported.\n     *\n     * @param {(number|string|Qty)} targetUnitsOrMaxDecimalsOrPrec -\n     *                              target units if string,\n     *                              max number of decimals if number,\n     *                              passed to #toPrec before converting if Qty\n     *\n     * @param {number=} maxDecimals - Maximum number of decimals of\n     *                                formatted output\n     *\n     * @returns {string} reparseable quantity as string\n     */\n    toString: function(targetUnitsOrMaxDecimalsOrPrec, maxDecimals) {\n      var targetUnits;\n      if (isNumber(targetUnitsOrMaxDecimalsOrPrec)) {\n        targetUnits = this.units();\n        maxDecimals = targetUnitsOrMaxDecimalsOrPrec;\n      }\n      else if (isString(targetUnitsOrMaxDecimalsOrPrec)) {\n        targetUnits = targetUnitsOrMaxDecimalsOrPrec;\n      }\n      else if (isQty(targetUnitsOrMaxDecimalsOrPrec)) {\n        return this.toPrec(targetUnitsOrMaxDecimalsOrPrec).toString(maxDecimals);\n      }\n\n      var out = this.to(targetUnits);\n\n      var outScalar = maxDecimals !== undefined ? round(out.scalar, maxDecimals) : out.scalar;\n      out = (outScalar + \" \" + out.units()).trim();\n      return out;\n    },\n\n    /**\n     * Format the quantity according to optional passed target units\n     * and formatter\n     *\n     * @param {string} [targetUnits=current units] -\n     *                 optional units to convert to before formatting\n     *\n     * @param {function} [formatter=Qty.formatter] -\n     *                   delegates formatting to formatter callback.\n     *                   formatter is called back with two parameters (scalar, units)\n     *                   and should return formatted result.\n     *                   If unspecified, formatting is delegated to default formatter\n     *                   set to Qty.formatter\n     *\n     * @example\n     * var roundingAndLocalizingFormatter = function(scalar, units) {\n     *   // localize or limit scalar to n max decimals for instance\n     *   // return formatted result\n     * };\n     * var qty = Qty('1.1234 m');\n     * qty.format(); // same units, default formatter => \"1.234 m\"\n     * qty.format(\"cm\"); // converted to \"cm\", default formatter => \"123.45 cm\"\n     * qty.format(roundingAndLocalizingFormatter); // same units, custom formatter => \"1,2 m\"\n     * qty.format(\"cm\", roundingAndLocalizingFormatter); // convert to \"cm\", custom formatter => \"123,4 cm\"\n     *\n     * @returns {string} quantity as string\n     */\n    format: function(targetUnits, formatter) {\n      if (arguments.length === 1) {\n        if (typeof targetUnits === \"function\") {\n          formatter = targetUnits;\n          targetUnits = undefined;\n        }\n      }\n\n      formatter = formatter || Qty.formatter;\n      var targetQty = this.to(targetUnits);\n      return formatter.call(this, targetQty.scalar, targetQty.units());\n    }\n  });\n\n  var stringifiedUnitsCache = new NestedMap();\n  /**\n   * Returns a string representing a normalized unit array\n   *\n   * @param {string[]} units Normalized unit array\n   * @returns {string} String representing passed normalized unit array and\n   *   suitable for output\n   *\n   */\n  function stringifyUnits(units) {\n\n    var stringified = stringifiedUnitsCache.get(units);\n    if (stringified) {\n      return stringified;\n    }\n\n    var isUnity = compareArray(units, UNITY_ARRAY);\n    if (isUnity) {\n      stringified = \"1\";\n    }\n    else {\n      stringified = simplify(getOutputNames(units)).join(\"*\");\n    }\n\n    // Cache result\n    stringifiedUnitsCache.set(units, stringified);\n\n    return stringified;\n  }\n\n  function getOutputNames(units) {\n    var unitNames = [], token, tokenNext;\n    for (var i = 0; i < units.length; i++) {\n      token = units[i];\n      tokenNext = units[i + 1];\n      if (PREFIX_VALUES[token]) {\n        unitNames.push(OUTPUT_MAP[token] + OUTPUT_MAP[tokenNext]);\n        i++;\n      }\n      else {\n        unitNames.push(OUTPUT_MAP[token]);\n      }\n    }\n    return unitNames;\n  }\n\n  function simplify(units) {\n    // this turns ['s','m','s'] into ['s2','m']\n\n    var unitCounts = units.reduce(function(acc, unit) {\n      var unitCounter = acc[unit];\n      if (!unitCounter) {\n        acc.push(unitCounter = acc[unit] = [unit, 0]);\n      }\n\n      unitCounter[1]++;\n\n      return acc;\n    }, []);\n\n    return unitCounts.map(function(unitCount) {\n      return unitCount[0] + (unitCount[1] > 1 ? unitCount[1] : \"\");\n    });\n  }\n\n  Qty.version = \"1.7.6\";\n\n  return Qty;\n\n})));\n","import Qty from 'js-quantities';\nexport function convertUnit(array, fromUnit, toUnit) {\n    fromUnit = normalize(fromUnit);\n    toUnit = normalize(toUnit);\n    if (fromUnit === toUnit)\n        return array;\n    try {\n        const convert = Qty.swiftConverter(fromUnit, toUnit); // Configures converter\n        return convert(array);\n    }\n    catch (e) {\n        return undefined;\n    }\n}\nfunction normalize(unit) {\n    unit = unit.replace(/°C/g, 'tempC');\n    unit = unit.replace(/°F/g, 'tempF');\n    unit = unit.replace(/(^|\\W)K(\\W|$)/g, '$1tempK$2');\n    return unit;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydFVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9jb252ZXJ0VW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFjaEMsTUFBTSxVQUFVLFdBQVcsQ0FDekIsS0FBVSxFQUNWLFFBQWdCLEVBQ2hCLE1BQWM7SUFFZCxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0IsSUFBSSxRQUFRLEtBQUssTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXRDLElBQUk7UUFDRixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLHVCQUF1QjtRQUM3RSxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN2QjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxTQUFTLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBWTtJQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyJ9","const testRegExp = /^\\/((?:\\\\\\/|[^/])+)\\/([migyu]{0,5})?$/;\nexport function ensureRegexp(string) {\n    if (typeof string !== 'string')\n        return string;\n    const parts = testRegExp.exec(string);\n    if (parts) {\n        try {\n            return new RegExp(parts[1], parts[2]);\n        }\n        catch (err) {\n            return stringToRegexp(string);\n        }\n    }\n    else {\n        return stringToRegexp(string);\n    }\n}\nfunction stringToRegexp(string, flags = 'i') {\n    return new RegExp(string.replace(/[[\\]\\\\{}()+*?.$^|]/g, (match) => `\\\\${match}`), flags);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5zdXJlUmVnZXhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvZW5zdXJlUmVnZXhwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxHQUFHLHVDQUF1QyxDQUFDO0FBRTNELE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBdUI7SUFDbEQsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDOUMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxJQUFJLEtBQUssRUFBRTtRQUNULElBQUk7WUFDRixPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2QztRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDL0I7S0FDRjtTQUFNO1FBQ0wsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDL0I7QUFDSCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsTUFBYyxFQUFFLEtBQUssR0FBRyxHQUFHO0lBQ2pELE9BQU8sSUFBSSxNQUFNLENBQ2YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxFQUN0RSxLQUFLLENBQ04sQ0FBQztBQUNKLENBQUMifQ==","import max from 'ml-array-max';\nimport min from 'ml-array-min';\nimport { xIsMonotone } from 'ml-spectra-processing';\nimport { convertUnit } from './convertUnit';\nexport function getConvertedVariable(variable, newUnits) {\n    const data = variable.units !== undefined && variable.units !== newUnits // would be nice if convertUnit would allow typedArray\n        ? convertUnit(Array.from(variable.data), variable.units, newUnits)\n        : variable.data;\n    return {\n        units: newUnits,\n        label: variable.label.replace(`[${variable.units || ''}]`, `[${newUnits}]`),\n        data: data || [],\n        min: data ? min(data) : undefined,\n        max: data ? max(data) : undefined,\n        isMonotone: xIsMonotone(data),\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Q29udmVydGVkVmFyaWFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9nZXRDb252ZXJ0ZWRWYXJpYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDL0IsT0FBTyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUlwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVDLE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsUUFBMEIsRUFDMUIsUUFBZ0I7SUFFaEIsTUFBTSxJQUFJLEdBQ1IsUUFBUSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsc0RBQXNEO1FBQ2hILENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7UUFDbEUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDcEIsT0FBTztRQUNMLEtBQUssRUFBRSxRQUFRO1FBQ2YsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxDQUFDO1FBQzNFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtRQUNoQixHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2pDLFVBQVUsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDO0tBQzlCLENBQUM7QUFDSixDQUFDIn0=","/* eslint-disable @typescript-eslint/no-dynamic-delete */\nimport { convertUnit } from './convertUnit';\nimport { ensureRegexp } from './ensureRegexp';\nimport { getConvertedVariable } from './getConvertedVariable';\n/**\n * Retrieve the spectrum with only X/Y data that match all the selectors\n * If more than one variable match the selector the 'x' or 'y' variable will be\n * taken\n */\nexport function getXYSpectrum(spectra = [], selector = {}) {\n    if (spectra.length < 1)\n        return;\n    let { dataType, title, xUnits, yUnits, variables, xVariable = 'x', yVariable = 'y', units, labels, xLabel, yLabel, meta, index, } = selector;\n    if (index !== undefined) {\n        return spectra[index];\n    }\n    if (dataType) {\n        dataType = ensureRegexp(dataType);\n    }\n    if (title) {\n        title = ensureRegexp(title);\n    }\n    if (units && !xUnits && !yUnits)\n        [yUnits, xUnits] = units.split(/\\s*vs\\s*/);\n    if (labels && !xLabel && !yLabel) {\n        [yLabel, xLabel] = labels.split(/\\s*vs\\s*/);\n    }\n    if (variables) {\n        const parts = variables.split(/\\s*vs\\s*/);\n        if (parts.length === 2) {\n            xVariable = parts[1];\n            yVariable = parts[0];\n        }\n    }\n    if (xLabel)\n        xLabel = ensureRegexp(xLabel);\n    if (yLabel)\n        yLabel = ensureRegexp(yLabel);\n    for (let spectrum of spectra) {\n        let variableNames = Object.keys(spectrum.variables);\n        if (!(variableNames.length > 1))\n            continue;\n        // we filter on general spectrum information\n        if (dataType) {\n            if (!spectrum.dataType || !dataType.exec(spectrum.dataType)) {\n                continue;\n            }\n        }\n        if (title) {\n            if (!spectrum.title || !title.exec(spectrum.title)) {\n                continue;\n            }\n        }\n        if (meta && typeof meta === 'object') {\n            if (!spectrum.meta)\n                continue;\n            for (let key in spectrum.meta) {\n                if (!spectrum.meta[key])\n                    continue;\n                let value = ensureRegexp(spectrum.meta[key]);\n                if (!value.exec(spectrum.meta[key]))\n                    continue;\n            }\n        }\n        let x = getPossibleVariable(spectrum.variables, {\n            units: xUnits,\n            label: xLabel,\n            variableName: xVariable,\n        });\n        let y = getPossibleVariable(spectrum.variables, {\n            units: yUnits,\n            label: yLabel,\n            variableName: yVariable,\n        });\n        if (x && y) {\n            return {\n                title: spectrum.title,\n                dataType: spectrum.dataType,\n                meta: spectrum.meta,\n                variables: { x, y },\n            };\n        }\n    }\n    return;\n}\nfunction getPossibleVariable(variables, selector = {}) {\n    var _a, _b;\n    const { units, label, variableName } = selector;\n    let possible = { ...variables };\n    let key;\n    if (units !== undefined) {\n        for (key in possible) {\n            const variable = variables[key];\n            let converted = convertUnit(1, (variable === null || variable === void 0 ? void 0 : variable.units) || '', units);\n            if (converted && variable) {\n                possible[key] = getConvertedVariable(variable, units);\n            }\n            else {\n                delete possible[key];\n            }\n        }\n    }\n    if (label !== undefined) {\n        const regexpLabel = ensureRegexp(label);\n        for (key in possible) {\n            if (!regexpLabel.exec((_b = (_a = variables[key]) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : '')) {\n                delete possible[key];\n            }\n        }\n    }\n    if (variableName !== undefined) {\n        if (possible[variableName])\n            return possible[variableName];\n        const upper = variableName.toUpperCase();\n        if (Object.prototype.hasOwnProperty.call(possible, upper)) {\n            return possible[upper];\n        }\n        const lower = variableName.toLowerCase();\n        if (Object.prototype.hasOwnProperty.call(possible, lower)) {\n            return possible[lower];\n        }\n    }\n    const possibleFiltered = Object.values(possible).filter((val) => val !== undefined);\n    if (possibleFiltered.length > 0) {\n        return possibleFiltered[0];\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0WFlTcGVjdHJ1bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2dldFhZU3BlY3RydW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBU3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixVQUEyQixFQUFFLEVBQzdCLFdBQTZCLEVBQUU7SUFFL0IsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPO0lBRS9CLElBQUksRUFDRixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FBRyxHQUFHLEVBQ2YsU0FBUyxHQUFHLEdBQUcsRUFDZixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sSUFBSSxFQUNKLEtBQUssR0FDTixHQUFHLFFBQVEsQ0FBQztJQUViLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtRQUN2QixPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN2QjtJQUVELElBQUksUUFBUSxFQUFFO1FBQ1osUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNuQztJQUVELElBQUksS0FBSyxFQUFFO1FBQ1QsS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3QjtJQUVELElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTTtRQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUUsSUFBSSxNQUFNLElBQUks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","import isAnyArray from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\nimport { xIsMonotone } from 'ml-spectra-processing';\nimport { getNormalizedSpectrum } from './util/getNormalizedSpectrum';\nimport { getXYSpectrum } from './util/getXYSpectrum';\n/**\n * Class allowing to store and manipulate an analysis.\n * An analysis may contain one or more spectra that can be selected\n * based on their units\n */\nexport class Analysis {\n    constructor(options = {}) {\n        this.id = options.id || Math.random().toString(36).substring(2, 10);\n        this.label = options.label || this.id;\n        this.spectrumCallback = options.spectrumCallback;\n        this.spectra = [];\n        this.cache = {};\n    }\n    /**\n     * Add a spectrum in the internal spectra variable\n     */\n    pushSpectrum(variables, options = {}) {\n        this.spectra.push(standardizeData(variables, options, {\n            spectrumCallback: this.spectrumCallback,\n        }));\n        this.cache = {};\n    }\n    /**\n     * Retrieve a Spectrum based on x/y units\n     */\n    getXYSpectrum(selector = {}) {\n        let id = JSON.stringify(selector);\n        if (!this.cache[id]) {\n            this.cache[id] = getXYSpectrum(this.spectra, selector);\n        }\n        return this.cache[id];\n    }\n    /**\n     * Retrieve a xy object\n     * @param selector.units Units separated by vs like for example \"g vs °C\"\n     * @param selector.xUnits if undefined takes the first variable\n     * @param selector.yUnits if undefined takes the second variable\n     */\n    getXY(selector = {}) {\n        let spectrum = this.getXYSpectrum(selector);\n        if (!spectrum)\n            return undefined;\n        return {\n            x: spectrum.variables.x.data,\n            y: spectrum.variables.y.data,\n        };\n    }\n    /**\n     * Return the data object for specific x/y units with possibly some\n     * normalization options\n     * @param options.selector.xUnits // if undefined takes the first variable\n     * @param options.selector.yUnits // if undefined takes the second variable\n     */\n    getNormalizedSpectrum(options = {}) {\n        const { normalization, selector } = options;\n        const spectrum = this.getXYSpectrum(selector);\n        if (!spectrum)\n            return undefined;\n        return getNormalizedSpectrum(spectrum, normalization);\n    }\n    /**\n     * Returns the first spectrum. This method could be improved in the future\n     * @returns\n     */\n    getSpectrum() {\n        return this.spectra[0];\n    }\n    /**\n     * Returns the xLabel\n     * @param selector.xUnits // if undefined takes the first variable\n     * @param selector.yUnits // if undefined takes the second variable\n     */\n    getXLabel(selector) {\n        var _a;\n        return (_a = this.getXYSpectrum(selector)) === null || _a === void 0 ? void 0 : _a.variables.x.label;\n    }\n    /**\n     * Returns the yLabel\n     * @param selector.xUnits // if undefined takes the first variable\n     * @param selector.yUnits // if undefined takes the second variable\n     */\n    getYLabel(selector) {\n        var _a;\n        return (_a = this.getXYSpectrum(selector)) === null || _a === void 0 ? void 0 : _a.variables.y.label;\n    }\n}\n/**\n * Internal function that ensure the order of x / y array\n */\nfunction standardizeData(variables, options, analysisOptions) {\n    let { meta = {}, dataType = '', title = '' } = options;\n    const { spectrumCallback } = analysisOptions;\n    if (spectrumCallback) {\n        spectrumCallback(variables);\n    }\n    let xVariable = variables.x;\n    let yVariable = variables.y;\n    if (!xVariable || !yVariable) {\n        throw Error('A spectrum must contain at least x and y variables');\n    }\n    if (!isAnyArray(xVariable.data) || !isAnyArray(yVariable.data)) {\n        throw Error('x and y variables must contain an array data');\n    }\n    let x = xVariable.data;\n    let reverse = x && x.length > 1 && x[0] > x[x.length - 1];\n    for (let [key, variable] of Object.entries(variables)) {\n        if (reverse)\n            variable.data = variable.data.slice().reverse();\n        variable.label = variable.label || key;\n        if (variable.label.match(/^.*[([](?<units>.*)[)\\]].*$/)) {\n            const units = variable.label.replace(/^.*[([](?<units>.*)[)\\]].*$/, '$<units>');\n            if (!variable.units || variable.units === units) {\n                variable.units = units;\n                variable.label = variable.label.replace(/[([].*[)\\]]/, '').trim();\n            }\n        }\n        variable.min = min(variable.data);\n        variable.max = max(variable.data);\n        variable.isMonotone = xIsMonotone(variable.data);\n    }\n    return {\n        variables,\n        title,\n        dataType,\n        meta,\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5hbHlzaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQW5hbHlzaXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBS3BELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWNyRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFPbkIsWUFBbUIsVUFBMkIsRUFBRTtRQUM5QyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUNqQixTQUE0QixFQUM1QixVQUF1QyxFQUFFO1FBRXpDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLGVBQWUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFO1lBQ2xDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7U0FDeEMsQ0FBQyxDQUNILENBQUM7UUFDRixJQUFJLENB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","import { airPLSBaseline, rollingAverageBaseline, iterativePolynomialBaseline, rollingBallBaseline, rollingMedianBaseline, } from 'baselines';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\nimport normed from 'ml-array-normed';\nimport rescale from 'ml-array-rescale';\nimport equallySpaced from 'ml-array-xy-equally-spaced';\nimport filterX from 'ml-array-xy-filter-x';\nimport savitzkyGolay from 'ml-savitzky-golay';\nimport { xDivide, xSubtract, xMultiply, xAdd, xIsMonotone, xyEnsureGrowingX, } from 'ml-spectra-processing';\nimport Stat from 'ml-stat/array';\nexport function getNormalizedSpectrum(spectrum, options = {}) {\n    var _a;\n    let data = {\n        x: spectrum.variables.x.data,\n        y: spectrum.variables.y.data,\n    };\n    let newSpectrum = {\n        variables: {\n            x: {\n                data: spectrum.variables.x.data,\n                units: spectrum.variables.x.units,\n                label: spectrum.variables.x.label,\n            },\n            y: {\n                data: spectrum.variables.y.data,\n                units: spectrum.variables.y.units,\n                label: spectrum.variables.y.label,\n            },\n        },\n    };\n    if (spectrum.title)\n        newSpectrum.title = spectrum.title;\n    if (spectrum.dataType)\n        newSpectrum.dataType = spectrum.dataType;\n    if (spectrum.meta)\n        newSpectrum.meta = spectrum.meta;\n    let { from = spectrum.variables.x.min, to = spectrum.variables.x.max, numberOfPoints, filters = [], exclusions = [], processing = '', keepYUnits = false, } = options;\n    let { x, y } = filterX(data, { from, to });\n    switch (processing) {\n        case 'firstDerivative':\n            if (options.processing) {\n                newSpectrum.variables.y.units = '';\n                newSpectrum.variables.y.label =\n                    newSpectrum.variables.y.label &&\n                        `1st derivative of ${newSpectrum.variables.y.label.replace(/\\s*\\[.*\\]/, '')}`;\n                y = savitzkyGolay(y, 1, {\n                    derivative: 1,\n                    polynomial: 2,\n                    windowSize: 5,\n                });\n                x = x.slice(2, x.length - 2);\n            }\n            break;\n        case 'secondDerivative':\n            if (options.processing) {\n                newSpectrum.variables.y.units = '';\n                newSpectrum.variables.y.label =\n                    newSpectrum.variables.y.label &&\n                        `2nd derivative of ${newSpectrum.variables.y.label.replace(/\\s*\\[.*\\]/, '')}`;\n                y = savitzkyGolay(y, 1, {\n                    derivative: 2,\n                    polynomial: 2,\n                    windowSize: 5,\n                });\n                x = x.slice(2, x.length - 2);\n            }\n            break;\n        case 'thirdDerivative':\n            if (options.processing) {\n                newSpectrum.variables.y.units = '';\n                newSpectrum.variables.y.label =\n                    newSpectrum.variables.y.label &&\n                        `3rd derivative of ${newSpectrum.variables.y.label.replace(/\\s*\\[.*\\]/, '')}`;\n                y = savitzkyGolay(y, 1, {\n                    derivative: 3,\n                    polynomial: 2,\n                    windowSize: 5,\n                });\n                x = x.slice(2, x.length - 2);\n            }\n            break;\n        default:\n    }\n    if (!keepYUnits && filters.length) {\n        // filters change the y axis, we get rid of the units\n        newSpectrum.variables.y.units = '';\n        newSpectrum.variables.y.label = (_a = newSpectrum.variables.y.label) === null || _a === void 0 ? void 0 : _a.replace(/\\s*\\[.*\\]/, '');\n    }\n    for (let filter of filters) {\n        let filterOptions = filter.options || {};\n        switch (filter.name.toLowerCase()) {\n            case 'centermean': {\n                let mean = Stat.mean(y);\n                y = xSubtract(y, mean);\n                break;\n            }\n            case 'dividebysd': {\n                let std = Stat.standardDeviation(y);\n                y = xDivide(y, std);\n                break;\n            }\n            case 'normalize': {\n                y = normed(y, {\n                    sumValue: filterOptions.value ? Number(filterOptions.value) : 1,\n                    algorithm: 'absolute',\n                });\n                break;\n            }\n            case 'rescale': {\n                y = rescale(y, {\n                    min: filterOptions.min ? Number(filterOptions.min) : 0,\n                    max: filterOptions.max ? Number(filterOptions.max) : 1,\n                });\n                break;\n            }\n            case 'dividebymax': {\n                let maxValue = max(y);\n                y = xDivide(y, maxValue);\n                break;\n            }\n            case 'multiply': {\n                y = xMultiply(y, filterOptions.value ? Number(filterOptions.value) : 1);\n                break;\n            }\n            case 'add': {\n                y = xAdd(y, filterOptions.value ? Number(filterOptions.value) : 0);\n                break;\n            }\n            case 'airplsbaseline': {\n                y = airPLSBaseline(y, filterOptions).correctedSpectrum;\n                break;\n            }\n            case 'rollingaveragebaseline': {\n                y = rollingAverageBaseline(y, filterOptions).correctedSpectrum;\n                break;\n            }\n            case 'iterativepolynomialbaseline': {\n                y = iterativePolynomialBaseline(y, undefined, filterOptions).correctedSpectrum;\n                break;\n            }\n            case 'rollingballbaseline': {\n                y = rollingBallBaseline(y, filterOptions).correctedSpectrum;\n                break;\n            }\n            case 'rollingmedianbaseline': {\n                y = rollingMedianBaseline(y, filterOptions).correctedSpectrum;\n                break;\n            }\n            case 'ensuregrowing': {\n                const ans = xyEnsureGrowingX({ x, y });\n                x = ans.x;\n                y = ans.y;\n                break;\n            }\n            case '':\n            case undefined:\n                break;\n            default:\n                throw new Error(`Unknown process kind: ${filter.name}`);\n        }\n    }\n    if (!numberOfPoints) {\n        data = filterX({ x, y }, { from, to, exclusions });\n    }\n    else {\n        data = equallySpaced({ x, y }, { from, to, numberOfPoints, exclusions });\n    }\n    newSpectrum.variables.x.data = x;\n    newSpectrum.variables.x.min = min(x);\n    newSpectrum.variables.x.max = max(x);\n    newSpectrum.variables.x.isMonotone = xIsMonotone(x);\n    newSpectrum.variables.y.data = y;\n    newSpectrum.variables.y.min = min(y);\n    newSpectrum.variables.y.max = max(y);\n    newSpectrum.variables.y.isMonotone = xIsMonotone(y);\n    return newSpectrum;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Tm9ybWFsaXplZFNwZWN0cnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvZ2V0Tm9ybWFsaXplZFNwZWN0cnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQixtQkFBbUIsRUFDbkIscUJBQXFCLEdBQ3RCLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDL0IsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxhQUFhLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFDM0MsT0FBTyxhQUFhLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUNMLE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixXQUFXLEVBQ1gsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBS2pDLE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsUUFBa0IsRUFDbEIsVUFBcUMsRUFBRTs7SUFFdkMsSUFBSSxJQUFJLEdBQUc7UUFDVCxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUM1QixDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtLQUM3QixDQUFDO0lBQ0YsSUFBSSxXQUFXLEdBQWE7UUFDMUIsU0FBUyxFQUFFO1lBQ1QsQ0FBQyxFQUFFO2dCQUNELElBQUksRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUMvQixLQUFLLEVBQUUsUUFBUSxDQUFD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","/**\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    return 'utf-8';\n}\n//# sourceMappingURL=index.js.map","/**\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 {\n            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            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                        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 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: 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: minZ,\n        maxZ: 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","// sources:\n// https://en.wikipedia.org/wiki/Gyromagnetic_ratio\n// TODO: #13 can we have a better source and more digits ? @jwist\nexport 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=gyromagneticRatio.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 'nmr-processing';\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} 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 } from 'jcampconverter';\nimport { Analysis } from '../Analysis';\n/**\n * Creates a new Analysis from a JCAMP string\n * @param {string} jcamp - String containing the JCAMP data\n * @param {object} [options={}]\n * @param {object} [options.id=Math.random()]\n * @param {string} [options.label=options.id] human redeable label\n * @param {string} [options.spectrumCallback] a callback to apply on variables when creating spectrum\n * @return {Analysis} - New class element with the given data\n */\nexport function fromJcamp(jcamp, options = {}) {\n    let analysis = new Analysis(options);\n    addJcamp(analysis, jcamp);\n    return analysis;\n}\nfunction addJcamp(analysis, jcamp) {\n    let converted = convert(jcamp, {\n        keepRecordsRegExp: /.*/,\n    });\n    for (let entry of converted.flatten) {\n        if (!entry.spectra || !entry.spectra[0])\n            continue;\n        let currentSpectrum = entry.spectra[0];\n        // we ensure variables\n        if (!currentSpectrum.variables) {\n            const variables = {};\n            currentSpectrum.variables = variables;\n            variables.x = {\n                label: currentSpectrum.xUnits,\n                symbol: 'X',\n                data: currentSpectrum.data.x || currentSpectrum.data.X,\n            };\n            variables.y = {\n                label: currentSpectrum.yUnits,\n                symbol: 'Y',\n                data: currentSpectrum.data.y || currentSpectrum.data.Y,\n            };\n        }\n        else {\n            for (let key in currentSpectrum.variables) {\n                const variable = currentSpectrum.variables[key];\n                if (variable.label)\n                    continue;\n                variable.label = variable.name || variable.symbol || key;\n                if (variable.units && !variable.label.includes(variable.units)) {\n                    variable.label += ` [${variable.units}]`;\n                }\n            }\n        }\n        analysis.pushSpectrum(currentSpectrum.variables, {\n            dataType: entry.dataType,\n            title: entry.title,\n            meta: entry.meta,\n        });\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbUpjYW1wLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Zyb20vZnJvbUpjYW1wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3ZDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUEyQixFQUFFLE9BQU8sR0FBRyxFQUFFO0lBQ2pFLElBQUksUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUIsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLFFBQWtCLEVBQUUsS0FBMkI7SUFDL0QsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRTtRQUM3QixpQkFBaUIsRUFBRSxJQUFJO0tBQ3hCLENBQUMsQ0FBQztJQUVILEtBQUssSUFBSSxLQUFLLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRTtRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQUUsU0FBUztRQUNsRCxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZDLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRTtZQUM5QixNQUFNLFNBQVMsR0FBcUMsRUFBRSxDQUFDO1lBQ3ZELGVBQWUsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ3RDLFNBQVMsQ0FBQyxDQUFDLEdBQUc7Z0JBQ1osS0FBSyxFQUFFLGVBQWUsQ0FBQyxNQUFNO2dCQUM3QixNQUFNLEVBQUUsR0FBRztnQkFDWCxJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3ZELENBQUM7WUFDRixTQUFTLENBQUMsQ0FBQyxHQUFHO2dCQUNaLEtBQUssRUFBRSxlQUFlLENBQUMsTUFBTTtnQkFDN0IsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN2RCxDQUFDO1NBQ0g7YUFBTTtZQUNMLEtBQUssSUFBSSxHQUFHLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRTtnQkFDekMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxRQUFRLENBQUMsS0FBSztvQkFBRSxTQUFTO2dCQUM3QixRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUM7Z0JBQ3pELElBQUksUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDOUQsUUFBUSxDQUFDLEtBQUssSUFBSSxLQUFLLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQztpQkFDMUM7YUFDRjtTQUNGO1FBRUQsUUFBUSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFO1lBQy9DLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1NBQ2pCLENBQUMsQ0FBQztLQUNKO0FBQ0gsQ0FBQyJ9","import maxFct from 'ml-array-max';\nimport minFct from 'ml-array-min';\n\n/**\n * Parse from a xyxy data array\n * @param {Array<Array<number>>} variables\n * @param {object} [meta] - same metadata object format that the fromText\n * @return {string} JCAMP of the input\n */\nexport default function creatorNtuples(variables, options) {\n  const { meta = {}, info = {} } = options;\n\n  const { title = '', owner = '', origin = '', dataType = '' } = info;\n\n  const symbol = [];\n  const varName = [];\n  const varType = [];\n  const varDim = [];\n  const units = [];\n  const first = [];\n  const last = [];\n  const min = [];\n  const max = [];\n  const factor = [];\n\n  const keys = Object.keys(variables);\n  for (let i = 0; i < keys.length; i++) {\n    const key = keys[i];\n    let variable = variables[key];\n\n    let name = variable.label && variable.label.replace(/ *\\[.*/, '');\n    let unit = variable.label && variable.label.replace(/.*\\[(.*)\\].*/, '$1');\n\n    symbol.push(variable.symbol || key);\n    varName.push(variable.name || name || key);\n    varDim.push(variables[key].data.length);\n\n    if (variable.isDependent !== undefined) {\n      varType.push(variable.isDependent ? 'DEPENDENT' : 'INDEPENDENT');\n    } else {\n      varType.push(\n        variable.type\n          ? variable.type.toUpperCase()\n          : i === 0\n          ? 'INDEPENDENT'\n          : 'DEPENDENT',\n      );\n    }\n\n    units.push(variable.units || unit || '');\n    first.push(variables[key][0]);\n    last.push(variables[key][variables[key].length - 1]);\n    min.push(minFct(variables[key].data));\n    max.push(maxFct(variables[key].data));\n    factor.push(1);\n  }\n\n  let header = `##TITLE=${title}\n##JCAMP-DX=6.00\n##DATA TYPE=${dataType}\n##ORIGIN=${origin}\n##OWNER=${owner}\\n`;\n\n  for (const key in meta) {\n    header +=\n      typeof meta[key] === 'object'\n        ? `##$${key}=${JSON.stringify(meta[key])}\\n`\n        : `##$${key}=${meta[key]}\\n`;\n  }\n\n  header += `##NTUPLES= ${dataType}\n##VAR_NAME=  ${varName.join()}\n##SYMBOL=    ${symbol.join()}\n##VAR_TYPE=  ${varType.join()}\n##VAR_DIM=   ${varDim.join()}\n##UNITS=     ${units.join()}\n##PAGE= N=1\\n`;\n\n  header += `##DATA TABLE= (${symbol.join('')}..${symbol.join('')}), PEAKS\\n`;\n\n  for (let i = 0; i < variables[keys[0]].data.length; i++) {\n    let point = [];\n    for (let key of keys) {\n      point.push(variables[key].data[i]);\n    }\n    header += `${point.join('\\t')}\\n`;\n  }\n\n  header += '##END';\n  return header;\n}\n","export function getNumber(number, factor) {\n  if (factor !== 1) number /= factor;\n  const rounded = Math.round(number);\n  if (rounded !== number && Math.abs(rounded - number) <= Number.EPSILON) {\n    return rounded;\n  }\n  return number;\n}\n","import { getNumber } from './getNumber.js';\n\nexport function peakTableCreator(data, options = {}) {\n  const { xFactor = 1, yFactor = 1 } = options;\n  let firstX = Number.POSITIVE_INFINITY;\n  let lastX = Number.NEGATIVE_INFINITY;\n  let firstY = Number.POSITIVE_INFINITY;\n  let lastY = Number.NEGATIVE_INFINITY;\n\n  let lines = [];\n\n  for (let i = 0; i < data.x.length; i++) {\n    let x = data.x[i];\n    let y = data.y[i];\n    if (firstX > x) {\n      firstX = x;\n    }\n    if (lastX < x) {\n      lastX = x;\n    }\n    if (firstY > y) {\n      firstY = y;\n    }\n    if (lastY < y) {\n      lastY = y;\n    }\n  }\n  lines.push(`##FIRSTX=${firstX}`);\n  lines.push(`##LASTX=${lastX}`);\n  lines.push(`##FIRSTY=${firstY}`);\n  lines.push(`##LASTY=${lastY}`);\n  lines.push(`##XFACTOR=${xFactor}`);\n  lines.push(`##YFACTOR=${yFactor}`);\n  lines.push('##PEAK TABLE=(XY..XY)');\n\n  for (let i = 0; i < data.x.length; i++) {\n    lines.push(\n      `${getNumber(data.x[i], xFactor)} ${getNumber(data.y[i], yFactor)}`,\n    );\n  }\n  return lines;\n}\n","import { getNumber } from './getNumber.js';\n\nexport function xyDataCreator(data, options = {}) {\n  const { xFactor = 1, yFactor = 1 } = options;\n  let firstX = data.x[0];\n  let lastX = data.x[data.x.length - 1];\n  let firstY = data.y[0];\n  let lastY = data.y[data.y.length - 1];\n  let nbPoints = data.x.length;\n  let deltaX = (lastX - firstX) / (nbPoints - 1);\n  let lines = [];\n\n  lines.push(`##FIRSTX=${firstX}`);\n  lines.push(`##LASTX=${lastX}`);\n  lines.push(`##FIRSTY=${firstY}`);\n  lines.push(`##LASTY=${lastY}`);\n  lines.push(`##DELTAX=${deltaX}`);\n  lines.push(`##XFACTOR=${xFactor}`);\n  lines.push(`##YFACTOR=${yFactor}`);\n  lines.push(`##DELTAX=${xFactor}`);\n  lines.push('##XYDATA=(X++(Y..Y))');\n\n  let line = data.x[0];\n  for (let i = 0; i < data.x.length; i++) {\n    line += ` ${getNumber(data.y[i], yFactor)}`;\n    if (line.length > 70) {\n      lines.push(line);\n      if (i < data.x.length - 1) {\n        line = getNumber(data.x[0] + i * deltaX, xFactor);\n      } else {\n        line = '';\n      }\n    }\n  }\n  if (line) lines.push(line);\n  return lines;\n}\n","import { peakTableCreator } from './utils/peakTableCreator';\nimport { xyDataCreator } from './utils/xyDataCreator';\n/**\n * Create a jcamp\n * @param {object} data object of array\n * @param {object} [options={}] metadata object\n * @param {string} [options.info={}] metadata of the file\n * @param {string} [options.info.title=''] title of the file\n * @param {string} [options.info.owner=''] owner of the file\n * @param {string} [options.info.origin=''] origin of the file\n * @param {string} [options.info.dataType=''] type of data\n * @param {string} [options.info.xUnits=''] units for the x axis for variables===undefined\n * @param {string} [options.info.yUnits=''] units for the y axis for variables===undefined\n * @param {number} [options.info.xFactor=1] factor to multiply X values\n * @param {number} [options.info.yFactor=1] factor to multiply Y values\n * @param {object} [options.meta={}] comments to add to the file\n * @param {boolean} [options.xydata=false] Use XYDATA format. Will use first / last X and equidistant Xs values if true\n * @return {string} JCAMP of the input\n */\nexport function fromJSON(data, options = {}) {\n  const { meta = {}, info = {}, xydata = false } = options;\n\n  const {\n    title = '',\n    owner = '',\n    origin = '',\n    dataType = '',\n    xUnits = '',\n    yUnits = '',\n    xFactor = 1,\n    yFactor = 1,\n  } = info;\n\n  data = { x: data.x, y: data.y };\n\n  let header = `##TITLE=${title}\n##JCAMP-DX=4.24\n##DATA TYPE=${dataType}\n##ORIGIN=${origin}\n##OWNER=${owner}\n##XUNITS=${xUnits}\n##YUNITS=${yUnits}\\n`;\n\n  for (const key in meta) {\n    header +=\n      key.toLowerCase() === 'cheminfo'\n        ? `##$${key}=${JSON.stringify(meta[key])}\\n`\n        : `##$${key}=${meta[key]}\\n`;\n  }\n\n  // we leave the header and utf8 fonts ${header.replace(/[^\\t\\r\\n\\x20-\\x7F]/g, '')\n\n  return `${header}##NPOINTS=${data.x.length}\n${(xydata\n  ? xyDataCreator(data, { xFactor, yFactor })\n  : peakTableCreator(data, { xFactor, yFactor })\n).join('\\n')}\n##END`;\n}\n","import { fromVariables } from 'convert-to-jcamp';\nexport function toJcamps(analysis, options = {}) {\n    let jcamps = [];\n    for (let spectrum of analysis.spectra) {\n        jcamps.push(getJcamp(spectrum, options));\n    }\n    return jcamps;\n}\nfunction getJcamp(spectrum, options) {\n    const { info = {}, meta = {} } = options;\n    let jcampOptions = {\n        options: {},\n        info: {\n            title: spectrum.title,\n            dataType: spectrum.dataType,\n            ...info,\n        },\n        meta: { ...spectrum.meta, ...meta },\n    };\n    return fromVariables(spectrum.variables, jcampOptions);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9KY2FtcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG8vdG9KY2FtcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBU2pELE1BQU0sVUFBVSxRQUFRLENBQUMsUUFBa0IsRUFBRSxVQUEyQixFQUFFO0lBQ3hFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFLLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7UUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDMUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsUUFBa0IsRUFBRSxPQUF3QjtJQUM1RCxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRXpDLElBQUksWUFBWSxHQUFHO1FBQ2pCLE9BQU8sRUFBRSxFQUFFO1FBQ1gsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3JCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtZQUMzQixHQUFHLElBQUk7U0FDUjtRQUNELElBQUksRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksRUFBRTtLQUNwQyxDQUFDO0lBRUYsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN6RCxDQUFDIn0=","import creatorNtuples from './creatorNtuples';\nimport { fromJSON } from './fromJSON';\n\n/**\n * Create a jcamp from variables\n * @param {Array<Variable} [variables={}] - object of variables\n * @param {string} [options.info={}] - metadata of the file\n * @param {string} [options.info.title = ''] - title of the file\n * @param {string} [options.info.owner = ''] - owner of the file\n * @param {string} [options.info.origin = ''] - origin of the file\n * @param {string} [options.info.dataType = ''] - type of data\n * @param {object} [options.meta = {}] - comments to add to the file\n * @param {object} [options.forceNtuples = false] - force the ntuples format even if there is only x and y variables\n */\nexport function fromVariables(variables = {}, options = {}) {\n  const { info, meta, forceNtuples } = options;\n\n  let jcampOptions = {\n    info,\n    meta,\n  };\n\n  let keys = Object.keys(variables).map((key) => key.toLowerCase());\n  if (\n    keys.length === 2 &&\n    keys.includes('x') &&\n    keys.includes('y') &&\n    !forceNtuples\n  ) {\n    let x = variables.x;\n    let xLabel = x.label || x.name || 'x';\n\n    jcampOptions.info.xUnits = xLabel.includes(variables.x.units)\n      ? xLabel\n      : `${xLabel} [${variables.x.units}]`;\n\n    let y = variables.y;\n    let yLabel = y.label || y.name || 'y';\n\n    jcampOptions.info.yUnits = yLabel.includes(variables.y.units)\n      ? yLabel\n      : `${yLabel} [${variables.y.units}]`;\n    return fromJSON({ x: variables.x.data, y: variables.y.data }, jcampOptions);\n  } else {\n    return creatorNtuples(variables, options);\n  }\n}\n","import { getJSGraph } from './jsgraph/getJSGraph';\nimport { getNormalizationAnnotations } from './jsgraph/getNormalizationAnnotations';\nexport * from './AnalysesManager';\nexport * from './Analysis';\nexport * from './from/fromJcamp';\nexport * from './from/fromText';\nexport * from './to/toJcamp';\nexport * from './to/toJcamps';\nexport * from './to/toText';\nexport * from './util/getNormalizedSpectrum';\nexport * from './util/peakPicking';\nexport * from './util/autoPeakPicking';\nexport * from './types/types';\nexport * from './types/AutoPeakPickingOptions';\nexport * from './types/NormalizedFilters';\nexport * from './types/NormalizedSpectrumOptions';\nexport * from './types/PlotObject';\nexport * from './types/SGOptions';\nexport * from './types/ShapeOptions';\nexport * from './types/SpectrumSelector';\nexport { getReactPlotJSON } from './reactPlot/getReactPlotJSON';\nexport const JSGraph = {\n    getJSGraph,\n    getNormalizationAnnotations,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXBGLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsOEJBQThCLENBQUM7QUFFN0MsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHdCQUF3QixDQUFDO0FBRXZDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLG1DQUFtQyxDQUFDO0FBRWxELGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsMEJBQTBCLENBQUM7QUFFekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFaEUsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHO0lBQ3JCLFVBQVU7SUFDViwyQkFBMkI7Q0FDNUIsQ0FBQyJ9","import { xyFilterXPositive } from 'ml-spectra-processing';\nimport { addStyle } from './addStyle';\nimport { COLORS } from './colors';\n/**\n * Generate a jsgraph chart format from an array of Analysis\n */\nexport function getJSGraph(analyses, options = {}) {\n    const { colors = COLORS, opacities = [1], linesWidth = [1], selector = {}, normalization, xAxis = {}, yAxis = {}, } = options;\n    let series = [];\n    let xLabel = xAxis.label;\n    let yLabel = yAxis.label;\n    let xUnits = xAxis.units;\n    let yUnits = yAxis.units;\n    for (let i = 0; i < analyses.length; i++) {\n        const analysis = analyses[i];\n        let serie = {};\n        let currentData = analysis.getNormalizedSpectrum({\n            selector,\n            normalization,\n        });\n        if (!currentData)\n            continue;\n        if (!xLabel)\n            xLabel = currentData.variables.x.label;\n        if (!yLabel)\n            yLabel = currentData.variables.y.label;\n        if (!xUnits)\n            xUnits = currentData.variables.x.units;\n        if (!yUnits)\n            yUnits = currentData.variables.y.units;\n        addStyle(serie, analysis, {\n            color: colors[i % colors.length],\n            opacity: opacities[i % opacities.length],\n            lineWidth: linesWidth[i % linesWidth.length],\n        });\n        serie.data = {\n            x: currentData.variables.x.data,\n            y: currentData.variables.y.data,\n        };\n        if (xAxis.logScale) {\n            serie.data = xyFilterXPositive(serie.data);\n        }\n        series.push(serie);\n    }\n    return {\n        axes: {\n            x: {\n                label: xLabel,\n                unit: xUnits,\n                unitWrapperBefore: '(',\n                unitWrapperAfter: ')',\n                flipped: false,\n                display: true,\n                ...xAxis,\n            },\n            y: {\n                label: yLabel,\n                unit: yUnits,\n                unitWrapperBefore: '(',\n                unitWrapperAfter: ')',\n                flipped: false,\n                display: true,\n                ...yAxis,\n            },\n        },\n        series,\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0SlNHcmFwaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc2dyYXBoL2dldEpTR3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBdUJsQzs7R0FFRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsUUFBb0IsRUFBRSxVQUEwQixFQUFFO0lBQzNFLE1BQU0sRUFDSixNQUFNLEdBQUcsTUFBTSxFQUNmLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUNmLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUNoQixRQUFRLEdBQUcsRUFBRSxFQUNiLGFBQWEsRUFDYixLQUFLLEdBQUcsRUFBRSxFQUNWLEtBQUssR0FBRyxFQUFFLEdBQ1gsR0FBRyxPQUFPLENBQUM7SUFDWixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUN6QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3pCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDekIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUV6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxLQUFLLEdBQTRCLEVBQUUsQ0FBQztRQUN4QyxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUM7WUFDL0MsUUFBUTtZQUNSLGFBQWE7U0FDZCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsV0FBVztZQUFFLFNBQVM7UUFDM0IsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3BELElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNwRCxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDcEQsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3BELFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFO1lBQ3hCLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDaEMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUN4QyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1NBQzdDLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxJQUFJLEdBQUc7WUFDWCxDQUFDLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUMvQixDQUFDLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUNoQyxDQUFDO1FBRUYsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ2xCLEtBQUssQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNwQjtJQUNELE9BQU87UUFDTCxJQUFJLEVBQUU7WUFDSixDQUFDLEVBQUU7Z0JBQ0QsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsSUFBSSxFQUFFLE1BQU07Z0JBQ1osaUJBQWlCLEVBQUUsR0FBRztnQkFDdEIsZ0JBQWdCLEVBQUUsR0FBRztnQkFDckIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsR0FBRyxLQUFLO2FBQ1Q7WUFDRCxDQUFDLEVBQUU7Z0JBQ0QsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsSUFBSSxFQUFFLE1BQU07Z0JBQ1osaUJBQWlCLEVBQUUsR0FBRztnQkFDdEIsZ0JBQWdCLEVBQUUsR0FBRztnQkFDckIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsR0FBRyxLQUFLO2FBQ1Q7U0FDRjtRQUNELE1BQU07S0FDUCxDQUFDO0FBQ0osQ0FBQyJ9","export function getNormalizationAnnotations(filter = {}, boundary = { y: { min: '0px', max: '2000px' } }) {\n    let { exclusions = [] } = filter;\n    let annotations = [];\n    exclusions = exclusions.filter((exclusion) => !exclusion.ignore);\n    annotations = exclusions.map((exclusion) => {\n        let annotation = {\n            type: 'rect',\n            position: [\n                { x: exclusion.from, y: boundary.y.min },\n                { x: exclusion.to, y: boundary.y.max },\n            ],\n            strokeWidth: 0,\n            fillColor: 'rgba(255,255,224,1)',\n        };\n        return annotation;\n    });\n    if (filter.from !== undefined) {\n        annotations.push({\n            type: 'rect',\n            position: [\n                { x: Number.MIN_SAFE_INTEGER, y: boundary.y.min },\n                { x: filter.from, y: boundary.y.max },\n            ],\n            strokeWidth: 0,\n            fillColor: 'rgba(255,255,224,1)',\n        });\n    }\n    if (filter.to !== undefined) {\n        annotations.push({\n            type: 'rect',\n            position: [\n                { x: filter.to, y: boundary.y.min },\n                { x: Number.MAX_SAFE_INTEGER, y: boundary.y.max },\n            ],\n            strokeWidth: 0,\n            fillColor: 'rgba(255,255,224,1)',\n        });\n    }\n    return annotations;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Tm9ybWFsaXphdGlvbkFubm90YXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2pzZ3JhcGgvZ2V0Tm9ybWFsaXphdGlvbkFubm90YXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVdBLE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsU0FBNEIsRUFBRSxFQUM5QixRQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRTtJQUUvQyxJQUFJLEVBQUUsVUFBVSxHQUFHLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUVqQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDckIsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pFLFdBQVcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7UUFDekMsSUFBSSxVQUFVLEdBQUc7WUFDZixJQUFJLEVBQUUsTUFBTTtZQUNaLFFBQVEsRUFBRTtnQkFDUixFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRTtnQkFDeEMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7YUFDdkM7WUFDRCxXQUFXLEVBQUUsQ0FBQztZQUNkLFNBQVMsRUFBRSxxQkFBcUI7U0FDakMsQ0FBQztRQUNGLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUM3QixXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2YsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUU7Z0JBQ1IsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRTtnQkFDakQsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7YUFDdEM7WUFDRCxXQUFXLEVBQUUsQ0FBQztZQUNkLFNBQVMsRUFBRSxxQkFBcUI7U0FDakMsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFO1FBQzNCLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDZixJQUFJLEVBQUUsTUFBTTtZQUNaLFFBQVEsRUFBRTtnQkFDUixFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRTtnQkFDbkMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRTthQUNsRDtZQUNELFdBQVcsRUFBRSxDQUFDO1lBQ2QsU0FBUyxFQUFFLHFCQUFxQjtTQUNqQyxDQUFDLENBQUM7S0FDSjtJQUNELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMifQ==","/**\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    return 'utf-8';\n}\n//# sourceMappingURL=index.js.map","import { parseDT0 } from './utils/parseDT0';\nimport { parseRes } from './utils/parseRes';\n\nexport function pelletHardnessParseHitec(dt0, res) {\n  const variables = parseDT0(dt0);\n  const meta = parseRes(res);\n  return { variables, meta };\n}\n","import { ensureString } from 'ensure-string';\n\nexport function parseDT0(dt0) {\n  dt0 = ensureString(dt0);\n\n  let lines = dt0.split(/\\r?\\n/).filter((line) => line);\n  let data = lines.map((line) => line.split('\\t').map(parseFloat));\n\n  /*\n  column 0: IPH\n  column 1: IPT\n  column 2: %BR\n  column 3: IPS\n  column 4: BRC\n  */\n\n  const variables = {\n    x: {\n      data: data.map((row, index) => index + 1),\n      units: '',\n      label: 'Pellet ID',\n    },\n    a: {\n      data: data.map((row) => row[0]),\n      units: '',\n      label: 'IPT',\n    },\n    y: {\n      data: data.map((row) => row[1]),\n      units: 'cN',\n      label: 'IPH',\n    },\n    b: {\n      data: data.map((row) => row[2]),\n      units: '',\n      label: 'BR',\n    },\n    c: {\n      data: data.map((row) => row[3]),\n      units: '',\n      label: 'IPS',\n    },\n    d: {\n      data: data.map((row) => row[4]),\n      units: '',\n      label: 'BRC',\n    },\n  };\n  return variables;\n}\n","import { ensureString } from 'ensure-string';\n\nexport function parseRes(res) {\n  res = ensureString(res);\n\n  let meta = {};\n  let currentMeta;\n  for (let line of res.split(/\\r?\\n/).filter((line) => line)) {\n    if (line.startsWith('[')) {\n      currentMeta = {};\n      meta[line.replace(/\\[(.*)\\]/, '$1')] = currentMeta;\n    } else {\n      const { field, value } = line.match(/(?<field>.*?)=(?<value>.*)/).groups;\n\n      currentMeta[field] = isNaN(value) ? value : parseFloat(value);\n    }\n  }\n  return meta;\n}\n","import { appendDistinctParameter } from './util/appendDistinctParameter';\nimport { appendDistinctValue } from './util/appendDistinctValue';\nexport class AnalysesManager {\n    constructor() {\n        this.analyses = [];\n    }\n    addAnalysis(analysis) {\n        let index = this.getAnalysisIndex(analysis.id);\n        if (index === undefined) {\n            this.analyses.push(analysis);\n        }\n        else {\n            this.analyses[index] = analysis;\n        }\n    }\n    getAnalyses(options = {}) {\n        const { ids } = options;\n        let analyses = [];\n        for (const analysis of this.analyses) {\n            if (!ids || ids.includes(analysis.id)) {\n                analyses.push(analysis);\n            }\n        }\n        return analyses;\n    }\n    getSpectra() {\n        const spectra = [];\n        for (const analysis of this.analyses) {\n            spectra.push(...analysis.spectra);\n        }\n        return spectra;\n    }\n    /**\n     * Get an array of objects (key + count) of all the titles\n     */\n    getDistinctTitles() {\n        let values = {};\n        for (let spectrum of this.getSpectra()) {\n            if (spectrum.title) {\n                appendDistinctValue(values, spectrum.title);\n            }\n        }\n        return Object.keys(values).map((key) => values[key]);\n    }\n    /**\n     * Get an array of objects (key + count) of all the units\n     */\n    getDistinctUnits() {\n        var _a;\n        let values = {};\n        for (let spectrum of this.getSpectra()) {\n            if (spectrum.variables) {\n                for (let [, variable] of Object.entries(spectrum.variables)) {\n                    const units = (_a = variable.units) === null || _a === void 0 ? void 0 : _a.replace(/\\s+\\[.*/, '');\n                    if (units) {\n                        appendDistinctValue(values, units);\n                    }\n                }\n            }\n        }\n        return Object.keys(values).map((key) => values[key]);\n    }\n    /**\n     * Get an array of objects (key + count) of all the labels\n     */\n    getDistinctLabels() {\n        let values = {};\n        for (let spectrum of this.getSpectra()) {\n            if (spectrum.variables) {\n                for (let [, variable] of Object.entries(spectrum.variables)) {\n                    appendDistinctValue(values, variable.label.replace(/\\s+\\[.*/, ''));\n                }\n            }\n        }\n        return Object.keys(values).map((key) => values[key]);\n    }\n    /**\n     * Get an array of objects (key + count) of all the dataTypes\n     */\n    getDistinctDataTypes() {\n        let values = {};\n        for (let spectrum of this.getSpectra()) {\n            if (spectrum.dataType) {\n                appendDistinctValue(values, spectrum.dataType);\n            }\n        }\n        return Object.keys(values).map((key) => values[key]);\n    }\n    /**\n     * Get an array of objects (key + count) of all the meta\n     */\n    getDistinctMeta() {\n        let values = {};\n        for (let spectrum of this.getSpectra()) {\n            if (spectrum.meta) {\n                for (let key in spectrum.meta) {\n                    appendDistinctParameter(values, key, spectrum.meta[key]);\n                }\n            }\n        }\n        return Object.keys(values).map((key) => values[key]);\n    }\n    removeAllAnalyses() {\n        this.analyses.splice(0);\n    }\n    /**\n     * Remove the analysis from the AnalysesManager for the specified id\n     */\n    removeAnalysis(id) {\n        let index = this.getAnalysisIndex(id);\n        if (index === undefined)\n            return undefined;\n        return this.analyses.splice(index, 1);\n    }\n    /**\n     * Returns the index of the analysis in the analyses array\n     */\n    getAnalysisIndex(id) {\n        if (!id)\n            return undefined;\n        for (let i = 0; i < this.analyses.length; i++) {\n            let analysis = this.analyses[i];\n            if (analysis.id === id)\n                return i;\n        }\n        return undefined;\n    }\n    /**\n     * Checks if the ID of an analysis exists in the AnalysesManager\n     */\n    includes(id) {\n        const index = this.getAnalysisIndex(id);\n        return index === undefined ? false : !isNaN(index);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5hbHlzZXNNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0FuYWx5c2VzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU1qRSxNQUFNLE9BQU8sZUFBZTtJQUcxQjtRQUNFLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxXQUFXLENBQUMsUUFBa0I7UUFDbkMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDOUI7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVNLFdBQVcsQ0FBQyxVQUE4QixFQUFFO1FBQ2pELE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxRQUFRLEdBQWUsRUFBRSxDQUFDO1FBQzlCLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNwQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3pCO1NBQ0Y7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU0sVUFBVTtRQUNmLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUN0QixJQUFJLE1BQU0sR0FBZ0MsRUFBRSxDQUFDO1FBQzdDLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3RDLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtnQkFDbEIsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM3QztTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZ0JBQWdCOztRQUNyQixJQUFJLE1BQU0sR0FBZ0MsRUFBRSxDQUFDO1FBQzdDLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3RDLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDdEIsS0FBSyxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDM0QsTUFBTSxLQUFLLEdBQUcsTUFBQSxRQUFRLENBQUMsS0FBSywwQ0FBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNyRCxJQUFJLEtBQUssRUFBRTt3QkFDVCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQ3BDO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUN0QixJQUFJLE1BQU0sR0FBZ0MsRUFBRSxDQUFDO1FBQzdDLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3RDLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDdEIsS0FBSyxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDM0QsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNwRTthQUNGO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxvQkFBb0I7UUFDekIsSUFBSSxNQUFNLEdBQWdDLEVBQUUsQ0FBQztRQUM3QyxLQUFLLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN0QyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JCLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDaEQ7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWU7UUFDcEIsSUFBSSxNQUFNLEdBQWtDLEVBQUUsQ0FBQztRQUMvQyxLQUFLLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN0QyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtvQkFDN0IsdUJBQXVCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzFEO2FBQ0Y7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYyxDQUFDLEVBQVU7UUFDOUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxFQUFVO1FBQ2hDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUU7Z0JBQUUsT0FBTyxDQUFDLENBQUM7U0FDbEM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQUMsRUFBVTtRQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FDRiJ9","import { Analysis } from 'common-spectrum';\nimport max from 'ml-array-max';\nimport mean from 'ml-array-mean';\nimport min from 'ml-array-min';\nimport sd from 'ml-array-standard-deviation';\nimport { pelletHardnessParseHitec } from 'physical-chemistry-parser';\n\nexport function fromHitec(dt0, res) {\n  let analysis = new Analysis();\n  const parsed = pelletHardnessParseHitec(dt0, res);\n  let meta = {};\n  for (let key in parsed.meta) {\n    meta = { ...meta, ...parsed.meta[key] };\n  }\n\n  let iph = parsed.variables.y.data;\n  let top10 = iph.sort((a, b) => b - a).slice(0, iph.length / 10);\n  const cheminfo = {\n    meta: {\n      average50: {\n        value: mean(iph),\n        units: 'cN',\n      },\n      sd: {\n        value: sd(iph),\n        units: 'cN',\n      },\n      min: {\n        value: min(iph),\n        units: 'cN',\n      },\n      max: {\n        value: max(iph),\n        units: 'cN',\n      },\n      averageHardest10: {\n        value: mean(top10),\n        units: 'cN',\n      },\n      method: meta.QualityName,\n    },\n  };\n\n  meta.cheminfo = cheminfo;\n\n\n  analysis.pushSpectrum(\n    {\n      x: parsed.variables.x,\n      y: parsed.variables.y,\n    },\n    {\n      dataType: 'Individual pellet hardness',\n      title: meta.Meta,\n      meta,\n    },\n  );\n\n  return analysis;\n}\n","import { toJcamps } from './toJcamps';\nexport function toJcamp(analysis, options = {}) {\n    return toJcamps(analysis, options).join('\\n');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9KY2FtcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90by90b0pjYW1wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFNdEMsTUFBTSxVQUFVLE9BQU8sQ0FBQyxRQUFrQixFQUFFLFVBQTJCLEVBQUU7SUFDdkUsT0FBTyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoRCxDQUFDIn0="],"names":["toString","Object","prototype","a","d","e","f","length","g","h","i","j","c","b","_ref","module","exports","window","median","input","value","call","endsWith","TypeError","quickSelectMedian","slice","isAnyArray","object","xAdd","array1","array2","isConstant","constant","Error","Number","array3","Array","xMultiply","Float64Array","xDivide","_typeof","obj","Symbol","iterator","constructor","sequentialFill","arguments","undefined","options","_options","_options$from","from","_options$to","to","_options$size","size","step","Math","floor","isArray","push","_i","xIsMonotone","array","sum","sumValue","mean","variance","values","_options$unbiased","unbiased","_options$mean","arrayMean","sqrError","x","standardDeviation","sqrt","min","_options$fromIndex","fromIndex","_options$toIndex","toIndex","isInteger","minValue","max","maxValue","xSubtract","xyCheck","data","y","xyEnsureGrowingX","prevX","Infinity","ansX","ansY","index","xyFilterXPositive","newX","newY","rescale","output","currentMin","currentMax","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","name","inspectData","rows","columns","maxI","maxJ","result","line","formatNumber","get","join","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","indexOf","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","checkNonEmpty","isEmpty","AbstractMatrix","static","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","rowVector","columnVector","fill","random","interval","round","this","zeros","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","iMax","swapRows","tmp","reducedEchelonForm","m","n","maxRow","p","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","setRow","row1","row2","temp","getColumn","getColumnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","NaN","v","maxIndex","idx","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","cumulativeSum","dot","vector2","vector1","mmul","other","Bcolj","s","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","cols","r","resultat","console","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","by","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","center","centerByRow","centerByColumn","centerAll","scale","pow","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","super","arrayData","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","abs","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","exp","expm1","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","BaseView","MatrixTransposeView","WrapperMatrix2D","LuDecomposition","t","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","count","X","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","eps","EPSILON","kase","alpha","MIN_VALUE","isNaN","ks","cs","sn","sp","spm1","epm1","sk","ek","shift","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","condition","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","useSVD","leftHandSide","rightHandSide","addStyle","serie","spectrum","color","opacity","lineWidth","match","toUpperCase","replace","style","width","dash","label","id","COLORS","appendDistinctParameter","key","includes","appendDistinctValue","prepare","M","P","Pinv","Mt","ar","ac","Ap","Ai","Ax","LNZ","coloffset","adr","D","Lp","Parent","Lnz","Flag","Pattern","bp1","kk","p2","ldlSymbolic","Lx","Li","yi","lKi","len","top","ldlNumeric","B","ldlPerm","ldlLsolve","ldlDsolve","ldlLTsolve","ldlPermt","compareNum","list","adj","visited","toVisit","eol","ptr","nbhd","u","getClosestNumber","goal","closest","reduce","prev","curr","getCloseIndex","updateSystem","weights","nbPoints","newVector","w","next","getDeltaMatrix","lambda","lowerTriangularNonZeros","permutationEncodedArray","cuthillMckee","airPLS","baseline","iteration","maxIterations","factorCriterion","controlPoints","baseLineZones","forEach","arr","range","indexFrom","indexTo","sumNegDifferences","MAX_SAFE_INTEGER","stopCriterion","cho","Cholesky","difference","map","calculateError","maxNegativeDiff","diff","corrected","error","airPLSBaseline","ys","numberPoints","regressionOptions","airpls","correctedSpectrum","maybeToPrecision","digits","BaseRegression","predict","_predict","train","toLaTeX","score","y2","xSum","ySum","chi2","rmsd","xSquared","ySquared","xY","PolynomialRegression","degree","powers","coefficients","checkArrayLength","pr","F","FT","A","regress","precision","_toFormula","isLaTeX","sup","closeSup","times","fn","str","charAt","load","json","baselineCorrectionRegression","Regression","tolerance","delta","regression","fitting","oldFitting","iterativePolynomialBaseline","baselineCorrection","xCheck","xPadding","algorithm","fromEnd","toEnd","toLowerCase","xRolling","fct","padding","subArray","buffer","xRollingAverage","xRollingMedian","rollingAverageBaseline","defaults","actualOptions","assign","rollingBall","maxima","minima","windowM","windowS","windowLeft","windowRight","rollingBallBaseline","rollingMedianBaseline","_options$algorithm","_options$sumValue","_options$maxValue","absoluteSumValue","absoluteSum","currentMaxValue","sumFactor","_i2","concat","normalize","zones","NEGATIVE_INFINITY","POSITIVE_INFINITY","JSON","parse","stringify","zone","filter","currentZone","invert","exclusions","exclusion","nextExclusion","zonesWithPoints","numberOfPoints","totalSize","previous","current","unitsPerPoint","currentTotal","integral","x0","x1","slope","intercept","equallySpaced","arrayXY","xLength","reverse","variant","xResult","yResult","zoneResult","processZone","halfStep","lastStep","start","previousX","MAX_VALUE","previousY","nextX","nextY","frontOutsideSpectra","backOutsideSpectra","currentValue","currentPoints","main","equallySpacedSlot","initialOriginalStep","lastOriginalStep","MIN_SAFE_INTEGER","sumAtMin","sumAtMax","equallySpacedSmooth","getZones","currentFrom","filterX","points","currentZoneIndex","position","defaultOptions","matrixCase","cond","arrayCase","factorial","savitzkyGolay","windowSize","derivative","polynomial","pad","padValue","C","padArray","ans","J","ones","inic","Jtranspose","det","minMax","arithmeticMean","geometricMean","logMean","lnsum","grandMean","means","samples","truncatedMean","percent","alreadySorted","harmonicMean","contraHarmonicMean","half","theMean","theVariance","standardError","robustMeanAndStdev","averageDeviations","stdev","quartiles","quart","q1","q2","q3","pooledStandardDeviation","pooledVariance","vari","mode","itemCount","itemArray","covariance","mean1","mean2","cov","skewness","s2","s3","dev","kurtosis","s4","entropy","weightedMean","weightedStandardDeviation","weightedVariance","z","inPlace","standardize","standardDev","isString","isFiniteImpl","isNumber","uniq","strings","seen","item","hasOwnProperty","compareArray","target","properties","keys","mulSafe","decimals","arg","getFractional","divSafe","den","val","QtyError","err","create","message","stack","throwIncompatibleUnits","left","right","UNITS","PI","BASE_UNITS","UNITY","UNITY_ARRAY","validateUnitDefinition","unitDef","definition","scalar","numerator","denominator","unit","PREFIX_VALUES","PREFIX_MAP","UNIT_VALUES","UNIT_MAP","OUTPUT_MAP","getUnits","kind","units","unitKeys","substr","getKinds","getAliases","unitName","SIGNATURE_VECTOR","unitSignature","signature","unitSignatureVector","isBase","toBase","SIGN","INTEGER","FRACTION","QTY_STRING_REGEX","RegExp","POWER_OP","SAFE_POWER","TOP_REGEX","BOTTOM_REGEX","trim","exec","scalarMatch","parseFloat","nx","bottom","UNIT_TEST_REGEX","test","parseUnits","PREFIX_REGEX","UNIT_REGEX","UNIT_MATCH","UNIT_MATCH_REGEX","parsedUnitsCache","cached","unitMatch","normalizedUnits","globalParse","isQty","Qty","initValue","initUnits","assertValidConstructorArgs","baseScalar","_conversionCache","isDefinitionObject","updateBaseScalar","isTemperature","base","KINDS","knownSignature","subtractTemperatures","lhs","rhs","lhsUnits","rhsConverted","dstDegrees","getDegreeUnits","subtractTempDegrees","deg","tempDegrees","addTempDegrees","toDegrees","src","dst","dstScalar","srcDegK","toDegK","dstUnits","qty","toTemp","toTempK","swiftConverter","srcUnits","convert","srcQty","dstQty","eq","isDegrees","isCompatible","isInverse","baseUnitCache","toBaseUnits","toFloat","isUnitless","toPrec","precQuantity","cleanTerms","num1","den1","num2","den2","notUnity","combined","combineTerms","terms","direction","prefix","prefixValue","combinedPrefixValue","prop","NestedMap","defaultFormatter","op1","op2","numdenscale","compareTo","lt","lte","gt","gte","same","every","_isBase","childMap","formatter","_units","numIsUnity","denIsUnity","numUnits","stringifyUnits","denUnits","targetUnitsOrMaxDecimalsOrPrec","maxDecimals","targetUnits","out","format","targetQty","stringifiedUnitsCache","stringified","simplify","getOutputNames","unitNames","token","tokenNext","acc","unitCounter","unitCount","version","factory","convertUnit","fromUnit","toUnit","testRegExp","ensureRegexp","string","parts","stringToRegexp","flags","getConvertedVariable","variable","newUnits","isMonotone","getPossibleVariable","variables","selector","variableName","possible","regexpLabel","_b","_a","upper","lower","possibleFiltered","Analysis","substring","spectrumCallback","spectra","cache","pushSpectrum","analysisOptions","meta","dataType","title","xVariable","yVariable","entries","standardizeData","getXYSpectrum","xUnits","yUnits","labels","xLabel","yLabel","split","getXY","getNormalizedSpectrum","normalization","newSpectrum","filters","processing","keepYUnits","filterOptions","Stat","normed","getSpectrum","getXLabel","getYLabel","ensureString","blob","ArrayBuffer","isView","encoding","guessEncoding","TextDecoder","decode","uint8","Uint8Array","byteOffset","byteLength","parseString","lowercase","number","GC_MS_FIELDS","complexChromatogram","chromatogram","series","ms","dimension","existingGCMSFields","convertMSFieldToLabel","pageValue","isMSField","canonicDataLabel","convertToFloatArray","stringArray","floatArray","fastParseXYData","yFactor","deltaX","isXYdata","currentData","ascii","currentX","firstX","currentY","firstY","endLine","charCodeAt","newLine","isDifference","isLastDifference","lastDifference","isDuplicate","inComment","lastValue","isNegative","inValue","skipFirstValue","decimalPosition","duplicate","ascii2","removeCommentRegExp","peakTableSplitRegExp","parsePeakTable","isPeaktable","numberOfVariables","lines","logs","parseXYZ","xFactor","parseXY","parseXYA","removeSymbolRegExp","isXYAdata","add2D","zData","minZ","maxZ","ySize","xSize","lastX","lastY","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","dx","y0","dy","iter","nbContourLevels","contourLevels","level","contourLevel","side","noiseMultiplier","zValue","iSubSpectra","subSpectra","subSpectraAfter","povar","segments","generateContourLines","gyromagneticRatio","profiling","action","time","Date","now","simpleChromatogram","intensity","postProcessing","entriesFlat","entry","observeFrequency","shiftOffsetVal","ntuples","symbol","nucleus","startsWith","$NUC2","f2index","$NUC1","yType","pageSymbolIndex","pageSymbol","ratio0","ratio1","ratio","postProcessingNMR","newNtuples","twoD","wantXY","keepSpectra","prepareNtuplesDatatable","currentEntry","xIndex","yIndex","firstVariable","secondVariable","lowerCaseSymbol","vardim","varname","prepareSpectrum","ntuplesSeparatorRegExp","keepRecordsRegExp","canonicDataLabels","canonicMetadataLabels","dynamicTyping","withoutXY","addJcamp","analysis","jcamp","converted","tmpResult","children","parentsStack","ldrs","ldr","dataLabel","dataValue","infos","datatable","parentEntry","info","dataClass","xType","shiftOffsetNum","vartype","varform","page","sampleDescription","pop","flatten","currentSpectrum","creatorNtuples","owner","origin","varName","varType","varDim","isDependent","minFct","maxFct","header","point","getNumber","rounded","peakTableCreator","xyDataCreator","fromJSON","xydata","toJcamps","jcamps","getJcamp","jcampOptions","forceNtuples","fromVariables","JSGraph","getJSGraph","analyses","colors","opacities","linesWidth","xAxis","yAxis","logScale","axes","unitWrapperBefore","unitWrapperAfter","flipped","display","getNormalizationAnnotations","boundary","annotations","ignore","strokeWidth","fillColor","pelletHardnessParseHitec","dt0","res","parseDT0","currentMeta","field","groups","parseRes","addAnalysis","getAnalysisIndex","getAnalyses","ids","getSpectra","getDistinctTitles","getDistinctUnits","getDistinctLabels","getDistinctDataTypes","getDistinctMeta","removeAllAnalyses","removeAnalysis","parsed","iph","top10","cheminfo","average50","sd","averageHardest10","method","QualityName","Meta"],"mappings":"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"}