{"version":3,"file":"ml-gsd.umd.js","sources":["../node_modules/ml-savitzky-golay-generalized/node_modules/is-any-array/lib/index.js","../node_modules/ml-savitzky-golay-generalized/lib/index.js","../node_modules/ml-spectra-processing/node_modules/is-any-array/lib/index.js","../node_modules/ml-spectra-processing/lib/x/xMedian.js","../node_modules/ml-spectra-processing/lib/x/xCheck.js","../node_modules/ml-spectra-processing/lib/x/xFindClosestIndex.js","../node_modules/ml-spectra-processing/lib/x/xGetFromToIndex.js","../node_modules/ml-matrix/matrix.js","../node_modules/ml-matrix/matrix.mjs","../node_modules/ml-spectra-processing/lib/x/xMean.js","../node_modules/ml-spectra-processing/lib/x/xMaxValue.js","../node_modules/ml-spectra-processing/lib/x/xMinValue.js","../node_modules/ml-spectra-processing/lib/x/xIsEquallySpaced.js","../node_modules/ml-spectra-processing/lib/x/xIsMonotonic.js","../node_modules/ml-spectra-processing/lib/x/xMaxAbsoluteValue.js","../node_modules/ml-spectra-processing/lib/x/xMedianAbsoluteDeviation.js","../node_modules/ml-spectra-processing/lib/x/xMinMaxValues.js","../node_modules/ml-spectra-processing/lib/x/xNoiseStandardDeviation.js","../node_modules/ml-spectra-processing/lib/x/xNorm.js","../lib/algorithms/getMinMaxIntervals.js","../lib/algorithms/tryMatchOneIntervalWithMinData.js","../lib/algorithms/autoAlgorithm.js","../lib/algorithms/getPeaksFromIntervals.js","../lib/algorithms/xGetCrossZeroPoints.js","../lib/algorithms/firstDerivative.js","../lib/algorithms/secondDerivative.js","../lib/utils/optimizeTop.js","../lib/gsd.js","../node_modules/ml-peak-shape-generator/lib/util/constants.js","../node_modules/ml-peak-shape-generator/lib/util/erfinv.js","../node_modules/ml-peak-shape-generator/lib/shapes/1d/gaussian/Gaussian.js","../node_modules/ml-peak-shape-generator/lib/shapes/1d/lorentzian/Lorentzian.js","../node_modules/ml-peak-shape-generator/lib/shapes/1d/lorentzianDispersive/LorentzianDispersive.js","../node_modules/ml-peak-shape-generator/lib/shapes/1d/pseudoVoigt/computeFactor.js","../node_modules/ml-peak-shape-generator/lib/shapes/1d/pseudoVoigt/PseudoVoigt.js","../node_modules/ml-peak-shape-generator/lib/shapes/1d/pseudoVoigtTCH/PseudoVoigtTCH.js","../node_modules/ml-peak-shape-generator/lib/shapes/1d/generalizedLorentzian/GeneralizedLorentzian.js","../node_modules/ml-peak-shape-generator/lib/shapes/1d/splitGaussian/SplitGaussian.js","../node_modules/ml-peak-shape-generator/lib/shapes/1d/getShape1D.js","../node_modules/ml-spectra-fitting/lib/shapes/getSumOfShapes.js","../node_modules/ml-spectra-fitting/lib/util/assert.js","../node_modules/ml-spectra-fitting/lib/util/buildOptimizationLayout.js","../node_modules/ml-spectra-fitting/lib/util/reconstructPeaks.js","../node_modules/ml-spectra-fitting/lib/util/getFixedParametersResult.js","../node_modules/ml-spectra-fitting/lib/util/internalPeaks/DefaultParameters.js","../node_modules/ml-spectra-fitting/lib/util/internalPeaks/getInternalPeaks.js","../node_modules/ml-levenberg-marquardt/node_modules/is-any-array/lib/index.js","../node_modules/ml-levenberg-marquardt/lib/check_options.js","../node_modules/ml-levenberg-marquardt/lib/error_calculation.js","../node_modules/ml-levenberg-marquardt/lib/gradient_function.js","../node_modules/ml-levenberg-marquardt/lib/step.js","../node_modules/ml-levenberg-marquardt/lib/levenberg_marquardt.js","../node_modules/ml-direct/src/util/antiLowerConvexHull.js","../node_modules/ml-direct/src/index.js","../node_modules/ml-spectra-fitting/lib/util/wrappers/directOptimization.js","../node_modules/ml-spectra-fitting/lib/util/selectMethod.js","../node_modules/ml-spectra-fitting/lib/index.js","../lib/utils/addMissingShape.js","../lib/utils/splitGroup.js","../lib/utils/groupPeaks.js","../lib/post/optimizePeaksWithLogs.js","../lib/post/optimizePeaks.js","../lib/utils/addMissingIDs.js","../lib/post/joinBroadPeaks.js","../lib/post/broadenPeaks.js","../lib/utils/setShape.js"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Apply Savitzky Golay algorithm.\n * @param ys - Array of y values.\n * @param xs - Array of X or deltaX.\n * @param options - Options controlling window size, derivative and polynomial order.\n * @returns Array containing the new ys (same length).\n */\nexport function sgg(ys, xs, options = {}) {\n    const { windowSize = 9, derivative = 0, polynomial = 3 } = 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 (!isAnyArray(ys)) {\n        throw new TypeError('Y values must be an array');\n    }\n    if (xs === undefined) {\n        throw new TypeError('X must be defined');\n    }\n    if (windowSize > ys.length) {\n        throw new RangeError(`Window size is higher than the data length ${windowSize}>${ys.length}`);\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    if (polynomial >= 6) {\n        // eslint-disable-next-line no-console\n        console.warn('You should not use polynomial grade higher than 5 if you are' +\n            ' not sure that your data arises from such a model. Possible polynomial oscillation problems');\n    }\n    const half = Math.floor(windowSize / 2);\n    const np = ys.length;\n    const ans = new Float64Array(np);\n    const weights = fullWeights(windowSize, polynomial, derivative);\n    let hs = 0;\n    let constantH = true;\n    if (isAnyArray(xs)) {\n        constantH = false;\n    }\n    else {\n        hs = xs ** derivative;\n    }\n    //For the borders\n    for (let i = 0; i < half; i++) {\n        const wg1 = weights[half - i - 1];\n        const wg2 = weights[half + i + 1];\n        let d1 = 0;\n        let d2 = 0;\n        for (let l = 0; l < windowSize; l++) {\n            d1 += wg1[l] * ys[l];\n            d2 += wg2[l] * ys[np - windowSize + l];\n        }\n        if (constantH) {\n            ans[half - i - 1] = d1 / hs;\n            ans[np - half + i] = d2 / hs;\n        }\n        else {\n            hs = getHs(xs, half - i - 1, half, derivative);\n            ans[half - i - 1] = d1 / hs;\n            hs = getHs(xs, np - half + i, half, derivative);\n            ans[np - half + i] = d2 / hs;\n        }\n    }\n    //For the internal points\n    const wg = weights[half];\n    for (let i = windowSize; i <= np; i++) {\n        let d = 0;\n        for (let l = 0; l < windowSize; l++)\n            d += wg[l] * ys[l + i - windowSize];\n        if (!constantH) {\n            hs = getHs(xs, i - half - 1, half, derivative);\n        }\n        ans[i - half - 1] = d / hs;\n    }\n    return ans;\n}\nfunction getHs(h, center, half, derivative) {\n    let hs = 0;\n    let count = 0;\n    for (let i = center - half; i < center + half; i++) {\n        if (i >= 0 && i < h.length - 1) {\n            hs += h[i + 1] - h[i];\n            count++;\n        }\n    }\n    return (hs / count) ** derivative;\n}\nfunction gramPoly(i, m, k, s) {\n    let Grampoly = 0;\n    if (k > 0) {\n        Grampoly =\n            ((4 * k - 2) / (k * (2 * m - k + 1))) *\n                (i * gramPoly(i, m, k - 1, s) + s * gramPoly(i, m, k - 1, s - 1)) -\n                (((k - 1) * (2 * m + k)) / (k * (2 * m - k + 1))) *\n                    gramPoly(i, m, k - 2, s);\n    }\n    else if (k === 0 && s === 0) {\n        Grampoly = 1;\n    }\n    else {\n        Grampoly = 0;\n    }\n    return Grampoly;\n}\nfunction genFact(a, b) {\n    let gf = 1;\n    if (a >= b) {\n        for (let j = a - b + 1; j <= a; j++) {\n            gf *= j;\n        }\n    }\n    return gf;\n}\nfunction weight(i, t, m, n, s) {\n    let sum = 0;\n    for (let k = 0; k <= n; k++) {\n        sum +=\n            (2 * k + 1) *\n                (genFact(2 * m, k) / genFact(2 * m + k + 1, k + 1)) *\n                gramPoly(i, m, k, 0) *\n                gramPoly(t, m, k, s);\n    }\n    return sum;\n}\n/**\n * Compute the full weights matrix for every position inside the window.\n * @param m - Number of points.\n * @param n - Polynomial grade.\n * @param s - Derivative.\n * @returns Array of Float64Array weight vectors, one per position in the window.\n */\nfunction fullWeights(m, n, s) {\n    const weights = new Array(m);\n    const np = Math.floor(m / 2);\n    for (let t = -np; t <= np; t++) {\n        weights[t + np] = new Float64Array(m);\n        for (let j = -np; j <= np; j++) {\n            weights[t + np][j + np] = weight(j, t, np, n, s);\n        }\n    }\n    return weights;\n}\n//# sourceMappingURL=index.js.map","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Calculates the median of an array.\n * @param input - array containing values.\n * @param options - options.\n * @returns median.\n */\nexport function xMedian(input, options = {}) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    const { exact = false, fromIndex = 0, toIndex = input.length, } = options || {};\n    const array = input.slice(fromIndex, toIndex);\n    if (array.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    const middleIndex = calcMiddle(0, array.length - 1);\n    const median = quickSelect(array, middleIndex);\n    if (array.length % 2 === 1 || !exact) {\n        return median;\n    }\n    const medianNext = quickSelect(array, middleIndex + 1);\n    return (median + medianNext) / 2;\n}\nfunction quickSelect(array, middleIndex) {\n    let low = 0;\n    let high = array.length - 1;\n    let middle = 0;\n    let currentLow = 0;\n    let currentHigh = 0;\n    while (true) {\n        if (high <= low) {\n            return array[middleIndex];\n        }\n        if (high === low + 1) {\n            if (array[low] > array[high]) {\n                swap(array, low, high);\n            }\n            return array[middleIndex];\n        }\n        // Find median of low, middle and high items; swap into position low\n        middle = calcMiddle(low, high);\n        if (array[middle] > array[high])\n            swap(array, middle, high);\n        if (array[low] > array[high])\n            swap(array, low, high);\n        if (array[middle] > array[low])\n            swap(array, middle, low);\n        // Swap low item (now in position middle) into position (low+1)\n        swap(array, middle, low + 1);\n        // Nibble from each end towards middle, swapping items when stuck\n        currentLow = low + 1;\n        currentHigh = high;\n        while (true) {\n            do\n                currentLow++;\n            while (array[low] > array[currentLow]);\n            do\n                currentHigh--;\n            while (array[currentHigh] > array[low]);\n            if (currentHigh < currentLow) {\n                break;\n            }\n            swap(array, currentLow, currentHigh);\n        }\n        // Swap middle item (in position low) back into correct position\n        swap(array, low, currentHigh);\n        // Re-set active partition\n        if (currentHigh <= middleIndex) {\n            low = currentLow;\n        }\n        if (currentHigh >= middleIndex) {\n            high = currentHigh - 1;\n        }\n    }\n}\nfunction swap(array, i, j) {\n    const temp = array[j];\n    array[j] = array[i];\n    array[i] = temp;\n}\nfunction calcMiddle(i, j) {\n    return Math.floor((i + j) / 2);\n}\n//# sourceMappingURL=xMedian.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if the input is a non-empty array of numbers.\n * Only checks the first element.\n * @param input - array to check.\n * @param options - additional checks.\n */\nexport function xCheck(input, options = {}) {\n    const { minLength = 1 } = options;\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    if (typeof input[0] !== 'number') {\n        throw new TypeError('input must contain numbers');\n    }\n    if (input.length < minLength) {\n        throw new Error(`input must have a length of at least ${minLength}`);\n    }\n}\n//# sourceMappingURL=xCheck.js.map","/**\n * Returns the closest index of a `target`\n * @param array - array of numbers.\n * @param target - target value.\n * @param options - options.\n * @returns closest index.\n */\nexport function xFindClosestIndex(array, target, options = {}) {\n    const { sorted = true } = options;\n    if (sorted) {\n        let low = 0;\n        let high = array.length - 1;\n        let middle = 0;\n        while (high - low > 1) {\n            middle = low + ((high - low) >> 1);\n            if (array[middle] < target) {\n                low = middle;\n            }\n            else if (array[middle] > target) {\n                high = middle;\n            }\n            else {\n                return middle;\n            }\n        }\n        if (low < array.length - 1) {\n            if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n                return low;\n            }\n            else {\n                return low + 1;\n            }\n        }\n        else {\n            return low;\n        }\n    }\n    else {\n        let index = 0;\n        let diff = Number.POSITIVE_INFINITY;\n        for (let i = 0; i < array.length; i++) {\n            const currentDiff = Math.abs(array[i] - target);\n            if (currentDiff < diff) {\n                diff = currentDiff;\n                index = i;\n            }\n        }\n        return index;\n    }\n}\n//# sourceMappingURL=xFindClosestIndex.js.map","import { xFindClosestIndex } from \"./xFindClosestIndex.js\";\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n * @param x - array of numbers\n * @param options - options.\n */\nexport function xGetFromToIndex(x, options = {}) {\n    let { fromIndex, toIndex } = options;\n    const { from, to } = options;\n    if (fromIndex === undefined) {\n        if (from !== undefined) {\n            fromIndex = xFindClosestIndex(x, from);\n        }\n        else {\n            fromIndex = 0;\n        }\n    }\n    if (toIndex === undefined) {\n        if (to !== undefined) {\n            toIndex = xFindClosestIndex(x, to);\n        }\n        else {\n            toIndex = x.length - 1;\n        }\n    }\n    if (fromIndex < 0)\n        fromIndex = 0;\n    if (toIndex < 0)\n        toIndex = 0;\n    if (fromIndex >= x.length)\n        fromIndex = x.length - 1;\n    if (toIndex >= x.length)\n        toIndex = x.length - 1;\n    if (fromIndex > toIndex)\n        [fromIndex, toIndex] = [toIndex, fromIndex];\n    return { fromIndex, toIndex };\n}\n//# sourceMappingURL=xGetFromToIndex.js.map","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nfunction isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\n}\n\n/**\n * Computes the maximum of the given values.\n *\n * @param input\n * @param options\n */\nfunction max(input, options = {}) {\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    const { fromIndex = 0, toIndex = input.length } = options;\n    if (fromIndex < 0 ||\n        fromIndex >= input.length ||\n        !Number.isInteger(fromIndex)) {\n        throw new Error('fromIndex must be a positive integer smaller than length');\n    }\n    if (toIndex <= fromIndex ||\n        toIndex > input.length ||\n        !Number.isInteger(toIndex)) {\n        throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n    }\n    let maxValue = input[fromIndex];\n    for (let i = fromIndex + 1; i < toIndex; i++) {\n        if (input[i] > maxValue)\n            maxValue = input[i];\n    }\n    return maxValue;\n}\n\n/**\n * Computes the minimum of the given values.\n */\nfunction min(input, options = {}) {\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    const { fromIndex = 0, toIndex = input.length } = options;\n    if (fromIndex < 0 ||\n        fromIndex >= input.length ||\n        !Number.isInteger(fromIndex)) {\n        throw new Error('fromIndex must be a positive integer smaller than length');\n    }\n    if (toIndex <= fromIndex ||\n        toIndex > input.length ||\n        !Number.isInteger(toIndex)) {\n        throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n    }\n    let minValue = input[fromIndex];\n    for (let i = fromIndex + 1; i < toIndex; i++) {\n        if (input[i] < minValue)\n            minValue = input[i];\n    }\n    return minValue;\n}\n\n/**\n * Rescale an array into a range.\n */\nfunction rescale(input, options = {}) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    else if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    let output;\n    if (options.output !== undefined) {\n        if (!isAnyArray(options.output)) {\n            throw new TypeError('output option must be an array if specified');\n        }\n        output = options.output;\n    }\n    else {\n        output = new Array(input.length);\n    }\n    const currentMin = min(input);\n    const currentMax = max(input);\n    if (currentMin === currentMax) {\n        throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n    }\n    const { min: minValue = options.autoMinMax ? currentMin : 0, max: maxValue = options.autoMinMax ? currentMax : 1, } = options;\n    if (minValue >= maxValue) {\n        throw new RangeError('min option must be smaller than max option');\n    }\n    const factor = (maxValue - minValue) / (currentMax - currentMin);\n    for (let i = 0; i < input.length; i++) {\n        output[i] = (input[i] - currentMin) * factor + minValue;\n    }\n    return output;\n}\n\nconst indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\n/**\n * @this {Matrix}\n * @returns {string}\n */\nfunction inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nfunction inspectMatrixWithOptions(matrix, options = {}) {\n  const {\n    maxRows = 15,\n    maxColumns = 10,\n    maxNumSize = 8,\n    padMinus = 'auto',\n  } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n\n  if (padMinus === 'auto') {\n    padMinus = false;\n    loop: for (let i = 0; i < maxI; i++) {\n      for (let j = 0; j < maxJ; j++) {\n        if (matrix.get(i, j) < 0) {\n          padMinus = true;\n          break loop;\n        }\n      }\n    }\n  }\n\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, padMinus));\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, padMinus) {\n  return (\n    num >= 0 && padMinus\n      ? ` ${formatNumber2(num, maxNumSize - 1)}`\n      : formatNumber2(num, maxNumSize)\n  ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n  // small.length numbers should be as is\n  let str = num.toString();\n  if (str.length <= len) return str;\n\n  // (7)'0.00123' is better then (7)'1.23e-2'\n  // (8)'0.000123' is worse then (7)'1.23e-3',\n  let fix = num.toFixed(len);\n  if (fix.length > len) {\n    fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n  }\n  if (\n    fix.length <= len &&\n    !fix.startsWith('0.000') &&\n    !fix.startsWith('-0.000')\n  ) {\n    return fix;\n  }\n\n  // well, if it's still too long the user should've used longer numbers\n  let exp = num.toExponential(len);\n  if (exp.length > len) {\n    exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n  }\n  return exp.slice(0);\n}\n\nfunction 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, 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, this.get(i, j) ** matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n}\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 */\nfunction 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 */\nfunction 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 */\nfunction 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 */\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nfunction 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\nclass 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  isDistance() {\n    if (!this.isSymmetric()) return false;\n\n    for (let i = 0; i < this.rows; i++) {\n      if (this.get(i, i) !== 0) return false;\n    }\n\n    return true;\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(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\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(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\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    switch (type) {\n      case 'max':\n        return this.max();\n      case 'frobenius':\n        return Math.sqrt(this.dot(this));\n      default:\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  gram() {\n    const rows = this.rows;\n    const n = this.columns;\n\n    // The Gram matrix `thisᵀ · this` is symmetric, so only its upper triangle is\n    // accumulated (then mirrored) and the transpose is never materialized.\n    // Row-streaming rank-1 updates read each row of `this` contiguously and skip\n    // zero entries, so the cost scales with the number of non-zeros: it is as\n    // fast as the dense version on dense matrices (the skip never fires) and far\n    // faster on sparse ones.\n    const gramData = new Float64Array(n * n);\n    for (let r = 0; r < rows; r++) {\n      for (let i = 0; i < n; i++) {\n        const value = this.get(r, i);\n        if (value === 0) continue;\n        const offset = i * n;\n        for (let j = i; j < n; j++) {\n          gramData[offset + j] += value * this.get(r, j);\n        }\n      }\n    }\n\n    const result = new Matrix(n, n);\n    for (let i = 0; i < n; i++) {\n      const offset = i * n;\n      for (let j = i; j < n; j++) {\n        const value = gramData[offset + j];\n        result.set(i, j, value);\n        result.set(j, i, value);\n      }\n    }\n    return result;\n  }\n\n  transposeMultiply(other) {\n    other = Matrix.checkMatrix(other);\n    if (this.rows !== other.rows) {\n      throw new RangeError(\n        'the number of rows of the two matrices must be equal',\n      );\n    }\n    const n = this.columns;\n    const p = other.columns;\n\n    const result = new Matrix(n, p);\n    const otherRow = new Float64Array(p);\n    for (let r = 0; r < this.rows; r++) {\n      for (let j = 0; j < p; j++) {\n        otherRow[j] = other.get(r, j);\n      }\n      for (let i = 0; i < n; i++) {\n        const value = this.get(r, i);\n        if (value === 0) continue;\n        const resultRow = result.data[i];\n        for (let j = 0; j < p; j++) {\n          resultRow[j] += value * otherRow[j];\n        }\n      }\n    }\n    return result;\n  }\n\n  mmulByTranspose(scale) {\n    let m = this.rows;\n    let n = this.columns;\n\n    if (scale !== undefined && scale.length !== n) {\n      throw new RangeError('scale must have one value per column');\n    }\n\n    let result = new Matrix(m, m);\n\n    // result = this · diag(scale) · thisᵀ is symmetric, so only the upper\n    // triangle is computed and mirrored, and the transpose is never\n    // materialized. `scale` (one factor per column) is folded into one operand.\n    let rowj = new Float64Array(n);\n    for (let j = 0; j < m; j++) {\n      if (scale === undefined) {\n        for (let k = 0; k < n; k++) {\n          rowj[k] = this.get(j, k);\n        }\n      } else {\n        for (let k = 0; k < n; k++) {\n          rowj[k] = scale[k] * this.get(j, k);\n        }\n      }\n\n      for (let i = j; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * rowj[k];\n        }\n\n        result.set(i, j, s);\n        result.set(j, i, s);\n      }\n    }\n    return result;\n  }\n\n  mpow(scalar) {\n    if (!this.isSquare()) {\n      throw new RangeError('Matrix must be square');\n    }\n    if (!Number.isInteger(scalar) || scalar < 0) {\n      throw new RangeError('Exponent must be a non-negative integer');\n    }\n    // Russian Peasant exponentiation, i.e. exponentiation by squaring\n    let result = Matrix.eye(this.rows);\n    let bb = this;\n    // Note: Don't bit shift. In JS, that would truncate at 32 bits\n    for (let e = scalar; e >= 1; e /= 2) {\n      if ((e & 1) !== 0) {\n        result = result.mmul(bb);\n      }\n      bb = bb.mmul(bb);\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 result = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      result = result.setSubMatrix(c11, 0, 0);\n      result = result.setSubMatrix(c12, c11.rows, 0);\n      result = result.setSubMatrix(c21, 0, c11.columns);\n      result = result.setSubMatrix(c22, c11.rows, c11.columns);\n      return result.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,\n          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    return this.constructor.copy(this, new Matrix(this.rows, this.columns));\n  }\n\n  /**\n   * @template {AbstractMatrix} M\n   * @param {AbstractMatrix} from\n   * @param {M} to\n   * @return {M}\n   */\n  static copy(from, to) {\n    for (const [row, column, value] of from.entries()) {\n      to.set(row, column, value);\n    }\n\n    return to;\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  [Symbol.iterator]() {\n    return this.entries();\n  }\n\n  /**\n   * iterator from left to right, from top to bottom\n   * yield [row, column, value]\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *entries() {\n    for (let row = 0; row < this.rows; row++) {\n      for (let col = 0; col < this.columns; col++) {\n        yield [row, col, this.get(row, col)];\n      }\n    }\n  }\n\n  /**\n   * iterator from left to right, from top to bottom\n   * yield value\n   * @returns {Generator<number, void, void>}\n   */\n  *values() {\n    for (let row = 0; row < this.rows; row++) {\n      for (let col = 0; col < this.columns; col++) {\n        yield this.get(row, col);\n      }\n    }\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\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\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\nclass Matrix extends AbstractMatrix {\n  /**\n   * @type {Float64Array[]}\n   */\n  data;\n\n  /**\n   * Init an empty matrix\n   * @param {number} nRows\n   * @param {number} nColumns\n   */\n  #initData(nRows, nColumns) {\n    this.data = [];\n\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\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      this.#initData(nRows.rows, nRows.columns);\n      Matrix.copy(nRows, this);\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      this.#initData(nRows, nColumns);\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\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n\n      this.rows = nRows;\n      this.columns = nColumns;\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\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\n/**\n * @typedef {0 | 1 | number | boolean} Mask\n */\n\nclass SymmetricMatrix extends AbstractMatrix {\n  /** @type {Matrix} */\n  #matrix;\n\n  get size() {\n    return this.#matrix.size;\n  }\n\n  get rows() {\n    return this.#matrix.rows;\n  }\n\n  get columns() {\n    return this.#matrix.columns;\n  }\n\n  get diagonalSize() {\n    return this.rows;\n  }\n\n  /**\n   * not the same as matrix.isSymmetric()\n   * Here is to check if it's instanceof SymmetricMatrix without bundling issues\n   *\n   * @param value\n   * @returns {boolean}\n   */\n  static isSymmetricMatrix(value) {\n    return Matrix.isMatrix(value) && value.klassType === 'SymmetricMatrix';\n  }\n\n  /**\n   * @param diagonalSize\n   * @return {SymmetricMatrix}\n   */\n  static zeros(diagonalSize) {\n    return new this(diagonalSize);\n  }\n\n  /**\n   * @param diagonalSize\n   * @return {SymmetricMatrix}\n   */\n  static ones(diagonalSize) {\n    return new this(diagonalSize).fill(1);\n  }\n\n  /**\n   * @param {number | AbstractMatrix | ArrayLike<ArrayLike<number>>} diagonalSize\n   * @return {this}\n   */\n  constructor(diagonalSize) {\n    super();\n\n    if (Matrix.isMatrix(diagonalSize)) {\n      if (!diagonalSize.isSymmetric()) {\n        throw new TypeError('not symmetric data');\n      }\n\n      this.#matrix = Matrix.copy(\n        diagonalSize,\n        new Matrix(diagonalSize.rows, diagonalSize.rows),\n      );\n    } else if (Number.isInteger(diagonalSize) && diagonalSize >= 0) {\n      this.#matrix = new Matrix(diagonalSize, diagonalSize);\n    } else {\n      this.#matrix = new Matrix(diagonalSize);\n\n      if (!this.isSymmetric()) {\n        throw new TypeError('not symmetric data');\n      }\n    }\n  }\n\n  clone() {\n    const matrix = new SymmetricMatrix(this.diagonalSize);\n\n    for (const [row, col, value] of this.upperRightEntries()) {\n      matrix.set(row, col, value);\n    }\n\n    return matrix;\n  }\n\n  toMatrix() {\n    return new Matrix(this);\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.#matrix.get(rowIndex, columnIndex);\n  }\n  set(rowIndex, columnIndex, value) {\n    // symmetric set\n    this.#matrix.set(rowIndex, columnIndex, value);\n    this.#matrix.set(columnIndex, rowIndex, value);\n\n    return this;\n  }\n\n  removeCross(index) {\n    // symmetric remove side\n    this.#matrix.removeRow(index);\n    this.#matrix.removeColumn(index);\n\n    return this;\n  }\n\n  addCross(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.diagonalSize;\n    }\n\n    const row = array.slice();\n    row.splice(index, 1);\n\n    this.#matrix.addRow(index, row);\n    this.#matrix.addColumn(index, array);\n\n    return this;\n  }\n\n  /**\n   * @param {Mask[]} mask\n   */\n  applyMask(mask) {\n    if (mask.length !== this.diagonalSize) {\n      throw new RangeError('Mask size do not match with matrix size');\n    }\n\n    // prepare sides to remove from matrix from mask\n    /** @type {number[]} */\n    const sidesToRemove = [];\n    for (const [index, passthroughs] of mask.entries()) {\n      if (passthroughs) continue;\n      sidesToRemove.push(index);\n    }\n    // to remove from highest to lowest for no mutation shifting\n    sidesToRemove.reverse();\n\n    // remove sides\n    for (const sideIndex of sidesToRemove) {\n      this.removeCross(sideIndex);\n    }\n\n    return this;\n  }\n\n  /**\n   * Compact format upper-right corner of matrix\n   * iterate from left to right, from top to bottom.\n   *\n   * ```\n   *   A B C D\n   * A 1 2 3 4\n   * B 2 5 6 7\n   * C 3 6 8 9\n   * D 4 7 9 10\n   * ```\n   *\n   * will return compact 1D array `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]`\n   *\n   * length is S(i=0, n=sideSize) => 10 for a 4 sideSized matrix\n   *\n   * @returns {number[]}\n   */\n  toCompact() {\n    const { diagonalSize } = this;\n\n    /** @type {number[]} */\n    const compact = new Array((diagonalSize * (diagonalSize + 1)) / 2);\n    for (let col = 0, row = 0, index = 0; index < compact.length; index++) {\n      compact[index] = this.get(row, col);\n\n      if (++col >= diagonalSize) col = ++row;\n    }\n\n    return compact;\n  }\n\n  /**\n   * @param {number[]} compact\n   * @return {SymmetricMatrix}\n   */\n  static fromCompact(compact) {\n    const compactSize = compact.length;\n    // compactSize = (sideSize * (sideSize + 1)) / 2\n    // https://mathsolver.microsoft.com/fr/solve-problem/y%20%3D%20%20x%20%60cdot%20%20%20%60frac%7B%20%20%60left(%20x%2B1%20%20%60right)%20%20%20%20%7D%7B%202%20%20%7D\n    // sideSize = (Sqrt(8 × compactSize + 1) - 1) / 2\n    const diagonalSize = (Math.sqrt(8 * compactSize + 1) - 1) / 2;\n\n    if (!Number.isInteger(diagonalSize)) {\n      throw new TypeError(\n        `This array is not a compact representation of a Symmetric Matrix, ${JSON.stringify(\n          compact,\n        )}`,\n      );\n    }\n\n    const matrix = new SymmetricMatrix(diagonalSize);\n    for (let col = 0, row = 0, index = 0; index < compactSize; index++) {\n      matrix.set(col, row, compact[index]);\n      if (++col >= diagonalSize) col = ++row;\n    }\n\n    return matrix;\n  }\n\n  /**\n   * half iterator upper-right-corner from left to right, from top to bottom\n   * yield [row, column, value]\n   *\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *upperRightEntries() {\n    for (let row = 0, col = 0; row < this.diagonalSize; void 0) {\n      const value = this.get(row, col);\n\n      yield [row, col, value];\n\n      // at the end of row, move cursor to next row at diagonal position\n      if (++col >= this.diagonalSize) col = ++row;\n    }\n  }\n\n  /**\n   * half iterator upper-right-corner from left to right, from top to bottom\n   * yield value\n   *\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *upperRightValues() {\n    for (let row = 0, col = 0; row < this.diagonalSize; void 0) {\n      const value = this.get(row, col);\n\n      yield value;\n\n      // at the end of row, move cursor to next row at diagonal position\n      if (++col >= this.diagonalSize) col = ++row;\n    }\n  }\n}\nSymmetricMatrix.prototype.klassType = 'SymmetricMatrix';\n\nclass DistanceMatrix extends SymmetricMatrix {\n  /**\n   * not the same as matrix.isSymmetric()\n   * Here is to check if it's instanceof SymmetricMatrix without bundling issues\n   *\n   * @param value\n   * @returns {boolean}\n   */\n  static isDistanceMatrix(value) {\n    return (\n      SymmetricMatrix.isSymmetricMatrix(value) &&\n      value.klassSubType === 'DistanceMatrix'\n    );\n  }\n\n  constructor(sideSize) {\n    super(sideSize);\n\n    if (!this.isDistance()) {\n      throw new TypeError('Provided arguments do no produce a distance matrix');\n    }\n  }\n\n  set(rowIndex, columnIndex, value) {\n    // distance matrix diagonal is 0\n    if (rowIndex === columnIndex) value = 0;\n\n    return super.set(rowIndex, columnIndex, value);\n  }\n\n  addCross(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.diagonalSize;\n    }\n\n    // ensure distance\n    array = array.slice();\n    array[index] = 0;\n\n    return super.addCross(index, array);\n  }\n\n  toSymmetricMatrix() {\n    return new SymmetricMatrix(this);\n  }\n\n  clone() {\n    const matrix = new DistanceMatrix(this.diagonalSize);\n\n    for (const [row, col, value] of this.upperRightEntries()) {\n      if (row === col) continue;\n      matrix.set(row, col, value);\n    }\n\n    return matrix;\n  }\n\n  /**\n   * Compact format upper-right corner of matrix\n   * no diagonal (only zeros)\n   * iterable from left to right, from top to bottom.\n   *\n   * ```\n   *   A B C D\n   * A 0 1 2 3\n   * B 1 0 4 5\n   * C 2 4 0 6\n   * D 3 5 6 0\n   * ```\n   *\n   * will return compact 1D array `[1, 2, 3, 4, 5, 6]`\n   *\n   * length is S(i=0, n=sideSize-1) => 6 for a 4 side sized matrix\n   *\n   * @returns {number[]}\n   */\n  toCompact() {\n    const { diagonalSize } = this;\n    const compactLength = ((diagonalSize - 1) * diagonalSize) / 2;\n\n    /** @type {number[]} */\n    const compact = new Array(compactLength);\n    for (let col = 1, row = 0, index = 0; index < compact.length; index++) {\n      compact[index] = this.get(row, col);\n\n      if (++col >= diagonalSize) col = ++row + 1;\n    }\n\n    return compact;\n  }\n\n  /**\n   * @param {number[]} compact\n   */\n  static fromCompact(compact) {\n    const compactSize = compact.length;\n\n    if (compactSize === 0) {\n      return new this(0);\n    }\n\n    // compactSize in Natural integer range ]0;∞]\n    // compactSize = (sideSize * (sideSize - 1)) / 2\n    // sideSize = (Sqrt(8 × compactSize + 1) + 1) / 2\n    const diagonalSize = (Math.sqrt(8 * compactSize + 1) + 1) / 2;\n\n    if (!Number.isInteger(diagonalSize)) {\n      throw new TypeError(\n        `This array is not a compact representation of a DistanceMatrix, ${JSON.stringify(\n          compact,\n        )}`,\n      );\n    }\n\n    const matrix = new this(diagonalSize);\n    for (let col = 1, row = 0, index = 0; index < compactSize; index++) {\n      matrix.set(col, row, compact[index]);\n      if (++col >= diagonalSize) col = ++row + 1;\n    }\n\n    return matrix;\n  }\n}\nDistanceMatrix.prototype.klassSubType = 'DistanceMatrix';\n\nclass 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\nclass MatrixColumnView extends BaseView {\n  constructor(matrix, column) {\n    checkColumnIndex(matrix, column);\n    super(matrix, matrix.rows, 1);\n    this.column = column;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.column, value);\n    return this;\n  }\n\n  get(rowIndex) {\n    return this.matrix.get(rowIndex, this.column);\n  }\n}\n\nclass MatrixColumnSelectionView extends BaseView {\n  constructor(matrix, columnIndices) {\n    checkColumnIndices(matrix, columnIndices);\n    super(matrix, matrix.rows, columnIndices.length);\n    this.columnIndices = columnIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.columnIndices[columnIndex], value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(rowIndex, this.columnIndices[columnIndex]);\n  }\n}\n\nclass MatrixFlipColumnView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.rows, matrix.columns);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.columns - columnIndex - 1, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(rowIndex, this.columns - columnIndex - 1);\n  }\n}\n\nclass MatrixFlipRowView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.rows, matrix.columns);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.rows - rowIndex - 1, columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.rows - rowIndex - 1, columnIndex);\n  }\n}\n\nclass MatrixRowView extends BaseView {\n  constructor(matrix, row) {\n    checkRowIndex(matrix, row);\n    super(matrix, 1, matrix.columns);\n    this.row = row;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.row, columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.row, columnIndex);\n  }\n}\n\nclass MatrixRowSelectionView extends BaseView {\n  constructor(matrix, rowIndices) {\n    checkRowIndices(matrix, rowIndices);\n    super(matrix, rowIndices.length, matrix.columns);\n    this.rowIndices = rowIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.rowIndices[rowIndex], columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.rowIndices[rowIndex], columnIndex);\n  }\n}\n\nclass MatrixSelectionView extends BaseView {\n  constructor(matrix, rowIndices, columnIndices) {\n    checkRowIndices(matrix, rowIndices);\n    checkColumnIndices(matrix, columnIndices);\n    super(matrix, rowIndices.length, columnIndices.length);\n    this.rowIndices = rowIndices;\n    this.columnIndices = columnIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(\n      this.rowIndices[rowIndex],\n      this.columnIndices[columnIndex],\n      value,\n    );\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(\n      this.rowIndices[rowIndex],\n      this.columnIndices[columnIndex],\n    );\n  }\n}\n\nclass MatrixSubView extends BaseView {\n  constructor(matrix, startRow, endRow, startColumn, endColumn) {\n    checkRange(matrix, startRow, endRow, startColumn, endColumn);\n    super(matrix, endRow - startRow + 1, endColumn - startColumn + 1);\n    this.startRow = startRow;\n    this.startColumn = startColumn;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(\n      this.startRow + rowIndex,\n      this.startColumn + columnIndex,\n      value,\n    );\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(\n      this.startRow + rowIndex,\n      this.startColumn + columnIndex,\n    );\n  }\n}\n\nclass 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\nclass WrapperMatrix1D extends AbstractMatrix {\n  constructor(data, options = {}) {\n    const { rows = 1 } = options;\n\n    if (data.length % rows !== 0) {\n      throw new Error('the data length is not divisible by the number of rows');\n    }\n    super();\n    this.rows = rows;\n    this.columns = data.length / rows;\n    this.data = data;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    let index = this._calculateIndex(rowIndex, columnIndex);\n    this.data[index] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    let index = this._calculateIndex(rowIndex, columnIndex);\n    return this.data[index];\n  }\n\n  _calculateIndex(row, column) {\n    return row * this.columns + column;\n  }\n}\n\nclass 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\nfunction wrap(array, options) {\n  if (isAnyArray(array)) {\n    if (array[0] && isAnyArray(array[0])) {\n      return new WrapperMatrix2D(array);\n    } else {\n      return new WrapperMatrix1D(array, options);\n    }\n  } else {\n    throw new Error('the argument is not an array');\n  }\n}\n\nclass 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\n/**\n * Transpose a square matrix in place, without allocating a copy.\n * Used to restore the logical layout of decomposition outputs that were\n * accumulated in transposed storage for cache-sequential inner loops.\n * @param {import('../matrix').default} matrix - square matrix, mutated in place\n * @returns {import('../matrix').default} the same matrix\n */\nfunction transposeSquareInPlace(matrix) {\n  const data = matrix.data;\n  const n = matrix.rows;\n  for (let i = 0; i < n; i++) {\n    const rowI = data[i];\n    for (let j = i + 1; j < n; j++) {\n      const tmp = rowI[j];\n      rowI[j] = data[j][i];\n      data[j][i] = tmp;\n    }\n  }\n  return matrix;\n}\n\nfunction 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\nclass 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\nclass 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    // Work on the transpose of the input so the hot inner loops (which iterate\n    // over rows for a fixed column) scan memory sequentially in the row-major\n    // backing store. `at` holds the transpose: at.get(j, i) === a.get(i, j)\n    // where `a` is the logical m x n working matrix.\n    let swapped = false;\n    let at;\n    if (m < n) {\n      if (!autoTranspose) {\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        at = value.transpose();\n      } else {\n        at = value.clone();\n        m = value.columns;\n        n = value.rows;\n        swapped = true;\n        let aux = wantu;\n        wantu = wantv;\n        wantv = aux;\n      }\n    } else {\n      at = value.transpose();\n    }\n\n    let nu = Math.min(m, n);\n    let ni = Math.min(m + 1, n);\n    let s = new Float64Array(ni);\n    // U and V are stored transposed during the computation so the inner loops\n    // (which always vary the row index) scan memory sequentially. They are\n    // transposed back to their logical layout before being returned.\n    // Ut.get(j, i) === U.get(i, j) and Vt.get(j, i) === V.get(i, j).\n    let U = new Matrix(nu, m);\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], at.get(k, i));\n        }\n        if (s[k] !== 0) {\n          if (at.get(k, k) < 0) {\n            s[k] = -s[k];\n          }\n          for (let i = k; i < m; i++) {\n            at.set(k, i, at.get(k, i) / s[k]);\n          }\n          at.set(k, k, at.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 += at.get(k, i) * at.get(j, i);\n          }\n          t = -t / at.get(k, k);\n          for (let i = k; i < m; i++) {\n            at.set(j, i, at.get(j, i) + t * at.get(k, i));\n          }\n        }\n        e[j] = at.get(j, k);\n      }\n\n      if (wantu && k < nct) {\n        for (let i = k; i < m; i++) {\n          U.set(k, i, at.get(k, i));\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] * at.get(j, i);\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              at.set(j, i, at.get(j, i) + t * work[i]);\n            }\n          }\n        }\n        if (wantv) {\n          for (let i = k + 1; i < n; i++) {\n            V.set(k, i, e[i]);\n          }\n        }\n      }\n    }\n\n    let p = Math.min(n, m + 1);\n    if (nct < n) {\n      s[nct] = at.get(nct, nct);\n    }\n    if (m < p) {\n      s[p - 1] = 0;\n    }\n    if (nrt + 1 < p) {\n      e[nrt] = at.get(p - 1, nrt);\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(j, i, 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(k, i) * U.get(j, i);\n            }\n            t = -t / U.get(k, k);\n            for (let i = k; i < m; i++) {\n              U.set(j, i, U.get(j, i) + t * U.get(k, i));\n            }\n          }\n          for (let i = k; i < m; i++) {\n            U.set(k, i, -U.get(k, i));\n          }\n          U.set(k, k, 1 + U.get(k, k));\n          for (let i = 0; i < k - 1; i++) {\n            U.set(k, i, 0);\n          }\n        } else {\n          for (let i = 0; i < m; i++) {\n            U.set(k, i, 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(k, i) * V.get(j, i);\n            }\n            t = -t / V.get(k, k + 1);\n            for (let i = k + 1; i < n; i++) {\n              V.set(j, i, V.get(j, i) + t * V.get(k, i));\n            }\n          }\n        }\n        for (let i = 0; i < n; i++) {\n          V.set(k, i, 0);\n        }\n        V.set(k, k, 1);\n      }\n    }\n\n    let pp = p - 1;\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(j, i) + sn * V.get(p - 1, i);\n                V.set(p - 1, i, -sn * V.get(j, i) + cs * V.get(p - 1, i));\n                V.set(j, i, 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(j, i) + sn * U.get(k - 1, i);\n                U.set(k - 1, i, -sn * U.get(j, i) + cs * U.get(k - 1, i));\n                U.set(j, i, 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(j, i) + sn * V.get(j + 1, i);\n                V.set(j + 1, i, -sn * V.get(j, i) + cs * V.get(j + 1, i));\n                V.set(j, i, 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(j, i) + sn * U.get(j + 1, i);\n                U.set(j + 1, i, -sn * U.get(j, i) + cs * U.get(j + 1, i));\n                U.set(j, i, t);\n              }\n            }\n          }\n          e[p - 2] = f;\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(k, i, -V.get(k, i));\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(k + 1, i);\n                V.set(k + 1, i, V.get(k, i));\n                V.set(k, i, t);\n              }\n            }\n            if (wantu && k < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = U.get(k + 1, i);\n                U.set(k + 1, i, U.get(k, i));\n                U.set(k, i, t);\n              }\n            }\n            k++;\n          }\n          p--;\n          break;\n        }\n        // no default\n      }\n    }\n\n    // Restore the logical (row-major) layout of the singular vectors, which were\n    // accumulated in transposed storage for cache-sequential inner loops. V is\n    // always square and U is square whenever the input is, so this is done in\n    // place (no allocation) in the common case.\n    U = U.isSquare() ? transposeSquareInPlace(U) : U.transpose();\n    V = transposeSquareInPlace(V);\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\nfunction 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\nfunction 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\nfunction determinant(matrix) {\n  matrix = Matrix.checkMatrix(matrix);\n  if (matrix.isSquare()) {\n    if (matrix.columns === 0) {\n      return 1;\n    }\n\n    let a, b, c, d;\n    if (matrix.columns === 2) {\n      // 2 x 2 matrix\n      a = matrix.get(0, 0);\n      b = matrix.get(0, 1);\n      c = matrix.get(1, 0);\n      d = matrix.get(1, 1);\n\n      return a * d - b * c;\n    } else if (matrix.columns === 3) {\n      // 3 x 3 matrix\n      let subMatrix0, subMatrix1, subMatrix2;\n      subMatrix0 = new MatrixSelectionView(matrix, [1, 2], [1, 2]);\n      subMatrix1 = new MatrixSelectionView(matrix, [1, 2], [0, 2]);\n      subMatrix2 = new MatrixSelectionView(matrix, [1, 2], [0, 1]);\n      a = matrix.get(0, 0);\n      b = matrix.get(0, 1);\n      c = matrix.get(0, 2);\n\n      return (\n        a * determinant(subMatrix0) -\n        b * determinant(subMatrix1) +\n        c * determinant(subMatrix2)\n      );\n    } else {\n      // general purpose determinant using the LU decomposition\n      return new LuDecomposition(matrix).determinant;\n    }\n  } else {\n    throw Error('determinant can only be calculated for a square matrix');\n  }\n}\n\nfunction xrange(n, exception) {\n  let range = [];\n  for (let i = 0; i < n; i++) {\n    if (i !== exception) {\n      range.push(i);\n    }\n  }\n  return range;\n}\n\nfunction dependenciesOneRow(\n  error,\n  matrix,\n  index,\n  thresholdValue = 10e-10,\n  thresholdError = 10e-10,\n) {\n  if (error > thresholdError) {\n    return new Array(matrix.rows + 1).fill(0);\n  } else {\n    let returnArray = matrix.addRow(index, [0]);\n    for (let i = 0; i < returnArray.rows; i++) {\n      if (Math.abs(returnArray.get(i, 0)) < thresholdValue) {\n        returnArray.set(i, 0, 0);\n      }\n    }\n    return returnArray.to1DArray();\n  }\n}\n\nfunction linearDependencies(matrix, options = {}) {\n  const { thresholdValue = 10e-10, thresholdError = 10e-10 } = options;\n  matrix = Matrix.checkMatrix(matrix);\n\n  let n = matrix.rows;\n  let results = new Matrix(n, n);\n\n  for (let i = 0; i < n; i++) {\n    let b = Matrix.columnVector(matrix.getRow(i));\n    let Abis = matrix.subMatrixRow(xrange(n, i)).transpose();\n    let svd = new SingularValueDecomposition(Abis);\n    let x = svd.solve(b);\n    let error = Matrix.sub(b, Abis.mmul(x)).abs().max();\n    results.setRow(\n      i,\n      dependenciesOneRow(error, x, i, thresholdValue, thresholdError),\n    );\n  }\n  return results;\n}\n\nfunction pseudoInverse(matrix, threshold = Number.EPSILON) {\n  matrix = Matrix.checkMatrix(matrix);\n  if (matrix.isEmpty()) {\n    // with a zero dimension, the pseudo-inverse is the transpose, since all 0xn and nx0 matrices are singular\n    // (0xn)*(nx0)*(0xn) = 0xn\n    // (nx0)*(0xn)*(nx0) = nx0\n    return matrix.transpose();\n  }\n  let svdSolution = new SingularValueDecomposition(matrix, { autoTranspose: true });\n\n  let U = svdSolution.leftSingularVectors;\n  let V = svdSolution.rightSingularVectors;\n  let s = svdSolution.diagonal;\n\n  for (let i = 0; i < s.length; i++) {\n    if (Math.abs(s[i]) > threshold) {\n      s[i] = 1.0 / s[i];\n    } else {\n      s[i] = 0.0;\n    }\n  }\n\n  return V.mmul(Matrix.diag(s).mmul(U.transpose()));\n}\n\nfunction covariance(xMatrix, yMatrix = xMatrix, options = {}) {\n  xMatrix = new Matrix(xMatrix);\n  let yIsSame = false;\n  if (\n    typeof yMatrix === 'object' &&\n    !Matrix.isMatrix(yMatrix) &&\n    !isAnyArray(yMatrix)\n  ) {\n    options = yMatrix;\n    yMatrix = xMatrix;\n    yIsSame = true;\n  } else {\n    yMatrix = new Matrix(yMatrix);\n  }\n  if (xMatrix.rows !== yMatrix.rows) {\n    throw new TypeError('Both matrices must have the same number of rows');\n  }\n  const { center = true } = options;\n  if (center) {\n    xMatrix = xMatrix.center('column');\n    if (!yIsSame) {\n      yMatrix = yMatrix.center('column');\n    }\n  }\n  const cov = xMatrix.transposeMultiply(yMatrix);\n  for (let i = 0; i < cov.rows; i++) {\n    for (let j = 0; j < cov.columns; j++) {\n      cov.set(i, j, cov.get(i, j) * (1 / (xMatrix.rows - 1)));\n    }\n  }\n  return cov;\n}\n\nfunction correlation(xMatrix, yMatrix = xMatrix, options = {}) {\n  xMatrix = new Matrix(xMatrix);\n  let yIsSame = false;\n  if (\n    typeof yMatrix === 'object' &&\n    !Matrix.isMatrix(yMatrix) &&\n    !isAnyArray(yMatrix)\n  ) {\n    options = yMatrix;\n    yMatrix = xMatrix;\n    yIsSame = true;\n  } else {\n    yMatrix = new Matrix(yMatrix);\n  }\n  if (xMatrix.rows !== yMatrix.rows) {\n    throw new TypeError('Both matrices must have the same number of rows');\n  }\n\n  const { center = true, scale = true } = options;\n  if (center) {\n    xMatrix.center('column');\n    if (!yIsSame) {\n      yMatrix.center('column');\n    }\n  }\n  if (scale) {\n    xMatrix.scale('column');\n    if (!yIsSame) {\n      yMatrix.scale('column');\n    }\n  }\n\n  const sdx = xMatrix.standardDeviation('column', { unbiased: true });\n  const sdy = yIsSame\n    ? sdx\n    : yMatrix.standardDeviation('column', { unbiased: true });\n\n  const corr = xMatrix.transposeMultiply(yMatrix);\n  for (let i = 0; i < corr.rows; i++) {\n    for (let j = 0; j < corr.columns; j++) {\n      corr.set(\n        i,\n        j,\n        corr.get(i, j) * (1 / (sdx[i] * sdy[j])) * (1 / (xMatrix.rows - 1)),\n      );\n    }\n  }\n  return corr;\n}\n\nclass EigenvalueDecomposition {\n  constructor(matrix, options = {}) {\n    const { assumeSymmetric = false } = options;\n\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n    if (!matrix.isSquare()) {\n      throw new Error('Matrix is not a square matrix');\n    }\n\n    if (matrix.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let n = matrix.columns;\n    let V = new Matrix(n, n);\n    let d = new Float64Array(n);\n    let e = new Float64Array(n);\n    let value = matrix;\n    let i, j;\n\n    let isSymmetric = false;\n    if (assumeSymmetric) {\n      isSymmetric = true;\n    } else {\n      isSymmetric = matrix.isSymmetric();\n    }\n\n    if (isSymmetric) {\n      // tred2/tql2 access V almost exclusively down columns (the row index\n      // varies in the hot loops). Storing V transposed turns those into\n      // sequential row scans of the row-major backing store; we transpose it\n      // back to the logical layout before returning. V.get(j, i) holds the\n      // logical V(i, j).\n      for (i = 0; i < n; i++) {\n        for (j = 0; j < n; j++) {\n          V.set(j, i, value.get(i, j));\n        }\n      }\n      tred2(n, e, d, V);\n      tql2(n, e, d, V);\n      // V is square; restore the logical layout in place (no allocation).\n      transposeSquareInPlace(V);\n    } else {\n      // The non-symmetric path (orthes/hqr2) has two O(n^3) phases with opposite\n      // memory-layout preferences (the QR sweep favours column-major eigenvectors\n      // while the back-transform favours row-major), so a single transposed\n      // storage cannot help both. It is left in the original row-major layout.\n      let H = new Matrix(n, n);\n      let ort = new Float64Array(n);\n      for (j = 0; j < n; j++) {\n        for (i = 0; i < n; i++) {\n          H.set(i, j, value.get(i, j));\n        }\n      }\n      orthes(n, H, ort, V);\n      hqr2(n, e, d, V, H);\n    }\n\n    this.n = n;\n    this.e = e;\n    this.d = d;\n    this.V = V;\n  }\n\n  get realEigenvalues() {\n    return Array.from(this.d);\n  }\n\n  get imaginaryEigenvalues() {\n    return Array.from(this.e);\n  }\n\n  get eigenvectorMatrix() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    let n = this.n;\n    let e = this.e;\n    let d = this.d;\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        X.set(i, j, 0);\n      }\n      X.set(i, i, d[i]);\n      if (e[i] > 0) {\n        X.set(i, i + 1, e[i]);\n      } else if (e[i] < 0) {\n        X.set(i, i - 1, e[i]);\n      }\n    }\n    return X;\n  }\n}\n\nfunction tred2(n, e, d, V) {\n  let f, g, h, i, j, k, hh, scale;\n\n  for (j = 0; j < n; j++) {\n    d[j] = V.get(j, n - 1);\n  }\n\n  for (i = n - 1; i > 0; i--) {\n    scale = 0;\n    h = 0;\n    for (k = 0; k < i; k++) {\n      scale = scale + Math.abs(d[k]);\n    }\n\n    if (scale === 0) {\n      e[i] = d[i - 1];\n      for (j = 0; j < i; j++) {\n        d[j] = V.get(j, i - 1);\n        V.set(j, i, 0);\n        V.set(i, j, 0);\n      }\n    } else {\n      for (k = 0; k < i; k++) {\n        d[k] /= scale;\n        h += d[k] * d[k];\n      }\n\n      f = d[i - 1];\n      g = Math.sqrt(h);\n      if (f > 0) {\n        g = -g;\n      }\n\n      e[i] = scale * g;\n      h = h - f * g;\n      d[i - 1] = f - g;\n      for (j = 0; j < i; j++) {\n        e[j] = 0;\n      }\n\n      for (j = 0; j < i; j++) {\n        f = d[j];\n        V.set(i, j, f);\n        g = e[j] + V.get(j, j) * f;\n        for (k = j + 1; k <= i - 1; k++) {\n          g += V.get(j, k) * d[k];\n          e[k] += V.get(j, k) * f;\n        }\n        e[j] = g;\n      }\n\n      f = 0;\n      for (j = 0; j < i; j++) {\n        e[j] /= h;\n        f += e[j] * d[j];\n      }\n\n      hh = f / (h + h);\n      for (j = 0; j < i; j++) {\n        e[j] -= hh * d[j];\n      }\n\n      for (j = 0; j < i; j++) {\n        f = d[j];\n        g = e[j];\n        for (k = j; k <= i - 1; k++) {\n          V.set(j, k, V.get(j, k) - (f * e[k] + g * d[k]));\n        }\n        d[j] = V.get(j, i - 1);\n        V.set(j, i, 0);\n      }\n    }\n    d[i] = h;\n  }\n\n  for (i = 0; i < n - 1; i++) {\n    V.set(i, n - 1, V.get(i, i));\n    V.set(i, i, 1);\n    h = d[i + 1];\n    if (h !== 0) {\n      for (k = 0; k <= i; k++) {\n        d[k] = V.get(i + 1, k) / h;\n      }\n\n      for (j = 0; j <= i; j++) {\n        g = 0;\n        for (k = 0; k <= i; k++) {\n          g += V.get(i + 1, k) * V.get(j, k);\n        }\n        for (k = 0; k <= i; k++) {\n          V.set(j, k, V.get(j, k) - g * d[k]);\n        }\n      }\n    }\n\n    for (k = 0; k <= i; k++) {\n      V.set(i + 1, k, 0);\n    }\n  }\n\n  for (j = 0; j < n; j++) {\n    d[j] = V.get(j, n - 1);\n    V.set(j, n - 1, 0);\n  }\n\n  V.set(n - 1, n - 1, 1);\n  e[0] = 0;\n}\n\nfunction tql2(n, e, d, V) {\n  let g, h, i, j, k, l, m, p, r, dl1, c, c2, c3, el1, s, s2;\n\n  for (i = 1; i < n; i++) {\n    e[i - 1] = e[i];\n  }\n\n  e[n - 1] = 0;\n\n  let f = 0;\n  let tst1 = 0;\n  let eps = Number.EPSILON;\n\n  for (l = 0; l < n; l++) {\n    tst1 = Math.max(tst1, Math.abs(d[l]) + Math.abs(e[l]));\n    m = l;\n    while (m < n) {\n      if (Math.abs(e[m]) <= eps * tst1) {\n        break;\n      }\n      m++;\n    }\n\n    if (m > l) {\n      do {\n\n        g = d[l];\n        p = (d[l + 1] - g) / (2 * e[l]);\n        r = hypotenuse(p, 1);\n        if (p < 0) {\n          r = -r;\n        }\n\n        d[l] = e[l] / (p + r);\n        d[l + 1] = e[l] * (p + r);\n        dl1 = d[l + 1];\n        h = g - d[l];\n        for (i = l + 2; i < n; i++) {\n          d[i] -= h;\n        }\n\n        f = f + h;\n\n        p = d[m];\n        c = 1;\n        c2 = c;\n        c3 = c;\n        el1 = e[l + 1];\n        s = 0;\n        s2 = 0;\n        for (i = m - 1; i >= l; i--) {\n          c3 = c2;\n          c2 = c;\n          s2 = s;\n          g = c * e[i];\n          h = c * p;\n          r = hypotenuse(p, e[i]);\n          e[i + 1] = s * r;\n          s = e[i] / r;\n          c = p / r;\n          p = c * d[i] - s * g;\n          d[i + 1] = h + s * (c * g + s * d[i]);\n\n          for (k = 0; k < n; k++) {\n            h = V.get(i + 1, k);\n            V.set(i + 1, k, s * V.get(i, k) + c * h);\n            V.set(i, k, c * V.get(i, k) - s * h);\n          }\n        }\n\n        p = (-s * s2 * c3 * el1 * e[l]) / dl1;\n        e[l] = s * p;\n        d[l] = c * p;\n      } while (Math.abs(e[l]) > eps * tst1);\n    }\n    d[l] = d[l] + f;\n    e[l] = 0;\n  }\n\n  for (i = 0; i < n - 1; i++) {\n    k = i;\n    p = d[i];\n    for (j = i + 1; j < n; j++) {\n      if (d[j] < p) {\n        k = j;\n        p = d[j];\n      }\n    }\n\n    if (k !== i) {\n      d[k] = d[i];\n      d[i] = p;\n      for (j = 0; j < n; j++) {\n        p = V.get(i, j);\n        V.set(i, j, V.get(k, j));\n        V.set(k, j, p);\n      }\n    }\n  }\n}\n\nfunction orthes(n, H, ort, V) {\n  let low = 0;\n  let high = n - 1;\n  let f, g, h, i, j, m;\n  let scale;\n\n  for (m = low + 1; m <= high - 1; m++) {\n    scale = 0;\n    for (i = m; i <= high; i++) {\n      scale = scale + Math.abs(H.get(i, m - 1));\n    }\n\n    if (scale !== 0) {\n      h = 0;\n      for (i = high; i >= m; i--) {\n        ort[i] = H.get(i, m - 1) / scale;\n        h += ort[i] * ort[i];\n      }\n\n      g = Math.sqrt(h);\n      if (ort[m] > 0) {\n        g = -g;\n      }\n\n      h = h - ort[m] * g;\n      ort[m] = ort[m] - g;\n\n      for (j = m; j < n; j++) {\n        f = 0;\n        for (i = high; i >= m; i--) {\n          f += ort[i] * H.get(i, j);\n        }\n\n        f = f / h;\n        for (i = m; i <= high; i++) {\n          H.set(i, j, H.get(i, j) - f * ort[i]);\n        }\n      }\n\n      for (i = 0; i <= high; i++) {\n        f = 0;\n        for (j = high; j >= m; j--) {\n          f += ort[j] * H.get(i, j);\n        }\n\n        f = f / h;\n        for (j = m; j <= high; j++) {\n          H.set(i, j, H.get(i, j) - f * ort[j]);\n        }\n      }\n\n      ort[m] = scale * ort[m];\n      H.set(m, m - 1, scale * g);\n    }\n  }\n\n  for (i = 0; i < n; i++) {\n    for (j = 0; j < n; j++) {\n      V.set(i, j, i === j ? 1 : 0);\n    }\n  }\n\n  for (m = high - 1; m >= low + 1; m--) {\n    if (H.get(m, m - 1) !== 0) {\n      for (i = m + 1; i <= high; i++) {\n        ort[i] = H.get(i, m - 1);\n      }\n\n      for (j = m; j <= high; j++) {\n        g = 0;\n        for (i = m; i <= high; i++) {\n          g += ort[i] * V.get(i, j);\n        }\n\n        g = g / ort[m] / H.get(m, m - 1);\n        for (i = m; i <= high; i++) {\n          V.set(i, j, V.get(i, j) + g * ort[i]);\n        }\n      }\n    }\n  }\n}\n\nfunction hqr2(nn, e, d, V, H) {\n  let n = nn - 1;\n  let low = 0;\n  let high = nn - 1;\n  let eps = Number.EPSILON;\n  let exshift = 0;\n  let norm = 0;\n  let p = 0;\n  let q = 0;\n  let r = 0;\n  let s = 0;\n  let z = 0;\n  let iter = 0;\n  let i, j, k, l, m, t, w, x, y;\n  let ra, sa, vr, vi;\n  let notlast, cdivres;\n\n  for (i = 0; i < nn; i++) {\n    if (i < low || i > high) {\n      d[i] = H.get(i, i);\n      e[i] = 0;\n    }\n\n    for (j = Math.max(i - 1, 0); j < nn; j++) {\n      norm = norm + Math.abs(H.get(i, j));\n    }\n  }\n\n  while (n >= low) {\n    l = n;\n    while (l > low) {\n      s = Math.abs(H.get(l - 1, l - 1)) + Math.abs(H.get(l, l));\n      if (s === 0) {\n        s = norm;\n      }\n      if (Math.abs(H.get(l, l - 1)) < eps * s) {\n        break;\n      }\n      l--;\n    }\n\n    if (l === n) {\n      H.set(n, n, H.get(n, n) + exshift);\n      d[n] = H.get(n, n);\n      e[n] = 0;\n      n--;\n      iter = 0;\n    } else if (l === n - 1) {\n      w = H.get(n, n - 1) * H.get(n - 1, n);\n      p = (H.get(n - 1, n - 1) - H.get(n, n)) / 2;\n      q = p * p + w;\n      z = Math.sqrt(Math.abs(q));\n      H.set(n, n, H.get(n, n) + exshift);\n      H.set(n - 1, n - 1, H.get(n - 1, n - 1) + exshift);\n      x = H.get(n, n);\n\n      if (q >= 0) {\n        z = p >= 0 ? p + z : p - z;\n        d[n - 1] = x + z;\n        d[n] = d[n - 1];\n        if (z !== 0) {\n          d[n] = x - w / z;\n        }\n        e[n - 1] = 0;\n        e[n] = 0;\n        x = H.get(n, n - 1);\n        s = Math.abs(x) + Math.abs(z);\n        p = x / s;\n        q = z / s;\n        r = Math.sqrt(p * p + q * q);\n        p = p / r;\n        q = q / r;\n\n        for (j = n - 1; j < nn; j++) {\n          z = H.get(n - 1, j);\n          H.set(n - 1, j, q * z + p * H.get(n, j));\n          H.set(n, j, q * H.get(n, j) - p * z);\n        }\n\n        for (i = 0; i <= n; i++) {\n          z = H.get(i, n - 1);\n          H.set(i, n - 1, q * z + p * H.get(i, n));\n          H.set(i, n, q * H.get(i, n) - p * z);\n        }\n\n        for (i = low; i <= high; i++) {\n          z = V.get(i, n - 1);\n          V.set(i, n - 1, q * z + p * V.get(i, n));\n          V.set(i, n, q * V.get(i, n) - p * z);\n        }\n      } else {\n        d[n - 1] = x + p;\n        d[n] = x + p;\n        e[n - 1] = z;\n        e[n] = -z;\n      }\n\n      n = n - 2;\n      iter = 0;\n    } else {\n      x = H.get(n, n);\n      y = 0;\n      w = 0;\n      if (l < n) {\n        y = H.get(n - 1, n - 1);\n        w = H.get(n, n - 1) * H.get(n - 1, n);\n      }\n\n      if (iter === 10) {\n        exshift += x;\n        for (i = low; i <= n; i++) {\n          H.set(i, i, H.get(i, i) - x);\n        }\n        s = Math.abs(H.get(n, n - 1)) + Math.abs(H.get(n - 1, n - 2));\n        // eslint-disable-next-line no-multi-assign\n        x = y = 0.75 * s;\n        w = -0.4375 * s * s;\n      }\n\n      if (iter === 30) {\n        s = (y - x) / 2;\n        s = s * s + w;\n        if (s > 0) {\n          s = Math.sqrt(s);\n          if (y < x) {\n            s = -s;\n          }\n          s = x - w / ((y - x) / 2 + s);\n          for (i = low; i <= n; i++) {\n            H.set(i, i, H.get(i, i) - s);\n          }\n          exshift += s;\n          // eslint-disable-next-line no-multi-assign\n          x = y = w = 0.964;\n        }\n      }\n\n      iter = iter + 1;\n\n      m = n - 2;\n      while (m >= l) {\n        z = H.get(m, m);\n        r = x - z;\n        s = y - z;\n        p = (r * s - w) / H.get(m + 1, m) + H.get(m, m + 1);\n        q = H.get(m + 1, m + 1) - z - r - s;\n        r = H.get(m + 2, m + 1);\n        s = Math.abs(p) + Math.abs(q) + Math.abs(r);\n        p = p / s;\n        q = q / s;\n        r = r / s;\n        if (m === l) {\n          break;\n        }\n        if (\n          Math.abs(H.get(m, m - 1)) * (Math.abs(q) + Math.abs(r)) <\n          eps *\n            (Math.abs(p) *\n              (Math.abs(H.get(m - 1, m - 1)) +\n                Math.abs(z) +\n                Math.abs(H.get(m + 1, m + 1))))\n        ) {\n          break;\n        }\n        m--;\n      }\n\n      for (i = m + 2; i <= n; i++) {\n        H.set(i, i - 2, 0);\n        if (i > m + 2) {\n          H.set(i, i - 3, 0);\n        }\n      }\n\n      for (k = m; k <= n - 1; k++) {\n        notlast = k !== n - 1;\n        if (k !== m) {\n          p = H.get(k, k - 1);\n          q = H.get(k + 1, k - 1);\n          r = notlast ? H.get(k + 2, k - 1) : 0;\n          x = Math.abs(p) + Math.abs(q) + Math.abs(r);\n          if (x !== 0) {\n            p = p / x;\n            q = q / x;\n            r = r / x;\n          }\n        }\n\n        if (x === 0) {\n          break;\n        }\n\n        s = Math.sqrt(p * p + q * q + r * r);\n        if (p < 0) {\n          s = -s;\n        }\n\n        if (s !== 0) {\n          if (k !== m) {\n            H.set(k, k - 1, -s * x);\n          } else if (l !== m) {\n            H.set(k, k - 1, -H.get(k, k - 1));\n          }\n\n          p = p + s;\n          x = p / s;\n          y = q / s;\n          z = r / s;\n          q = q / p;\n          r = r / p;\n\n          for (j = k; j < nn; j++) {\n            p = H.get(k, j) + q * H.get(k + 1, j);\n            if (notlast) {\n              p = p + r * H.get(k + 2, j);\n              H.set(k + 2, j, H.get(k + 2, j) - p * z);\n            }\n\n            H.set(k, j, H.get(k, j) - p * x);\n            H.set(k + 1, j, H.get(k + 1, j) - p * y);\n          }\n\n          for (i = 0; i <= Math.min(n, k + 3); i++) {\n            p = x * H.get(i, k) + y * H.get(i, k + 1);\n            if (notlast) {\n              p = p + z * H.get(i, k + 2);\n              H.set(i, k + 2, H.get(i, k + 2) - p * r);\n            }\n\n            H.set(i, k, H.get(i, k) - p);\n            H.set(i, k + 1, H.get(i, k + 1) - p * q);\n          }\n\n          for (i = low; i <= high; i++) {\n            p = x * V.get(i, k) + y * V.get(i, k + 1);\n            if (notlast) {\n              p = p + z * V.get(i, k + 2);\n              V.set(i, k + 2, V.get(i, k + 2) - p * r);\n            }\n\n            V.set(i, k, V.get(i, k) - p);\n            V.set(i, k + 1, V.get(i, k + 1) - p * q);\n          }\n        }\n      }\n    }\n  }\n\n  if (norm === 0) {\n    return;\n  }\n\n  for (n = nn - 1; n >= 0; n--) {\n    p = d[n];\n    q = e[n];\n\n    if (q === 0) {\n      l = n;\n      H.set(n, n, 1);\n      for (i = n - 1; i >= 0; i--) {\n        w = H.get(i, i) - p;\n        r = 0;\n        for (j = l; j <= n; j++) {\n          r = r + H.get(i, j) * H.get(j, n);\n        }\n\n        if (e[i] < 0) {\n          z = w;\n          s = r;\n        } else {\n          l = i;\n          if (e[i] === 0) {\n            H.set(i, n, w !== 0 ? -r / w : -r / (eps * norm));\n          } else {\n            x = H.get(i, i + 1);\n            y = H.get(i + 1, i);\n            q = (d[i] - p) * (d[i] - p) + e[i] * e[i];\n            t = (x * s - z * r) / q;\n            H.set(i, n, t);\n            H.set(\n              i + 1,\n              n,\n              Math.abs(x) > Math.abs(z) ? (-r - w * t) / x : (-s - y * t) / z,\n            );\n          }\n\n          t = Math.abs(H.get(i, n));\n          if (eps * t * t > 1) {\n            for (j = i; j <= n; j++) {\n              H.set(j, n, H.get(j, n) / t);\n            }\n          }\n        }\n      }\n    } else if (q < 0) {\n      l = n - 1;\n\n      if (Math.abs(H.get(n, n - 1)) > Math.abs(H.get(n - 1, n))) {\n        H.set(n - 1, n - 1, q / H.get(n, n - 1));\n        H.set(n - 1, n, -(H.get(n, n) - p) / H.get(n, n - 1));\n      } else {\n        cdivres = cdiv(0, -H.get(n - 1, n), H.get(n - 1, n - 1) - p, q);\n        H.set(n - 1, n - 1, cdivres[0]);\n        H.set(n - 1, n, cdivres[1]);\n      }\n\n      H.set(n, n - 1, 0);\n      H.set(n, n, 1);\n      for (i = n - 2; i >= 0; i--) {\n        ra = 0;\n        sa = 0;\n        for (j = l; j <= n; j++) {\n          ra = ra + H.get(i, j) * H.get(j, n - 1);\n          sa = sa + H.get(i, j) * H.get(j, n);\n        }\n\n        w = H.get(i, i) - p;\n\n        if (e[i] < 0) {\n          z = w;\n          r = ra;\n          s = sa;\n        } else {\n          l = i;\n          if (e[i] === 0) {\n            cdivres = cdiv(-ra, -sa, w, q);\n            H.set(i, n - 1, cdivres[0]);\n            H.set(i, n, cdivres[1]);\n          } else {\n            x = H.get(i, i + 1);\n            y = H.get(i + 1, i);\n            vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;\n            vi = (d[i] - p) * 2 * q;\n            if (vr === 0 && vi === 0) {\n              vr =\n                eps *\n                norm *\n                (Math.abs(w) +\n                  Math.abs(q) +\n                  Math.abs(x) +\n                  Math.abs(y) +\n                  Math.abs(z));\n            }\n            cdivres = cdiv(\n              x * r - z * ra + q * sa,\n              x * s - z * sa - q * ra,\n              vr,\n              vi,\n            );\n            H.set(i, n - 1, cdivres[0]);\n            H.set(i, n, cdivres[1]);\n            if (Math.abs(x) > Math.abs(z) + Math.abs(q)) {\n              H.set(\n                i + 1,\n                n - 1,\n                (-ra - w * H.get(i, n - 1) + q * H.get(i, n)) / x,\n              );\n              H.set(\n                i + 1,\n                n,\n                (-sa - w * H.get(i, n) - q * H.get(i, n - 1)) / x,\n              );\n            } else {\n              cdivres = cdiv(\n                -r - y * H.get(i, n - 1),\n                -s - y * H.get(i, n),\n                z,\n                q,\n              );\n              H.set(i + 1, n - 1, cdivres[0]);\n              H.set(i + 1, n, cdivres[1]);\n            }\n          }\n\n          t = Math.max(Math.abs(H.get(i, n - 1)), Math.abs(H.get(i, n)));\n          if (eps * t * t > 1) {\n            for (j = i; j <= n; j++) {\n              H.set(j, n - 1, H.get(j, n - 1) / t);\n              H.set(j, n, H.get(j, n) / t);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  for (i = 0; i < nn; i++) {\n    if (i < low || i > high) {\n      for (j = i; j < nn; j++) {\n        V.set(i, j, H.get(i, j));\n      }\n    }\n  }\n\n  for (j = nn - 1; j >= low; j--) {\n    for (i = low; i <= high; i++) {\n      z = 0;\n      for (k = low; k <= Math.min(j, high); k++) {\n        z = z + V.get(i, k) * H.get(k, j);\n      }\n      V.set(i, j, z);\n    }\n  }\n}\n\nfunction cdiv(xr, xi, yr, yi) {\n  let r, d;\n  if (Math.abs(yr) > Math.abs(yi)) {\n    r = yi / yr;\n    d = yr + r * yi;\n    return [(xr + r * xi) / d, (xi - r * xr) / d];\n  } else {\n    r = yr / yi;\n    d = yi + r * yr;\n    return [(r * xr + xi) / d, (r * xi - xr) / d];\n  }\n}\n\nclass CholeskyDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n    if (!value.isSymmetric()) {\n      throw new Error('Matrix is not symmetric');\n    }\n\n    let a = value;\n    let dimension = a.rows;\n    let l = new Matrix(dimension, dimension);\n    let positiveDefinite = true;\n    let i, j, k;\n\n    for (j = 0; j < dimension; j++) {\n      let d = 0;\n      for (k = 0; k < j; k++) {\n        let s = 0;\n        for (i = 0; i < k; i++) {\n          s += l.get(k, i) * l.get(j, i);\n        }\n        s = (a.get(j, k) - s) / l.get(k, k);\n        l.set(j, k, s);\n        d = d + s * s;\n      }\n\n      d = a.get(j, j) - d;\n\n      positiveDefinite &&= d > 0;\n      l.set(j, j, Math.sqrt(Math.max(d, 0)));\n      for (k = j + 1; k < dimension; k++) {\n        l.set(j, k, 0);\n      }\n    }\n\n    this.L = l;\n    this.positiveDefinite = positiveDefinite;\n  }\n\n  isPositiveDefinite() {\n    return this.positiveDefinite;\n  }\n\n  solve(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let l = this.L;\n    let dimension = l.rows;\n\n    if (value.rows !== dimension) {\n      throw new Error('Matrix dimensions do not match');\n    }\n    if (this.isPositiveDefinite() === false) {\n      throw new Error('Matrix is not positive definite');\n    }\n\n    let count = value.columns;\n    let B = value.clone();\n    let i, j, k;\n\n    for (k = 0; k < dimension; k++) {\n      for (j = 0; j < count; j++) {\n        for (i = 0; i < k; i++) {\n          B.set(k, j, B.get(k, j) - B.get(i, j) * l.get(k, i));\n        }\n        B.set(k, j, B.get(k, j) / l.get(k, k));\n      }\n    }\n\n    for (k = dimension - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        for (i = k + 1; i < dimension; i++) {\n          B.set(k, j, B.get(k, j) - B.get(i, j) * l.get(i, k));\n        }\n        B.set(k, j, B.get(k, j) / l.get(k, k));\n      }\n    }\n\n    return B;\n  }\n\n  get lowerTriangularMatrix() {\n    return this.L;\n  }\n}\n\nclass nipals {\n  constructor(X, options = {}) {\n    X = WrapperMatrix2D.checkMatrix(X);\n    let { Y } = options;\n    const {\n      scaleScores = false,\n      maxIterations = 1000,\n      terminationCriteria = 1e-10,\n    } = options;\n\n    let u;\n    if (Y) {\n      if (isAnyArray(Y) && typeof Y[0] === 'number') {\n        Y = Matrix.columnVector(Y);\n      } else {\n        Y = WrapperMatrix2D.checkMatrix(Y);\n      }\n      if (Y.rows !== X.rows) {\n        throw new Error('Y should have the same number of rows as X');\n      }\n      u = Y.getColumnVector(0);\n    } else {\n      u = X.getColumnVector(0);\n    }\n\n    let diff = 1;\n    let t, q, w, tOld;\n\n    for (\n      let counter = 0;\n      counter < maxIterations && diff > terminationCriteria;\n      counter++\n    ) {\n      w = X.transpose().mmul(u).div(u.transpose().mmul(u).get(0, 0));\n      w = w.div(w.norm());\n\n      t = X.mmul(w).div(w.transpose().mmul(w).get(0, 0));\n\n      if (counter > 0) {\n        diff = t.clone().sub(tOld).pow(2).sum();\n      }\n      tOld = t.clone();\n\n      if (Y) {\n        q = Y.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n        q = q.div(q.norm());\n\n        u = Y.mmul(q).div(q.transpose().mmul(q).get(0, 0));\n      } else {\n        u = t;\n      }\n    }\n\n    if (Y) {\n      let p = X.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n      p = p.div(p.norm());\n      let xResidual = X.clone().sub(t.clone().mmul(p.transpose()));\n      let residual = u.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n      let yResidual = Y.clone().sub(\n        t.clone().mulS(residual.get(0, 0)).mmul(q.transpose()),\n      );\n\n      this.t = t;\n      this.p = p.transpose();\n      this.w = w.transpose();\n      this.q = q;\n      this.u = u;\n      this.s = t.transpose().mmul(t);\n      this.xResidual = xResidual;\n      this.yResidual = yResidual;\n      this.betas = residual;\n    } else {\n      this.w = w.transpose();\n      this.s = t.transpose().mmul(t).sqrt();\n      if (scaleScores) {\n        this.t = t.clone().div(this.s.get(0, 0));\n      } else {\n        this.t = t;\n      }\n      this.xResidual = X.sub(t.mmul(w.transpose()));\n    }\n  }\n}\n\nexports.AbstractMatrix = AbstractMatrix;\nexports.CHO = CholeskyDecomposition;\nexports.CholeskyDecomposition = CholeskyDecomposition;\nexports.DistanceMatrix = DistanceMatrix;\nexports.EVD = EigenvalueDecomposition;\nexports.EigenvalueDecomposition = EigenvalueDecomposition;\nexports.LU = LuDecomposition;\nexports.LuDecomposition = LuDecomposition;\nexports.Matrix = Matrix;\nexports.MatrixColumnSelectionView = MatrixColumnSelectionView;\nexports.MatrixColumnView = MatrixColumnView;\nexports.MatrixFlipColumnView = MatrixFlipColumnView;\nexports.MatrixFlipRowView = MatrixFlipRowView;\nexports.MatrixRowSelectionView = MatrixRowSelectionView;\nexports.MatrixRowView = MatrixRowView;\nexports.MatrixSelectionView = MatrixSelectionView;\nexports.MatrixSubView = MatrixSubView;\nexports.MatrixTransposeView = MatrixTransposeView;\nexports.NIPALS = nipals;\nexports.Nipals = nipals;\nexports.QR = QrDecomposition;\nexports.QrDecomposition = QrDecomposition;\nexports.SVD = SingularValueDecomposition;\nexports.SingularValueDecomposition = SingularValueDecomposition;\nexports.SymmetricMatrix = SymmetricMatrix;\nexports.WrapperMatrix1D = WrapperMatrix1D;\nexports.WrapperMatrix2D = WrapperMatrix2D;\nexports.correlation = correlation;\nexports.covariance = covariance;\nexports.default = Matrix;\nexports.determinant = determinant;\nexports.inverse = inverse;\nexports.linearDependencies = linearDependencies;\nexports.pseudoInverse = pseudoInverse;\nexports.solve = solve;\nexports.wrap = wrap;\n//# sourceMappingURL=matrix.js.map\n","import * as matrix from './matrix.js';\n\nexport const AbstractMatrix = matrix.AbstractMatrix;\nexport const CHO = matrix.CHO;\nexport const CholeskyDecomposition = matrix.CholeskyDecomposition;\nexport const DistanceMatrix = matrix.DistanceMatrix;\nexport const EVD = matrix.EVD;\nexport const EigenvalueDecomposition = matrix.EigenvalueDecomposition;\nexport const LU = matrix.LU;\nexport const LuDecomposition = matrix.LuDecomposition;\nexport const Matrix = matrix.Matrix;\nexport const MatrixColumnSelectionView = matrix.MatrixColumnSelectionView;\nexport const MatrixColumnView = matrix.MatrixColumnView;\nexport const MatrixFlipColumnView = matrix.MatrixFlipColumnView;\nexport const MatrixFlipRowView = matrix.MatrixFlipRowView;\nexport const MatrixRowSelectionView = matrix.MatrixRowSelectionView;\nexport const MatrixRowView = matrix.MatrixRowView;\nexport const MatrixSelectionView = matrix.MatrixSelectionView;\nexport const MatrixSubView = matrix.MatrixSubView;\nexport const MatrixTransposeView = matrix.MatrixTransposeView;\nexport const NIPALS = matrix.NIPALS;\nexport const Nipals = matrix.Nipals;\nexport const QR = matrix.QR;\nexport const QrDecomposition = matrix.QrDecomposition;\nexport const SVD = matrix.SVD;\nexport const SingularValueDecomposition = matrix.SingularValueDecomposition;\nexport const SymmetricMatrix = matrix.SymmetricMatrix;\nexport const WrapperMatrix1D = matrix.WrapperMatrix1D;\nexport const WrapperMatrix2D = matrix.WrapperMatrix2D;\nexport const correlation = matrix.correlation;\nexport const covariance = matrix.covariance;\nexport default matrix.default.Matrix ? matrix.default.Matrix : matrix.Matrix;\nexport const determinant = matrix.determinant;\nexport const inverse = matrix.inverse;\nexport const linearDependencies = matrix.linearDependencies;\nexport const pseudoInverse = matrix.pseudoInverse;\nexport const solve = matrix.solve;\nexport const wrap = matrix.wrap;\n","import { xCheck } from \"./xCheck.js\";\nimport { xGetFromToIndex } from \"./xGetFromToIndex.js\";\n/**\n * Computes the mean value of an array of values.\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMean(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let sumValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        sumValue += array[i];\n    }\n    return sumValue / (toIndex - fromIndex + 1);\n}\n//# sourceMappingURL=xMean.js.map","import { xCheck } from \"./xCheck.js\";\nimport { xGetFromToIndex } from \"./xGetFromToIndex.js\";\n/**\n * Computes the maximal value of an array of values\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] > maxValue) {\n            maxValue = array[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMaxValue.js.map","import { xCheck } from \"./xCheck.js\";\nimport { xGetFromToIndex } from \"./xGetFromToIndex.js\";\n/**\n * Computes the minimal value of an array of values.\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMinValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let minValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] < minValue) {\n            minValue = array[i];\n        }\n    }\n    return minValue;\n}\n//# sourceMappingURL=xMinValue.js.map","/**\n * Check if the values are separated always by the same difference\n * @param array - monotone growing array of number.\n * @param options - options.\n */\nexport function xIsEquallySpaced(array, options = {}) {\n    if (array.length < 3)\n        return true;\n    const { tolerance = 0.05 } = options;\n    let maxDx = 0;\n    let minDx = Number.MAX_SAFE_INTEGER;\n    for (let i = 0; i < array.length - 1; ++i) {\n        const absoluteDifference = array[i + 1] - array[i];\n        if (absoluteDifference < minDx) {\n            minDx = absoluteDifference;\n        }\n        if (absoluteDifference > maxDx) {\n            maxDx = absoluteDifference;\n        }\n    }\n    return (maxDx - minDx) / maxDx < tolerance;\n}\n//# sourceMappingURL=xIsEquallySpaced.js.map","/**\n * Returns true if x is monotonic.\n * @param array - array of numbers.\n * @returns 1 if monotonic increasing, -1 if monotonic decreasing, 0 if not monotonic.\n */\nexport function xIsMonotonic(array) {\n    if (array.length <= 2) {\n        return 1;\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])\n                return 0;\n        }\n        return 1;\n    }\n    if (array[0] < array.at(-1)) {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] >= array[i + 1])\n                return 0;\n        }\n        return 1;\n    }\n    else {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] <= array[i + 1])\n                return 0;\n        }\n        return -1;\n    }\n}\n//# sourceMappingURL=xIsMonotonic.js.map","import { xCheck } from \"./xCheck.js\";\nimport { xGetFromToIndex } from \"./xGetFromToIndex.js\";\n/**\n * Computes the maximal value of an array of values\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxAbsoluteValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = Math.abs(array[fromIndex]);\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] >= 0) {\n            if (array[i] > maxValue) {\n                maxValue = array[i];\n            }\n        }\n        else if (-array[i] > maxValue) {\n            maxValue = -array[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMaxAbsoluteValue.js.map","import { xMedian } from \"./xMedian.js\";\n/**\n * This function calculates the median absolute deviation (MAD).\n * https://en.wikipedia.org/wiki/Median_absolute_deviation\n * @param array - array of numbers.\n */\nexport function xMedianAbsoluteDeviation(array) {\n    const median = xMedian(array);\n    const averageDeviations = new Float64Array(array.length);\n    for (let i = 0; i < array.length; i++) {\n        averageDeviations[i] = Math.abs(array[i] - median);\n    }\n    return {\n        median,\n        mad: xMedian(averageDeviations),\n    };\n}\n//# sourceMappingURL=xMedianAbsoluteDeviation.js.map","import { xCheck } from \"./xCheck.js\";\n/**\n * Return min and max values of an array.\n * @param array - array of number\n * @returns object with 2 properties, min and max.\n */\nexport function xMinMaxValues(array) {\n    xCheck(array);\n    let min = array[0];\n    let max = array[0];\n    for (const value of array) {\n        if (value < min)\n            min = value;\n        if (value > max)\n            max = value;\n    }\n    return { min, max };\n}\n//# sourceMappingURL=xMinMaxValues.js.map","import { xMedianAbsoluteDeviation } from \"./xMedianAbsoluteDeviation.js\";\n/**\n * Determine noise level using MAD https://en.wikipedia.org/wiki/Median_absolute_deviation\n * Constant to convert mad to sd calculated using https://www.wolframalpha.com/input?i=sqrt%282%29+inverse+erf%280.5%29\n * This assumes a gaussian distribution of the noise\n * @param array - array of numbers.\n * @returns noise level corresponding to one standard deviation.\n */\nexport function xNoiseStandardDeviation(array) {\n    const { mad, median } = xMedianAbsoluteDeviation(array);\n    return { sd: mad / 0.6744897501960817, mad, median };\n}\n//# sourceMappingURL=xNoiseStandardDeviation.js.map","/**\n * This function calculate the norm of a vector.\n * @example xNorm([3, 4]) -> 5\n * @param array - array\n * @returns - calculated norm\n */\nexport function xNorm(array) {\n    let result = 0;\n    for (const element of array) {\n        result += element ** 2;\n    }\n    return Math.sqrt(result);\n}\n//# sourceMappingURL=xNorm.js.map","/**\n * Compute the `[left, right]` intervals around each peak by locating\n * consecutive extrema (minima / maxima) of the first derivative.\n * @param y - Spectrum y values.\n * @param x - Spectrum x values.\n * @param dY - First derivative of `y`.\n * @param dX - Sign of the x step (positive for increasing x, negative otherwise).\n * @returns `intervalL` / `intervalR` arrays defining each peak's inflection-point bounds.\n */\nexport function getMinMaxIntervalsDy(y, x, dY, dX) {\n    let lastMax = null;\n    let lastMin = null;\n    const intervalL = [];\n    const intervalR = [];\n    for (let i = 1; i < y.length - 1; ++i) {\n        if ((dY[i] < dY[i - 1] && dY[i] <= dY[i + 1]) ||\n            (dY[i] <= dY[i - 1] && dY[i] < dY[i + 1])) {\n            lastMin = {\n                x: x[i],\n                index: i,\n            };\n            if (dX > 0 && lastMax !== null) {\n                intervalL.push(lastMax);\n                intervalR.push(lastMin);\n            }\n        }\n        // Maximum in first derivative\n        if ((dY[i] >= dY[i - 1] && dY[i] > dY[i + 1]) ||\n            (dY[i] > dY[i - 1] && dY[i] >= dY[i + 1])) {\n            lastMax = {\n                x: x[i],\n                index: i,\n            };\n            if (dX < 0 && lastMin !== null) {\n                intervalL.push(lastMax);\n                intervalR.push(lastMin);\n            }\n        }\n    }\n    return { intervalL, intervalR };\n}\n//# sourceMappingURL=getMinMaxIntervals.js.map","/**\n * Find the `minData` index closest to the center of one interval,\n * above the intensity threshold and bounded by the half-width.\n * @param options - Interval, candidate indices and spectrum data.\n * @returns The picked candidate (`possible`) and the last visited index (`lastIndex`).\n */\nexport function tryMatchOneIntervalWithMinData(options) {\n    const { x, lastK, minData, yThreshold, intervalWidth, intervalCenter, yData, } = options;\n    let minDistance = Number.POSITIVE_INFINITY;\n    let possible = -1;\n    let newLastIndex = lastK;\n    for (let k = newLastIndex + 1; k < minData.length; k++) {\n        const centerIndex = minData[k];\n        if (yData[centerIndex] <= yThreshold) {\n            continue;\n        }\n        const deltaX = x[centerIndex];\n        const currentDistance = Math.abs(deltaX - intervalCenter);\n        if (currentDistance < intervalWidth) {\n            if (currentDistance < minDistance) {\n                possible = k;\n            }\n            newLastIndex = k;\n        }\n        if (currentDistance >= minDistance)\n            break;\n        minDistance = currentDistance;\n    }\n    return { lastIndex: newLastIndex, possible };\n}\n//# sourceMappingURL=tryMatchOneIntervalWithMinData.js.map","import { getMinMaxIntervalsDy } from \"./getMinMaxIntervals.js\";\nimport { tryMatchOneIntervalWithMinData } from \"./tryMatchOneIntervalWithMinData.js\";\n/**\n * Peak detection that combines first-derivative zero-crossings and\n * second-derivative local minima to find peaks inside each interval.\n * @param input - Spectrum values together with its first and second derivatives.\n * @returns The detected peaks.\n */\nexport function autoAlgorithm(input) {\n    const { x, y, yData, dY, ddY, dX, yThreshold } = input;\n    const minddY = [];\n    const crossDy = [];\n    const { intervalL, intervalR } = getMinMaxIntervalsDy(y, x, dY, dX);\n    for (let i = 1; i < y.length - 1; ++i) {\n        if ((dY[i] < 0 && dY[i + 1] > 0) || (dY[i] > 0 && dY[i + 1] < 0)) {\n            // push the index of the element closer to zero\n            crossDy.push(Math.abs(dY[i]) < Math.abs(dY[i + 1]) ? i : i + 1);\n        }\n        // Handle exact zero\n        if (dY[i] === 0 &&\n            dY[i] < Math.abs(dY[i + 1]) &&\n            dY[i] < Math.abs(dY[i - 1])) {\n            crossDy.push(i);\n        }\n        // Minimum in second derivative\n        if (ddY[i] < ddY[i - 1] && ddY[i] < ddY[i + 1]) {\n            minddY.push(i);\n        }\n    }\n    const peaks = [];\n    let lastK = -1;\n    let lastJ = -1;\n    for (let i = 0; i < intervalL.length; i++) {\n        const intervalWidth = (intervalR[i].x - intervalL[i].x) / 2;\n        const intervalCenter = (intervalR[i].x + intervalL[i].x) / 2;\n        let yIndex = -1;\n        let match = tryMatchOneIntervalWithMinData({\n            x,\n            yData,\n            lastK,\n            yThreshold,\n            intervalWidth,\n            intervalCenter,\n            minData: crossDy,\n        });\n        lastK = match.lastIndex;\n        if (match.possible !== -1) {\n            yIndex = crossDy[match.possible];\n        }\n        else {\n            match = tryMatchOneIntervalWithMinData({\n                x,\n                yData,\n                yThreshold,\n                lastK: lastJ,\n                intervalWidth,\n                intervalCenter,\n                minData: minddY,\n            });\n            if (match.possible !== -1) {\n                yIndex = minddY[match.possible];\n            }\n            lastJ = match.lastIndex;\n        }\n        if (yIndex !== -1) {\n            const width = Math.abs(intervalR[i].x - intervalL[i].x);\n            peaks.push({\n                id: crypto.randomUUID(),\n                x: x[yIndex],\n                y: y[yIndex],\n                width,\n                index: yIndex,\n                ddY: ddY[yIndex],\n                inflectionPoints: {\n                    from: intervalL[i],\n                    to: intervalR[i],\n                },\n            });\n        }\n    }\n    return peaks;\n}\n//# sourceMappingURL=autoAlgorithm.js.map","import { tryMatchOneIntervalWithMinData } from \"./tryMatchOneIntervalWithMinData.js\";\n/**\n * Build the list of detected peaks by matching each `[left, right]` interval\n * with the best candidate index from `minData`.\n * @param options - Intervals, candidate indices and spectrum data.\n * @returns The detected peaks.\n */\nexport function getPeakFromIntervals(options) {\n    let lastK = -1;\n    const peaks = [];\n    const { x, ddY, yData, yThreshold, intervalR, intervalL, minData } = options;\n    for (let i = 0; i < intervalL.length; i++) {\n        const intervalWidth = (intervalR[i].x - intervalL[i].x) / 2;\n        const intervalCenter = (intervalR[i].x + intervalL[i].x) / 2;\n        const { possible, lastIndex } = tryMatchOneIntervalWithMinData({\n            x,\n            lastK,\n            minData,\n            yThreshold,\n            intervalWidth,\n            intervalCenter,\n            yData,\n        });\n        if (possible !== -1) {\n            const centerIndex = minData[possible];\n            const width = Math.abs(intervalR[i].x - intervalL[i].x);\n            peaks.push({\n                id: crypto.randomUUID(),\n                x: x[centerIndex],\n                y: yData[centerIndex],\n                width,\n                index: centerIndex,\n                ddY: ddY[centerIndex],\n                inflectionPoints: {\n                    from: intervalL[i],\n                    to: intervalR[i],\n                },\n            });\n        }\n        lastK = lastIndex;\n    }\n    return peaks;\n}\n//# sourceMappingURL=getPeaksFromIntervals.js.map","/**\n * Finds the indices where the first derivative crosses zero (sign change),\n * which are potential peak positions. This function does not detect zero-crossings\n * in regions with consecutive zero values in the derivative (flat regions).\n * @param input - Object containing the y values and their first derivative (dY).\n * @returns Array of indices where the first derivative crosses zero (excluding consecutive zeros).\n */\nexport function xGetCrossZeroPoints(input) {\n    const { y, dY } = input;\n    const crossDy = [];\n    for (let i = 1; i < y.length - 1; ++i) {\n        if (isLessAndGreaterThanZero(dY[i], dY[i + 1])) {\n            // push the index of the element closer to zero\n            crossDy.push(Math.abs(dY[i]) < Math.abs(dY[i + 1]) ? i : i + 1);\n        }\n        else if (\n        // Handle exact zero\n        dY[i] === 0 &&\n            isLessAndGreaterThanZero(dY[i - 1], dY[i + 1])) {\n            crossDy.push(i);\n        }\n    }\n    return crossDy;\n}\nfunction isLessAndGreaterThanZero(back, next) {\n    return (back < 0 && next > 0) || (back > 0 && next < 0);\n}\n//# sourceMappingURL=xGetCrossZeroPoints.js.map","import { getMinMaxIntervalsDy } from \"./getMinMaxIntervals.js\";\nimport { getPeakFromIntervals } from \"./getPeaksFromIntervals.js\";\nimport { xGetCrossZeroPoints } from \"./xGetCrossZeroPoints.js\";\n/**\n * Detect peaks using zero-crossings of the first derivative.\n * @param input - Spectrum values and its first/second derivatives.\n * @returns The detected peaks.\n */\nexport function firstDerivative(input) {\n    const { y, x, dY, dX, yData, yThreshold, ddY } = input;\n    const crossDy = xGetCrossZeroPoints(input);\n    const { intervalL, intervalR } = getMinMaxIntervalsDy(y, x, dY, dX);\n    return getPeakFromIntervals({\n        minData: crossDy,\n        intervalL,\n        intervalR,\n        x,\n        yData,\n        yThreshold,\n        ddY,\n    });\n}\n//# sourceMappingURL=firstDerivative.js.map","import { getMinMaxIntervalsDy } from \"./getMinMaxIntervals.js\";\nimport { getPeakFromIntervals } from \"./getPeaksFromIntervals.js\";\n/**\n * Detect peaks using local minima of the second derivative (inflection points).\n * @param input - Spectrum values and its first/second derivatives.\n * @returns The detected peaks.\n */\nexport function secondDerivative(input) {\n    const { x, y, yData, dY, ddY, dX, yThreshold } = input;\n    const minddY = [];\n    const { intervalL, intervalR } = getMinMaxIntervalsDy(y, x, dY, dX);\n    // By the intermediate value theorem We cannot find 2 consecutive maximum or minimum\n    for (let i = 1; i < y.length - 1; ++i) {\n        // Minimum in second derivative\n        if (ddY[i] < ddY[i - 1] && ddY[i] < ddY[i + 1]) {\n            minddY.push(i);\n        }\n    }\n    return getPeakFromIntervals({\n        minData: minddY,\n        intervalL,\n        intervalR,\n        x,\n        yData,\n        yThreshold,\n        ddY,\n    });\n}\n//# sourceMappingURL=secondDerivative.js.map","/**\n * Refine the `x` and `y` coordinates of each peak by running a quadratic\n * interpolation over the peak and its 3 closest neighbors.\n * The correction is performed in place.\n * @param data - Object with `x` and `y` arrays.\n * @param peaks - Peaks to refine (mutated in place).\n */\nexport function optimizeTop(data, peaks) {\n    const { x, y } = data;\n    for (const peak of peaks) {\n        let currentIndex = peak.index;\n        // The detected peak could be moved 1 or 2 units to left or right.\n        if (y[currentIndex - 1] >= y[currentIndex - 2] &&\n            y[currentIndex - 1] >= y[currentIndex]) {\n            currentIndex--;\n        }\n        else if (y[currentIndex + 1] >= y[currentIndex] &&\n            y[currentIndex + 1] >= y[currentIndex + 2]) {\n            currentIndex++;\n        }\n        else if (y[currentIndex - 2] >= y[currentIndex - 3] &&\n            y[currentIndex - 2] >= y[currentIndex - 1]) {\n            currentIndex -= 2;\n        }\n        else if (y[currentIndex + 2] >= y[currentIndex + 1] &&\n            y[currentIndex + 2] >= y[currentIndex + 3]) {\n            currentIndex += 2;\n        }\n        // Quadratic interpolation on log-intensities to refine the peak top.\n        if (y[currentIndex - 1] > 0 &&\n            y[currentIndex + 1] > 0 &&\n            y[currentIndex] >= y[currentIndex - 1] &&\n            y[currentIndex] >= y[currentIndex + 1] &&\n            (y[currentIndex] !== y[currentIndex - 1] ||\n                y[currentIndex] !== y[currentIndex + 1])) {\n            const alpha = Math.log10(y[currentIndex - 1]);\n            const beta = Math.log10(y[currentIndex]);\n            const gamma = Math.log10(y[currentIndex + 1]);\n            const p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n            const xCurrent = x[currentIndex];\n            const xPrevious = x[currentIndex - 1];\n            peak.x = xCurrent + (xCurrent - xPrevious) * p;\n            peak.y =\n                y[currentIndex] -\n                    0.25 * (y[currentIndex - 1] - y[currentIndex + 1]) * p;\n        }\n    }\n}\n//# sourceMappingURL=optimizeTop.js.map","import { sgg } from 'ml-savitzky-golay-generalized';\nimport { xIsEquallySpaced, xIsMonotonic, xMaxAbsoluteValue, xMaxValue, xMinMaxValues, xNoiseStandardDeviation, } from 'ml-spectra-processing';\nimport { autoAlgorithm } from \"./algorithms/autoAlgorithm.js\";\nimport { firstDerivative } from \"./algorithms/firstDerivative.js\";\nimport { secondDerivative } from \"./algorithms/secondDerivative.js\";\nimport { optimizeTop } from \"./utils/optimizeTop.js\";\n/**\n * Global spectra deconvolution.\n * @param data - Object with `x` and `y` arrays. `x` must be monotone increasing.\n * @param options - Peak detection options.\n * @returns The detected peaks, sorted by ascending `x`.\n */\nexport function gsd(data, options = {}) {\n    let { noiseLevel } = options;\n    const { sgOptions = {\n        windowSize: 9,\n        polynomial: 3,\n    }, smoothY = false, maxCriteria = true, maxAbsoluteRatio = 0, minMaxRatio = 0.00025, realTopDetection = false, peakDetectionAlgorithm = 'second', } = options;\n    if (maxAbsoluteRatio < 0 || maxAbsoluteRatio > 1) {\n        throw new Error('maxAbsoluteRatio must be between 0 and 1');\n    }\n    const { x } = data;\n    let { y } = data;\n    if (xIsMonotonic(x) !== 1) {\n        throw new Error('GSD only accepts monotone increasing x values');\n    }\n    // Copy so the `maxCriteria` / clipping loops below don't mutate the caller's array.\n    y = y.slice();\n    // If the max difference between delta x is less than 5%, then,\n    // we can assume it to be equally spaced variable\n    const isEquallySpaced = xIsEquallySpaced(x);\n    if (noiseLevel === undefined) {\n        if (isEquallySpaced) {\n            const noiseInfo = xNoiseStandardDeviation(y);\n            if (maxCriteria) {\n                noiseLevel = noiseInfo.median + 1.5 * noiseInfo.sd;\n            }\n            else {\n                noiseLevel = -noiseInfo.median + 1.5 * noiseInfo.sd;\n            }\n        }\n        else {\n            noiseLevel = 0;\n        }\n    }\n    else if (!maxCriteria) {\n        noiseLevel *= -1;\n    }\n    if (!maxCriteria) {\n        for (let i = 0; i < y.length; i++) {\n            y[i] = -y[i];\n        }\n    }\n    const maxAbsoluteValue = maxAbsoluteRatio > 0 ? maxAbsoluteRatio * xMaxAbsoluteValue(y) : noiseLevel;\n    if (noiseLevel !== undefined) {\n        for (let i = 0; i < y.length; i++) {\n            if (y[i] < noiseLevel) {\n                y[i] = noiseLevel;\n            }\n        }\n    }\n    const xValue = isEquallySpaced ? x[1] - x[0] : x;\n    const yData = smoothY\n        ? sgg(y, xValue, {\n            ...sgOptions,\n            derivative: 0,\n        })\n        : y;\n    const { min: minY, max: maxY } = xMinMaxValues(yData);\n    if (minY > maxY || minY === maxY)\n        return [];\n    const dY = sgg(y, xValue, {\n        ...sgOptions,\n        derivative: 1,\n    });\n    const ddY = sgg(y, xValue, {\n        ...sgOptions,\n        derivative: 2,\n    });\n    const yThreshold = xMaxValue([\n        noiseLevel,\n        minY + (maxY - minY) * minMaxRatio,\n        maxAbsoluteValue,\n    ]);\n    const dX = x[1] - x[0];\n    const peakData = { x, y, yData, dY, ddY, dX, yThreshold };\n    let peaks = [];\n    if (peakDetectionAlgorithm === 'first') {\n        peaks = firstDerivative(peakData);\n    }\n    else if (peakDetectionAlgorithm === 'second') {\n        peaks = secondDerivative(peakData);\n    }\n    else {\n        peaks = autoAlgorithm(peakData);\n    }\n    if (realTopDetection) {\n        optimizeTop({ x, y: yData }, peaks);\n    }\n    for (const peak of peaks) {\n        if (!maxCriteria) {\n            peak.y *= -1;\n            peak.ddY = peak.ddY * -1;\n        }\n    }\n    peaks.sort((a, b) => {\n        return a.x - b.x;\n    });\n    return peaks;\n}\n//# sourceMappingURL=gsd.js.map","export const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2;\n/**\n * A pseudo-Voigt is a gaussian plus a lorentzian. Beyond 3.74 fwhm from the\n * centre the gaussian part is down to 1.4e-17 — too small to change a shape of\n * height one — while the lorentzian part is still 1.8e-2 and fades much more\n * slowly. Past that distance the gaussian is skipped: the `Math.exp` it costs\n * cannot change the result, and most points of a wide window lie out there.\n *\n * The limit is stored squared, so the test is `(x / fwhm)² > 14`, which saves a\n * square root. The same value works for every mixing ratio `mu`, except `mu = 1`\n * where the shape is a pure gaussian: with no lorentzian part left, skipping\n * would return zero instead of a very small number, so that case is never\n * skipped.\n */\nexport const GAUSSIAN_CUTOFF = 14;\nexport const ROOT_PI_OVER_LN2 = Math.sqrt(Math.PI / Math.LN2);\nexport const ROOT_LN2 = Math.sqrt(Math.LN2);\nexport const ROOT_THREE = Math.sqrt(3);\nexport const ROOT_2LN2 = Math.sqrt(2 * Math.LN2);\nexport const ROOT_2LN2_MINUS_ONE = Math.sqrt(2 * Math.LN2) - 1;\n//# sourceMappingURL=constants.js.map","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n/**\n * Approximate inverse error function.\n * @param x - value in the range (-1, 1).\n * @returns erfinv(x).\n * @see https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n */\nexport default function erfinv(x) {\n    const a = 0.147;\n    if (x === 0)\n        return 0;\n    const ln1MinusXSqrd = Math.log(1 - x * x);\n    const lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a);\n    const firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a);\n    const secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2);\n    return secondSqrt * (x > 0 ? 1 : -1);\n}\n//# sourceMappingURL=erfinv.js.map","import { GAUSSIAN_EXP_FACTOR, ROOT_2LN2, ROOT_LN2, ROOT_PI_OVER_LN2, } from \"../../../util/constants.js\";\nimport erfinv from \"../../../util/erfinv.js\";\nexport class Gaussian {\n    kind = 'gaussian';\n    /**\n     * Full width at half maximum.\n     * @default 500\n     */\n    fwhm;\n    constructor(options = {}) {\n        const { fwhm = 500, sd } = options;\n        this.fwhm = sd ? gaussianWidthToFWHM(2 * sd) : fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return gaussianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return gaussianWidthToFWHM(width);\n    }\n    fct(x) {\n        return gaussianFct(x, this.fwhm);\n    }\n    getArea(height = calculateGaussianHeight({ fwhm: this.fwhm })) {\n        return getGaussianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getGaussianFactor(area);\n    }\n    getData(options = {}) {\n        return getGaussianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateGaussianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n    /**\n     * Descriptor of this shape, so `JSON.stringify` round-trips through `getShape1D`.\n     * @returns the shape descriptor.\n     */\n    toJSON() {\n        return { kind: this.kind, fwhm: this.fwhm };\n    }\n    derivative(x) {\n        const { fct, dx, dFwhm } = gaussianDerivative(x, this.fwhm);\n        return { fct, dx, parameters: [dFwhm] };\n    }\n}\n/**\n * Calculate the peak height for a given area and fwhm.\n * @param options - fwhm, area, and optional sd.\n * @returns the peak height.\n */\nexport function calculateGaussianHeight(options) {\n    const { area = 1, sd } = options;\n    let { fwhm = 500 } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (2 * area) / ROOT_PI_OVER_LN2 / fwhm;\n}\n/**\n * Evaluate the gaussian function centered at x=0.\n * @param x - position at which to evaluate.\n * @param fwhm - full width at half maximum.\n * @returns the intensity at x.\n */\nexport function gaussianFct(x, fwhm) {\n    return Math.exp(GAUSSIAN_EXP_FACTOR * (x / fwhm) ** 2);\n}\n/**\n * Analytical value and partial derivatives of the gaussian function centered at x=0.\n * @param x - position at which to evaluate.\n * @param fwhm - full width at half maximum.\n * @returns the value `fct` and its partial derivatives with respect to `x` (`dx`) and `fwhm` (`dFwhm`).\n */\nexport function gaussianDerivative(x, fwhm) {\n    const fct = gaussianFct(x, fwhm);\n    const dx = ((2 * GAUSSIAN_EXP_FACTOR * x) / (fwhm * fwhm)) * fct;\n    const dFwhm = ((-2 * GAUSSIAN_EXP_FACTOR * x * x) / (fwhm * fwhm * fwhm)) * fct;\n    return { fct, dx, dFwhm };\n}\n/**\n * Convert inflection-point width to full width at half maximum.\n * @param width - width between inflection points.\n * @returns full width at half maximum.\n */\nexport function gaussianWidthToFWHM(width) {\n    return width * ROOT_2LN2;\n}\n/**\n * Convert full width at half maximum to inflection-point width.\n * @param fwhm - full width at half maximum.\n * @returns width between inflection points.\n */\nexport function gaussianFwhmToWidth(fwhm) {\n    return fwhm / ROOT_2LN2;\n}\n/**\n * Calculate the area under a gaussian peak.\n * @param options - fwhm, height, and optional sd.\n * @returns the area.\n */\nexport function getGaussianArea(options) {\n    const { sd, height = 1 } = options;\n    let { fwhm = 500 } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n}\n/**\n * Calculate the width factor corresponding to a given area coverage fraction.\n * @param area - target area fraction (0–1). Defaults to `0.9999`.\n * @returns the factor by which to multiply fwhm to cover the given area.\n */\nexport function getGaussianFactor(area = 0.9999) {\n    if (area >= 1) {\n        throw new Error('area should be (0 - 1)');\n    }\n    return erfinv(area) / ROOT_LN2;\n}\n/**\n * Generate an intensity array for a gaussian shape.\n * @param shape - gaussian shape parameters (fwhm, sd).\n * @param options - sampling options (length, factor, height).\n * @returns Float64Array of intensity values.\n */\nexport function getGaussianData(shape = {}, options = {}) {\n    const { sd } = shape;\n    let { fwhm = 500 } = shape;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    const { factor = getGaussianFactor(), height = calculateGaussianHeight({ fwhm }), } = options;\n    let { length } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), 2 ** 25 - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        const value = gaussianFct(i - center, fwhm) * height;\n        data[i] = value;\n        data[length - 1 - i] = value;\n    }\n    return data;\n}\n//# sourceMappingURL=Gaussian.js.map","import { ROOT_THREE } from \"../../../util/constants.js\";\nexport class Lorentzian {\n    kind = 'lorentzian';\n    /**\n     * Full width at half maximum.\n     * @default 500\n     */\n    fwhm;\n    constructor(options = {}) {\n        const { fwhm = 500 } = options;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return lorentzianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return lorentzianWidthToFWHM(width);\n    }\n    fct(x) {\n        return lorentzianFct(x, this.fwhm);\n    }\n    getArea(height = 1) {\n        return getLorentzianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getLorentzianFactor(area);\n    }\n    getData(options = {}) {\n        return getLorentzianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateLorentzianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n    /**\n     * Descriptor of this shape, so `JSON.stringify` round-trips through `getShape1D`.\n     * @returns the shape descriptor.\n     */\n    toJSON() {\n        return { kind: this.kind, fwhm: this.fwhm };\n    }\n    derivative(x) {\n        const { fct, dx, dFwhm } = lorentzianDerivative(x, this.fwhm);\n        return { fct, dx, parameters: [dFwhm] };\n    }\n}\nexport const calculateLorentzianHeight = ({ fwhm = 1, area = 1 }) => {\n    return (2 * area) / Math.PI / fwhm;\n};\nexport const getLorentzianArea = (options) => {\n    const { fwhm = 500, height = 1 } = options;\n    return (height * Math.PI * fwhm) / 2;\n};\nexport const lorentzianFct = (x, fwhm) => {\n    return fwhm ** 2 / (4 * x ** 2 + fwhm ** 2);\n};\n/**\n * Analytical value and partial derivatives of the lorentzian function centered at x=0.\n * @param x - position at which to evaluate.\n * @param fwhm - full width at half maximum.\n * @returns the value `fct` and its partial derivatives with respect to `x` (`dx`) and `fwhm` (`dFwhm`).\n */\nexport function lorentzianDerivative(x, fwhm) {\n    const denominator = 4 * x * x + fwhm * fwhm;\n    const fct = (fwhm * fwhm) / denominator;\n    const dx = (-8 * x * fwhm * fwhm) / (denominator * denominator);\n    const dFwhm = (8 * fwhm * x * x) / (denominator * denominator);\n    return { fct, dx, dFwhm };\n}\nexport const lorentzianWidthToFWHM = (width) => {\n    return width * ROOT_THREE;\n};\nexport const lorentzianFwhmToWidth = (fwhm) => {\n    return fwhm / ROOT_THREE;\n};\nconst lorentzianQuantile = (p) => Math.tan(Math.PI * (p - 0.5));\nexport const getLorentzianFactor = (area = 0.9999) => {\n    if (area >= 1) {\n        throw new Error('area should be (0 - 1)');\n    }\n    const halfResidual = (1 - area) * 0.5;\n    return ((lorentzianQuantile(1 - halfResidual) - lorentzianQuantile(halfResidual)) /\n        2);\n};\nexport const getLorentzianData = (shape = {}, options = {}) => {\n    const { fwhm = 500 } = shape;\n    const { factor = getLorentzianFactor(), height = calculateLorentzianHeight({ fwhm, area: 1 }), } = options;\n    let { length } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), 2 ** 25 - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        const value = lorentzianFct(i - center, fwhm) * height;\n        data[i] = value;\n        data[length - 1 - i] = value;\n    }\n    return data;\n};\n//# sourceMappingURL=Lorentzian.js.map","import { calculateLorentzianHeight, getLorentzianFactor, lorentzianFwhmToWidth, lorentzianWidthToFWHM, } from \"../lorentzian/Lorentzian.js\";\nexport class LorentzianDispersive {\n    kind = 'lorentzianDispersive';\n    /**\n     * Full width at half maximum.\n     * @default 500\n     */\n    fwhm;\n    constructor(options = {}) {\n        const { fwhm = 500 } = options;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return lorentzianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return lorentzianWidthToFWHM(width);\n    }\n    fct(x) {\n        return lorentzianDispersiveFct(x, this.fwhm);\n    }\n    getArea() {\n        return 0;\n    }\n    getFactor(area) {\n        return getLorentzianFactor(area);\n    }\n    getData(options = {}) {\n        return getLorentzianDispersiveData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateLorentzianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n    /**\n     * Descriptor of this shape, so `JSON.stringify` round-trips through `getShape1D`.\n     * @returns the shape descriptor.\n     */\n    toJSON() {\n        return { kind: this.kind, fwhm: this.fwhm };\n    }\n    derivative(x) {\n        const { fct, dx, dFwhm } = lorentzianDispersiveDerivative(x, this.fwhm);\n        return { fct, dx, parameters: [dFwhm] };\n    }\n}\nexport const lorentzianDispersiveFct = (x, fwhm) => {\n    return (2 * fwhm * x) / (4 * x ** 2 + fwhm ** 2);\n};\n/**\n * Analytical value and partial derivatives of the dispersive lorentzian function centered at x=0.\n * @param x - position at which to evaluate.\n * @param fwhm - full width at half maximum.\n * @returns the value `fct` and its partial derivatives with respect to `x` (`dx`) and `fwhm` (`dFwhm`).\n */\nexport function lorentzianDispersiveDerivative(x, fwhm) {\n    const denominator = 4 * x * x + fwhm * fwhm;\n    const fct = (2 * fwhm * x) / denominator;\n    const dx = (2 * fwhm * (fwhm * fwhm - 4 * x * x)) / (denominator * denominator);\n    const dFwhm = (2 * x * (4 * x * x - fwhm * fwhm)) / (denominator * denominator);\n    return { fct, dx, dFwhm };\n}\nexport const getLorentzianDispersiveData = (shape = {}, options = {}) => {\n    const { fwhm = 500 } = shape;\n    const { factor = getLorentzianFactor(), height = calculateLorentzianHeight({ fwhm, area: 1 }), } = options;\n    let { length } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), 2 ** 25 - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        const value = lorentzianDispersiveFct(i - center, fwhm) * height;\n        data[i] = value;\n        data[length - 1 - i] = -value;\n    }\n    return data;\n};\n//# sourceMappingURL=LorentzianDispersive.js.map","import { getGaussianFactor } from \"../gaussian/Gaussian.js\";\nimport { getLorentzianFactor } from \"../lorentzian/Lorentzian.js\";\n/**\n * Find the k factor for a pseudo-Voigt distribution such that the\n * cumulative probability pPseudoVoigt(k, mu) equals `pTarget`.\n *\n * Uses a simple bisection search (with exponential bracketing) to\n * invert the pseudo-Voigt cumulative function. Special cases:\n * - mu === 1 -> reduces to the gaussian case\n * - mu === 0 -> reduces to the lorentzian case\n * @param pTarget - Target cumulative probability in (0,1)\n * @param mu - Gaussian fraction in [0,1]\n * @param tol - Convergence tolerance\n * @param maxIter - Maximum number of bisection iterations\n * @returns the factor k such that pPseudoVoigt(k, mu) ~= pTarget\n */\nexport function pseudoVoigtFindFactor(pTarget, mu, tol = 1e-9, maxIter = 200) {\n    if (pTarget <= 0 || pTarget >= 1) {\n        throw new RangeError('pTarget must be in (0,1)');\n    }\n    if (mu === 1) {\n        return getGaussianFactor(pTarget);\n    }\n    else if (mu === 0) {\n        return getLorentzianFactor(pTarget);\n    }\n    // bisection\n    let lo = 0;\n    let hi = 10;\n    let it = 0;\n    while (pPseudoVoigt(hi, mu) < pTarget && it++ < 200)\n        hi *= 2;\n    for (let i = 0; i < maxIter; i++) {\n        const mid = 0.5 * (lo + hi);\n        const val = pPseudoVoigt(mid, mu);\n        if (Math.abs(val - pTarget) < tol)\n            return mid;\n        if (val < pTarget) {\n            lo = mid;\n        }\n        else {\n            hi = mid;\n        }\n    }\n    return 0.5 * (lo + hi);\n}\nfunction erf(x) {\n    const sign = x < 0 ? -1 : 1;\n    x = Math.abs(x);\n    const a1 = 0.254829592;\n    const a2 = -0.284496736;\n    const a3 = 1.421413741;\n    const a4 = -1.453152027;\n    const a5 = 1.061405429;\n    const p = 0.3275911;\n    const t = 1 / (1 + p * x);\n    const y = 1 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(-x * x);\n    return sign * y;\n}\nconst sqrtLn2 = Math.sqrt(Math.log(2));\nfunction pGaussian(k) {\n    return erf(k * sqrtLn2);\n}\nfunction pLorentz(k) {\n    return (2 / Math.PI) * Math.atan(k);\n}\nfunction pPseudoVoigt(k, mu) {\n    return (1 - mu) * pLorentz(k) + mu * pGaussian(k);\n}\n//# sourceMappingURL=computeFactor.js.map","import { GAUSSIAN_CUTOFF, GAUSSIAN_EXP_FACTOR, ROOT_2LN2_MINUS_ONE, ROOT_PI_OVER_LN2, } from \"../../../util/constants.js\";\nimport { gaussianFct } from \"../gaussian/Gaussian.js\";\nimport { lorentzianFct } from \"../lorentzian/Lorentzian.js\";\nimport { pseudoVoigtFindFactor } from \"./computeFactor.js\";\nexport class PseudoVoigt {\n    kind = 'pseudoVoigt';\n    fwhm;\n    /**\n     * Ratio of gaussian contribution in the shape\n     * @default 0.5\n     */\n    mu;\n    constructor(options = {}) {\n        const { fwhm = 500, mu = 0.5 } = options;\n        this.mu = mu;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm, mu = this.mu) {\n        return pseudoVoigtFwhmToWidth(fwhm, mu);\n    }\n    widthToFWHM(width, mu = this.mu) {\n        return pseudoVoigtWidthToFWHM(width, mu);\n    }\n    fct(x) {\n        return pseudoVoigtFct(x, this.fwhm, this.mu);\n    }\n    getArea(height = 1) {\n        return getPseudoVoigtArea({ fwhm: this.fwhm, height, mu: this.mu });\n    }\n    getFactor(area) {\n        return getPseudoVoigtFactor(area, this.mu);\n    }\n    getData(options = {}) {\n        const { length, factor, height = calculatePseudoVoigtHeight({\n            fwhm: this.fwhm,\n            mu: this.mu,\n            area: 1,\n        }), } = options;\n        return getPseudoVoigtData(this, { factor, length, height });\n    }\n    calculateHeight(area = 1) {\n        return calculatePseudoVoigtHeight({ fwhm: this.fwhm, mu: this.mu, area });\n    }\n    getParameters() {\n        return ['fwhm', 'mu'];\n    }\n    /**\n     * Descriptor of this shape, so `JSON.stringify` round-trips through `getShape1D`.\n     * @returns the shape descriptor.\n     */\n    toJSON() {\n        return { kind: this.kind, fwhm: this.fwhm, mu: this.mu };\n    }\n    derivative(x) {\n        const { fct, dx, dFwhm, dMu } = pseudoVoigtDerivative(x, this.fwhm, this.mu);\n        return { fct, dx, parameters: [dFwhm, dMu] };\n    }\n}\nexport const calculatePseudoVoigtHeight = (options = {}) => {\n    const { fwhm = 1, mu = 0.5, area = 1 } = options;\n    return (2 * area) / (fwhm * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI));\n};\nexport const pseudoVoigtFct = (x, fwhm, mu) => {\n    // at mu = 1 the shape *is* the gaussian: there is no lorentzian half left to\n    // carry the tail, so the gaussian is evaluated however far out it is asked for\n    if (mu === 1)\n        return gaussianFct(x, fwhm);\n    const lorentzian = (1 - mu) * lorentzianFct(x, fwhm);\n    const z = x / fwhm;\n    if (z * z > GAUSSIAN_CUTOFF)\n        return lorentzian;\n    return lorentzian + mu * gaussianFct(x, fwhm);\n};\n/**\n * Analytical value and partial derivatives of the pseudo-Voigt function centered at x=0.\n * @param x - position at which to evaluate.\n * @param fwhm - full width at half maximum.\n * @param mu - ratio of gaussian contribution in the shape.\n * @returns the value `fct` and its partial derivatives with respect to `x` (`dx`), `fwhm` (`dFwhm`) and `mu` (`dMu`).\n */\nexport function pseudoVoigtDerivative(x, fwhm, mu) {\n    // gaussian and lorentzian derivative math is inlined (rather than calling\n    // gaussianDerivative / lorentzianDerivative) to allocate a single object on\n    // this hot path; the sub-calls would allocate three.\n    //\n    // Past {@link GAUSSIAN_CUTOFF} the gaussian half has underflowed, so it is\n    // dropped here under the same condition as in `pseudoVoigtFct` — including its\n    // mu = 1 exemption, so the two stay consistent — which also settles what the\n    // derivatives are out there: `dx` and `dFwhm` keep only their lorentzian\n    // halves, and `dMu` becomes `-lorentz`, the value the shape loses by trading\n    // its lorentzian half for a gaussian one that contributes nothing.\n    const z = x / fwhm;\n    const e = mu !== 1 && z * z > GAUSSIAN_CUTOFF\n        ? 0\n        : Math.exp(GAUSSIAN_EXP_FACTOR * z * z);\n    const denominator = 4 * x * x + fwhm * fwhm;\n    const lorentz = (fwhm * fwhm) / denominator;\n    const dEdt = ((2 * GAUSSIAN_EXP_FACTOR * x) / (fwhm * fwhm)) * e;\n    const dLdt = (-8 * x * fwhm * fwhm) / (denominator * denominator);\n    const dEdfwhm = ((-2 * GAUSSIAN_EXP_FACTOR * x * x) / (fwhm * fwhm * fwhm)) * e;\n    const dLdfwhm = (8 * fwhm * x * x) / (denominator * denominator);\n    return {\n        fct: (1 - mu) * lorentz + mu * e,\n        dx: (1 - mu) * dLdt + mu * dEdt,\n        dFwhm: (1 - mu) * dLdfwhm + mu * dEdfwhm,\n        dMu: e - lorentz,\n    };\n}\nexport const pseudoVoigtWidthToFWHM = (width, mu = 0.5) => {\n    return width * (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\nexport const pseudoVoigtFwhmToWidth = (fwhm, mu = 0.5) => {\n    return fwhm / (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\nexport const getPseudoVoigtArea = (options) => {\n    const { fwhm = 500, height = 1, mu = 0.5 } = options;\n    return (fwhm * height * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI)) / 2;\n};\nexport const getPseudoVoigtFactor = (area = 0.9999, mu = 0.5) => {\n    return pseudoVoigtFindFactor(area, mu);\n};\nexport const getPseudoVoigtData = (shape = {}, options = {}) => {\n    const { fwhm = 500, mu = 0.5 } = shape;\n    const { factor = getPseudoVoigtFactor(0.999, mu) } = options;\n    let { length, height = calculatePseudoVoigtHeight({ fwhm, mu, area: 1 }) } = options;\n    if (!height) {\n        height =\n            1 /\n                ((mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * fwhm +\n                    ((1 - mu) * fwhm * Math.PI) / 2);\n    }\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), 2 ** 25 - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        const value = pseudoVoigtFct(i - center, fwhm, mu) * height;\n        data[i] = value;\n        data[length - 1 - i] = value;\n    }\n    return data;\n};\n//# sourceMappingURL=PseudoVoigt.js.map","import { GAUSSIAN_CUTOFF, GAUSSIAN_EXP_FACTOR, } from \"../../../util/constants.js\";\nimport { calculatePseudoVoigtHeight, getPseudoVoigtArea, getPseudoVoigtData, getPseudoVoigtFactor, pseudoVoigtFct, pseudoVoigtFwhmToWidth, pseudoVoigtWidthToFWHM, } from \"../pseudoVoigt/PseudoVoigt.js\";\n/**\n * TCH-style pseudo-Voigt where gaussian and lorentzian widths are independent.\n * The effective fwhm and mixing parameter mu are derived from fwhmG and fwhmL\n * via the Thompson–Cox–Hastings approximation.\n */\nexport class PseudoVoigtTCH {\n    kind = 'pseudoVoigtTCH';\n    _fwhmG;\n    _fwhmL;\n    _fwhm;\n    _mu;\n    _lorentzianWidthFraction;\n    constructor(options = {}) {\n        const { fwhmG, fwhmL, fwhm, mu = 0.5 } = options;\n        this._mu = mu;\n        this._fwhm = 0;\n        this._fwhmG = 0;\n        this._fwhmL = 0;\n        this._lorentzianWidthFraction = lorentzianWidthFraction(1 - mu);\n        if (fwhmG !== undefined && fwhmL !== undefined) {\n            this._fwhmG = fwhmG;\n            this.fwhmL = fwhmL;\n        }\n        else if (fwhm !== undefined) {\n            this.fwhm = fwhm;\n        }\n    }\n    set fwhmG(value) {\n        const effectiveFwhm = computeEffectiveWidth(value, this._fwhmL);\n        const lorentzianFraction = this._fwhmL / effectiveFwhm;\n        this._fwhm = effectiveFwhm;\n        this._mu =\n            1 -\n                (1.36603 * lorentzianFraction -\n                    0.47719 * lorentzianFraction * lorentzianFraction +\n                    0.11116 * lorentzianFraction * lorentzianFraction * lorentzianFraction);\n        this._fwhmG = value;\n        this._lorentzianWidthFraction = lorentzianFraction;\n    }\n    get fwhmG() {\n        return this._fwhmG;\n    }\n    set fwhmL(value) {\n        const effectiveFwhm = computeEffectiveWidth(this._fwhmG, value);\n        const lorentzianFraction = value / effectiveFwhm;\n        this._fwhm = effectiveFwhm;\n        this._mu =\n            1 -\n                (1.36603 * lorentzianFraction -\n                    0.47719 * lorentzianFraction * lorentzianFraction +\n                    0.11116 * lorentzianFraction * lorentzianFraction * lorentzianFraction);\n        this._fwhmL = value;\n        this._lorentzianWidthFraction = lorentzianFraction;\n    }\n    get fwhmL() {\n        return this._fwhmL;\n    }\n    set mu(value) {\n        const lorentzianFraction = lorentzianWidthFraction(1 - value);\n        this._lorentzianWidthFraction = lorentzianFraction;\n        this._fwhmL = this._fwhm * lorentzianFraction;\n        this._fwhmG = this._fwhm * gaussianWidthFraction(lorentzianFraction);\n        this._mu = value;\n    }\n    get mu() {\n        return this._mu;\n    }\n    set fwhm(value) {\n        const lorentzianFraction = this._lorentzianWidthFraction || lorentzianWidthFraction(1 - this._mu);\n        this._fwhmL = value * lorentzianFraction;\n        this._fwhmG = value * gaussianWidthFraction(lorentzianFraction);\n        this._fwhm = value;\n    }\n    get fwhm() {\n        return this._fwhm;\n    }\n    fwhmToWidth(fwhm = this._fwhm, mu = this._mu) {\n        return pseudoVoigtFwhmToWidth(fwhm, mu);\n    }\n    widthToFWHM(width, mu = this._mu) {\n        return pseudoVoigtWidthToFWHM(width, mu);\n    }\n    fct(x) {\n        return pseudoVoigtFct(x, this._fwhm, this._mu);\n    }\n    getArea(height = 1) {\n        return getPseudoVoigtArea({ fwhm: this._fwhm, height, mu: this._mu });\n    }\n    getFactor(area) {\n        return getPseudoVoigtFactor(area, this._mu);\n    }\n    getData(options = {}) {\n        const { length, factor, height = calculatePseudoVoigtHeight({\n            fwhm: this._fwhm,\n            mu: this._mu,\n            area: 1,\n        }), } = options;\n        return getPseudoVoigtData(this, { factor, length, height });\n    }\n    calculateHeight(area = 1) {\n        return calculatePseudoVoigtHeight({\n            fwhm: this._fwhm,\n            mu: this._mu,\n            area,\n        });\n    }\n    getParameters() {\n        return ['fwhmG', 'fwhmL'];\n    }\n    /**\n     * Descriptor of this shape, so `JSON.stringify` round-trips through `getShape1D`.\n     * The component widths are emitted rather than `fwhm`/`mu`, because they are\n     * the state this shape is defined by: `getParameters` reports them and\n     * `derivative` differentiates with respect to them. The effective width and\n     * the mixing ratio are re-derived from them exactly.\n     * @returns the shape descriptor.\n     */\n    toJSON() {\n        return { kind: this.kind, fwhmG: this._fwhmG, fwhmL: this._fwhmL };\n    }\n    derivative(x) {\n        const { fct, dx, dFwhmG, dFwhmL } = pseudoVoigtTCHDerivative(x, this._fwhmG, this._fwhmL);\n        return { fct, dx, parameters: [dFwhmG, dFwhmL] };\n    }\n}\n/**\n * Analytical value and partial derivatives of the TCH pseudo-Voigt function centered at x=0.\n * The effective fwhm `F` and mixing `mu` are functions of `fwhmG` and `fwhmL`, so the\n * derivatives chain `∂fct/∂F` and `∂fct/∂mu` through `∂F/∂·` and `∂mu/∂·`.\n * @param x - position at which to evaluate.\n * @param fwhmG - full width at half maximum of the gaussian component.\n * @param fwhmL - full width at half maximum of the lorentzian component.\n * @returns the value `fct` and its partial derivatives with respect to `x` (`dx`), `fwhmG` (`dFwhmG`) and `fwhmL` (`dFwhmL`).\n */\nexport function pseudoVoigtTCHDerivative(x, fwhmG, fwhmL) {\n    const effectiveFwhm = computeEffectiveWidth(fwhmG, fwhmL);\n    const w = effectiveFwhm ** 5; // the polynomial under the 1/5 power\n    // ∂w/∂fwhmG and ∂w/∂fwhmL (derivatives of the TCH width polynomial).\n    const dwDfwhmG = 5 * fwhmG ** 4 +\n        10.77076 * fwhmG ** 3 * fwhmL +\n        7.28529 * fwhmG ** 2 * fwhmL ** 2 +\n        8.94326 * fwhmG * fwhmL ** 3 +\n        0.07842 * fwhmL ** 4;\n    const dwDfwhmL = 2.69269 * fwhmG ** 4 +\n        4.85686 * fwhmG ** 3 * fwhmL +\n        13.41489 * fwhmG ** 2 * fwhmL ** 2 +\n        0.31368 * fwhmG * fwhmL ** 3 +\n        5 * fwhmL ** 4;\n    // F = w^0.2  =>  ∂F/∂· = 0.2 * F / w * ∂w/∂·\n    const dFwhmDfwhmG = (0.2 * effectiveFwhm * dwDfwhmG) / w;\n    const dFwhmDfwhmL = (0.2 * effectiveFwhm * dwDfwhmL) / w;\n    // lorentzian width fraction L = fwhmL / F\n    const lorentzianFraction = fwhmL / effectiveFwhm;\n    const dLorentzianFractionDfwhmG = (-fwhmL / (effectiveFwhm * effectiveFwhm)) * dFwhmDfwhmG;\n    const dLorentzianFractionDfwhmL = 1 / effectiveFwhm - (fwhmL / (effectiveFwhm * effectiveFwhm)) * dFwhmDfwhmL;\n    // mu = 1 - (1.36603 L - 0.47719 L^2 + 0.11116 L^3)\n    const dPolyDfraction = 1.36603 -\n        0.95438 * lorentzianFraction +\n        0.33348 * lorentzianFraction * lorentzianFraction;\n    const dMuDfwhmG = -dPolyDfraction * dLorentzianFractionDfwhmG;\n    const dMuDfwhmL = -dPolyDfraction * dLorentzianFractionDfwhmL;\n    const mu = 1 -\n        (1.36603 * lorentzianFraction -\n            0.47719 * lorentzianFraction * lorentzianFraction +\n            0.11116 * lorentzianFraction * lorentzianFraction * lorentzianFraction);\n    // pseudoVoigt value and its ∂/∂x, ∂/∂F (dFwhm), ∂/∂mu (dMu) at the effective\n    // fwhm, inlined to allocate a single object on this hot path.\n    //\n    // Past {@link GAUSSIAN_CUTOFF} the gaussian half has underflowed and is\n    // dropped under the same condition as in `pseudoVoigtFct` — which this shape's\n    // own `fct` delegates to, so the value and its derivatives stay consistent out\n    // there. `fwhmL = 0` gives `mu = 1`, the pure gaussian that is never dropped.\n    const z = x / effectiveFwhm;\n    const e = mu !== 1 && z * z > GAUSSIAN_CUTOFF\n        ? 0\n        : Math.exp(GAUSSIAN_EXP_FACTOR * z * z);\n    const denominator2 = 4 * x * x + effectiveFwhm * effectiveFwhm;\n    const lorentz = (effectiveFwhm * effectiveFwhm) / denominator2;\n    const dEdt = ((2 * GAUSSIAN_EXP_FACTOR * x) / (effectiveFwhm * effectiveFwhm)) * e;\n    const dLdt = (-8 * x * effectiveFwhm * effectiveFwhm) / (denominator2 * denominator2);\n    const dEdfwhm = ((-2 * GAUSSIAN_EXP_FACTOR * x * x) /\n        (effectiveFwhm * effectiveFwhm * effectiveFwhm)) *\n        e;\n    const dLdfwhm = (8 * effectiveFwhm * x * x) / (denominator2 * denominator2);\n    const dFwhm = (1 - mu) * dLdfwhm + mu * dEdfwhm;\n    const dMu = e - lorentz;\n    return {\n        fct: (1 - mu) * lorentz + mu * e,\n        dx: (1 - mu) * dLdt + mu * dEdt,\n        dFwhmG: dFwhm * dFwhmDfwhmG + dMu * dMuDfwhmG,\n        dFwhmL: dFwhm * dFwhmDfwhmL + dMu * dMuDfwhmL,\n    };\n}\n/**\n * Compute the effective FWHM from gaussian and lorentzian component widths\n * using the Thompson–Cox–Hastings approximation.\n * @param fwhmG - gaussian component FWHM.\n * @param fwhmL - lorentzian component FWHM.\n * @returns effective combined FWHM.\n */\nfunction computeEffectiveWidth(fwhmG, fwhmL) {\n    return ((fwhmG ** 5 +\n        2.69269 * fwhmG ** 4 * fwhmL +\n        2.42843 * fwhmG ** 3 * fwhmL ** 2 +\n        4.47163 * fwhmG ** 2 * fwhmL ** 3 +\n        0.07842 * fwhmG * fwhmL ** 4 +\n        fwhmL ** 5) **\n        0.2);\n}\n/**\n * Solve for the lorentzian width fraction fwhmL/fwhm given lorentzianFraction = 1 - mu,\n * using Newton's method on: 1.36603·x - 0.47719·x² + 0.11116·x³ = lorentzianFraction.\n * @param lorentzianFraction - TCH lorentzian mixing parameter (= 1 - mu).\n * @returns the lorentzian width fraction fwhmL/fwhm.\n */\nfunction lorentzianWidthFraction(lorentzianFraction) {\n    let fraction = lorentzianFraction;\n    for (let i = 0; i < 6; i++) {\n        const f = 1.36603 * fraction -\n            0.47719 * fraction * fraction +\n            0.11116 * fraction * fraction * fraction -\n            lorentzianFraction;\n        const df = 1.36603 - 2 * 0.47719 * fraction + 3 * 0.11116 * fraction * fraction;\n        fraction -= f / df;\n    }\n    return fraction;\n}\n/**\n * Solve for the gaussian width fraction fwhmG/fwhm that pairs with a given\n * lorentzian width fraction fwhmL/fwhm. Writing fwhmG = g·fwhm and\n * fwhmL = q·fwhm in {@link computeEffectiveWidth} makes fwhm cancel, so `g` is\n * the root of the TCH width polynomial evaluated at 1. Solving it — rather than\n * taking `1 - q` — is what keeps `computeEffectiveWidth(fwhmG, fwhmL)` equal to\n * `fwhm`, and therefore keeps `fct` and `derivative` describing one same curve.\n * @param lorentzianFraction - the lorentzian width fraction fwhmL/fwhm.\n * @returns the gaussian width fraction fwhmG/fwhm.\n */\nfunction gaussianWidthFraction(lorentzianFraction) {\n    const q = lorentzianFraction;\n    let g = 1 - q;\n    for (let i = 0; i < 8; i++) {\n        const f = g ** 5 +\n            2.69269 * g ** 4 * q +\n            2.42843 * g ** 3 * q ** 2 +\n            4.47163 * g ** 2 * q ** 3 +\n            0.07842 * g * q ** 4 +\n            q ** 5 -\n            1;\n        const df = 5 * g ** 4 +\n            10.77076 * g ** 3 * q +\n            7.28529 * g ** 2 * q ** 2 +\n            8.94326 * g * q ** 3 +\n            0.07842 * q ** 4;\n        if (df === 0)\n            break;\n        g -= f / df;\n    }\n    return g;\n}\n//# sourceMappingURL=PseudoVoigtTCH.js.map","import { ROOT_THREE } from \"../../../util/constants.js\";\n/**\n * This shape is a linear combination of rational function (n|n+2), for n = 0 (lorentzian function) and n = 2\n * the parameter that combines those two functions is `gamma` and it is called the kurtosis parameter, it is an\n * implementation of generalized lorentzian shape published by Stanislav Sykora in the SMASH 2010. DOI:10.3247/SL3nmr10.006\n * {@link https://www.ebyte.it/stan/Talk_ML_UserMeeting_SMASH_2010_GeneralizedLorentzian.html}\n */\nexport class GeneralizedLorentzian {\n    kind = 'generalizedLorentzian';\n    /**\n     * Full width at half maximum.\n     * @default 500\n     */\n    fwhm;\n    /**\n     * kurtosis parameter of the shape, between -1 to 2\n     * @default 1\n     */\n    gamma;\n    constructor(options = {}) {\n        const { fwhm = 500, gamma = 0.5 } = options;\n        this.fwhm = fwhm;\n        this.gamma = gamma;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return generalizedLorentzianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return generalizedLorentzianWidthToFWHM(width);\n    }\n    fct(x) {\n        return generalizedLorentzianFct(x, this.fwhm, this.gamma);\n    }\n    getArea(height = 1) {\n        return getGeneralizedLorentzianArea({\n            fwhm: this.fwhm,\n            height,\n            gamma: this.gamma,\n        });\n    }\n    getFactor(area) {\n        return getGeneralizedLorentzianFactor(area);\n    }\n    getData(options = {}) {\n        return getGeneralizedLorentzianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        const { gamma, fwhm } = this;\n        return calculateGeneralizedLorentzianHeight({ fwhm, area, gamma });\n    }\n    getParameters() {\n        return ['fwhm', 'gamma'];\n    }\n    /**\n     * Descriptor of this shape, so `JSON.stringify` round-trips through `getShape1D`.\n     * @returns the shape descriptor.\n     */\n    toJSON() {\n        return { kind: this.kind, fwhm: this.fwhm, gamma: this.gamma };\n    }\n    derivative(x) {\n        const { fct, dx, dFwhm, dGamma } = generalizedLorentzianDerivative(x, this.fwhm, this.gamma);\n        return { fct, dx, parameters: [dFwhm, dGamma] };\n    }\n}\nexport const calculateGeneralizedLorentzianHeight = ({ fwhm = 1, gamma = 1, area = 1, }) => {\n    return (area / fwhm / (3.14159 - 0.420894 * gamma)) * 2;\n};\n/**\n * Calculate the area under a generalized Lorentzian peak (integral from Mathematica).\n * @param options - shape parameters including fwhm, height, and gamma.\n * @returns the area under the peak.\n */\nexport const getGeneralizedLorentzianArea = (options) => {\n    const { fwhm = 500, height = 1, gamma = 1 } = options;\n    return (height * fwhm * (3.14159 - 0.420894 * gamma)) / 2;\n};\nexport const generalizedLorentzianFct = (x, fwhm, gamma) => {\n    const u = ((2 * x) / fwhm) ** 2;\n    return (1 - gamma) / (1 + u) + (gamma * (1 + u / 2)) / (1 + u + u ** 2);\n};\n/**\n * Analytical value and partial derivatives of the generalized lorentzian function centered at x=0.\n * @param x - position at which to evaluate.\n * @param fwhm - full width at half maximum.\n * @param gamma - kurtosis parameter of the shape.\n * @returns the value `fct` and its partial derivatives with respect to `x` (`dx`), `fwhm` (`dFwhm`) and `gamma` (`dGamma`).\n */\nexport function generalizedLorentzianDerivative(x, fwhm, gamma) {\n    const u = ((2 * x) / fwhm) ** 2;\n    const lorentzian = 1 / (1 + u); // A\n    const rational = (1 + u / 2) / (1 + u + u * u); // B\n    const fct = (1 - gamma) * lorentzian + gamma * rational;\n    // dA/du and dB/du\n    const dLorentzianDu = -1 / ((1 + u) * (1 + u));\n    const denominator = 1 + u + u * u;\n    const dRationalDu = -(0.5 + 2 * u + 0.5 * u * u) / (denominator * denominator);\n    const dFctDu = (1 - gamma) * dLorentzianDu + gamma * dRationalDu;\n    const duDx = (8 * x) / (fwhm * fwhm);\n    const duDfwhm = (-8 * x * x) / (fwhm * fwhm * fwhm);\n    const dx = dFctDu * duDx;\n    const dFwhm = dFctDu * duDfwhm;\n    const dGamma = rational - lorentzian; // B - A\n    return { fct, dx, dFwhm, dGamma };\n}\nexport const generalizedLorentzianWidthToFWHM = (width) => {\n    return width * ROOT_THREE;\n};\nexport const generalizedLorentzianFwhmToWidth = (fwhm) => {\n    return fwhm / ROOT_THREE;\n};\nconst generalizedLorentzianQuantile = (p) => Math.tan(Math.PI * (p - 0.5));\nexport const getGeneralizedLorentzianFactor = (area = 0.9999) => {\n    if (area >= 1) {\n        throw new Error('area should be (0 - 1)');\n    }\n    const halfResidual = (1 - area) * 0.5;\n    return ((generalizedLorentzianQuantile(1 - halfResidual) -\n        generalizedLorentzianQuantile(halfResidual)) /\n        2);\n};\nexport const getGeneralizedLorentzianData = (shape = {}, options = {}) => {\n    const { fwhm = 500, gamma = 1 } = shape;\n    const { factor = getGeneralizedLorentzianFactor(), height = calculateGeneralizedLorentzianHeight({ fwhm, area: 1, gamma }), } = options;\n    let { length } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), 2 ** 25 - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        const value = generalizedLorentzianFct(i - center, fwhm, gamma) * height;\n        data[i] = value;\n        data[length - 1 - i] = value;\n    }\n    return data;\n};\n//# sourceMappingURL=GeneralizedLorentzian.js.map","import { ROOT_PI_OVER_LN2 } from \"../../../util/constants.js\";\nimport { gaussianDerivative, gaussianFct, gaussianFwhmToWidth, gaussianWidthToFWHM, getGaussianFactor, } from \"../gaussian/Gaussian.js\";\nexport class SplitGaussian {\n    kind = 'splitGaussian';\n    /**\n     * Full width at half maximum of the lower-x half (x <= 0).\n     * @default 500\n     */\n    fwhmLow;\n    /**\n     * Full width at half maximum of the higher-x half (x > 0).\n     * @default 500\n     */\n    fwhmHigh;\n    constructor(options = {}) {\n        const { fwhmLow = 500, fwhmHigh = 500 } = options;\n        this.fwhmLow = fwhmLow;\n        this.fwhmHigh = fwhmHigh;\n    }\n    /**\n     * Full width at half maximum of the peak. The half-maximum crossings are at\n     * `-fwhmLow / 2` and `fwhmHigh / 2`, so the width between them is the mean of\n     * both halves.\n     * @returns the full width at half maximum.\n     */\n    get fwhm() {\n        return (this.fwhmLow + this.fwhmHigh) / 2;\n    }\n    /**\n     * Set the full width at half maximum. Both halves are scaled by the same\n     * ratio, so their mean becomes `value` while the asymmetry between them is\n     * preserved. A peak with no width has no ratio to preserve, so both halves\n     * take `value` and the peak stays symmetric.\n     * @param value - the new full width at half maximum.\n     */\n    set fwhm(value) {\n        const { fwhm } = this;\n        if (fwhm === 0) {\n            this.fwhmLow = value;\n            this.fwhmHigh = value;\n            return;\n        }\n        const ratio = value / fwhm;\n        this.fwhmLow *= ratio;\n        this.fwhmHigh *= ratio;\n    }\n    /**\n     * Convert a full width at half maximum to the width between the inflection\n     * points. For this peak's own fwhm the result is exactly `σlow + σhigh`.\n     * @param fwhm - full width at half maximum. Defaults to the peak's fwhm.\n     * @returns the width between the inflection points.\n     */\n    fwhmToWidth(fwhm = this.fwhm) {\n        return gaussianFwhmToWidth(fwhm);\n    }\n    /**\n     * Convert a width between the inflection points back to a full width at half\n     * maximum. A single width does not encode the asymmetry, so it cannot recover\n     * `fwhmLow` and `fwhmHigh` individually.\n     * @param width - width between the inflection points.\n     * @returns the corresponding full width at half maximum.\n     */\n    widthToFWHM(width) {\n        return gaussianWidthToFWHM(width);\n    }\n    fct(x) {\n        return splitGaussianFct(x, this.fwhmLow, this.fwhmHigh);\n    }\n    getArea(height = calculateSplitGaussianHeight({\n        fwhmLow: this.fwhmLow,\n        fwhmHigh: this.fwhmHigh,\n    })) {\n        return getSplitGaussianArea({\n            fwhmLow: this.fwhmLow,\n            fwhmHigh: this.fwhmHigh,\n            height,\n        });\n    }\n    getFactor(area) {\n        return getGaussianFactor(area);\n    }\n    getData(options = {}) {\n        return getSplitGaussianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateSplitGaussianHeight({\n            fwhmLow: this.fwhmLow,\n            fwhmHigh: this.fwhmHigh,\n            area,\n        });\n    }\n    getParameters() {\n        return ['fwhmLow', 'fwhmHigh'];\n    }\n    /**\n     * Descriptor of this shape, so `JSON.stringify` round-trips through `getShape1D`.\n     * @returns the shape descriptor.\n     */\n    toJSON() {\n        return {\n            kind: this.kind,\n            fwhmLow: this.fwhmLow,\n            fwhmHigh: this.fwhmHigh,\n        };\n    }\n    derivative(x) {\n        const { fct, dx, dFwhmLow, dFwhmHigh } = splitGaussianDerivative(x, this.fwhmLow, this.fwhmHigh);\n        return { fct, dx, parameters: [dFwhmLow, dFwhmHigh] };\n    }\n}\n/**\n * Calculate the peak height for a given area and both half-widths.\n * @param options - fwhmLow, fwhmHigh and area.\n * @returns the peak height.\n */\nexport function calculateSplitGaussianHeight(options) {\n    const { fwhmLow = 500, fwhmHigh = 500, area = 1 } = options;\n    return (4 * area) / ROOT_PI_OVER_LN2 / (fwhmLow + fwhmHigh);\n}\n/**\n * Evaluate the split (asymmetric) gaussian function centered at x=0.\n * The lower-x half (x <= 0) uses `fwhmLow`, the higher-x half (x > 0) uses `fwhmHigh`.\n * @param x - position at which to evaluate.\n * @param fwhmLow - full width at half maximum of the lower-x half.\n * @param fwhmHigh - full width at half maximum of the higher-x half.\n * @returns the intensity at x.\n */\nexport function splitGaussianFct(x, fwhmLow, fwhmHigh) {\n    return x <= 0 ? gaussianFct(x, fwhmLow) : gaussianFct(x, fwhmHigh);\n}\n/**\n * Analytical value and partial derivatives of the split gaussian function centered at x=0.\n * Each half's fwhm only affects its own side, so the off-side derivative is 0.\n * @param x - position at which to evaluate.\n * @param fwhmLow - full width at half maximum of the lower-x half.\n * @param fwhmHigh - full width at half maximum of the higher-x half.\n * @returns the value `fct` and its partial derivatives with respect to `x` (`dx`), `fwhmLow` (`dFwhmLow`) and `fwhmHigh` (`dFwhmHigh`).\n */\nexport function splitGaussianDerivative(x, fwhmLow, fwhmHigh) {\n    if (x <= 0) {\n        const { fct, dx, dFwhm } = gaussianDerivative(x, fwhmLow);\n        return { fct, dx, dFwhmLow: dFwhm, dFwhmHigh: 0 };\n    }\n    const { fct, dx, dFwhm } = gaussianDerivative(x, fwhmHigh);\n    return { fct, dx, dFwhmLow: 0, dFwhmHigh: dFwhm };\n}\n/**\n * Calculate the area under a split gaussian peak.\n * @param options - fwhmLow, fwhmHigh and height.\n * @returns the area.\n */\nexport function getSplitGaussianArea(options) {\n    const { fwhmLow = 500, fwhmHigh = 500, height = 1 } = options;\n    return (height * ROOT_PI_OVER_LN2 * (fwhmLow + fwhmHigh)) / 4;\n}\n/**\n * Generate an intensity array for a split gaussian shape.\n * @param shape - split gaussian shape parameters (fwhmLow, fwhmHigh).\n * @param options - sampling options (length, factor, height).\n * @returns Float64Array of intensity values.\n */\nexport function getSplitGaussianData(shape = {}, options = {}) {\n    const { fwhmLow = 500, fwhmHigh = 500 } = shape;\n    const { factor = getGaussianFactor(), height = calculateSplitGaussianHeight({ fwhmLow, fwhmHigh }), } = options;\n    let { length } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(Math.max(fwhmLow, fwhmHigh) * factor), 2 ** 25 - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i < length; i++) {\n        data[i] = splitGaussianFct(i - center, fwhmLow, fwhmHigh) * height;\n    }\n    return data;\n}\n//# sourceMappingURL=SplitGaussian.js.map","import { Gaussian } from \"./gaussian/Gaussian.js\";\nimport { GeneralizedLorentzian } from \"./generalizedLorentzian/GeneralizedLorentzian.js\";\nimport { Lorentzian } from \"./lorentzian/Lorentzian.js\";\nimport { LorentzianDispersive } from \"./lorentzianDispersive/LorentzianDispersive.js\";\nimport { PseudoVoigt } from \"./pseudoVoigt/PseudoVoigt.js\";\nimport { PseudoVoigtTCH } from \"./pseudoVoigtTCH/PseudoVoigtTCH.js\";\nimport { SplitGaussian } from \"./splitGaussian/SplitGaussian.js\";\nexport function getShape1D(shape) {\n    const { kind } = shape;\n    switch (kind) {\n        case 'gaussian':\n            return new Gaussian(shape);\n        case 'lorentzian':\n            return new Lorentzian(shape);\n        case 'pseudoVoigt':\n            return new PseudoVoigt(shape);\n        case 'pseudoVoigtTCH':\n            return new PseudoVoigtTCH(shape);\n        case 'lorentzianDispersive':\n            return new LorentzianDispersive(shape);\n        case 'generalizedLorentzian':\n            return new GeneralizedLorentzian(shape);\n        case 'splitGaussian':\n            return new SplitGaussian(shape);\n        default:\n            throw new Error(`Unknown distribution ${kind}`);\n    }\n}\n//# sourceMappingURL=getShape1D.js.map","/**\n * This function returns the sumOfShapes function\n * This function gives sumOfShapes access to the peak list and the associated data\n * @param internalPeaks\n */\nexport function getSumOfShapes(internalPeaks) {\n    return function sumOfShapes(parameters) {\n        for (const peak of internalPeaks) {\n            for (let i = 2; i < peak.parameters.length; i++) {\n                const shapeFctKey = peak.parameters[i];\n                peak.shapeFct[shapeFctKey] = parameters[peak.fromIndex + i];\n            }\n        }\n        return (x) => {\n            let totalY = 0;\n            for (const peak of internalPeaks) {\n                const peakX = parameters[peak.fromIndex];\n                const y = parameters[peak.fromIndex + 1];\n                totalY += y * peak.shapeFct.fct(x - peakX);\n            }\n            return totalY;\n        };\n    };\n}\n//# sourceMappingURL=getSumOfShapes.js.map","/**\n * Asserts that value is truthy.\n * @param value - Value to check.\n * @param message - Optional error message to throw.\n */\nexport function assert(value, message) {\n    if (!value) {\n        throw new Error(message || 'unreachable');\n    }\n}\n//# sourceMappingURL=assert.js.map","import { xMean } from 'ml-spectra-processing';\nimport { assert } from \"./assert.js\";\n/**\n * Build an optimization layout mapping actual per-peak parameter slots\n * to optimizer variables. The layout describes slots, grouped/shared\n * variables, variable bounds/initials, and provides a helper to\n * materialize actual peak parameter values from a variable vector.\n * @param internalPeaks - normalized internal peaks with parameter indices\n * @param peaks - original peak objects (for per-peak optimize flags)\n * @param options - user `OptimizeOptions`, may contain `linkedParameters`\n * @param yScale - y normalization factor (used when converting offsets)\n * @returns an `OptimizationLayout` describing variables and slots\n */\nexport function buildOptimizationLayout(internalPeaks, peaks, options, yScale = 1) {\n    const slots = buildParameterSlots(internalPeaks, peaks, options);\n    const variables = buildOptimizationVariables(slots, options.linkedParameters, yScale);\n    const variableMin = new Float64Array(variables.length);\n    const variableMax = new Float64Array(variables.length);\n    const variableInit = new Float64Array(variables.length);\n    const variableGrad = new Float64Array(variables.length);\n    const freeIndices = [];\n    for (let i = 0; i < variables.length; i++) {\n        const variable = variables[i];\n        variableMin[i] = variable.min;\n        variableMax[i] = variable.max;\n        variableInit[i] = variable.init;\n        variableGrad[i] = variable.gradientDifference;\n        if (variable.optimize) {\n            freeIndices.push(i);\n        }\n    }\n    return {\n        slots,\n        variables,\n        freeIndices,\n        variableMin,\n        variableMax,\n        variableInit,\n        variableGrad,\n        variableToPeakValues(variableValues) {\n            const actualValues = new Array(slots.length);\n            for (let i = 0; i < variables.length; i++) {\n                const variableValue = variableValues[i];\n                const members = variables[i].members;\n                for (const member of members) {\n                    actualValues[member.actualIndex] =\n                        variableValue * member.factor + member.offset;\n                }\n            }\n            return actualValues;\n        },\n    };\n}\n/**\n * Builds concrete parameter slots for each peak parameter.\n * @param internalPeaks - normalized peaks containing parameter metadata\n * @param peaks - original peaks used to resolve optimize flags\n * @param options - optimization options with parameter settings\n * @returns flattened parameter slots across all peaks\n */\nfunction buildParameterSlots(internalPeaks, peaks, options) {\n    const slots = [];\n    for (let peakIndex = 0; peakIndex < internalPeaks.length; peakIndex++) {\n        const internalPeak = internalPeaks[peakIndex];\n        for (let i = 0; i < internalPeak.parameters.length; i++) {\n            const parameter = internalPeak.parameters[i];\n            slots.push({\n                actualIndex: internalPeak.fromIndex + i,\n                peakIndex,\n                peakId: internalPeak.id,\n                parameter,\n                init: internalPeak.propertiesValues.init[i],\n                min: internalPeak.propertiesValues.min[i],\n                max: internalPeak.propertiesValues.max[i],\n                gradientDifference: internalPeak.propertiesValues.gradientDifference[i],\n                optimize: getOptimizeFlag(peaks[peakIndex], parameter, options),\n            });\n        }\n    }\n    return slots;\n}\n/**\n * Builds optimization variables from concrete parameter slots.\n * @param slots - flattened per-peak parameter slots\n * @param linkedParameters - optional linked parameter groups\n * @param yScale - y normalization factor for y-offset conversion\n * @returns sorted optimization variables ready for the optimizer\n */\nfunction buildOptimizationVariables(slots, linkedParameters, yScale) {\n    const groupedActualIndices = new Set();\n    const variables = [];\n    const slotLookup = new Map();\n    const idToIndices = new Map();\n    for (const slot of slots) {\n        slotLookup.set(getSlotKey(slot.peakIndex, slot.parameter), slot);\n        if (slot.peakId) {\n            const indices = idToIndices.get(slot.peakId) ?? [];\n            if (!indices.includes(slot.peakIndex)) {\n                indices.push(slot.peakIndex);\n            }\n            idToIndices.set(slot.peakId, indices);\n        }\n    }\n    for (const linkedParameter of linkedParameters ?? []) {\n        variables.push(buildLinkedVariable(linkedParameter, slotLookup, groupedActualIndices, idToIndices, yScale));\n    }\n    for (const slot of slots) {\n        if (groupedActualIndices.has(slot.actualIndex)) {\n            continue;\n        }\n        variables.push({\n            sortKey: slot.actualIndex,\n            parameter: slot.parameter,\n            init: slot.init,\n            min: slot.min,\n            max: slot.max,\n            gradientDifference: slot.gradientDifference,\n            optimize: slot.optimize,\n            members: [\n                {\n                    actualIndex: slot.actualIndex,\n                    peakIndex: slot.peakIndex,\n                    parameter: slot.parameter,\n                    factor: 1,\n                    offset: 0,\n                },\n            ],\n        });\n    }\n    variables.sort((a, b) => a.sortKey - b.sortKey);\n    return variables.map(({ sortKey: _sortKey, ...variable }) => variable);\n}\nfunction buildLinkedVariable(linkedParameter, slotLookup, groupedActualIndices, idToIndices, yScale) {\n    if (linkedParameter.peaks.length === 0) {\n        throw new Error(`Linked parameter for ${linkedParameter.parameter} must contain at least one peak`);\n    }\n    const resolvedMembers = linkedParameter.peaks.map((peak) => {\n        const slot = resolveLinkedSlot(peak, linkedParameter.parameter, slotLookup, idToIndices);\n        if (groupedActualIndices.has(slot.actualIndex)) {\n            throw new Error(`Peak ${String(peak.id)} parameter ${linkedParameter.parameter} is already linked`);\n        }\n        return {\n            slot,\n            factor: getFactor(peak, linkedParameter.parameter),\n            offset: getOffset(peak, linkedParameter.parameter, yScale),\n        };\n    });\n    const memberActualIndices = new Set();\n    for (const member of resolvedMembers) {\n        if (memberActualIndices.has(member.slot.actualIndex)) {\n            throw new Error(`Linked parameter for ${linkedParameter.parameter} contains the same peak more than once`);\n        }\n        memberActualIndices.add(member.slot.actualIndex);\n    }\n    const firstMember = resolvedMembers[0];\n    let sharedMin = Number.NEGATIVE_INFINITY;\n    let sharedMax = Number.POSITIVE_INFINITY;\n    const optimize = firstMember.slot.optimize;\n    const sharedInitCandidates = [];\n    for (const member of resolvedMembers) {\n        if (member.slot.optimize !== optimize) {\n            throw new Error(`Linked parameter ${linkedParameter.parameter} must use a consistent optimize flag across all members`);\n        }\n        if (member.slot.min > member.slot.max) {\n            throw new Error(`Linked parameter ${linkedParameter.parameter} has incompatible bounds across its members`);\n        }\n        const variableBounds = getMemberVariableBounds(member);\n        sharedMin = Math.max(sharedMin, variableBounds.min);\n        sharedMax = Math.min(sharedMax, variableBounds.max);\n        sharedInitCandidates.push((member.slot.init - member.offset) / member.factor);\n    }\n    if (sharedMin > sharedMax) {\n        throw new Error(`Linked parameter ${linkedParameter.parameter} has incompatible bounds across its members`);\n    }\n    for (const member of resolvedMembers) {\n        groupedActualIndices.add(member.slot.actualIndex);\n    }\n    return {\n        sortKey: Math.min(...resolvedMembers.map((member) => member.slot.actualIndex)),\n        parameter: linkedParameter.parameter,\n        init: xMean(sharedInitCandidates),\n        min: sharedMin,\n        max: sharedMax,\n        gradientDifference: Math.min(...resolvedMembers.map((m) => Math.abs(m.slot.gradientDifference))),\n        optimize,\n        members: resolvedMembers.map((member) => ({\n            actualIndex: member.slot.actualIndex,\n            peakIndex: member.slot.peakIndex,\n            parameter: member.slot.parameter,\n            factor: member.factor,\n            offset: member.offset,\n        })),\n    };\n}\nfunction resolveLinkedSlot(peak, parameter, slotLookup, idToIndices) {\n    const peakIndex = typeof peak.id === 'number'\n        ? peak.id\n        : resolvePeakIndexById(peak.id, idToIndices);\n    if (!Number.isInteger(peakIndex) || peakIndex < 0) {\n        throw new Error(`Invalid peak reference ${String(peak.id)}`);\n    }\n    const slot = slotLookup.get(getSlotKey(peakIndex, parameter));\n    if (!slot) {\n        throw new Error(`Unknown parameter ${parameter} for peak ${String(peak.id)}`);\n    }\n    return slot;\n}\nfunction resolvePeakIndexById(peakId, idToIndices) {\n    const indices = idToIndices.get(peakId);\n    if (!indices || indices.length === 0) {\n        throw new Error(`Unknown peak id ${peakId}`);\n    }\n    if (new Set(indices).size > 1) {\n        throw new Error(`Peak id ${peakId} is ambiguous because it is used by multiple peaks`);\n    }\n    return indices[0];\n}\nfunction getFactor(peak, parameter) {\n    const factor = peak.factor ?? 1;\n    if (!Number.isFinite(factor) || factor === 0) {\n        throw new Error(`Linked parameter ${parameter} must use a non-zero finite factor`);\n    }\n    return factor;\n}\nfunction getOffset(peak, parameter, yScale) {\n    const offset = peak.offset ?? 0;\n    if (!Number.isFinite(offset)) {\n        throw new Error(`Linked parameter ${parameter} must use a finite offset`);\n    }\n    if (parameter === 'y') {\n        return offset / yScale;\n    }\n    return offset;\n}\nfunction getMemberVariableBounds(member) {\n    const transformedMin = (member.slot.min - member.offset) / member.factor;\n    const transformedMax = (member.slot.max - member.offset) / member.factor;\n    return {\n        min: Math.min(transformedMin, transformedMax),\n        max: Math.max(transformedMin, transformedMax),\n    };\n}\nfunction getOptimizeFlag(peak, parameter, options) {\n    assert(peak);\n    let optimizeFlag = true;\n    const perPeakParam = peak.parameters?.[parameter];\n    const globalParam = options.parameters?.[parameter];\n    if (perPeakParam?.optimize !== undefined) {\n        if (typeof perPeakParam.optimize === 'function') {\n            optimizeFlag = perPeakParam.optimize(peak);\n        }\n        else {\n            const { optimize = true } = perPeakParam;\n            optimizeFlag = optimize;\n        }\n    }\n    else if (globalParam?.optimize !== undefined) {\n        if (typeof globalParam.optimize === 'function') {\n            optimizeFlag = globalParam.optimize(peak);\n        }\n        else {\n            const { optimize = true } = globalParam;\n            optimizeFlag = optimize;\n        }\n    }\n    return optimizeFlag;\n}\nfunction getSlotKey(peakIndex, parameter) {\n    return `${peakIndex}:${parameter}`;\n}\n//# sourceMappingURL=buildOptimizationLayout.js.map","/**\n * Reconstruct user-facing peak objects from internal peaks and a full\n * actual-parameter vector.\n * @template T - original Peak type\n * @param internalPeaks - internal peaks produced by `getInternalPeaks`\n * @param actualValues - flattened actual parameter values (not normalized for Y)\n * @param yScale - normalization factor previously applied to Y values\n * @returns array of optimized peaks with reconstructed shapes and ids\n */\nexport function reconstructPeaks(internalPeaks, actualValues, yScale) {\n    const newPeaks = [];\n    for (const peak of internalPeaks) {\n        const { id, shape, parameters, fromIndex } = peak;\n        let newPeak = { x: 0, y: 0, shape };\n        if (id) {\n            newPeak = { ...newPeak, id };\n        }\n        newPeak.x = actualValues[fromIndex];\n        newPeak.y = actualValues[fromIndex + 1] * yScale;\n        for (let i = 2; i < parameters.length; i++) {\n            //@ts-expect-error should be fixed once\n            newPeak.shape[parameters[i]] = actualValues[fromIndex + i];\n        }\n        newPeaks.push(newPeak);\n    }\n    return newPeaks;\n}\n//# sourceMappingURL=reconstructPeaks.js.map","import { reconstructPeaks } from \"./reconstructPeaks.js\";\n/**\n * Build result when no parameters are free to optimize.\n * Computes the fit error using the provided `globalInit` parameter vector\n * and reconstructs the output peak objects from `internalPeaks`.\n * @template T - input Peak type\n * @param internalPeaks - internal representation of peaks (with parameter indices)\n * @param normalizedY - observed Y values normalized by the global scale\n * @param x - X axis values\n * @param globalInit - full parameter vector (actual-space) used to evaluate the model\n * @param baseSumOfShapes - function that returns the spectrum function given parameters\n * @param yScale - the scale factor used to normalize Y (used to reconstruct peak amplitudes)\n * @returns an object containing `error`, `iterations` (0) and the reconstructed `peaks`\n */\nexport function getFixedParametersResult(internalPeaks, normalizedY, x, globalInit, baseSumOfShapes, yScale) {\n    const fct = baseSumOfShapes(globalInit);\n    let error = 0;\n    for (let i = 0; i < normalizedY.length; i++) {\n        error += (normalizedY[i] - fct(x[i])) ** 2;\n    }\n    return {\n        error,\n        iterations: 0,\n        peaks: reconstructPeaks(internalPeaks, globalInit, yScale),\n    };\n}\n//# sourceMappingURL=getFixedParametersResult.js.map","export const DefaultParameters = {\n    x: {\n        init: (peak) => peak.x,\n        min: (peak, peakShape) => peak.x - peakShape.fwhm * 2,\n        max: (peak, peakShape) => peak.x + peakShape.fwhm * 2,\n        gradientDifference: (peak, peakShape) => peakShape.fwhm * 2e-3,\n    },\n    y: {\n        init: (peak) => peak.y,\n        min: (peak) => (peak.y < 0 ? -1.1 : 0),\n        max: (peak) => (peak.y < 0 ? 0 : 1.1),\n        gradientDifference: () => 1e-3,\n    },\n    fwhm: {\n        init: (peak, peakShape) => peakShape.fwhm,\n        min: (peak, peakShape) => peakShape.fwhm * 0.25,\n        max: (peak, peakShape) => peakShape.fwhm * 4,\n        gradientDifference: (peak, peakShape) => peakShape.fwhm * 2e-3,\n    },\n    fwhmG: {\n        init: (peak, peakShape) => peakShape.fwhm * 0.6,\n        min: (peak, peakShape) => peakShape.fwhm * 0.6 * 0.25,\n        max: (peak, peakShape) => peakShape.fwhm * 0.6 * 4,\n        gradientDifference: (peak, peakShape) => peakShape.fwhm * 0.6 * 2e-3,\n    },\n    fwhmL: {\n        init: (peak, peakShape) => peakShape.fwhm * 0.4,\n        min: (peak, peakShape) => peakShape.fwhm * 0.4 * 0.25,\n        max: (peak, peakShape) => peakShape.fwhm * 0.4 * 4,\n        gradientDifference: (peak, peakShape) => peakShape.fwhm * 0.4 * 2e-3,\n    },\n    mu: {\n        init: (peak, peakShape) => peakShape.mu,\n        min: () => 0,\n        max: () => 1,\n        gradientDifference: () => 0.01,\n    },\n    gamma: {\n        init: (peak, peakShape) => peakShape.gamma || 0.5,\n        min: () => -1,\n        max: () => 2,\n        gradientDifference: () => 0.01,\n    },\n};\n//# sourceMappingURL=DefaultParameters.js.map","import { getShape1D } from 'ml-peak-shape-generator';\nimport { assert } from \"../assert.js\";\nimport { DefaultParameters } from \"./DefaultParameters.js\";\nconst properties = ['init', 'min', 'max', 'gradientDifference'];\n/**\n * Return an array of internalPeaks that contains the exact init, min, max values based on the options\n * @param peaks\n * @param minMaxY\n * @param yScale\n * @param options\n * @returns\n */\nexport function getInternalPeaks(peaks, yScale, options = {}) {\n    let index = 0;\n    const internalPeaks = [];\n    for (const originalPeak of peaks) {\n        const normalizedPeak = {\n            ...originalPeak,\n            y: originalPeak.y / yScale,\n        };\n        const peak = normalizedPeak;\n        const { id, shape = options.shape || { kind: 'gaussian' } } = peak;\n        const shapeFct = getShape1D(shape);\n        const parameters = ['x', 'y', ...shapeFct.getParameters()];\n        const propertiesValuesInternal = {\n            min: [],\n            max: [],\n            init: [],\n            gradientDifference: [],\n        };\n        for (const parameter of parameters) {\n            for (const property of properties) {\n                // check if the property is specified in the peak\n                let propertyValue = peak?.parameters?.[parameter]?.[property];\n                if (propertyValue !== undefined) {\n                    propertyValue = getNormalizedValue(propertyValue, parameter, property, yScale);\n                    propertiesValuesInternal[property].push(propertyValue);\n                    continue;\n                }\n                // check if there are some global option, it could be a number or a callback\n                let generalParameterValue = options?.parameters?.[parameter]?.[property];\n                if (generalParameterValue !== undefined) {\n                    if (typeof generalParameterValue === 'number') {\n                        generalParameterValue = getNormalizedValue(generalParameterValue, parameter, property, yScale);\n                        propertiesValuesInternal[property].push(generalParameterValue);\n                        continue;\n                    }\n                    else {\n                        // callbacks receive user-provided peak values (not Y-normalized)\n                        let value = generalParameterValue(originalPeak);\n                        value = getNormalizedValue(value, parameter, property, yScale);\n                        propertiesValuesInternal[property].push(value);\n                        continue;\n                    }\n                }\n                // we just need to take the default parameters\n                assert(DefaultParameters[parameter], `No default parameter for ${parameter}`);\n                const defaultParameterValues = DefaultParameters[parameter][property];\n                propertiesValuesInternal[property].push(\n                //@ts-expect-error parameters and shape instance are guaranteed to be present in the defaultParameterValues function\n                defaultParameterValues(peak, shapeFct));\n            }\n        }\n        const fromIndex = index;\n        const toIndex = fromIndex + parameters.length - 1;\n        index += toIndex - fromIndex + 1;\n        const propertiesValues = {\n            min: propertiesValuesInternal.min,\n            max: propertiesValuesInternal.max,\n            init: propertiesValuesInternal.init,\n            gradientDifference: propertiesValuesInternal.gradientDifference,\n        };\n        internalPeaks.push({\n            id,\n            shape,\n            shapeFct,\n            parameters,\n            propertiesValues,\n            fromIndex,\n            toIndex,\n        });\n    }\n    return internalPeaks;\n}\nfunction getNormalizedValue(value, parameter, property, yScale) {\n    if (parameter === 'y') {\n        if (property === 'gradientDifference') {\n            return value;\n        }\n        else {\n            return value / yScale;\n        }\n    }\n    return value;\n}\n//# sourceMappingURL=getInternalPeaks.js.map","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\nexport default function checkOptions(data, options) {\n    const { timeout, initialValues, weights = 1, damping = 1e-2, dampingStepUp = 11, dampingStepDown = 9, maxIterations = 100, errorTolerance = 1e-7, centralDifference = false, gradientDifference = 10e-2, improvementThreshold = 1e-3, } = options;\n    let { minValues, maxValues } = options;\n    if (damping <= 0) {\n        throw new Error('The damping option must be a positive number');\n    }\n    else if (!data.x || !data.y) {\n        throw new Error('The data parameter must have x and y elements');\n    }\n    else if (!isAnyArray(data.x) ||\n        data.x.length < 2 ||\n        !isAnyArray(data.y) ||\n        data.y.length < 2) {\n        throw new Error('The data parameter elements must be an array with more than 2 points');\n    }\n    else if (data.x.length !== data.y.length) {\n        throw new Error('The data parameter elements must have the same size');\n    }\n    if (!(initialValues && initialValues.length > 0)) {\n        throw new Error('The initialValues option is mandatory and must be an array');\n    }\n    const parameters = Array.from(initialValues);\n    const parLen = parameters.length;\n    maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n    minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n    if (maxValues.length !== minValues.length) {\n        throw new Error('minValues and maxValues must be the same size');\n    }\n    const gradientDifferenceArray = getGradientDifferenceArray(gradientDifference, parameters);\n    const filler = getFiller(weights, data.x.length);\n    const checkTimeout = getCheckTimeout(timeout);\n    const weightSquare = Array.from({ length: data.x.length }, (_, i) => filler(i));\n    return {\n        checkTimeout,\n        minValues,\n        maxValues,\n        parameters,\n        weightSquare,\n        damping,\n        dampingStepUp,\n        dampingStepDown,\n        maxIterations,\n        errorTolerance,\n        centralDifference,\n        gradientDifference: gradientDifferenceArray,\n        improvementThreshold,\n    };\n}\nfunction getGradientDifferenceArray(gradientDifference, parameters) {\n    if (typeof gradientDifference === 'number') {\n        return new Array(parameters.length).fill(gradientDifference);\n    }\n    else if (isAnyArray(gradientDifference)) {\n        const parLen = parameters.length;\n        if (gradientDifference.length !== parLen) {\n            return new Array(parLen).fill(gradientDifference[0]);\n        }\n        return Array.from(gradientDifference);\n    }\n    throw new Error('gradientDifference should be a number or array with length equal to the number of parameters');\n}\nfunction getFiller(weights, dataLength) {\n    if (typeof weights === 'number') {\n        const value = 1 / weights ** 2;\n        return () => value;\n    }\n    else if (isAnyArray(weights)) {\n        if (weights.length < dataLength) {\n            const value = 1 / weights[0] ** 2;\n            return () => value;\n        }\n        return (i) => 1 / weights[i] ** 2;\n    }\n    throw new Error('weights should be a number or array with length equal to the number of data points');\n}\nfunction getCheckTimeout(timeout) {\n    if (timeout !== undefined) {\n        if (typeof timeout !== 'number') {\n            throw new Error('timeout should be a number');\n        }\n        const endTime = Date.now() + timeout * 1000;\n        return () => Date.now() > endTime;\n    }\n    else {\n        return () => false;\n    }\n}\n//# sourceMappingURL=check_options.js.map","/**\n * the sum of the weighted squares of the errors (or weighted residuals) between the data.y\n * and the curve-fit function.\n *\n * @param data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param parameters - Array of current parameter values\n * @param parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param weightSquare - Square of weights (must be same length as data.x)\n */\nexport default function errorCalculation(data, parameters, parameterizedFunction, weightSquare) {\n    let error = 0;\n    const func = parameterizedFunction(parameters);\n    for (let i = 0; i < data.x.length; i++) {\n        error += (data.y[i] - func(data.x[i])) ** 2 / weightSquare[i];\n    }\n    return error;\n}\n//# sourceMappingURL=error_calculation.js.map","import { Matrix } from 'ml-matrix';\n/**\n * Difference of the matrix function over the parameters\n * @param data Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param evaluatedData - Array of previous evaluated function values\n * @param params - Array of previous parameter values\n * @param gradientDifference - The step size to approximate the jacobian matrix\n * @param centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param paramFunction - The parameters and returns a function with the independent variable as a parameter\n */\nexport default function gradientFunction(data, evaluatedData, params, gradientDifference, paramFunction, centralDifference) {\n    const nbParams = params.length;\n    const nbPoints = data.x.length;\n    const ans = Matrix.zeros(nbParams, nbPoints);\n    let rowIndex = 0;\n    for (let param = 0; param < nbParams; param++) {\n        if (gradientDifference[param] === 0)\n            continue;\n        let delta = gradientDifference[param];\n        let auxParams = params.slice();\n        auxParams[param] += delta;\n        const funcParam = paramFunction(auxParams);\n        if (!centralDifference) {\n            for (let point = 0; point < nbPoints; point++) {\n                ans.set(rowIndex, point, (evaluatedData[point] - funcParam(data.x[point])) / delta);\n            }\n        }\n        else {\n            auxParams = params.slice();\n            auxParams[param] -= delta;\n            delta *= 2;\n            const funcParam2 = paramFunction(auxParams);\n            for (let point = 0; point < nbPoints; point++) {\n                ans.set(rowIndex, point, (funcParam2(data.x[point]) - funcParam(data.x[point])) / delta);\n            }\n        }\n        rowIndex++;\n    }\n    return ans;\n}\n//# sourceMappingURL=gradient_function.js.map","import { CholeskyDecomposition, Matrix, inverse } from 'ml-matrix';\nimport gradientFunction from \"./gradient_function.js\";\n/**\n * Builds the (nbParams x nbPoints) Jacobian of the residuals from an analytical\n * model gradient. The residual is `y - model`, so the residual Jacobian is the\n * negative of the model gradient — matching the sign convention produced by the\n * finite-difference `gradientFunction`.\n * @param data - points to fit\n * @param params - current parameter values\n * @param jacobianFunction - returns, for an x, the model partials over params\n */\nfunction analyticalGradient(data, params, jacobianFunction) {\n    const nbParams = params.length;\n    const nbPoints = data.x.length;\n    const ans = Matrix.zeros(nbParams, nbPoints);\n    const gradient = jacobianFunction(params);\n    for (let point = 0; point < nbPoints; point++) {\n        const partials = gradient(data.x[point]);\n        for (let param = 0; param < nbParams; param++) {\n            ans.set(param, point, -partials[param]);\n        }\n    }\n    return ans;\n}\n/**\n * Matrix function over the samples\n *\n * @param data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param evaluatedData - Array of previous evaluated function values\n */\nfunction matrixFunction(data, evaluatedData) {\n    const m = data.x.length;\n    const ans = new Matrix(m, 1);\n    for (let point = 0; point < m; point++) {\n        ans.set(point, 0, data.y[point] - evaluatedData[point]);\n    }\n    return ans;\n}\n/**\n * Iteration for Levenberg-Marquardt\n *\n * @param data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param params - Array of previous parameter values\n * @param damping - Levenberg-Marquardt parameter\n * @param gradientDifference - The step size to approximate the jacobian matrix\n * @param centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param weights - scale the gradient and residual error by weights\n * @param jacobianFunction - optional analytical Jacobian, replaces finite differences when provided\n */\nexport default function step(data, params, damping, gradientDifference, parameterizedFunction, centralDifference, weights, jacobianFunction) {\n    const func = parameterizedFunction(params);\n    const evaluatedData = new Float64Array(data.x.length);\n    for (let i = 0; i < data.x.length; i++) {\n        evaluatedData[i] = func(data.x[i]);\n    }\n    const gradientFunc = jacobianFunction\n        ? analyticalGradient(data, params, jacobianFunction)\n        : gradientFunction(data, evaluatedData, params, gradientDifference, parameterizedFunction, centralDifference);\n    const residualError = matrixFunction(data, evaluatedData);\n    const hessianApproximation = gradientFunc.mmulByTranspose(weights);\n    for (let i = 0; i < params.length; i++) {\n        hessianApproximation.set(i, i, hessianApproximation.get(i, i) + damping);\n    }\n    const jacobianWeightResidualError = gradientFunc.mmul(residualError.scale('row', { scale: weights }));\n    // (damping * I + Jᵀ W J) is symmetric positive-definite for damping > 0, so a\n    // Cholesky solve is faster and more numerically stable than forming the full\n    // inverse and multiplying. Fall back to the inverse only in the rare case the\n    // approximated Hessian is not positive-definite.\n    const cholesky = new CholeskyDecomposition(hessianApproximation);\n    const perturbations = cholesky.isPositiveDefinite()\n        ? cholesky.solve(jacobianWeightResidualError)\n        : inverse(hessianApproximation).mmul(jacobianWeightResidualError);\n    return {\n        perturbations,\n        jacobianWeightResidualError,\n    };\n}\n//# sourceMappingURL=step.js.map","import checkOptions from \"./check_options.js\";\nimport errorCalculation from \"./error_calculation.js\";\nimport step from \"./step.js\";\n/**\n * Curve fitting algorithm\n * @param data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param parameterizedFunction - Takes an array of parameters and returns a function with the independent variable as its sole argument\n * @param options - Options object\n */\nexport function levenbergMarquardt(data, parameterizedFunction, options) {\n    const checkedOptions = checkOptions(data, options);\n    const { checkTimeout, minValues, maxValues, parameters, weightSquare, dampingStepUp, dampingStepDown, maxIterations, errorTolerance, centralDifference, gradientDifference, improvementThreshold, } = checkedOptions;\n    let damping = checkedOptions.damping;\n    const { jacobianFunction } = options;\n    let error = errorCalculation(data, parameters, parameterizedFunction, weightSquare);\n    let optimalError = error;\n    let optimalParameters = parameters.slice();\n    let converged = error <= errorTolerance;\n    let iteration = 0;\n    for (; iteration < maxIterations && !converged; iteration++) {\n        const previousError = error;\n        const { perturbations, jacobianWeightResidualError } = step(data, parameters, damping, gradientDifference, parameterizedFunction, centralDifference, weightSquare, jacobianFunction);\n        for (let k = 0; k < parameters.length; k++) {\n            parameters[k] = Math.min(Math.max(minValues[k], parameters[k] - perturbations.get(k, 0)), maxValues[k]);\n        }\n        error = errorCalculation(data, parameters, parameterizedFunction, weightSquare);\n        if (isNaN(error))\n            break;\n        if (error < optimalError - errorTolerance) {\n            optimalError = error;\n            optimalParameters = parameters.slice();\n        }\n        const improvementMetric = (previousError - error) /\n            perturbations\n                .transpose()\n                .mmul(perturbations.mul(damping).add(jacobianWeightResidualError))\n                .get(0, 0);\n        if (improvementMetric > improvementThreshold) {\n            damping = Math.max(damping / dampingStepDown, 1e-7);\n        }\n        else {\n            damping = Math.min(damping * dampingStepUp, 1e7);\n        }\n        if (checkTimeout()) {\n            throw new Error(`The execution time is over to ${options.timeout} seconds`);\n        }\n        converged = error <= errorTolerance;\n    }\n    return {\n        parameterValues: optimalParameters,\n        parameterError: optimalError,\n        iterations: iteration,\n    };\n}\n//# sourceMappingURL=levenberg_marquardt.js.map","/**\n * Preparata, F. P., & Shamos, M. I. (2012). Computational geometry: an introduction. Springer Science & Business Media.\n * @param {Array} x - The array with x coordinates of the points.\n * @param {Array} y - The array with y coordinates of the points.\n * @return {Array} The indices of the points of anticlockwise lower convex hull\n * @private\n */\nexport default function antiLowerConvexHull(x, y) {\n  if (x.length !== y.length) {\n    throw new RangeError('X and Y vectors has different dimensions');\n  }\n\n  const nbPoints = x.length - 1;\n  if (nbPoints === 0) return [0];\n  if (nbPoints === 1) return [0, 1];\n\n  let currentPoint = 0;\n  let result = new Array(x.length).fill(true);\n  while (true) {\n    const a = currentPoint;\n    const b = moveOn(currentPoint, nbPoints, result);\n    const c = moveOn(moveOn(currentPoint, nbPoints, result), nbPoints, result);\n\n    const det =\n      x[c] * (y[a] - y[b]) + x[a] * (y[b] - y[c]) + x[b] * (y[c] - y[a]);\n\n    const leftTurn = det >= 0;\n\n    if (leftTurn) {\n      currentPoint = b;\n    } else {\n      result[b] = false;\n      currentPoint = moveBack(currentPoint, nbPoints, result);\n    }\n    if (c === nbPoints) break;\n  }\n\n  return result\n    .map((item, index) => (item === false ? false : index))\n    .filter((item) => item !== false);\n}\n\n/**\n * @param {number} currentPoint - The index of the current point to make the move\n * @param {number} nbPoints - The total number of points in the array\n * @param {Array} vector - The array with the points\n * @return {number} the index of the point after the move\n * @private\n */\n\nfunction moveBack(currentPoint, nbPoints, vector) {\n  let counter = currentPoint - 1;\n  while (vector[counter] === false) counter--;\n  return currentPoint === 0 ? nbPoints : counter;\n}\n\nfunction moveOn(currentPoint, nbPoints, vector) {\n  let counter = currentPoint + 1;\n  while (vector[counter] === false) counter++;\n  return currentPoint === nbPoints ? 0 : counter;\n}\n","import { xNorm, xMaxValue, xMinValue } from 'ml-spectra-processing';\n\nimport antiLowerConvexHull from './util/antiLowerConvexHull';\n\n/**\n * Performs a global optimization of required parameters\n * It will return an object containing:\n * - `minFunctionValue`: The minimum value found for the objetive function\n * - `optima`: Array of Array of values for all the variables where the function reach its minimum value\n * - `iterations`: Number of iterations performed in the process\n * - `finalState`: Internal state allowing to continue optimization (initialState)\n * @param {function} objectiveFunction Function to evaluate. It should accept an array of variables\n * @param {Array} lowerBoundaries Array containing for each variable the lower boundary\n * @param {Array} upperBoundaries Array containing for each variable the higher boundary\n * @param {Object} [options={}]\n * @param {number} [options.iterations] - Number of iterations.\n * @param {number} [options.epsilon] - Tolerance to choose best current value.\n * @param {number} [options.tolerance] - Minimum tollerance of the function.\n * @param {number} [options.tolerance2] - Minimum tollerance of the function.\n * @param {Object} [options.initialState={}}] - finalState of previous optimization.\n * @return {Object} {finalState, iterations, minFunctionValue}\n * */\n\nexport default function direct(\n  objectiveFunction,\n  lowerBoundaries,\n  upperBoundaries,\n  options = {},\n) {\n  const {\n    iterations = 50,\n    epsilon = 1e-4,\n    tolerance = 1e-16,\n    tolerance2 = 1e-12,\n    initialState = {},\n  } = options;\n\n  if (\n    objectiveFunction === undefined ||\n    lowerBoundaries === undefined ||\n    upperBoundaries === undefined\n  ) {\n    throw new RangeError('There is something undefined');\n  }\n\n  lowerBoundaries = new Float64Array(lowerBoundaries);\n  upperBoundaries = new Float64Array(upperBoundaries);\n\n  if (lowerBoundaries.length !== upperBoundaries.length) {\n    throw new Error(\n      'Lower bounds and Upper bounds for x are not of the same length',\n    );\n  }\n\n  //-------------------------------------------------------------------------\n  //                        STEP 1. Initialization\n  //-------------------------------------------------------------------------\n  let n = lowerBoundaries.length;\n  let diffBorders = upperBoundaries.map((x, i) => x - lowerBoundaries[i]);\n\n  let {\n    numberOfRectangles = 0,\n    totalIterations = 0,\n    unitaryCoordinates = [new Float64Array(n).fill(0.5)],\n    middlePoint = new Float64Array(n).map((value, index) => {\n      return (\n        lowerBoundaries[index] +\n        unitaryCoordinates[0][index] * diffBorders[index]\n      );\n    }),\n    bestCurrentValue = objectiveFunction(middlePoint),\n    fCalls = 1,\n    smallerDistance = 0,\n    edgeSizes = [new Float64Array(n).fill(0.5)],\n    diagonalDistances = [Math.sqrt(n * 0.5 ** 2)],\n    functionValues = [bestCurrentValue],\n    differentDistances = diagonalDistances,\n    smallerValuesByDistance = [bestCurrentValue],\n    choiceLimit = undefined,\n  } = initialState;\n  if (\n    initialState.originalCoordinates &&\n    initialState.originalCoordinates.length > 0\n  ) {\n    bestCurrentValue = xMinValue(functionValues);\n    choiceLimit =\n      epsilon * Math.abs(bestCurrentValue) > 1e-8\n        ? epsilon * Math.abs(bestCurrentValue)\n        : 1e-8;\n\n    smallerDistance = getMinIndex(\n      functionValues,\n      diagonalDistances,\n      choiceLimit,\n      bestCurrentValue,\n    );\n\n    unitaryCoordinates = initialState.originalCoordinates.slice();\n    for (let j = 0; j < unitaryCoordinates.length; j++) {\n      for (let i = 0; i < lowerBoundaries.length; i++) {\n        unitaryCoordinates[j][i] =\n          (unitaryCoordinates[j][i] - lowerBoundaries[i]) / diffBorders[i];\n      }\n    }\n  }\n\n  let iteration = 0;\n  //-------------------------------------------------------------------------\n  //                          Iteration loop\n  //-------------------------------------------------------------------------\n\n  while (iteration < iterations) {\n    //----------------------------------------------------------------------\n    //  STEP 2. Identify the set S of all potentially optimal rectangles\n    //----------------------------------------------------------------------\n\n    let S1 = [];\n    let idx = differentDistances.findIndex(\n      // eslint-disable-next-line no-loop-func\n      (e) => e === diagonalDistances[smallerDistance],\n    );\n    let counter = 0;\n    for (let i = idx; i < differentDistances.length; i++) {\n      for (let f = 0; f < functionValues.length; f++) {\n        if (\n          (functionValues[f] === smallerValuesByDistance[i]) &\n          (diagonalDistances[f] === differentDistances[i])\n        ) {\n          S1[counter++] = f;\n        }\n      }\n    }\n\n    let optimumValuesIndex, S3;\n    if (differentDistances.length - idx > 1) {\n      let a1 = diagonalDistances[smallerDistance];\n      let b1 = functionValues[smallerDistance];\n      let a2 = differentDistances[differentDistances.length - 1];\n      let b2 = smallerValuesByDistance[differentDistances.length - 1];\n      let slope = (b2 - b1) / (a2 - a1);\n      let constant = b1 - slope * a1;\n      let S2 = new Uint32Array(counter);\n      counter = 0;\n      for (let i = 0; i < S2.length; i++) {\n        let j = S1[i];\n        if (\n          functionValues[j] <=\n          slope * diagonalDistances[j] + constant + tolerance2\n        ) {\n          S2[counter++] = j;\n        }\n      }\n\n      let xHull = [];\n      let yHull = [];\n      for (let i = 0; i < counter; i++) {\n        xHull.push(diagonalDistances[S2[i]]);\n        yHull.push(functionValues[S2[i]]);\n      }\n\n      let lowerIndexHull = antiLowerConvexHull(xHull, yHull);\n\n      S3 = [];\n      for (let i = 0; i < lowerIndexHull.length; i++) {\n        S3.push(S2[lowerIndexHull[i]]);\n      }\n    } else {\n      S3 = S1.slice(0, counter);\n    }\n    optimumValuesIndex = S3;\n    //--------------------------------------------------------------\n    // STEPS 3,5: Select any rectangle j in S\n    //--------------------------------------------------------------\n    for (let k = 0; k < optimumValuesIndex.length; k++) {\n      let j = optimumValuesIndex[k];\n      let largerSide = xMaxValue(edgeSizes[j]);\n      let largeSidesIndex = new Uint32Array(edgeSizes[j].length);\n      counter = 0;\n      for (let i = 0; i < edgeSizes[j].length; i++) {\n        if (Math.abs(edgeSizes[j][i] - largerSide) < tolerance) {\n          largeSidesIndex[counter++] = i;\n        }\n      }\n      let delta = (2 * largerSide) / 3;\n      let bestFunctionValues = [];\n      for (let r = 0; r < counter; r++) {\n        let i = largeSidesIndex[r];\n        let firstMiddleCenter = unitaryCoordinates[j].slice();\n        let secondMiddleCenter = unitaryCoordinates[j].slice();\n        firstMiddleCenter[i] += delta;\n        secondMiddleCenter[i] -= delta;\n        let firstMiddleValue = new Float64Array(firstMiddleCenter.length);\n        let secondMiddleValue = new Float64Array(secondMiddleCenter.length);\n        for (let i = 0; i < firstMiddleCenter.length; i++) {\n          firstMiddleValue[i] =\n            lowerBoundaries[i] + firstMiddleCenter[i] * diffBorders[i];\n          secondMiddleValue[i] =\n            lowerBoundaries[i] + secondMiddleCenter[i] * diffBorders[i];\n        }\n        let firstMinValue = objectiveFunction(firstMiddleValue);\n        let secondMinValue = objectiveFunction(secondMiddleValue);\n        fCalls += 2;\n        bestFunctionValues.push({\n          minValue: Math.min(firstMinValue, secondMinValue),\n          index: r,\n        });\n        // [Math.min(firstMinValue, secondMinValue), r];\n        unitaryCoordinates.push(firstMiddleCenter, secondMiddleCenter);\n        functionValues.push(firstMinValue, secondMinValue);\n      }\n\n      let b = bestFunctionValues.sort((a, b) => a.minValue - b.minValue);\n      for (let r = 0; r < counter; r++) {\n        let u = largeSidesIndex[b[r].index];\n        let ix1 = numberOfRectangles + 2 * (b[r].index + 1) - 1;\n        let ix2 = numberOfRectangles + 2 * (b[r].index + 1);\n        edgeSizes[j][u] = delta / 2;\n        edgeSizes[ix1] = edgeSizes[j].slice();\n        edgeSizes[ix2] = edgeSizes[j].slice();\n        diagonalDistances[j] = xNorm(edgeSizes[j]);\n        diagonalDistances[ix1] = diagonalDistances[j];\n        diagonalDistances[ix2] = diagonalDistances[j];\n      }\n      numberOfRectangles += 2 * counter;\n    }\n\n    //--------------------------------------------------------------\n    //                  Update\n    //--------------------------------------------------------------\n\n    bestCurrentValue = xMinValue(functionValues);\n\n    choiceLimit =\n      epsilon * Math.abs(bestCurrentValue) > 1e-8\n        ? epsilon * Math.abs(bestCurrentValue)\n        : 1e-8;\n\n    smallerDistance = getMinIndex(\n      functionValues,\n      diagonalDistances,\n      choiceLimit,\n      bestCurrentValue,\n      iteration,\n    );\n\n    differentDistances = Array.from(new Set(diagonalDistances));\n    differentDistances = differentDistances.sort((a, b) => a - b);\n\n    smallerValuesByDistance = [];\n    for (let i = 0; i < differentDistances.length; i++) {\n      let minIndex;\n      let minValue = Number.POSITIVE_INFINITY;\n      for (let k = 0; k < diagonalDistances.length; k++) {\n        if (diagonalDistances[k] === differentDistances[i]) {\n          if (functionValues[k] < minValue) {\n            minValue = functionValues[k];\n            minIndex = k;\n          }\n        }\n      }\n      smallerValuesByDistance.push(functionValues[minIndex]);\n    }\n\n    let currentMin = [];\n    for (let j = 0; j < functionValues.length; j++) {\n      if (functionValues[j] === bestCurrentValue) {\n        let temp = [];\n        for (let i = 0; i < lowerBoundaries.length; i++) {\n          temp.push(\n            lowerBoundaries[i] + unitaryCoordinates[j][i] * diffBorders[i],\n          );\n        }\n        currentMin.push(temp);\n      }\n    }\n    iteration += 1;\n  }\n  //--------------------------------------------------------------\n  //                  Saving results\n  //--------------------------------------------------------------\n\n  let result = {};\n  result.minFunctionValue = bestCurrentValue;\n  result.iterations = iteration;\n  let originalCoordinates = [];\n  for (let j = 0; j < numberOfRectangles + 1; j++) {\n    let pair = [];\n    for (let i = 0; i < lowerBoundaries.length; i++) {\n      pair.push(lowerBoundaries[i] + unitaryCoordinates[j][i] * diffBorders[i]);\n    }\n    originalCoordinates.push(pair);\n  }\n\n  result.finalState = {\n    numberOfRectangles,\n    totalIterations: (totalIterations += iterations),\n    originalCoordinates,\n    middlePoint,\n    fCalls,\n    smallerDistance,\n    edgeSizes,\n    diagonalDistances,\n    functionValues,\n    differentDistances,\n    smallerValuesByDistance,\n    choiceLimit,\n  };\n\n  let minimizer = [];\n  for (let i = 0; i < functionValues.length; i++) {\n    if (functionValues[i] === bestCurrentValue) {\n      minimizer.push(originalCoordinates[i]);\n    }\n  }\n\n  result.optima = minimizer;\n  return result;\n}\n\nfunction getMinIndex(\n  functionValues,\n  diagonalDistances,\n  choiceLimit,\n  bestCurrentValue,\n) {\n  let item = [];\n  for (let i = 0; i < functionValues.length; i++) {\n    item[i] =\n      Math.abs(functionValues[i] - (bestCurrentValue + choiceLimit)) /\n      diagonalDistances[i];\n  }\n  const min = xMinValue(item);\n  let result = item.findIndex((x) => x === min);\n  return result;\n}\n","import direct from 'ml-direct';\n/**\n * Run a direct optimization on the provided data using a sum-of-shapes model.\n * @param data - The observed x/y data to fit.\n * @param sumOfShapes - A function returning the model prediction for a given parameter vector.\n * @param options - Optimization bounds and solver options.\n * @returns The optimized parameter values, the final objective error, and the number of iterations.\n */\nexport function directOptimization(data, sumOfShapes, options) {\n    const { minValues, maxValues, maxIterations, epsilon, tolerance, tolerance2, initialState, } = options;\n    const objectiveFunction = getObjectiveFunction(data, sumOfShapes);\n    const result = direct(objectiveFunction, \n    // direct internally converts ArrayLike to Float64Array,\n    // so we can safely cast minValues and maxValues to number[]\n    minValues, maxValues, {\n        iterations: maxIterations,\n        epsilon,\n        tolerance,\n        tolerance2,\n        initialState,\n    });\n    const { optima, minFunctionValue, iterations } = result;\n    return {\n        parameterError: minFunctionValue,\n        iterations,\n        parameterValues: optima[0],\n    };\n}\nfunction getObjectiveFunction(data, sumOfShapes) {\n    const { x, y } = data;\n    const nbPoints = x.length;\n    return (parameters) => {\n        const fct = sumOfShapes(parameters);\n        let error = 0;\n        for (let i = 0; i < nbPoints; i++) {\n            error += (y[i] - fct(x[i])) ** 2;\n        }\n        return error;\n    };\n}\n//# sourceMappingURL=directOptimization.js.map","import { levenbergMarquardt } from 'ml-levenberg-marquardt';\nimport { directOptimization } from \"./wrappers/directOptimization.js\";\n/**\n * Algorithm to select the method.\n * @param optimizationOptions - Optimization options\n * @returns - The algorithm and optimization options\n */\nexport function selectMethod(optimizationOptions = {}) {\n    const { kind = 'lm', options } = optimizationOptions;\n    switch (kind) {\n        case 'lm':\n        case 'levenbergMarquardt':\n            return {\n                algorithm: levenbergMarquardt,\n                optimizationOptions: {\n                    damping: 1.5,\n                    maxIterations: 100,\n                    errorTolerance: 1e-8,\n                    ...options,\n                },\n            };\n        case 'direct': {\n            return {\n                algorithm: directOptimization,\n                optimizationOptions: {\n                    maxIterations: 20,\n                    epsilon: 1e-4,\n                    tolerance: 1e-16,\n                    tolerance2: 1e-12,\n                    initialState: {},\n                    ...options,\n                },\n            };\n        }\n        default:\n            throw new Error(`Unknown fitting algorithm`);\n    }\n}\n//# sourceMappingURL=selectMethod.js.map","import { xMaxAbsoluteValue } from 'ml-spectra-processing';\nimport { getSumOfShapes } from \"./shapes/getSumOfShapes.js\";\nimport { buildOptimizationLayout } from \"./util/buildOptimizationLayout.js\";\nimport { getFixedParametersResult } from \"./util/getFixedParametersResult.js\";\nimport { getInternalPeaks } from \"./util/internalPeaks/getInternalPeaks.js\";\nimport { reconstructPeaks } from \"./util/reconstructPeaks.js\";\nimport { selectMethod } from \"./util/selectMethod.js\";\n/**\n * Fits a set of points to the sum of a set of bell functions.\n * @param data - An object containing the x and y data to be fitted.\n * @param peaks - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param options - Options for optimize\n * @returns - An object with fitting error and the list of optimized parameters { parameters: [ {x, y, width} ], error } if the kind of shape is pseudoVoigt mu parameter is optimized.\n */\nexport function optimize(data, peaks, options = {}) {\n    // rescale data so the maximum Y value becomes 1\n    const max = xMaxAbsoluteValue(data.y);\n    const yScale = max === 0 ? 1 : max;\n    const internalPeaks = getInternalPeaks(peaks, yScale, options);\n    // need to rescale what is related to Y\n    const normalizedY = new Float64Array(data.y.length);\n    for (let i = 0; i < data.y.length; i++) {\n        normalizedY[i] = data.y[i] / yScale;\n    }\n    const optimizationLayout = buildOptimizationLayout(internalPeaks, peaks, options, yScale);\n    const { freeIndices, variableMin, variableMax, variableInit, variableGrad, variables, } = optimizationLayout;\n    const { algorithm, optimizationOptions } = selectMethod(options.optimization);\n    const baseSumOfShapes = getSumOfShapes(internalPeaks);\n    const sumOfShapesForVariables = (variableValues) => {\n        return baseSumOfShapes(optimizationLayout.variableToPeakValues(variableValues));\n    };\n    if (freeIndices.length === 0) {\n        return getFixedParametersResult(internalPeaks, normalizedY, data.x, optimizationLayout.variableToPeakValues(variableInit), baseSumOfShapes, yScale);\n    }\n    // prepare arrays to pass to the algorithm (reduced if needed)\n    let minValues;\n    let maxValues;\n    let initialValues;\n    let gradientDifferences;\n    let sumOfShapesToUse = sumOfShapesForVariables;\n    if (freeIndices.length === variables.length) {\n        // nothing to reduce\n        minValues = variableMin;\n        maxValues = variableMax;\n        initialValues = variableInit;\n        gradientDifferences = variableGrad;\n    }\n    else {\n        // wrapper that maps reduced (free) parameters into the full parameter vector\n        const sumOfShapesForReduced = (reducedParameters) => {\n            const full = new Float64Array(variables.length);\n            full.set(variableInit);\n            for (let k = 0; k < freeIndices.length; k++) {\n                full[freeIndices[k]] = reducedParameters[k];\n            }\n            return sumOfShapesForVariables(full);\n        };\n        minValues = new Float64Array(freeIndices.length);\n        maxValues = new Float64Array(freeIndices.length);\n        initialValues = new Float64Array(freeIndices.length);\n        gradientDifferences = new Float64Array(freeIndices.length);\n        for (let j = 0; j < freeIndices.length; j++) {\n            const i = freeIndices[j];\n            minValues[j] = variableMin[i];\n            maxValues[j] = variableMax[i];\n            initialValues[j] = variableInit[i];\n            gradientDifferences[j] = variableGrad[i];\n        }\n        sumOfShapesToUse = sumOfShapesForReduced;\n    }\n    const fitted = algorithm({ x: data.x, y: normalizedY }, sumOfShapesToUse, {\n        minValues,\n        maxValues,\n        initialValues,\n        gradientDifference: gradientDifferences,\n        ...optimizationOptions,\n    });\n    let fittedVariableValues;\n    if (freeIndices.length === variables.length) {\n        fittedVariableValues = fitted.parameterValues;\n    }\n    else {\n        const full = variableInit.slice();\n        for (let k = 0; k < freeIndices.length; k++) {\n            full[freeIndices[k]] = fitted.parameterValues[k];\n        }\n        fittedVariableValues = full;\n    }\n    const fittedValues = optimizationLayout.variableToPeakValues(fittedVariableValues);\n    return {\n        error: fitted.parameterError,\n        iterations: fitted.iterations,\n        peaks: reconstructPeaks(internalPeaks, fittedValues, yScale),\n    };\n}\n//# sourceMappingURL=index.js.map","import { getShape1D } from 'ml-peak-shape-generator';\n/**\n * Add a `shape` property to peaks that do not have one.\n * If a peak already has a `shape` but no `fwhm`, the FWHM is computed from `peak.width`.\n * @param peaks - Peaks with a `width` property.\n * @param options - Shape options.\n * @returns A peak list where every peak has a `shape` property.\n */\nexport function addMissingShape(peaks, options = {}) {\n    const { shape = { kind: 'gaussian' }, output = structuredClone(peaks) } = options;\n    const defaultShapeInstance = getShape1D(shape);\n    return output.map((peak) => {\n        if (hasShape(peak)) {\n            if (!('fwhm' in peak.shape)) {\n                peak.shape.fwhm = getShape1D(peak.shape).widthToFWHM(peak.width);\n            }\n            return peak;\n        }\n        return {\n            ...peak,\n            shape: {\n                fwhm: defaultShapeInstance.widthToFWHM(peak.width),\n                ...shape,\n            },\n        };\n    });\n}\nfunction hasShape(peak) {\n    return 'shape' in peak;\n}\n//# sourceMappingURL=addMissingShape.js.map","/**\n * Splits a group of peaks into smaller subgroups whose size is approximately\n * limited by `maxNumberOfPeaks`.\n *\n * If the group contains more peaks than allowed, the function identifies the\n * largest normalized gaps between adjacent peaks and uses them as split points.\n *\n * The gap score is computed as:\n *\n * `score = distanceBetweenCenters / averagePeakWidth`\n *\n * where:\n * - `distanceBetweenCenters = peak[i + 1].x - peak[i].x`\n * - `averagePeakWidth = (peak[i].width + peak[i + 1].width) / 2`\n *\n * Larger scores indicate that two neighboring peaks are well separated\n * relative to their widths, making them good candidates for dividing the\n * fitting problem into independent subgroups.\n *\n * The algorithm:\n * 1. Computes the number of cuts required.\n * 2. Scores every boundary between adjacent peaks.\n * 3. Selects the boundaries with the largest scores.\n * 4. Splits the original group at those boundaries.\n * @param group - Ordered collection of peaks. Peaks should be sorted by\n * increasing `x` position before calling this function.\n * @param maxNumberOfPeaks - Desired maximum number of peaks per subgroup.\n * If the group size is less than or equal to this value, no splitting occurs.\n * @returns An array of peak subgroups. The returned groups preserve the\n * original peak ordering.\n */\nexport function splitGroup(group, maxNumberOfPeaks) {\n    const groups = [group];\n    while (true) {\n        const index = groups.findIndex((g) => g.length > maxNumberOfPeaks);\n        if (index === -1)\n            break;\n        const current = groups[index];\n        const cut = findBestCut(current);\n        groups.splice(index, 1, current.slice(0, cut), current.slice(cut));\n    }\n    return groups;\n}\nfunction findBestCut(group) {\n    let bestScore = -Infinity;\n    const candidates = [];\n    for (let i = 1; i < group.length; i++) {\n        const score = (group[i].x - group[i - 1].x) /\n            ((group[i].width + group[i - 1].width) / 2);\n        if (score > bestScore) {\n            bestScore = score;\n            candidates.length = 0;\n        }\n        if (score === bestScore) {\n            candidates.push({\n                index: i,\n                balance: Math.abs(i - (group.length - i)),\n            });\n        }\n    }\n    let bestScored = candidates[0];\n    for (const candidate of candidates) {\n        if (candidate.balance < bestScored.balance) {\n            bestScored = candidate;\n        }\n    }\n    return bestScored.index;\n}\n//# sourceMappingURL=splitGroup.js.map","import { splitGroup } from \"./splitGroup.js\";\n/**\n * Group peaks based on a width-aware factor.\n * Only `x` and `width` are used, so the current implementation does not take\n * peak asymmetry into account.\n * @param peaks - Peaks with `x` and `width` properties.\n * @param options - Grouping options.\n * @returns Groups of peaks sorted by ascending `x`.\n */\nexport function groupPeaks(peaks, options = {}) {\n    if (peaks.length === 0)\n        return [];\n    const { groupingFactor = 1, maxNumberOfPeaks = 15 } = options;\n    const sortedPeaks = peaks.toSorted((a, b) => a.x - b.x);\n    let previousPeak = sortedPeaks[0];\n    let currentGroup = [previousPeak];\n    const groups = [currentGroup];\n    for (let i = 1; i < sortedPeaks.length; i++) {\n        const peak = sortedPeaks[i];\n        if ((peak.x - previousPeak.x) / ((peak.width + previousPeak.width) / 2) <=\n            groupingFactor) {\n            currentGroup.push(peak);\n        }\n        else {\n            currentGroup = [peak];\n            groups.push(currentGroup);\n        }\n        previousPeak = peak;\n    }\n    if (maxNumberOfPeaks !== undefined) {\n        return groups.flatMap((group) => group.length > maxNumberOfPeaks\n            ? splitGroup(group, maxNumberOfPeaks)\n            : [group]);\n    }\n    return groups;\n}\n//# sourceMappingURL=groupPeaks.js.map","import { getShape1D } from 'ml-peak-shape-generator';\nimport { optimize } from 'ml-spectra-fitting';\nimport { xGetFromToIndex } from 'ml-spectra-processing';\nimport { addMissingShape } from \"../utils/addMissingShape.js\";\nimport { groupPeaks } from \"../utils/groupPeaks.js\";\n/**\n * Optimize the position (x), max intensity (y), full width at half maximum (fwhm)\n * and the ratio of gaussian contribution (mu) if it's required.\n * It currently supports three kind of shapes: gaussian, lorentzian and pseudovoigt.\n * Returns both the optimized peaks and per-group diagnostic logs.\n * @param data - An object containing the x and y data to be fitted.\n * @param peakList - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param options - Optimization options.\n * @returns An object with the optimized peaks and the per-group logs.\n */\nexport function optimizePeaksWithLogs(data, peakList, options = {}) {\n    const { fromTo = {}, shape = { kind: 'gaussian' }, maxNumberOfPeaks, groupingFactor, factorLimits = 2, parameters, optimization = {\n        kind: 'lm',\n        options: {\n            timeout: 10,\n        },\n    }, } = options;\n    // Optimize peaks in groups: fitting everything at once would be too slow and\n    // have too many free parameters.\n    const groups = groupPeaks(peakList, {\n        groupingFactor,\n        maxNumberOfPeaks,\n    });\n    const logs = [];\n    const results = [];\n    for (const peakGroup of groups) {\n        const start = Date.now();\n        const peaks = addMissingShape(peakGroup, { shape });\n        const firstPeak = peaks[0];\n        const lastPeak = peaks.at(-1);\n        const { from = firstPeak.x - firstPeak.width * factorLimits, to = lastPeak.x + lastPeak.width * factorLimits, } = fromTo;\n        const { fromIndex, toIndex } = xGetFromToIndex(data.x, { from, to });\n        const x = data.x instanceof Float64Array\n            ? data.x.subarray(fromIndex, toIndex)\n            : data.x.slice(fromIndex, toIndex);\n        const y = data.y instanceof Float64Array\n            ? data.y.subarray(fromIndex, toIndex)\n            : data.y.slice(fromIndex, toIndex);\n        const log = {\n            range: { from, to },\n            parameters: { optimization, parameters },\n            groupSize: peakGroup.length,\n            time: Date.now() - start,\n        };\n        if (x.length > 5) {\n            const { iterations, error, peaks: optimizedPeaks, } = optimize({ x, y }, peaks, {\n                shape,\n                parameters,\n                optimization,\n            });\n            for (let i = 0; i < peaks.length; i++) {\n                results.push({\n                    ...optimizedPeaks[i],\n                    width: getShape1D(peaks[i].shape).fwhmToWidth(optimizedPeaks[i].shape.fwhm),\n                });\n            }\n            logs.push({\n                ...log,\n                iterations,\n                error,\n                message: 'optimization successful',\n            });\n        }\n        else {\n            results.push(...peaks);\n            logs.push({\n                ...log,\n                iterations: 0,\n                message: 'x length too small for optimization',\n            });\n        }\n    }\n    return { logs, optimizedPeaks: results };\n}\n//# sourceMappingURL=optimizePeaksWithLogs.js.map","import { optimizePeaksWithLogs } from \"./optimizePeaksWithLogs.js\";\n/**\n * Optimize the position (x), max intensity (y), full width at half maximum (fwhm)\n * and the ratio of gaussian contribution (mu) if it's required.\n * @param data - An object containing the x and y data to be fitted.\n * @param peakList - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param options - Optimization options.\n * @returns The optimized peaks.\n */\nexport function optimizePeaks(data, peakList, options = {}) {\n    return optimizePeaksWithLogs(data, peakList, options).optimizedPeaks;\n}\n//# sourceMappingURL=optimizePeaks.js.map","/**\n * Assign a random UUID to every peak that does not already have an `id`.\n * @param peaks - Peaks possibly missing an `id`.\n * @param options - Options.\n * @param options.output - Destination array. Defaults to a deep clone of `peaks`.\n * @returns A peak list where every peak has an `id`.\n */\nexport function addMissingIDs(peaks, options = {}) {\n    const { output = structuredClone(peaks) } = options;\n    for (const peak of output) {\n        if (!('id' in peak)) {\n            peak.id = crypto.randomUUID();\n        }\n    }\n    return output;\n}\n//# sourceMappingURL=addMissingIDs.js.map","import { addMissingIDs } from \"../utils/addMissingIDs.js\";\nimport { addMissingShape } from \"../utils/addMissingShape.js\";\nimport { optimizePeaksWithLogs } from \"./optimizePeaksWithLogs.js\";\n/**\n * Join peaks that seem to belong to a broad signal into a single broad peak.\n * @param peakList - Detected peaks, possibly containing fragments of a broad signal.\n * @param options - Join options.\n * @returns The peak list with broad fragments fitted as a single peak.\n */\nexport function joinBroadPeaks(peakList, options = {}) {\n    const { shape = { kind: 'gaussian' }, optimization = { kind: 'lm', options: { timeout: 10 } }, broadWidth = 0.25, broadRatio = 0.0025, } = options;\n    let max = 0;\n    let maxI = 0;\n    let count = 1;\n    const broadLines = [];\n    if (peakList.length < 2) {\n        return addMissingIDs(addMissingShape(peakList.map(getGSDPeakOptimizedStructure), { shape }));\n    }\n    let maxDdy = Math.abs(peakList[0].ddY);\n    for (let i = 1; i < peakList.length; i++) {\n        const absDdy = Math.abs(peakList[i].ddY);\n        if (absDdy > maxDdy)\n            maxDdy = absDdy;\n    }\n    const newPeaks = [];\n    for (const peak of peakList) {\n        if (Math.abs(peak.ddY) <= broadRatio * maxDdy) {\n            broadLines.push(peak);\n        }\n        else {\n            newPeaks.push(getGSDPeakOptimizedStructure(peak));\n        }\n    }\n    // Sentinel: forces the final group to be flushed by the `else` branch below.\n    //@ts-expect-error Sentinel peak, x=+Infinity guarantees the distance check fails.\n    broadLines.push({ x: Number.MAX_VALUE, y: 0 });\n    let candidates = {\n        x: [broadLines[0].x],\n        y: [broadLines[0].y],\n    };\n    let indexes = [0];\n    for (let i = 1; i < broadLines.length; i++) {\n        if (Math.abs(broadLines[i - 1].x - broadLines[i].x) < broadWidth) {\n            candidates.x.push(broadLines[i].x);\n            candidates.y.push(broadLines[i].y);\n            if (broadLines[i].y > max) {\n                max = broadLines[i].y;\n                maxI = i;\n            }\n            indexes.push(i);\n            count++;\n        }\n        else {\n            if (count > 2) {\n                const initialWidth = Math.abs(candidates.x.at(-1) - candidates.x[0]);\n                const { logs, optimizedPeaks } = optimizePeaksWithLogs(candidates, [\n                    {\n                        id: crypto.randomUUID(),\n                        x: broadLines[maxI].x,\n                        y: max,\n                        width: initialWidth,\n                        parameters: {\n                            width: { max: initialWidth * 4, min: initialWidth * 0.8 },\n                        },\n                    },\n                ], { shape: { kind: 'pseudoVoigt' }, optimization });\n                max = 0;\n                maxI = 0;\n                const log = logs.find((l) => l.message === 'optimization successful');\n                if (log?.error !== undefined && log.error < 0.2) {\n                    newPeaks.push(optimizedPeaks[0]);\n                }\n                else {\n                    pushBackPeaks(broadLines, indexes, newPeaks);\n                }\n            }\n            else {\n                pushBackPeaks(broadLines, indexes, newPeaks);\n            }\n            candidates = { x: [broadLines[i].x], y: [broadLines[i].y] };\n            indexes = [i];\n            max = broadLines[i].y;\n            maxI = i;\n            count = 1;\n        }\n    }\n    newPeaks.sort((a, b) => a.x - b.x);\n    return addMissingIDs(newPeaks, { output: newPeaks });\n}\nfunction pushBackPeaks(broadLines, indexes, peaks) {\n    for (const index of indexes) {\n        peaks.push(getGSDPeakOptimizedStructure(broadLines[index]));\n    }\n}\nfunction getGSDPeakOptimizedStructure(peak) {\n    const { id, shape, x, y, width } = peak;\n    const newPeak = {\n        x,\n        y,\n        width,\n        shape,\n    };\n    if (id)\n        newPeak.id = id;\n    return newPeak;\n}\n//# sourceMappingURL=joinBroadPeaks.js.map","import { getShape1D } from 'ml-peak-shape-generator';\n/**\n * Enlarge peaks while preventing overlap between them.\n * A typical application is chromatography peak picking.\n * We should not make the hypothesis that `x` is equidistant, because peaks\n * may not be symmetric once we add the `from` and `to` properties.\n * @param peakList - Peaks to broaden.\n * @param options - Broadening options.\n * @returns The broadened peaks.\n */\nexport function broadenPeaks(peakList, options = {}) {\n    const { factor = 2, overlap = false } = options;\n    const peaks = mapPeaks(peakList, factor);\n    if (!overlap) {\n        for (let i = 0; i < peaks.length - 1; i++) {\n            const peak = peaks[i];\n            const nextPeak = peaks[i + 1];\n            if (peak.to.x > nextPeak.from.x) {\n                // we do it proportional to the width of the peaks\n                peak.to.x =\n                    (peak.width / (nextPeak.width + peak.width)) * (nextPeak.x - peak.x) +\n                        peak.x;\n                nextPeak.from.x = peak.to.x;\n            }\n        }\n    }\n    for (const peak of peaks) {\n        peak.width = peak.to.x - peak.from.x;\n        if (peak.shape) {\n            const { shape, width } = peak;\n            if (shape.fwhm !== undefined) {\n                const shapeFct = getShape1D(shape);\n                shape.fwhm = shapeFct.widthToFWHM(width);\n            }\n        }\n    }\n    return peaks;\n}\nfunction mapPeaks(peaks, factor) {\n    return peaks.map((peak) => {\n        const { id, shape, x, y, index, inflectionPoints } = peak;\n        const xFrom = x - (x - inflectionPoints.from.x) * factor;\n        const xTo = x + (inflectionPoints.to.x - x) * factor;\n        let result = {\n            x,\n            y,\n            index,\n            width: xTo - xFrom,\n            from: { x: xFrom },\n            to: { x: xTo },\n        };\n        if (id) {\n            result = { ...result, id };\n        }\n        if (shape) {\n            result = { ...result, shape };\n        }\n        return result;\n    });\n}\n//# sourceMappingURL=broadenPeaks.js.map","import { getShape1D } from 'ml-peak-shape-generator';\n/**\n * Append a `shape` property (including `fwhm`) to every peak.\n * @param peaks - Peaks with a `width` property.\n * @param options - Shape options.\n * @returns A peak list where every peak has a `shape` property.\n */\nexport function setShape(peaks, options = {}) {\n    const { shape = { kind: 'gaussian' }, output = structuredClone(peaks) } = options;\n    const shapeInstance = getShape1D(shape);\n    return output.map((peak) => ({\n        ...peak,\n        shape: { ...shape, fwhm: shapeInstance.widthToFWHM(peak.width) },\n    }));\n}\n//# sourceMappingURL=setShape.js.map"],"names":["toString","Object","prototype","isAnyArray","value","tag","call","endsWith","includes","sgg","ys","xs","options","windowSize","derivative","polynomial","Number","isInteger","RangeError","TypeError","undefined","length","console","warn","half","Math","floor","np","ans","Float64Array","weights","fullWeights","hs","constantH","i","wg1","wg2","d1","d2","l","getHs","wg","d","h","center","count","gramPoly","m","k","s","Grampoly","genFact","a","b","gf","j","weight","t","n","sum","Array","xMedian","input","exact","fromIndex","toIndex","array","slice","middleIndex","calcMiddle","median","quickSelect","medianNext","low","high","middle","currentLow","currentHigh","swap","temp","xCheck","minLength","Error","xFindClosestIndex","target","sorted","abs","index","diff","POSITIVE_INFINITY","currentDiff","xGetFromToIndex","x","from","to","CholeskyDecomposition","matrix","Matrix","inverse","xMean","sumValue","xMaxValue","maxValue","xMinValue","minValue","xIsEquallySpaced","tolerance","maxDx","minDx","MAX_SAFE_INTEGER","absoluteDifference","xIsMonotonic","at","xMaxAbsoluteValue","xMedianAbsoluteDeviation","averageDeviations","mad","xMinMaxValues","min","max","xNoiseStandardDeviation","sd","xNorm","result","element","sqrt","getMinMaxIntervalsDy","y","dY","dX","lastMax","lastMin","intervalL","intervalR","push","tryMatchOneIntervalWithMinData","lastK","minData","yThreshold","intervalWidth","intervalCenter","yData","minDistance","possible","newLastIndex","centerIndex","deltaX","currentDistance","lastIndex","autoAlgorithm","ddY","minddY","crossDy","peaks","lastJ","yIndex","match","width","id","crypto","randomUUID","inflectionPoints","getPeakFromIntervals","xGetCrossZeroPoints","isLessAndGreaterThanZero","back","next","firstDerivative","secondDerivative","optimizeTop","data","peak","currentIndex","alpha","log10","beta","gamma","p","xCurrent","xPrevious","gsd","noiseLevel","sgOptions","smoothY","maxCriteria","maxAbsoluteRatio","minMaxRatio","realTopDetection","peakDetectionAlgorithm","isEquallySpaced","noiseInfo","maxAbsoluteValue","xValue","minY","maxY","peakData","sort","GAUSSIAN_EXP_FACTOR","LN2","GAUSSIAN_CUTOFF","ROOT_PI_OVER_LN2","PI","ROOT_LN2","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","erfinv","ln1MinusXSqrd","log","lnEtcBy2Plus2","firstSqrt","secondSqrt","Gaussian","kind","fwhm","constructor","gaussianWidthToFWHM","fwhmToWidth","gaussianFwhmToWidth","widthToFWHM","fct","gaussianFct","getArea","height","calculateGaussianHeight","getGaussianArea","getFactor","area","getGaussianFactor","getData","getGaussianData","calculateHeight","getParameters","toJSON","dx","dFwhm","gaussianDerivative","parameters","exp","shape","factor","ceil","Lorentzian","lorentzianFwhmToWidth","lorentzianWidthToFWHM","lorentzianFct","getLorentzianArea","getLorentzianFactor","getLorentzianData","calculateLorentzianHeight","lorentzianDerivative","denominator","lorentzianQuantile","tan","halfResidual","LorentzianDispersive","lorentzianDispersiveFct","getLorentzianDispersiveData","lorentzianDispersiveDerivative","pseudoVoigtFindFactor","pTarget","mu","tol","maxIter","lo","hi","it","pPseudoVoigt","mid","val","erf","sign","a1","a2","a3","a4","a5","sqrtLn2","pGaussian","pLorentz","atan","PseudoVoigt","pseudoVoigtFwhmToWidth","pseudoVoigtWidthToFWHM","pseudoVoigtFct","getPseudoVoigtArea","getPseudoVoigtFactor","calculatePseudoVoigtHeight","getPseudoVoigtData","dMu","pseudoVoigtDerivative","lorentzian","z","e","lorentz","dEdt","dLdt","dEdfwhm","dLdfwhm","PseudoVoigtTCH","_fwhmG","_fwhmL","_fwhm","_mu","_lorentzianWidthFraction","fwhmG","fwhmL","lorentzianWidthFraction","effectiveFwhm","computeEffectiveWidth","lorentzianFraction","gaussianWidthFraction","dFwhmG","dFwhmL","pseudoVoigtTCHDerivative","w","dwDfwhmG","dwDfwhmL","dFwhmDfwhmG","dFwhmDfwhmL","dLorentzianFractionDfwhmG","dLorentzianFractionDfwhmL","dPolyDfraction","dMuDfwhmG","dMuDfwhmL","denominator2","fraction","f","df","q","g","GeneralizedLorentzian","generalizedLorentzianFwhmToWidth","generalizedLorentzianWidthToFWHM","generalizedLorentzianFct","getGeneralizedLorentzianArea","getGeneralizedLorentzianFactor","getGeneralizedLorentzianData","calculateGeneralizedLorentzianHeight","dGamma","generalizedLorentzianDerivative","u","rational","dLorentzianDu","dRationalDu","dFctDu","duDx","duDfwhm","generalizedLorentzianQuantile","SplitGaussian","fwhmLow","fwhmHigh","ratio","splitGaussianFct","calculateSplitGaussianHeight","getSplitGaussianArea","getSplitGaussianData","dFwhmLow","dFwhmHigh","splitGaussianDerivative","getShape1D","getSumOfShapes","internalPeaks","sumOfShapes","shapeFctKey","shapeFct","totalY","peakX","assert","message","buildOptimizationLayout","yScale","slots","buildParameterSlots","variables","buildOptimizationVariables","linkedParameters","variableMin","variableMax","variableInit","variableGrad","freeIndices","variable","init","gradientDifference","optimize","variableToPeakValues","variableValues","actualValues","variableValue","members","member","actualIndex","offset","peakIndex","internalPeak","parameter","peakId","propertiesValues","getOptimizeFlag","groupedActualIndices","Set","slotLookup","Map","idToIndices","slot","set","getSlotKey","indices","get","linkedParameter","buildLinkedVariable","has","sortKey","map","_sortKey","resolvedMembers","resolveLinkedSlot","String","getOffset","memberActualIndices","add","firstMember","sharedMin","NEGATIVE_INFINITY","sharedMax","sharedInitCandidates","variableBounds","getMemberVariableBounds","resolvePeakIndexById","size","isFinite","transformedMin","transformedMax","optimizeFlag","perPeakParam","globalParam","reconstructPeaks","newPeaks","newPeak","getFixedParametersResult","normalizedY","globalInit","baseSumOfShapes","error","iterations","DefaultParameters","peakShape","properties","getInternalPeaks","originalPeak","normalizedPeak","propertiesValuesInternal","property","propertyValue","getNormalizedValue","generalParameterValue","defaultParameterValues","checkOptions","timeout","initialValues","damping","dampingStepUp","dampingStepDown","maxIterations","errorTolerance","centralDifference","improvementThreshold","minValues","maxValues","parLen","fill","MIN_SAFE_INTEGER","gradientDifferenceArray","getGradientDifferenceArray","filler","getFiller","checkTimeout","getCheckTimeout","weightSquare","_","dataLength","endTime","Date","now","errorCalculation","parameterizedFunction","func","gradientFunction","evaluatedData","params","paramFunction","nbParams","nbPoints","zeros","rowIndex","param","delta","auxParams","funcParam","point","funcParam2","analyticalGradient","jacobianFunction","gradient","partials","matrixFunction","step","gradientFunc","residualError","hessianApproximation","mmulByTranspose","jacobianWeightResidualError","mmul","scale","cholesky","perturbations","isPositiveDefinite","solve","levenbergMarquardt","checkedOptions","optimalError","optimalParameters","converged","iteration","previousError","isNaN","improvementMetric","transpose","mul","parameterValues","parameterError","antiLowerConvexHull","currentPoint","moveOn","c","det","leftTurn","moveBack","item","filter","vector","counter","direct","objectiveFunction","lowerBoundaries","upperBoundaries","epsilon","tolerance2","initialState","diffBorders","numberOfRectangles","totalIterations","unitaryCoordinates","middlePoint","bestCurrentValue","fCalls","smallerDistance","edgeSizes","diagonalDistances","functionValues","differentDistances","smallerValuesByDistance","choiceLimit","originalCoordinates","getMinIndex","S1","idx","findIndex","optimumValuesIndex","S3","b1","b2","slope","constant","S2","Uint32Array","xHull","yHull","lowerIndexHull","largerSide","largeSidesIndex","bestFunctionValues","r","firstMiddleCenter","secondMiddleCenter","firstMiddleValue","secondMiddleValue","firstMinValue","secondMinValue","ix1","ix2","minIndex","minFunctionValue","pair","finalState","minimizer","optima","directOptimization","getObjectiveFunction","selectMethod","optimizationOptions","algorithm","optimizationLayout","optimization","sumOfShapesForVariables","gradientDifferences","sumOfShapesToUse","sumOfShapesForReduced","reducedParameters","full","fitted","fittedVariableValues","fittedValues","addMissingShape","output","structuredClone","defaultShapeInstance","hasShape","splitGroup","group","maxNumberOfPeaks","groups","current","cut","findBestCut","splice","bestScore","Infinity","candidates","score","balance","bestScored","candidate","groupPeaks","groupingFactor","sortedPeaks","toSorted","previousPeak","currentGroup","flatMap","optimizePeaksWithLogs","peakList","fromTo","factorLimits","logs","results","peakGroup","start","firstPeak","lastPeak","subarray","range","groupSize","time","optimizedPeaks","optimizePeaks","addMissingIDs","joinBroadPeaks","broadWidth","broadRatio","maxI","broadLines","getGSDPeakOptimizedStructure","maxDdy","absDdy","MAX_VALUE","indexes","initialWidth","find","pushBackPeaks","broadenPeaks","overlap","mapPeaks","nextPeak","xFrom","xTo","setShape","shapeInstance"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ICHO,MAAM2F,qBAAqB,GAAGC,uBAA4B;IAM1D,MAAMC,MAAM,GAAGD,QAAa;AAqBpBA,YAAc,CAACC,MAAM,GAAGD,QAAc,CAACC,MAAM,GAAGD,QAAa;IAErE,MAAME,OAAO,GAAGF,SAAc;;IC3BrC;;;;;IAKM,SAAUG,KAAKA,CACnBjC,KAAkB,EAClBtD,OAAA,GAAkC,EAAE,EAAA;MAEpCoE,MAAM,CAACd,KAAK,CAAC;MACb,MAAM;QAAEF,SAAS;IAAEC,IAAAA;IAAO,GAAE,GAAG0B,eAAe,CAACzB,KAAK,EAAEtD,OAAO,CAAC;IAE9D,EAAA,IAAIwF,QAAQ,GAAGlC,KAAK,CAACF,SAAS,CAAC;IAE/B,EAAA,KAAK,IAAI9B,CAAC,GAAG8B,SAAS,GAAG,CAAC,EAAE9B,CAAC,IAAI+B,OAAO,EAAE/B,CAAC,EAAE,EAAE;IAC7CkE,IAAAA,QAAQ,IAAIlC,KAAK,CAAChC,CAAC,CAAC;IACtB,EAAA;IACA,EAAA,OAAOkE,QAAQ,IAAInC,OAAO,GAAGD,SAAS,GAAG,CAAC,CAAC;IAC7C;;IClBA;;;;;IAKM,SAAUqC,SAASA,CACvBnC,KAAkB,EAClBtD,OAAA,GAAkC,EAAE,EAAA;MAEpCoE,MAAM,CAACd,KAAK,CAAC;MACb,MAAM;QAAEF,SAAS;IAAEC,IAAAA;IAAO,GAAE,GAAG0B,eAAe,CAACzB,KAAK,EAAEtD,OAAO,CAAC;IAC9D,EAAA,IAAI0F,QAAQ,GAAGpC,KAAK,CAACF,SAAS,CAAC;IAE/B,EAAA,KAAK,IAAI9B,CAAC,GAAG8B,SAAS,GAAG,CAAC,EAAE9B,CAAC,IAAI+B,OAAO,EAAE/B,CAAC,EAAE,EAAE;IAC7C,IAAA,IAAIgC,KAAK,CAAChC,CAAC,CAAC,GAAGoE,QAAQ,EAAE;IACvBA,MAAAA,QAAQ,GAAGpC,KAAK,CAAChC,CAAC,CAAC;IACrB,IAAA;IACF,EAAA;IACA,EAAA,OAAOoE,QAAQ;IACjB;;ICnBA;;;;;IAKM,SAAUC,SAASA,CACvBrC,KAAkB,EAClBtD,OAAA,GAAkC,EAAE,EAAA;MAEpCoE,MAAM,CAACd,KAAK,CAAC;MACb,MAAM;QAAEF,SAAS;IAAEC,IAAAA;IAAO,GAAE,GAAG0B,eAAe,CAACzB,KAAK,EAAEtD,OAAO,CAAC;IAC9D,EAAA,IAAI4F,QAAQ,GAAGtC,KAAK,CAACF,SAAS,CAAC;IAC/B,EAAA,KAAK,IAAI9B,CAAC,GAAG8B,SAAS,GAAG,CAAC,EAAE9B,CAAC,IAAI+B,OAAO,EAAE/B,CAAC,EAAE,EAAE;IAC7C,IAAA,IAAIgC,KAAK,CAAChC,CAAC,CAAC,GAAGsE,QAAQ,EAAE;IACvBA,MAAAA,QAAQ,GAAGtC,KAAK,CAAChC,CAAC,CAAC;IACrB,IAAA;IACF,EAAA;IACA,EAAA,OAAOsE,QAAQ;IACjB;;ICdA;;;;;IAKM,SAAUC,gBAAgBA,CAC9BvC,KAAkB,EAClBtD,OAAA,GAAmC,EAAE,EAAA;IAErC,EAAA,IAAIsD,KAAK,CAAC7C,MAAM,GAAG,CAAC,EAAE,OAAO,IAAI;MACjC,MAAM;IAAEqF,IAAAA,SAAS,GAAG;IAAI,GAAE,GAAG9F,OAAO;MACpC,IAAI+F,KAAK,GAAG,CAAC;IACb,EAAA,IAAIC,KAAK,GAAG5F,MAAM,CAAC6F,gBAAgB;IACnC,EAAA,KAAK,IAAI3E,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgC,KAAK,CAAC7C,MAAM,GAAG,CAAC,EAAE,EAAEa,CAAC,EAAE;IACzC,IAAA,MAAM4E,kBAAkB,GAAG5C,KAAK,CAAChC,CAAC,GAAG,CAAC,CAAC,GAAGgC,KAAK,CAAChC,CAAC,CAAC;QAClD,IAAI4E,kBAAkB,GAAGF,KAAK,EAAE;IAC9BA,MAAAA,KAAK,GAAGE,kBAAkB;IAC5B,IAAA;QACA,IAAIA,kBAAkB,GAAGH,KAAK,EAAE;IAC9BA,MAAAA,KAAK,GAAGG,kBAAkB;IAC5B,IAAA;IACF,EAAA;IACA,EAAA,OAAO,CAACH,KAAK,GAAGC,KAAK,IAAID,KAAK,GAAGD,SAAS;IAC5C;;IC/BA;;;;;IAKM,SAAUK,YAAYA,CAAC7C,KAAkB,EAAA;IAC7C,EAAA,IAAIA,KAAK,CAAC7C,MAAM,IAAI,CAAC,EAAE;IACrB,IAAA,OAAO,CAAC;IACV,EAAA;MACA,IAAI6C,KAAK,CAAC,CAAC,CAAC,KAAKA,KAAK,CAAC,CAAC,CAAC,EAAE;IACzB;IACA,IAAA,KAAK,IAAIhC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgC,KAAK,CAAC7C,MAAM,GAAG,CAAC,EAAEa,CAAC,EAAE,EAAE;IACzC,MAAA,IAAIgC,KAAK,CAAChC,CAAC,CAAC,KAAKgC,KAAK,CAAChC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IACzC,IAAA;IACA,IAAA,OAAO,CAAC;IACV,EAAA;IAEA,EAAA,IAAIgC,KAAK,CAAC,CAAC,CAAC,GAAIA,KAAK,CAAC8C,EAAE,CAAC,EAAE,CAAY,EAAE;IACvC,IAAA,KAAK,IAAI9E,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgC,KAAK,CAAC7C,MAAM,GAAG,CAAC,EAAEa,CAAC,EAAE,EAAE;IACzC,MAAA,IAAIgC,KAAK,CAAChC,CAAC,CAAC,IAAIgC,KAAK,CAAChC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IACxC,IAAA;IACA,IAAA,OAAO,CAAC;IACV,EAAA,CAAC,MAAM;IACL,IAAA,KAAK,IAAIA,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgC,KAAK,CAAC7C,MAAM,GAAG,CAAC,EAAEa,CAAC,EAAE,EAAE;IACzC,MAAA,IAAIgC,KAAK,CAAChC,CAAC,CAAC,IAAIgC,KAAK,CAAChC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IACxC,IAAA;IACA,IAAA,OAAO,EAAE;IACX,EAAA;IACF;;ICxBA;;;;;IAKM,SAAU+E,iBAAiBA,CAC/B/C,KAAkB,EAClBtD,OAAA,GAAkC,EAAE,EAAA;MAEpCoE,MAAM,CAACd,KAAK,CAAC;MACb,MAAM;QAAEF,SAAS;IAAEC,IAAAA;IAAO,GAAE,GAAG0B,eAAe,CAACzB,KAAK,EAAEtD,OAAO,CAAC;MAC9D,IAAI0F,QAAQ,GAAG7E,IAAI,CAAC6D,GAAG,CAACpB,KAAK,CAACF,SAAS,CAAC,CAAC;IAEzC,EAAA,KAAK,IAAI9B,CAAC,GAAG8B,SAAS,GAAG,CAAC,EAAE9B,CAAC,IAAI+B,OAAO,EAAE/B,CAAC,EAAE,EAAE;IAC7C,IAAA,IAAIgC,KAAK,CAAChC,CAAC,CAAC,IAAI,CAAC,EAAE;IACjB,MAAA,IAAIgC,KAAK,CAAChC,CAAC,CAAC,GAAGoE,QAAQ,EAAE;IACvBA,QAAAA,QAAQ,GAAGpC,KAAK,CAAChC,CAAC,CAAC;IACrB,MAAA;QACF,CAAC,MAAM,IAAI,CAACgC,KAAK,CAAChC,CAAC,CAAC,GAAGoE,QAAQ,EAAE;IAC/BA,MAAAA,QAAQ,GAAG,CAACpC,KAAK,CAAChC,CAAC,CAAC;IACtB,IAAA;IACF,EAAA;IACA,EAAA,OAAOoE,QAAQ;IACjB;;ICbA;;;;;IAKM,SAAUY,wBAAwBA,CACtChD,KAAkB,EAAA;IAElB,EAAA,MAAMI,MAAM,GAAGT,OAAO,CAACK,KAAK,CAAC;MAC7B,MAAMiD,iBAAiB,GAAG,IAAItF,YAAY,CAACqC,KAAK,CAAC7C,MAAM,CAAC;IACxD,EAAA,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgC,KAAK,CAAC7C,MAAM,EAAEa,CAAC,EAAE,EAAE;IACrCiF,IAAAA,iBAAiB,CAACjF,CAAC,CAAC,GAAGT,IAAI,CAAC6D,GAAG,CAACpB,KAAK,CAAChC,CAAC,CAAC,GAAGoC,MAAM,CAAC;IACpD,EAAA;MACA,OAAO;QACLA,MAAM;QACN8C,GAAG,EAAEvD,OAAO,CAACsD,iBAAiB;IAC/B,GAAA;IACH;;IC7BA;;;;;IAKM,SAAUE,aAAaA,CAACnD,KAAkB,EAAA;MAI9Cc,MAAM,CAACd,KAAK,CAAC;IAEb,EAAA,IAAIoD,GAAG,GAAGpD,KAAK,CAAC,CAAC,CAAC;IAClB,EAAA,IAAIqD,GAAG,GAAGrD,KAAK,CAAC,CAAC,CAAC;IAElB,EAAA,KAAK,MAAM9D,KAAK,IAAI8D,KAAK,EAAE;IACzB,IAAA,IAAI9D,KAAK,GAAGkH,GAAG,EAAEA,GAAG,GAAGlH,KAAK;IAC5B,IAAA,IAAIA,KAAK,GAAGmH,GAAG,EAAEA,GAAG,GAAGnH,KAAK;IAC9B,EAAA;MAEA,OAAO;QAAEkH,GAAG;IAAEC,IAAAA;OAAK;IACrB;;ICHA;;;;;;;IAOM,SAAUC,uBAAuBA,CACrCtD,KAAkB,EAAA;MAElB,MAAM;QAAEkD,GAAG;IAAE9C,IAAAA;IAAM,GAAE,GAAG4C,wBAAwB,CAAChD,KAAK,CAAC;MACvD,OAAO;QAAEuD,EAAE,EAAEL,GAAG,GAAG,kBAAkB;QAAEA,GAAG;IAAE9C,IAAAA;OAAQ;IACtD;;IC/BA;;;;;;IAMM,SAAUoD,KAAKA,CAACxD,KAAkB,EAAA;MACtC,IAAIyD,MAAM,GAAG,CAAC;IACd,EAAA,KAAK,MAAMC,OAAO,IAAI1D,KAAK,EAAE;QAC3ByD,MAAM,IAAIC,OAAO,IAAI,CAAC;IACxB,EAAA;IACA,EAAA,OAAOnG,IAAI,CAACoG,IAAI,CAACF,MAAM,CAAC;IAC1B;;ICVA;;;;;;;;;IASM,SAAUG,oBAAoBA,CAClCC,CAAc,EACdnC,CAAc,EACdoC,EAAe,EACfC,EAAU,EAAA;MAEV,IAAIC,OAAO,GAAkB,IAAI;MACjC,IAAIC,OAAO,GAAkB,IAAI;MACjC,MAAMC,SAAS,GAAa,EAAE;MAC9B,MAAMC,SAAS,GAAa,EAAE;IAC9B,EAAA,KAAK,IAAInG,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6F,CAAC,CAAC1G,MAAM,GAAG,CAAC,EAAE,EAAEa,CAAC,EAAE;QACrC,IACG8F,EAAE,CAAC9F,CAAC,CAAC,GAAG8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,IAAI8F,EAAE,CAAC9F,CAAC,CAAC,IAAI8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,IACvC8F,EAAE,CAAC9F,CAAC,CAAC,IAAI8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,IAAI8F,EAAE,CAAC9F,CAAC,CAAC,GAAG8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAE,EACzC;IACAiG,MAAAA,OAAO,GAAG;IACRvC,QAAAA,CAAC,EAAEA,CAAC,CAAC1D,CAAC,CAAC;IACPqD,QAAAA,KAAK,EAAErD;IACR,OAAA;IACD,MAAA,IAAI+F,EAAE,GAAG,CAAC,IAAIC,OAAO,KAAK,IAAI,EAAE;IAC9BE,QAAAA,SAAS,CAACE,IAAI,CAACJ,OAAO,CAAC;IACvBG,QAAAA,SAAS,CAACC,IAAI,CAACH,OAAO,CAAC;IACzB,MAAA;IACF,IAAA;IAEA;QACA,IACGH,EAAE,CAAC9F,CAAC,CAAC,IAAI8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,IAAI8F,EAAE,CAAC9F,CAAC,CAAC,GAAG8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,IACvC8F,EAAE,CAAC9F,CAAC,CAAC,GAAG8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,IAAI8F,EAAE,CAAC9F,CAAC,CAAC,IAAI8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAE,EACzC;IACAgG,MAAAA,OAAO,GAAG;IACRtC,QAAAA,CAAC,EAAEA,CAAC,CAAC1D,CAAC,CAAC;IACPqD,QAAAA,KAAK,EAAErD;IACR,OAAA;IACD,MAAA,IAAI+F,EAAE,GAAG,CAAC,IAAIE,OAAO,KAAK,IAAI,EAAE;IAC9BC,QAAAA,SAAS,CAACE,IAAI,CAACJ,OAAO,CAAC;IACvBG,QAAAA,SAAS,CAACC,IAAI,CAACH,OAAO,CAAC;IACzB,MAAA;IACF,IAAA;IACF,EAAA;MAEA,OAAO;QAAEC,SAAS;IAAEC,IAAAA;OAAW;IACjC;;IC3CA;;;;;;IAMM,SAAUE,8BAA8BA,CAC5C3H,OAA8C,EAAA;MAE9C,MAAM;QACJgF,CAAC;QACD4C,KAAK;QACLC,OAAO;QACPC,UAAU;QACVC,aAAa;QACbC,cAAc;IACdC,IAAAA;IAAK,GACN,GAAGjI,OAAO;IAEX,EAAA,IAAIkI,WAAW,GAAG9H,MAAM,CAACyE,iBAAiB;MAC1C,IAAIsD,QAAQ,GAAG,EAAE;MACjB,IAAIC,YAAY,GAAGR,KAAK;IACxB,EAAA,KAAK,IAAIxF,CAAC,GAAGgG,YAAY,GAAG,CAAC,EAAEhG,CAAC,GAAGyF,OAAO,CAACpH,MAAM,EAAE2B,CAAC,EAAE,EAAE;IACtD,IAAA,MAAMiG,WAAW,GAAGR,OAAO,CAACzF,CAAC,CAAC;IAC9B,IAAA,IAAI6F,KAAK,CAACI,WAAW,CAAC,IAAIP,UAAU,EAAE;IACpC,MAAA;IACF,IAAA;IAEA,IAAA,MAAMQ,MAAM,GAAGtD,CAAC,CAACqD,WAAW,CAAC;QAC7B,MAAME,eAAe,GAAG1H,IAAI,CAAC6D,GAAG,CAAC4D,MAAM,GAAGN,cAAc,CAAC;QAEzD,IAAIO,eAAe,GAAGR,aAAa,EAAE;UACnC,IAAIQ,eAAe,GAAGL,WAAW,EAAE;IACjCC,QAAAA,QAAQ,GAAG/F,CAAC;IACd,MAAA;IACAgG,MAAAA,YAAY,GAAGhG,CAAC;IAClB,IAAA;QAEA,IAAImG,eAAe,IAAIL,WAAW,EAAE;IACpCA,IAAAA,WAAW,GAAGK,eAAe;IAC/B,EAAA;MAEA,OAAO;IAAEC,IAAAA,SAAS,EAAEJ,YAAY;IAAED,IAAAA;OAAU;IAC9C;;ICjDA;;;;;;IAMM,SAAUM,aAAaA,CAACvF,KAAe,EAAA;MAC3C,MAAM;QAAE8B,CAAC;QAAEmC,CAAC;QAAEc,KAAK;QAAEb,EAAE;QAAEsB,GAAG;QAAErB,EAAE;IAAES,IAAAA;IAAU,GAAE,GAAG5E,KAAK;MAEtD,MAAMyF,MAAM,GAAa,EAAE;MAC3B,MAAMC,OAAO,GAAa,EAAE;MAC5B,MAAM;QAAEpB,SAAS;IAAEC,IAAAA;OAAW,GAAGP,oBAAoB,CAACC,CAAC,EAAEnC,CAAC,EAAEoC,EAAE,EAAEC,EAAE,CAAC;IAEnE,EAAA,KAAK,IAAI/F,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6F,CAAC,CAAC1G,MAAM,GAAG,CAAC,EAAE,EAAEa,CAAC,EAAE;IACrC,IAAA,IAAK8F,EAAE,CAAC9F,CAAC,CAAC,GAAG,CAAC,IAAI8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAM8F,EAAE,CAAC9F,CAAC,CAAC,GAAG,CAAC,IAAI8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,GAAG,CAAE,EAAE;IAChE;IACAsH,MAAAA,OAAO,CAAClB,IAAI,CAAC7G,IAAI,CAAC6D,GAAG,CAAC0C,EAAE,CAAC9F,CAAC,CAAC,CAAC,GAAGT,IAAI,CAAC6D,GAAG,CAAC0C,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,CAAC,GAAGA,CAAC,GAAGA,CAAC,GAAG,CAAC,CAAC;IACjE,IAAA;IACA;IACA,IAAA,IACE8F,EAAE,CAAC9F,CAAC,CAAC,KAAK,CAAC,IACX8F,EAAE,CAAC9F,CAAC,CAAC,GAAGT,IAAI,CAAC6D,GAAG,CAAC0C,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,CAAC,IAC3B8F,EAAE,CAAC9F,CAAC,CAAC,GAAGT,IAAI,CAAC6D,GAAG,CAAC0C,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,CAAC,EAC3B;IACAsH,MAAAA,OAAO,CAAClB,IAAI,CAACpG,CAAC,CAAC;IACjB,IAAA;IAEA;QACA,IAAIoH,GAAG,CAACpH,CAAC,CAAC,GAAGoH,GAAG,CAACpH,CAAC,GAAG,CAAC,CAAC,IAAIoH,GAAG,CAACpH,CAAC,CAAC,GAAGoH,GAAG,CAACpH,CAAC,GAAG,CAAC,CAAC,EAAE;IAC9CqH,MAAAA,MAAM,CAACjB,IAAI,CAACpG,CAAC,CAAC;IAChB,IAAA;IACF,EAAA;MAEA,MAAMuH,KAAK,GAAgB,EAAE;MAC7B,IAAIjB,KAAK,GAAG,EAAE;MACd,IAAIkB,KAAK,GAAG,EAAE;IACd,EAAA,KAAK,IAAIxH,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGkG,SAAS,CAAC/G,MAAM,EAAEa,CAAC,EAAE,EAAE;IACzC,IAAA,MAAMyG,aAAa,GAAG,CAACN,SAAS,CAACnG,CAAC,CAAC,CAAC0D,CAAC,GAAGwC,SAAS,CAAClG,CAAC,CAAC,CAAC0D,CAAC,IAAI,CAAC;IAC3D,IAAA,MAAMgD,cAAc,GAAG,CAACP,SAAS,CAACnG,CAAC,CAAC,CAAC0D,CAAC,GAAGwC,SAAS,CAAClG,CAAC,CAAC,CAAC0D,CAAC,IAAI,CAAC;QAE5D,IAAI+D,MAAM,GAAG,EAAE;QACf,IAAIC,KAAK,GAAGrB,8BAA8B,CAAC;UACzC3C,CAAC;UACDiD,KAAK;UACLL,KAAK;UACLE,UAAU;UACVC,aAAa;UACbC,cAAc;IACdH,MAAAA,OAAO,EAAEe;SACV,CAAC;QACFhB,KAAK,GAAGoB,KAAK,CAACR,SAAS;IACvB,IAAA,IAAIQ,KAAK,CAACb,QAAQ,KAAK,EAAE,EAAE;IACzBY,MAAAA,MAAM,GAAGH,OAAO,CAACI,KAAK,CAACb,QAAQ,CAAC;IAClC,IAAA,CAAC,MAAM;UACLa,KAAK,GAAGrB,8BAA8B,CAAC;YACrC3C,CAAC;YACDiD,KAAK;YACLH,UAAU;IACVF,QAAAA,KAAK,EAAEkB,KAAK;YACZf,aAAa;YACbC,cAAc;IACdH,QAAAA,OAAO,EAAEc;WACV,CAAC;IACF,MAAA,IAAIK,KAAK,CAACb,QAAQ,KAAK,EAAE,EAAE;IACzBY,QAAAA,MAAM,GAAGJ,MAAM,CAACK,KAAK,CAACb,QAAQ,CAAC;IACjC,MAAA;UACAW,KAAK,GAAGE,KAAK,CAACR,SAAS;IACzB,IAAA;IAEA,IAAA,IAAIO,MAAM,KAAK,EAAE,EAAE;IACjB,MAAA,MAAME,KAAK,GAAGpI,IAAI,CAAC6D,GAAG,CAAC+C,SAAS,CAACnG,CAAC,CAAC,CAAC0D,CAAC,GAAGwC,SAAS,CAAClG,CAAC,CAAC,CAAC0D,CAAC,CAAC;UACvD6D,KAAK,CAACnB,IAAI,CAAC;IACTwB,QAAAA,EAAE,EAAEC,MAAM,CAACC,UAAU,EAAE;IACvBpE,QAAAA,CAAC,EAAEA,CAAC,CAAC+D,MAAM,CAAC;IACZ5B,QAAAA,CAAC,EAAEA,CAAC,CAAC4B,MAAM,CAAC;YACZE,KAAK;IACLtE,QAAAA,KAAK,EAAEoE,MAAM;IACbL,QAAAA,GAAG,EAAEA,GAAG,CAACK,MAAM,CAAC;IAChBM,QAAAA,gBAAgB,EAAE;IAChBpE,UAAAA,IAAI,EAAEuC,SAAS,CAAClG,CAAC,CAAC;cAClB4D,EAAE,EAAEuC,SAAS,CAACnG,CAAC;;WAElB,CAAC;IACJ,IAAA;IACF,EAAA;IAEA,EAAA,OAAOuH,KAAK;IACd;;IC3EA;;;;;;IAMM,SAAUS,oBAAoBA,CAACtJ,OAAoC,EAAA;MACvE,IAAI4H,KAAK,GAAG,EAAE;MACd,MAAMiB,KAAK,GAAgB,EAAE;MAC7B,MAAM;QAAE7D,CAAC;QAAE0D,GAAG;QAAET,KAAK;QAAEH,UAAU;QAAEL,SAAS;QAAED,SAAS;IAAEK,IAAAA;IAAO,GAAE,GAAG7H,OAAO;IAE5E,EAAA,KAAK,IAAIsB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGkG,SAAS,CAAC/G,MAAM,EAAEa,CAAC,EAAE,EAAE;IACzC,IAAA,MAAMyG,aAAa,GAAG,CAACN,SAAS,CAACnG,CAAC,CAAC,CAAC0D,CAAC,GAAGwC,SAAS,CAAClG,CAAC,CAAC,CAAC0D,CAAC,IAAI,CAAC;IAC3D,IAAA,MAAMgD,cAAc,GAAG,CAACP,SAAS,CAACnG,CAAC,CAAC,CAAC0D,CAAC,GAAGwC,SAAS,CAAClG,CAAC,CAAC,CAAC0D,CAAC,IAAI,CAAC;QAC5D,MAAM;UAAEmD,QAAQ;IAAEK,MAAAA;SAAW,GAAGb,8BAA8B,CAAC;UAC7D3C,CAAC;UACD4C,KAAK;UACLC,OAAO;UACPC,UAAU;UACVC,aAAa;UACbC,cAAc;IACdC,MAAAA;SACD,CAAC;IAEF,IAAA,IAAIE,QAAQ,KAAK,EAAE,EAAE;IACnB,MAAA,MAAME,WAAW,GAAGR,OAAO,CAACM,QAAQ,CAAC;IACrC,MAAA,MAAMc,KAAK,GAAGpI,IAAI,CAAC6D,GAAG,CAAC+C,SAAS,CAACnG,CAAC,CAAC,CAAC0D,CAAC,GAAGwC,SAAS,CAAClG,CAAC,CAAC,CAAC0D,CAAC,CAAC;UACvD6D,KAAK,CAACnB,IAAI,CAAC;IACTwB,QAAAA,EAAE,EAAEC,MAAM,CAACC,UAAU,EAAE;IACvBpE,QAAAA,CAAC,EAAEA,CAAC,CAACqD,WAAW,CAAC;IACjBlB,QAAAA,CAAC,EAAEc,KAAK,CAACI,WAAW,CAAC;YACrBY,KAAK;IACLtE,QAAAA,KAAK,EAAE0D,WAAW;IAClBK,QAAAA,GAAG,EAAEA,GAAG,CAACL,WAAW,CAAC;IACrBgB,QAAAA,gBAAgB,EAAE;IAChBpE,UAAAA,IAAI,EAAEuC,SAAS,CAAClG,CAAC,CAAC;cAClB4D,EAAE,EAAEuC,SAAS,CAACnG,CAAC;;WAElB,CAAC;IACJ,IAAA;IACAsG,IAAAA,KAAK,GAAGY,SAAS;IACnB,EAAA;IAEA,EAAA,OAAOK,KAAK;IACd;;IC1DA;;;;;;;IAOM,SAAUU,mBAAmBA,CAACrG,KAA+B,EAAA;MACjE,MAAM;QAAEiE,CAAC;IAAEC,IAAAA;IAAE,GAAE,GAAGlE,KAAK;MAEvB,MAAM0F,OAAO,GAAa,EAAE;IAE5B,EAAA,KAAK,IAAItH,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6F,CAAC,CAAC1G,MAAM,GAAG,CAAC,EAAE,EAAEa,CAAC,EAAE;IACrC,IAAA,IAAIkI,wBAAwB,CAACpC,EAAE,CAAC9F,CAAC,CAAC,EAAE8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;IAC9C;IACAsH,MAAAA,OAAO,CAAClB,IAAI,CAAC7G,IAAI,CAAC6D,GAAG,CAAC0C,EAAE,CAAC9F,CAAC,CAAC,CAAC,GAAGT,IAAI,CAAC6D,GAAG,CAAC0C,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,CAAC,GAAGA,CAAC,GAAGA,CAAC,GAAG,CAAC,CAAC;IACjE,IAAA,CAAC,MAAM;IACL;QACA8F,EAAE,CAAC9F,CAAC,CAAC,KAAK,CAAC,IACXkI,wBAAwB,CAACpC,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,EAAE8F,EAAE,CAAC9F,CAAC,GAAG,CAAC,CAAC,CAAC,EAC9C;IACAsH,MAAAA,OAAO,CAAClB,IAAI,CAACpG,CAAC,CAAC;IACjB,IAAA;IACF,EAAA;IACA,EAAA,OAAOsH,OAAO;IAChB;IAEA,SAASY,wBAAwBA,CAACC,IAAY,EAAEC,IAAY,EAAA;IAC1D,EAAA,OAAQD,IAAI,GAAG,CAAC,IAAIC,IAAI,GAAG,CAAC,IAAMD,IAAI,GAAG,CAAC,IAAIC,IAAI,GAAG,CAAE;IACzD;;IC5BA;;;;;IAKM,SAAUC,eAAeA,CAACzG,KAAe,EAAA;MAC7C,MAAM;QAAEiE,CAAC;QAAEnC,CAAC;QAAEoC,EAAE;QAAEC,EAAE;QAAEY,KAAK;QAAEH,UAAU;IAAEY,IAAAA;IAAG,GAAE,GAAGxF,KAAK;IACtD,EAAA,MAAM0F,OAAO,GAAGW,mBAAmB,CAACrG,KAAK,CAAC;MAC1C,MAAM;QAAEsE,SAAS;IAAEC,IAAAA;OAAW,GAAGP,oBAAoB,CAACC,CAAC,EAAEnC,CAAC,EAAEoC,EAAE,EAAEC,EAAE,CAAC;IAEnE,EAAA,OAAOiC,oBAAoB,CAAC;IAC1BzB,IAAAA,OAAO,EAAEe,OAAO;QAChBpB,SAAS;QACTC,SAAS;QACTzC,CAAC;QACDiD,KAAK;QACLH,UAAU;IACVY,IAAAA;OACD,CAAC;IACJ;;ICpBA;;;;;IAKM,SAAUkB,gBAAgBA,CAAC1G,KAAe,EAAA;MAC9C,MAAM;QAAE8B,CAAC;QAAEmC,CAAC;QAAEc,KAAK;QAAEb,EAAE;QAAEsB,GAAG;QAAErB,EAAE;IAAES,IAAAA;IAAU,GAAE,GAAG5E,KAAK;MAEtD,MAAMyF,MAAM,GAAa,EAAE;MAC3B,MAAM;QAAEnB,SAAS;IAAEC,IAAAA;OAAW,GAAGP,oBAAoB,CAACC,CAAC,EAAEnC,CAAC,EAAEoC,EAAE,EAAEC,EAAE,CAAC;IAEnE;IACA,EAAA,KAAK,IAAI/F,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6F,CAAC,CAAC1G,MAAM,GAAG,CAAC,EAAE,EAAEa,CAAC,EAAE;IACrC;QACA,IAAIoH,GAAG,CAACpH,CAAC,CAAC,GAAGoH,GAAG,CAACpH,CAAC,GAAG,CAAC,CAAC,IAAIoH,GAAG,CAACpH,CAAC,CAAC,GAAGoH,GAAG,CAACpH,CAAC,GAAG,CAAC,CAAC,EAAE;IAC9CqH,MAAAA,MAAM,CAACjB,IAAI,CAACpG,CAAC,CAAC;IAChB,IAAA;IACF,EAAA;IAEA,EAAA,OAAOgI,oBAAoB,CAAC;IAC1BzB,IAAAA,OAAO,EAAEc,MAAM;QACfnB,SAAS;QACTC,SAAS;QACTzC,CAAC;QACDiD,KAAK;QACLH,UAAU;IACVY,IAAAA;OACD,CAAC;IACJ;;IC9BA;;;;;;;IAOM,SAAUmB,WAAWA,CACzBC,IAAY,EACZjB,KAAqD,EAAA;MAErD,MAAM;QAAE7D,CAAC;IAAEmC,IAAAA;IAAC,GAAE,GAAG2C,IAAI;IAErB,EAAA,KAAK,MAAMC,IAAI,IAAIlB,KAAK,EAAE;IACxB,IAAA,IAAImB,YAAY,GAAGD,IAAI,CAACpF,KAAK;IAC7B;QACA,IACEwC,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAAI7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAC1C7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAAI7C,CAAC,CAAC6C,YAAY,CAAC,EACtC;IACAA,MAAAA,YAAY,EAAE;QAChB,CAAC,MAAM,IACL7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAAI7C,CAAC,CAAC6C,YAAY,CAAC,IACtC7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAAI7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,EAC1C;IACAA,MAAAA,YAAY,EAAE;IAChB,IAAA,CAAC,MAAM,IACL7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAAI7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAC1C7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAAI7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,EAC1C;IACAA,MAAAA,YAAY,IAAI,CAAC;IACnB,IAAA,CAAC,MAAM,IACL7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAAI7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAC1C7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IAAI7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,EAC1C;IACAA,MAAAA,YAAY,IAAI,CAAC;IACnB,IAAA;IACA;IACA,IAAA,IACE7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,IACvB7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,IACvB7C,CAAC,CAAC6C,YAAY,CAAC,IAAI7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IACtC7C,CAAC,CAAC6C,YAAY,CAAC,IAAI7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,KACrC7C,CAAC,CAAC6C,YAAY,CAAC,KAAK7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,IACtC7C,CAAC,CAAC6C,YAAY,CAAC,KAAK7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,CAAC,EAC1C;IACA,MAAA,MAAMC,KAAK,GAAGpJ,IAAI,CAACqJ,KAAK,CAAC/C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,CAAC;UAC7C,MAAMG,IAAI,GAAGtJ,IAAI,CAACqJ,KAAK,CAAC/C,CAAC,CAAC6C,YAAY,CAAC,CAAC;IACxC,MAAA,MAAMI,KAAK,GAAGvJ,IAAI,CAACqJ,KAAK,CAAC/C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAA,MAAMK,CAAC,GAAI,GAAG,IAAIJ,KAAK,GAAGG,KAAK,CAAC,IAAKH,KAAK,GAAG,CAAC,GAAGE,IAAI,GAAGC,KAAK,CAAC;IAC9D,MAAA,MAAME,QAAQ,GAAWtF,CAAC,CAACgF,YAAY,CAAC;IACxC,MAAA,MAAMO,SAAS,GAAWvF,CAAC,CAACgF,YAAY,GAAG,CAAC,CAAC;UAC7CD,IAAI,CAAC/E,CAAC,GAAGsF,QAAQ,GAAG,CAACA,QAAQ,GAAGC,SAAS,IAAIF,CAAC;UAC9CN,IAAI,CAAC5C,CAAC,GACJA,CAAC,CAAC6C,YAAY,CAAC,GACf,IAAI,IAAI7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,GAAG7C,CAAC,CAAC6C,YAAY,GAAG,CAAC,CAAC,CAAC,GAAGK,CAAC;IAC1D,IAAA;IACF,EAAA;IACF;;ICgBA;;;;;;IAMM,SAAUG,GAAGA,CAACV,IAAY,EAAE9J,OAAA,GAAsB,EAAE,EAAA;MACxD,IAAI;IAAEyK,IAAAA;IAAU,GAAE,GAAGzK,OAAO;MAC5B,MAAM;IACJ0K,IAAAA,SAAS,GAAG;IACVzK,MAAAA,UAAU,EAAE,CAAC;IACbE,MAAAA,UAAU,EAAE;IACb,KAAA;IACDwK,IAAAA,OAAO,GAAG,KAAK;IACfC,IAAAA,WAAW,GAAG,IAAI;IAClBC,IAAAA,gBAAgB,GAAG,CAAC;IACpBC,IAAAA,WAAW,GAAG,OAAO;IACrBC,IAAAA,gBAAgB,GAAG,KAAK;IACxBC,IAAAA,sBAAsB,GAAG;IAAQ,GAClC,GAAGhL,OAAO;IACX,EAAA,IAAI6K,gBAAgB,GAAG,CAAC,IAAIA,gBAAgB,GAAG,CAAC,EAAE;IAChD,IAAA,MAAM,IAAIvG,KAAK,CAAC,0CAA0C,CAAC;IAC7D,EAAA;MACA,MAAM;IAAEU,IAAAA;IAAC,GAAE,GAAG8E,IAAI;MAClB,IAAI;IAAE3C,IAAAA;IAAC,GAAE,GAAG2C,IAAI;IAChB,EAAA,IAAI3D,YAAY,CAACnB,CAAC,CAAC,KAAK,CAAC,EAAE;IACzB,IAAA,MAAM,IAAIV,KAAK,CAAC,+CAA+C,CAAC;IAClE,EAAA;IACA;IACA6C,EAAAA,CAAC,GAAGA,CAAC,CAAC5D,KAAK,EAAE;IAEb;IACA;IACA,EAAA,MAAM0H,eAAe,GAAGpF,gBAAgB,CAACb,CAAC,CAAC;MAE3C,IAAIyF,UAAU,KAAKjK,SAAS,EAAE;IAC5B,IAAA,IAAIyK,eAAe,EAAE;IACnB,MAAA,MAAMC,SAAS,GAAGtE,uBAAuB,CAACO,CAAC,CAAC;IAC5C,MAAA,IAAIyD,WAAW,EAAE;YACfH,UAAU,GAAGS,SAAS,CAACxH,MAAM,GAAG,GAAG,GAAGwH,SAAS,CAACrE,EAAE;IACpD,MAAA,CAAC,MAAM;YACL4D,UAAU,GAAG,CAACS,SAAS,CAACxH,MAAM,GAAG,GAAG,GAAGwH,SAAS,CAACrE,EAAE;IACrD,MAAA;IACF,IAAA,CAAC,MAAM;IACL4D,MAAAA,UAAU,GAAG,CAAC;IAChB,IAAA;IACF,EAAA,CAAC,MAAM,IAAI,CAACG,WAAW,EAAE;QACvBH,UAAU,IAAI,EAAE;IAClB,EAAA;MAEA,IAAI,CAACG,WAAW,EAAE;IAChB,IAAA,KAAK,IAAItJ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6F,CAAC,CAAC1G,MAAM,EAAEa,CAAC,EAAE,EAAE;UACjC6F,CAAC,CAAC7F,CAAC,CAAC,GAAG,CAAC6F,CAAC,CAAC7F,CAAC,CAAC;IACd,IAAA;IACF,EAAA;IAEA,EAAA,MAAM6J,gBAAgB,GACpBN,gBAAgB,GAAG,CAAC,GAAGA,gBAAgB,GAAGxE,iBAAiB,CAACc,CAAC,CAAC,GAAGsD,UAAU;MAE7E,IAAIA,UAAU,KAAKjK,SAAS,EAAE;IAC5B,IAAA,KAAK,IAAIc,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6F,CAAC,CAAC1G,MAAM,EAAEa,CAAC,EAAE,EAAE;IACjC,MAAA,IAAI6F,CAAC,CAAC7F,CAAC,CAAC,GAAGmJ,UAAU,EAAE;IACrBtD,QAAAA,CAAC,CAAC7F,CAAC,CAAC,GAAGmJ,UAAU;IACnB,MAAA;IACF,IAAA;IACF,EAAA;IAEA,EAAA,MAAMW,MAAM,GAAGH,eAAe,GAAGjG,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC;MAEhD,MAAMiD,KAAK,GAAG0C,OAAO,GACjB9K,GAAG,CAACsH,CAAC,EAAEiE,MAAM,EAAE;IACb,IAAA,GAAGV,SAAS;IACZxK,IAAAA,UAAU,EAAE;IACb,GAAA,CAAC,GACFiH,CAAC;MACL,MAAM;IAAET,IAAAA,GAAG,EAAE2E,IAAI;IAAE1E,IAAAA,GAAG,EAAE2E;IAAI,GAAE,GAAG7E,aAAa,CAACwB,KAAK,CAAC;MAErD,IAAIoD,IAAI,GAAGC,IAAI,IAAID,IAAI,KAAKC,IAAI,EAAE,OAAO,EAAE;IAE3C,EAAA,MAAMlE,EAAE,GAAGvH,GAAG,CAACsH,CAAC,EAAEiE,MAAM,EAAE;IACxB,IAAA,GAAGV,SAAS;IACZxK,IAAAA,UAAU,EAAE;OACb,CAAC;IAEF,EAAA,MAAMwI,GAAG,GAAG7I,GAAG,CAACsH,CAAC,EAAEiE,MAAM,EAAE;IACzB,IAAA,GAAGV,SAAS;IACZxK,IAAAA,UAAU,EAAE;OACb,CAAC;IAEF,EAAA,MAAM4H,UAAU,GAAGrC,SAAS,CAAC,CAC3BgF,UAAU,EACVY,IAAI,GAAG,CAACC,IAAI,GAAGD,IAAI,IAAIP,WAAW,EAClCK,gBAAgB,CACjB,CAAC;MAEF,MAAM9D,EAAE,GAAGrC,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC;IACtB,EAAA,MAAMuG,QAAQ,GAAG;QAAEvG,CAAC;QAAEmC,CAAC;QAAEc,KAAK;QAAEb,EAAE;QAAEsB,GAAG;QAAErB,EAAE;IAAES,IAAAA;OAAY;MACzD,IAAIe,KAAK,GAAgB,EAAE;MAC3B,IAAImC,sBAAsB,KAAK,OAAO,EAAE;IACtCnC,IAAAA,KAAK,GAAGc,eAAe,CAAC4B,QAAQ,CAAC;IACnC,EAAA,CAAC,MAAM,IAAIP,sBAAsB,KAAK,QAAQ,EAAE;IAC9CnC,IAAAA,KAAK,GAAGe,gBAAgB,CAAC2B,QAAQ,CAAC;IACpC,EAAA,CAAC,MAAM;IACL1C,IAAAA,KAAK,GAAGJ,aAAa,CAAC8C,QAAQ,CAAC;IACjC,EAAA;IAEA,EAAA,IAAIR,gBAAgB,EAAE;IACpBlB,IAAAA,WAAW,CAAC;UAAE7E,CAAC;IAAEmC,MAAAA,CAAC,EAAEc;SAAO,EAAEY,KAAK,CAAC;IACrC,EAAA;IAEA,EAAA,KAAK,MAAMkB,IAAI,IAAIlB,KAAK,EAAE;QACxB,IAAI,CAAC+B,WAAW,EAAE;IAChBb,MAAAA,IAAI,CAAC5C,CAAC,IAAI,EAAE;UACZ4C,IAAI,CAACrB,GAAG,GAAGqB,IAAI,CAACrB,GAAG,GAAG,EAAE;IAC1B,IAAA;IACF,EAAA;IAEAG,EAAAA,KAAK,CAAC2C,IAAI,CAAC,CAAChJ,CAAC,EAAEC,CAAC,KAAI;IAClB,IAAA,OAAOD,CAAC,CAACwC,CAAC,GAAGvC,CAAC,CAACuC,CAAC;IAClB,EAAA,CAAC,CAAC;IAEF,EAAA,OAAO6D,KAAK;IACd;;ICtMO,MAAM4C,mBAAmB,GAAG,EAAE,GAAG5K,IAAI,CAAC6K,GAAG;IAEhD;;;;;;;;;;;;;IAaO,MAAMC,eAAe,GAAG,EAAE;IAC1B,MAAMC,gBAAgB,GAAG/K,IAAI,CAACoG,IAAI,CAACpG,IAAI,CAACgL,EAAE,GAAGhL,IAAI,CAAC6K,GAAG,CAAC;IACtD,MAAMI,QAAQ,GAAGjL,IAAI,CAACoG,IAAI,CAACpG,IAAI,CAAC6K,GAAG,CAAC;IACpC,MAAMK,UAAU,GAAGlL,IAAI,CAACoG,IAAI,CAAC,CAAC,CAAC;IAC/B,MAAM+E,SAAS,GAAGnL,IAAI,CAACoG,IAAI,CAAC,CAAC,GAAGpG,IAAI,CAAC6K,GAAG,CAAC;IACzC,MAAMO,mBAAmB,GAAGpL,IAAI,CAACoG,IAAI,CAAC,CAAC,GAAGpG,IAAI,CAAC6K,GAAG,CAAC,GAAG,CAAC;;ICpB9D;IACA;IAEA;IAEA;;;;;;IAMc,SAAUQ,MAAMA,CAAClH,CAAS,EAAA;MACtC,MAAMxC,CAAC,GAAG,KAAK;IACf,EAAA,IAAIwC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;MACrB,MAAMmH,aAAa,GAAGtL,IAAI,CAACuL,GAAG,CAAC,CAAC,GAAGpH,CAAC,GAAGA,CAAC,CAAC;IACzC,EAAA,MAAMqH,aAAa,GAAGF,aAAa,GAAG,CAAC,GAAG,CAAC,IAAItL,IAAI,CAACgL,EAAE,GAAGrJ,CAAC,CAAC;IAC3D,EAAA,MAAM8J,SAAS,GAAGzL,IAAI,CAACoG,IAAI,CAACoF,aAAa,IAAI,CAAC,GAAGF,aAAa,GAAG3J,CAAC,CAAC;MACnE,MAAM+J,UAAU,GAAG1L,IAAI,CAACoG,IAAI,CAACqF,SAAS,GAAGD,aAAa,CAAC;MACvD,OAAOE,UAAU,IAAIvH,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;IACtC;;ICmCM,MAAOwH,QAAQ,CAAA;IACHC,EAAAA,IAAI,GAAG,UAAmB;IAC1C;;;;MAIOC,IAAI;MAEXC,WAAAA,CAAmB3M,OAAA,GAAgC,EAAE,EAAA;QACnD,MAAM;IAAE0M,MAAAA,IAAI,GAAG,GAAG;IAAE7F,MAAAA;IAAE,KAAE,GAAG7G,OAAO;IAElC,IAAA,IAAI,CAAC0M,IAAI,GAAG7F,EAAE,GAAG+F,mBAAmB,CAAC,CAAC,GAAG/F,EAAE,CAAC,GAAG6F,IAAI;IACrD,EAAA;IAEOG,EAAAA,WAAWA,CAACH,IAAI,GAAG,IAAI,CAACA,IAAI,EAAA;QACjC,OAAOI,mBAAmB,CAACJ,IAAI,CAAC;IAClC,EAAA;IAEOK,EAAAA,WAAWA,CAAC9D,KAAa,EAAA;QAC9B,OAAO2D,mBAAmB,CAAC3D,KAAK,CAAC;IACnC,EAAA;IAEO+D,EAAAA,GAAGA,CAAChI,CAAS,EAAA;IAClB,IAAA,OAAOiI,WAAW,CAACjI,CAAC,EAAE,IAAI,CAAC0H,IAAI,CAAC;IAClC,EAAA;IAEOQ,EAAAA,OAAOA,CAACC,MAAM,GAAGC,uBAAuB,CAAC;QAAEV,IAAI,EAAE,IAAI,CAACA;IAAI,GAAE,CAAC,EAAA;IAClE,IAAA,OAAOW,eAAe,CAAC;UAAEX,IAAI,EAAE,IAAI,CAACA,IAAI;IAAES,MAAAA;IAAM,KAAE,CAAC;IACrD,EAAA;IAEOG,EAAAA,SAASA,CAACC,IAAa,EAAA;QAC5B,OAAOC,iBAAiB,CAACD,IAAI,CAAC;IAChC,EAAA;MAEOE,OAAOA,CAACzN,OAAA,GAA4B,EAAE,EAAA;IAC3C,IAAA,OAAO0N,eAAe,CAAC,IAAI,EAAE1N,OAAO,CAAC;IACvC,EAAA;MAEO2N,eAAeA,CAACJ,IAAI,GAAG,CAAC,EAAA;IAC7B,IAAA,OAAOH,uBAAuB,CAAC;UAAEV,IAAI,EAAE,IAAI,CAACA,IAAI;IAAEa,MAAAA;IAAI,KAAE,CAAC;IAC3D,EAAA;IAEOK,EAAAA,aAAaA,GAAA;QAClB,OAAO,CAAC,MAAM,CAAC;IACjB,EAAA;IAEA;;;;IAIOC,EAAAA,MAAMA,GAAA;QACX,OAAO;UAAEpB,IAAI,EAAE,IAAI,CAACA,IAAI;UAAEC,IAAI,EAAE,IAAI,CAACA;SAAM;IAC7C,EAAA;IAEOxM,EAAAA,UAAUA,CAAC8E,CAAS,EAAA;QACzB,MAAM;UAAEgI,GAAG;UAAEc,EAAE;IAAEC,MAAAA;SAAO,GAAGC,kBAAkB,CAAChJ,CAAC,EAAE,IAAI,CAAC0H,IAAI,CAAC;QAC3D,OAAO;UAAEM,GAAG;UAAEc,EAAE;UAAEG,UAAU,EAAE,CAACF,KAAK;SAAG;IACzC,EAAA;;IAMF;;;;;IAKM,SAAUX,uBAAuBA,CACrCpN,OAAuC,EAAA;MAEvC,MAAM;IAAEuN,IAAAA,IAAI,GAAG,CAAC;IAAE1G,IAAAA;IAAE,GAAE,GAAG7G,OAAO;MAChC,IAAI;IAAE0M,IAAAA,IAAI,GAAG;IAAG,GAAE,GAAG1M,OAAO;MAE5B,IAAI6G,EAAE,EAAE6F,IAAI,GAAGE,mBAAmB,CAAC,CAAC,GAAG/F,EAAE,CAAC;IAE1C,EAAA,OAAQ,CAAC,GAAG0G,IAAI,GAAI3B,gBAAgB,GAAGc,IAAI;IAC7C;IAEA;;;;;;IAMM,SAAUO,WAAWA,CAACjI,CAAS,EAAE0H,IAAY,EAAA;IACjD,EAAA,OAAO7L,IAAI,CAACqN,GAAG,CAACzC,mBAAmB,GAAG,CAACzG,CAAC,GAAG0H,IAAI,KAAK,CAAC,CAAC;IACxD;IAEA;;;;;;IAMM,SAAUsB,kBAAkBA,CAAChJ,CAAS,EAAE0H,IAAY,EAAA;IACxD,EAAA,MAAMM,GAAG,GAAGC,WAAW,CAACjI,CAAC,EAAE0H,IAAI,CAAC;IAChC,EAAA,MAAMoB,EAAE,GAAK,CAAC,GAAGrC,mBAAmB,GAAGzG,CAAC,IAAK0H,IAAI,GAAGA,IAAI,CAAC,GAAIM,GAAG;IAChE,EAAA,MAAMe,KAAK,GACP,EAAE,GAAGtC,mBAAmB,GAAGzG,CAAC,GAAGA,CAAC,IAAK0H,IAAI,GAAGA,IAAI,GAAGA,IAAI,CAAC,GAAIM,GAAG;MACnE,OAAO;QAAEA,GAAG;QAAEc,EAAE;IAAEC,IAAAA;OAAO;IAC3B;IAEA;;;;;IAKM,SAAUnB,mBAAmBA,CAAC3D,KAAa,EAAA;MAC/C,OAAOA,KAAK,GAAG+C,SAAS;IAC1B;IAEA;;;;;IAKM,SAAUc,mBAAmBA,CAACJ,IAAY,EAAA;MAC9C,OAAOA,IAAI,GAAGV,SAAS;IACzB;IAEA;;;;;IAKM,SAAUqB,eAAeA,CAACrN,OAA+B,EAAA;MAC7D,MAAM;QAAE6G,EAAE;IAAEsG,IAAAA,MAAM,GAAG;IAAC,GAAE,GAAGnN,OAAO;MAClC,IAAI;IAAE0M,IAAAA,IAAI,GAAG;IAAG,GAAE,GAAG1M,OAAO;MAE5B,IAAI6G,EAAE,EAAE6F,IAAI,GAAGE,mBAAmB,CAAC,CAAC,GAAG/F,EAAE,CAAC;IAE1C,EAAA,OAAQsG,MAAM,GAAGvB,gBAAgB,GAAGc,IAAI,GAAI,CAAC;IAC/C;IAEA;;;;;IAKM,SAAUc,iBAAiBA,CAACD,IAAI,GAAG,MAAM,EAAA;MAC7C,IAAIA,IAAI,IAAI,CAAC,EAAE;IACb,IAAA,MAAM,IAAIjJ,KAAK,CAAC,wBAAwB,CAAC;IAC3C,EAAA;IACA,EAAA,OAAO4H,MAAM,CAACqB,IAAI,CAAC,GAAGzB,QAAQ;IAChC;IAEA;;;;;;IAMM,SAAU4B,eAAeA,CAC7BS,KAAA,GAA8B,EAAE,EAChCnO,OAAA,GAA4B,EAAE,EAAA;MAE9B,MAAM;IAAE6G,IAAAA;IAAE,GAAE,GAAGsH,KAAK;MACpB,IAAI;IAAEzB,IAAAA,IAAI,GAAG;IAAG,GAAE,GAAGyB,KAAK;MAC1B,IAAItH,EAAE,EAAE6F,IAAI,GAAGE,mBAAmB,CAAC,CAAC,GAAG/F,EAAE,CAAC;MAE1C,MAAM;QACJuH,MAAM,GAAGZ,iBAAiB,EAAE;QAC5BL,MAAM,GAAGC,uBAAuB,CAAC;IAAEV,MAAAA;SAAM;IAAC,GAC3C,GAAG1M,OAAO;MACX,IAAI;IAAES,IAAAA;IAAM,GAAE,GAAGT,OAAO;MAExB,IAAI,CAACS,MAAM,EAAE;IACXA,IAAAA,MAAM,GAAGI,IAAI,CAAC6F,GAAG,CAAC7F,IAAI,CAACwN,IAAI,CAAC3B,IAAI,GAAG0B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxD,IAAA,IAAI3N,MAAM,GAAG,CAAC,KAAK,CAAC,EAAEA,MAAM,EAAE;IAChC,EAAA;IAEA,EAAA,MAAMuB,MAAM,GAAG,CAACvB,MAAM,GAAG,CAAC,IAAI,CAAC;IAC/B,EAAA,MAAMqJ,IAAI,GAAG,IAAI7I,YAAY,CAACR,MAAM,CAAC;MACrC,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIU,MAAM,EAAEV,CAAC,EAAE,EAAE;QAChC,MAAM9B,KAAK,GAAGyN,WAAW,CAAC3L,CAAC,GAAGU,MAAM,EAAE0K,IAAI,CAAC,GAAGS,MAAM;IACpDrD,IAAAA,IAAI,CAACxI,CAAC,CAAC,GAAG9B,KAAK;QACfsK,IAAI,CAACrJ,MAAM,GAAG,CAAC,GAAGa,CAAC,CAAC,GAAG9B,KAAK;IAC9B,EAAA;IAEA,EAAA,OAAOsK,IAAI;IACb;;ICjNM,MAAOwE,UAAU,CAAA;IACL7B,EAAAA,IAAI,GAAG,YAAqB;IAC5C;;;;MAIOC,IAAI;MAEXC,WAAAA,CAAmB3M,OAAA,GAAkC,EAAE,EAAA;QACrD,MAAM;IAAE0M,MAAAA,IAAI,GAAG;IAAG,KAAE,GAAG1M,OAAO;QAE9B,IAAI,CAAC0M,IAAI,GAAGA,IAAI;IAClB,EAAA;IAEOG,EAAAA,WAAWA,CAACH,IAAI,GAAG,IAAI,CAACA,IAAI,EAAA;QACjC,OAAO6B,qBAAqB,CAAC7B,IAAI,CAAC;IACpC,EAAA;IAEOK,EAAAA,WAAWA,CAAC9D,KAAa,EAAA;QAC9B,OAAOuF,qBAAqB,CAACvF,KAAK,CAAC;IACrC,EAAA;IAEO+D,EAAAA,GAAGA,CAAChI,CAAS,EAAA;IAClB,IAAA,OAAOyJ,aAAa,CAACzJ,CAAC,EAAE,IAAI,CAAC0H,IAAI,CAAC;IACpC,EAAA;MAEOQ,OAAOA,CAACC,MAAM,GAAG,CAAC,EAAA;IACvB,IAAA,OAAOuB,iBAAiB,CAAC;UAAEhC,IAAI,EAAE,IAAI,CAACA,IAAI;IAAES,MAAAA;IAAM,KAAE,CAAC;IACvD,EAAA;IAEOG,EAAAA,SAASA,CAACC,IAAa,EAAA;QAC5B,OAAOoB,mBAAmB,CAACpB,IAAI,CAAC;IAClC,EAAA;MAEOE,OAAOA,CAACzN,OAAA,GAA4B,EAAE,EAAA;IAC3C,IAAA,OAAO4O,iBAAiB,CAAC,IAAI,EAAE5O,OAAO,CAAC;IACzC,EAAA;MAEO2N,eAAeA,CAACJ,IAAI,GAAG,CAAC,EAAA;IAC7B,IAAA,OAAOsB,yBAAyB,CAAC;UAAEnC,IAAI,EAAE,IAAI,CAACA,IAAI;IAAEa,MAAAA;IAAI,KAAE,CAAC;IAC7D,EAAA;IAEOK,EAAAA,aAAaA,GAAA;QAClB,OAAO,CAAC,MAAM,CAAC;IACjB,EAAA;IAEA;;;;IAIOC,EAAAA,MAAMA,GAAA;QACX,OAAO;UAAEpB,IAAI,EAAE,IAAI,CAACA,IAAI;UAAEC,IAAI,EAAE,IAAI,CAACA;SAAM;IAC7C,EAAA;IAEOxM,EAAAA,UAAUA,CAAC8E,CAAS,EAAA;QACzB,MAAM;UAAEgI,GAAG;UAAEc,EAAE;IAAEC,MAAAA;SAAO,GAAGe,oBAAoB,CAAC9J,CAAC,EAAE,IAAI,CAAC0H,IAAI,CAAC;QAC7D,OAAO;UAAEM,GAAG;UAAEc,EAAE;UAAEG,UAAU,EAAE,CAACF,KAAK;SAAG;IACzC,EAAA;;IAMK,MAAMc,yBAAyB,GAAGA,CAAC;IAAEnC,EAAAA,IAAI,GAAG,CAAC;IAAEa,EAAAA,IAAI,GAAG;IAAC,CAAE,KAAI;MAClE,OAAQ,CAAC,GAAGA,IAAI,GAAI1M,IAAI,CAACgL,EAAE,GAAGa,IAAI;IACpC,CAAC;IAEM,MAAMgC,iBAAiB,GAAI1O,OAAiC,IAAI;MACrE,MAAM;IAAE0M,IAAAA,IAAI,GAAG,GAAG;IAAES,IAAAA,MAAM,GAAG;IAAC,GAAE,GAAGnN,OAAO;MAC1C,OAAQmN,MAAM,GAAGtM,IAAI,CAACgL,EAAE,GAAGa,IAAI,GAAI,CAAC;IACtC,CAAC;IAEM,MAAM+B,aAAa,GAAGA,CAACzJ,CAAS,EAAE0H,IAAY,KAAI;IACvD,EAAA,OAAOA,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG1H,CAAC,IAAI,CAAC,GAAG0H,IAAI,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;IAMM,SAAUoC,oBAAoBA,CAAC9J,CAAS,EAAE0H,IAAY,EAAA;MAC1D,MAAMqC,WAAW,GAAG,CAAC,GAAG/J,CAAC,GAAGA,CAAC,GAAG0H,IAAI,GAAGA,IAAI;IAC3C,EAAA,MAAMM,GAAG,GAAIN,IAAI,GAAGA,IAAI,GAAIqC,WAAW;IACvC,EAAA,MAAMjB,EAAE,GAAI,EAAE,GAAG9I,CAAC,GAAG0H,IAAI,GAAGA,IAAI,IAAKqC,WAAW,GAAGA,WAAW,CAAC;IAC/D,EAAA,MAAMhB,KAAK,GAAI,CAAC,GAAGrB,IAAI,GAAG1H,CAAC,GAAGA,CAAC,IAAK+J,WAAW,GAAGA,WAAW,CAAC;MAC9D,OAAO;QAAE/B,GAAG;QAAEc,EAAE;IAAEC,IAAAA;OAAO;IAC3B;IAEO,MAAMS,qBAAqB,GAAIvF,KAAa,IAAI;MACrD,OAAOA,KAAK,GAAG8C,UAAU;IAC3B,CAAC;IAEM,MAAMwC,qBAAqB,GAAI7B,IAAY,IAAI;MACpD,OAAOA,IAAI,GAAGX,UAAU;IAC1B,CAAC;IAED,MAAMiD,kBAAkB,GAAI3E,CAAS,IAAKxJ,IAAI,CAACoO,GAAG,CAACpO,IAAI,CAACgL,EAAE,IAAIxB,CAAC,GAAG,GAAG,CAAC,CAAC;IAEhE,MAAMsE,mBAAmB,GAAGA,CAACpB,IAAI,GAAG,MAAM,KAAI;MACnD,IAAIA,IAAI,IAAI,CAAC,EAAE;IACb,IAAA,MAAM,IAAIjJ,KAAK,CAAC,wBAAwB,CAAC;IAC3C,EAAA;IACA,EAAA,MAAM4K,YAAY,GAAG,CAAC,CAAC,GAAG3B,IAAI,IAAI,GAAG;IACrC,EAAA,OACE,CAACyB,kBAAkB,CAAC,CAAC,GAAGE,YAAY,CAAC,GAAGF,kBAAkB,CAACE,YAAY,CAAC,IACxE,CAAC;IAEL,CAAC;IAEM,MAAMN,iBAAiB,GAAGA,CAC/BT,KAAA,GAAgC,EAAE,EAClCnO,OAAA,GAA4B,EAAE,KAC5B;MACF,MAAM;IAAE0M,IAAAA,IAAI,GAAG;IAAG,GAAE,GAAGyB,KAAK;MAC5B,MAAM;QACJC,MAAM,GAAGO,mBAAmB,EAAE;QAC9BxB,MAAM,GAAG0B,yBAAyB,CAAC;UAAEnC,IAAI;IAAEa,MAAAA,IAAI,EAAE;SAAG;IAAC,GACtD,GAAGvN,OAAO;MACX,IAAI;IAAES,IAAAA;IAAM,GAAE,GAAGT,OAAO;MAExB,IAAI,CAACS,MAAM,EAAE;IACXA,IAAAA,MAAM,GAAGI,IAAI,CAAC6F,GAAG,CAAC7F,IAAI,CAACwN,IAAI,CAAC3B,IAAI,GAAG0B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxD,IAAA,IAAI3N,MAAM,GAAG,CAAC,KAAK,CAAC,EAAEA,MAAM,EAAE;IAChC,EAAA;IAEA,EAAA,MAAMuB,MAAM,GAAG,CAACvB,MAAM,GAAG,CAAC,IAAI,CAAC;IAC/B,EAAA,MAAMqJ,IAAI,GAAG,IAAI7I,YAAY,CAACR,MAAM,CAAC;MACrC,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIU,MAAM,EAAEV,CAAC,EAAE,EAAE;QAChC,MAAM9B,KAAK,GAAGiP,aAAa,CAACnN,CAAC,GAAGU,MAAM,EAAE0K,IAAI,CAAC,GAAGS,MAAM;IACtDrD,IAAAA,IAAI,CAACxI,CAAC,CAAC,GAAG9B,KAAK;QACfsK,IAAI,CAACrJ,MAAM,GAAG,CAAC,GAAGa,CAAC,CAAC,GAAG9B,KAAK;IAC9B,EAAA;IAEA,EAAA,OAAOsK,IAAI;IACb,CAAC;;ICvJK,MAAOqF,oBAAoB,CAAA;IACf1C,EAAAA,IAAI,GAAG,sBAA+B;IACtD;;;;MAIOC,IAAI;MAEXC,WAAAA,CAAmB3M,OAAA,GAAkC,EAAE,EAAA;QACrD,MAAM;IAAE0M,MAAAA,IAAI,GAAG;IAAG,KAAE,GAAG1M,OAAO;QAE9B,IAAI,CAAC0M,IAAI,GAAGA,IAAI;IAClB,EAAA;IAEOG,EAAAA,WAAWA,CAACH,IAAI,GAAG,IAAI,CAACA,IAAI,EAAA;QACjC,OAAO6B,qBAAqB,CAAC7B,IAAI,CAAC;IACpC,EAAA;IAEOK,EAAAA,WAAWA,CAAC9D,KAAa,EAAA;QAC9B,OAAOuF,qBAAqB,CAACvF,KAAK,CAAC;IACrC,EAAA;IAEO+D,EAAAA,GAAGA,CAAChI,CAAS,EAAA;IAClB,IAAA,OAAOoK,uBAAuB,CAACpK,CAAC,EAAE,IAAI,CAAC0H,IAAI,CAAC;IAC9C,EAAA;IAEOQ,EAAAA,OAAOA,GAAA;IACZ,IAAA,OAAO,CAAC;IACV,EAAA;IAEOI,EAAAA,SAASA,CAACC,IAAa,EAAA;QAC5B,OAAOoB,mBAAmB,CAACpB,IAAI,CAAC;IAClC,EAAA;MAEOE,OAAOA,CAACzN,OAAA,GAA4B,EAAE,EAAA;IAC3C,IAAA,OAAOqP,2BAA2B,CAAC,IAAI,EAAErP,OAAO,CAAC;IACnD,EAAA;MAEO2N,eAAeA,CAACJ,IAAI,GAAG,CAAC,EAAA;IAC7B,IAAA,OAAOsB,yBAAyB,CAAC;UAAEnC,IAAI,EAAE,IAAI,CAACA,IAAI;IAAEa,MAAAA;IAAI,KAAE,CAAC;IAC7D,EAAA;IAEOK,EAAAA,aAAaA,GAAA;QAClB,OAAO,CAAC,MAAM,CAAC;IACjB,EAAA;IAEA;;;;IAIOC,EAAAA,MAAMA,GAAA;QACX,OAAO;UAAEpB,IAAI,EAAE,IAAI,CAACA,IAAI;UAAEC,IAAI,EAAE,IAAI,CAACA;SAAM;IAC7C,EAAA;IAEOxM,EAAAA,UAAUA,CAAC8E,CAAS,EAAA;QACzB,MAAM;UAAEgI,GAAG;UAAEc,EAAE;IAAEC,MAAAA;SAAO,GAAGuB,8BAA8B,CAACtK,CAAC,EAAE,IAAI,CAAC0H,IAAI,CAAC;QACvE,OAAO;UAAEM,GAAG;UAAEc,EAAE;UAAEG,UAAU,EAAE,CAACF,KAAK;SAAG;IACzC,EAAA;;IAMK,MAAMqB,uBAAuB,GAAGA,CAACpK,CAAS,EAAE0H,IAAY,KAAI;IACjE,EAAA,OAAQ,CAAC,GAAGA,IAAI,GAAG1H,CAAC,IAAK,CAAC,GAAGA,CAAC,IAAI,CAAC,GAAG0H,IAAI,IAAI,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;IAMM,SAAU4C,8BAA8BA,CAACtK,CAAS,EAAE0H,IAAY,EAAA;MACpE,MAAMqC,WAAW,GAAG,CAAC,GAAG/J,CAAC,GAAGA,CAAC,GAAG0H,IAAI,GAAGA,IAAI;MAC3C,MAAMM,GAAG,GAAI,CAAC,GAAGN,IAAI,GAAG1H,CAAC,GAAI+J,WAAW;MACxC,MAAMjB,EAAE,GACL,CAAC,GAAGpB,IAAI,IAAIA,IAAI,GAAGA,IAAI,GAAG,CAAC,GAAG1H,CAAC,GAAGA,CAAC,CAAC,IAAK+J,WAAW,GAAGA,WAAW,CAAC;MACtE,MAAMhB,KAAK,GACR,CAAC,GAAG/I,CAAC,IAAI,CAAC,GAAGA,CAAC,GAAGA,CAAC,GAAG0H,IAAI,GAAGA,IAAI,CAAC,IAAKqC,WAAW,GAAGA,WAAW,CAAC;MACnE,OAAO;QAAE/B,GAAG;QAAEc,EAAE;IAAEC,IAAAA;OAAO;IAC3B;IAEO,MAAMsB,2BAA2B,GAAGA,CACzClB,KAAA,GAAgC,EAAE,EAClCnO,OAAA,GAA4B,EAAE,KAC5B;MACF,MAAM;IAAE0M,IAAAA,IAAI,GAAG;IAAG,GAAE,GAAGyB,KAAK;MAC5B,MAAM;QACJC,MAAM,GAAGO,mBAAmB,EAAE;QAC9BxB,MAAM,GAAG0B,yBAAyB,CAAC;UAAEnC,IAAI;IAAEa,MAAAA,IAAI,EAAE;SAAG;IAAC,GACtD,GAAGvN,OAAO;MACX,IAAI;IAAES,IAAAA;IAAM,GAAE,GAAGT,OAAO;MAExB,IAAI,CAACS,MAAM,EAAE;IACXA,IAAAA,MAAM,GAAGI,IAAI,CAAC6F,GAAG,CAAC7F,IAAI,CAACwN,IAAI,CAAC3B,IAAI,GAAG0B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxD,IAAA,IAAI3N,MAAM,GAAG,CAAC,KAAK,CAAC,EAAEA,MAAM,EAAE;IAChC,EAAA;IAEA,EAAA,MAAMuB,MAAM,GAAG,CAACvB,MAAM,GAAG,CAAC,IAAI,CAAC;IAC/B,EAAA,MAAMqJ,IAAI,GAAG,IAAI7I,YAAY,CAACR,MAAM,CAAC;MACrC,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIU,MAAM,EAAEV,CAAC,EAAE,EAAE;QAChC,MAAM9B,KAAK,GAAG4P,uBAAuB,CAAC9N,CAAC,GAAGU,MAAM,EAAE0K,IAAI,CAAC,GAAGS,MAAM;IAChErD,IAAAA,IAAI,CAACxI,CAAC,CAAC,GAAG9B,KAAK;QACfsK,IAAI,CAACrJ,MAAM,GAAG,CAAC,GAAGa,CAAC,CAAC,GAAG,CAAC9B,KAAK;IAC/B,EAAA;IAEA,EAAA,OAAOsK,IAAI;IACb,CAAC;;ICpHD;;;;;;;;;;;;;;IAcM,SAAUyF,qBAAqBA,CACnCC,OAAe,EACfC,EAAU,EACVC,GAAG,GAAG,IAAI,EACVC,OAAO,GAAG,GAAG,EAAA;IAEb,EAAA,IAAIH,OAAO,IAAI,CAAC,IAAIA,OAAO,IAAI,CAAC,EAAE;IAChC,IAAA,MAAM,IAAIlP,UAAU,CAAC,0BAA0B,CAAC;IAClD,EAAA;MAEA,IAAImP,EAAE,KAAK,CAAC,EAAE;QACZ,OAAOjC,iBAAiB,CAACgC,OAAO,CAAC;IACnC,EAAA,CAAC,MAAM,IAAIC,EAAE,KAAK,CAAC,EAAE;QACnB,OAAOd,mBAAmB,CAACa,OAAO,CAAC;IACrC,EAAA;IAEA;MACA,IAAII,EAAE,GAAG,CAAC;MACV,IAAIC,EAAE,GAAG,EAAE;MACX,IAAIC,EAAE,GAAG,CAAC;IACV,EAAA,OAAOC,YAAY,CAACF,EAAE,EAAEJ,EAAE,CAAC,GAAGD,OAAO,IAAIM,EAAE,EAAE,GAAG,GAAG,EAAED,EAAE,IAAI,CAAC;MAC5D,KAAK,IAAIvO,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGqO,OAAO,EAAErO,CAAC,EAAE,EAAE;IAChC,IAAA,MAAM0O,GAAG,GAAG,GAAG,IAAIJ,EAAE,GAAGC,EAAE,CAAC;IAC3B,IAAA,MAAMI,GAAG,GAAGF,YAAY,CAACC,GAAG,EAAEP,EAAE,CAAC;IACjC,IAAA,IAAI5O,IAAI,CAAC6D,GAAG,CAACuL,GAAG,GAAGT,OAAO,CAAC,GAAGE,GAAG,EAAE,OAAOM,GAAG;QAC7C,IAAIC,GAAG,GAAGT,OAAO,EAAE;IACjBI,MAAAA,EAAE,GAAGI,GAAG;IACV,IAAA,CAAC,MAAM;IACLH,MAAAA,EAAE,GAAGG,GAAG;IACV,IAAA;IACF,EAAA;IACA,EAAA,OAAO,GAAG,IAAIJ,EAAE,GAAGC,EAAE,CAAC;IACxB;IAEA,SAASK,GAAGA,CAAClL,CAAS,EAAA;MACpB,MAAMmL,IAAI,GAAGnL,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;IAC3BA,EAAAA,CAAC,GAAGnE,IAAI,CAAC6D,GAAG,CAACM,CAAC,CAAC;MACf,MAAMoL,EAAE,GAAG,WAAW;MACtB,MAAMC,EAAE,GAAG,YAAY;MACvB,MAAMC,EAAE,GAAG,WAAW;MACtB,MAAMC,EAAE,GAAG,YAAY;MACvB,MAAMC,EAAE,GAAG,WAAW;MACtB,MAAMnG,CAAC,GAAG,SAAS;MACnB,MAAMxH,CAAC,GAAG,CAAC,IAAI,CAAC,GAAGwH,CAAC,GAAGrF,CAAC,CAAC;IACzB,EAAA,MAAMmC,CAAC,GACL,CAAC,GAAG,CAAC,CAAC,CAAC,CAACqJ,EAAE,GAAG3N,CAAC,GAAG0N,EAAE,IAAI1N,CAAC,GAAGyN,EAAE,IAAIzN,CAAC,GAAGwN,EAAE,IAAIxN,CAAC,GAAGuN,EAAE,IAAIvN,CAAC,GAAGhC,IAAI,CAACqN,GAAG,CAAC,CAAClJ,CAAC,GAAGA,CAAC,CAAC;MAC3E,OAAOmL,IAAI,GAAGhJ,CAAC;IACjB;IAEA,MAAMsJ,OAAO,GAAG5P,IAAI,CAACoG,IAAI,CAACpG,IAAI,CAACuL,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,SAASsE,SAASA,CAACtO,CAAS,EAAA;IAC1B,EAAA,OAAO8N,GAAG,CAAC9N,CAAC,GAAGqO,OAAO,CAAC;IACzB;IACA,SAASE,QAAQA,CAACvO,CAAS,EAAA;MACzB,OAAQ,CAAC,GAAGvB,IAAI,CAACgL,EAAE,GAAIhL,IAAI,CAAC+P,IAAI,CAACxO,CAAC,CAAC;IACrC;IACA,SAAS2N,YAAYA,CAAC3N,CAAS,EAAEqN,EAAU,EAAA;IACzC,EAAA,OAAO,CAAC,CAAC,GAAGA,EAAE,IAAIkB,QAAQ,CAACvO,CAAC,CAAC,GAAGqN,EAAE,GAAGiB,SAAS,CAACtO,CAAC,CAAC;IACnD;;ICfM,MAAOyO,WAAW,CAAA;IACNpE,EAAAA,IAAI,GAAG,aAAsB;MACtCC,IAAI;IACX;;;;MAIO+C,EAAE;MAET9C,WAAAA,CAAmB3M,OAAA,GAAmC,EAAE,EAAA;QACtD,MAAM;IAAE0M,MAAAA,IAAI,GAAG,GAAG;IAAE+C,MAAAA,EAAE,GAAG;IAAG,KAAE,GAAGzP,OAAO;QAExC,IAAI,CAACyP,EAAE,GAAGA,EAAE;QACZ,IAAI,CAAC/C,IAAI,GAAGA,IAAI;IAClB,EAAA;MAEOG,WAAWA,CAACH,IAAI,GAAG,IAAI,CAACA,IAAI,EAAE+C,EAAE,GAAG,IAAI,CAACA,EAAE,EAAA;IAC/C,IAAA,OAAOqB,sBAAsB,CAACpE,IAAI,EAAE+C,EAAE,CAAC;IACzC,EAAA;IAEO1C,EAAAA,WAAWA,CAAC9D,KAAa,EAAEwG,EAAA,GAAa,IAAI,CAACA,EAAE,EAAA;IACpD,IAAA,OAAOsB,sBAAsB,CAAC9H,KAAK,EAAEwG,EAAE,CAAC;IAC1C,EAAA;IAEOzC,EAAAA,GAAGA,CAAChI,CAAS,EAAA;QAClB,OAAOgM,cAAc,CAAChM,CAAC,EAAE,IAAI,CAAC0H,IAAI,EAAE,IAAI,CAAC+C,EAAE,CAAC;IAC9C,EAAA;MAEOvC,OAAOA,CAACC,MAAM,GAAG,CAAC,EAAA;IACvB,IAAA,OAAO8D,kBAAkB,CAAC;UAAEvE,IAAI,EAAE,IAAI,CAACA,IAAI;UAAES,MAAM;UAAEsC,EAAE,EAAE,IAAI,CAACA;IAAE,KAAE,CAAC;IACrE,EAAA;IAEOnC,EAAAA,SAASA,CAACC,IAAa,EAAA;IAC5B,IAAA,OAAO2D,oBAAoB,CAAC3D,IAAI,EAAE,IAAI,CAACkC,EAAE,CAAC;IAC5C,EAAA;MAEOhC,OAAOA,CAACzN,OAAA,GAA4B,EAAE,EAAA;QAC3C,MAAM;UACJS,MAAM;UACN2N,MAAM;UACNjB,MAAM,GAAGgE,0BAA0B,CAAC;YAClCzE,IAAI,EAAE,IAAI,CAACA,IAAI;YACf+C,EAAE,EAAE,IAAI,CAACA,EAAE;IACXlC,QAAAA,IAAI,EAAE;IACP,OAAA;IAAC,KACH,GAAGvN,OAAO;QACX,OAAOoR,kBAAkB,CAAC,IAAI,EAAE;UAAEhD,MAAM;UAAE3N,MAAM;IAAE0M,MAAAA;IAAM,KAAE,CAAC;IAC7D,EAAA;MAEOQ,eAAeA,CAACJ,IAAI,GAAG,CAAC,EAAA;IAC7B,IAAA,OAAO4D,0BAA0B,CAAC;UAAEzE,IAAI,EAAE,IAAI,CAACA,IAAI;UAAE+C,EAAE,EAAE,IAAI,CAACA,EAAE;IAAElC,MAAAA;IAAI,KAAE,CAAC;IAC3E,EAAA;IAEOK,EAAAA,aAAaA,GAAA;IAClB,IAAA,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;IACvB,EAAA;IAEA;;;;IAIOC,EAAAA,MAAMA,GAAA;QACX,OAAO;UAAEpB,IAAI,EAAE,IAAI,CAACA,IAAI;UAAEC,IAAI,EAAE,IAAI,CAACA,IAAI;UAAE+C,EAAE,EAAE,IAAI,CAACA;SAAI;IAC1D,EAAA;IAEOvP,EAAAA,UAAUA,CAAC8E,CAAS,EAAA;QACzB,MAAM;UAAEgI,GAAG;UAAEc,EAAE;UAAEC,KAAK;IAAEsD,MAAAA;IAAG,KAAE,GAAGC,qBAAqB,CACnDtM,CAAC,EACD,IAAI,CAAC0H,IAAI,EACT,IAAI,CAAC+C,EAAE,CACR;QACD,OAAO;UAAEzC,GAAG;UAAEc,EAAE;IAAEG,MAAAA,UAAU,EAAE,CAACF,KAAK,EAAEsD,GAAG;SAAG;IAC9C,EAAA;;IAMK,MAAMF,0BAA0B,GAAGA,CACxCnR,OAAA,GAA8C,EAAE,KAC9C;MACF,MAAM;IAAE0M,IAAAA,IAAI,GAAG,CAAC;IAAE+C,IAAAA,EAAE,GAAG,GAAG;IAAElC,IAAAA,IAAI,GAAG;IAAC,GAAE,GAAGvN,OAAO;IAChD,EAAA,OAAQ,CAAC,GAAGuN,IAAI,IAAKb,IAAI,IAAI+C,EAAE,GAAG7D,gBAAgB,GAAG,CAAC,CAAC,GAAG6D,EAAE,IAAI5O,IAAI,CAACgL,EAAE,CAAC,CAAC;IAC3E,CAAC;IAEM,MAAMmF,cAAc,GAAGA,CAAChM,CAAS,EAAE0H,IAAY,EAAE+C,EAAU,KAAI;IACpE;IACA;MACA,IAAIA,EAAE,KAAK,CAAC,EAAE,OAAOxC,WAAW,CAACjI,CAAC,EAAE0H,IAAI,CAAC;IACzC,EAAA,MAAM6E,UAAU,GAAG,CAAC,CAAC,GAAG9B,EAAE,IAAIhB,aAAa,CAACzJ,CAAC,EAAE0H,IAAI,CAAC;IACpD,EAAA,MAAM8E,CAAC,GAAGxM,CAAC,GAAG0H,IAAI;IAClB,EAAA,IAAI8E,CAAC,GAAGA,CAAC,GAAG7F,eAAe,EAAE,OAAO4F,UAAU;MAC9C,OAAOA,UAAU,GAAG9B,EAAE,GAAGxC,WAAW,CAACjI,CAAC,EAAE0H,IAAI,CAAC;IAC/C,CAAC;IAED;;;;;;;IAOM,SAAU4E,qBAAqBA,CAACtM,CAAS,EAAE0H,IAAY,EAAE+C,EAAU,EAAA;IACvE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EAAA,MAAM+B,CAAC,GAAGxM,CAAC,GAAG0H,IAAI;MAClB,MAAM+E,CAAC,GACLhC,EAAE,KAAK,CAAC,IAAI+B,CAAC,GAAGA,CAAC,GAAG7F,eAAe,GAC/B,CAAC,GACD9K,IAAI,CAACqN,GAAG,CAACzC,mBAAmB,GAAG+F,CAAC,GAAGA,CAAC,CAAC;MAC3C,MAAMzC,WAAW,GAAG,CAAC,GAAG/J,CAAC,GAAGA,CAAC,GAAG0H,IAAI,GAAGA,IAAI;IAC3C,EAAA,MAAMgF,OAAO,GAAIhF,IAAI,GAAGA,IAAI,GAAIqC,WAAW;IAC3C,EAAA,MAAM4C,IAAI,GAAK,CAAC,GAAGlG,mBAAmB,GAAGzG,CAAC,IAAK0H,IAAI,GAAGA,IAAI,CAAC,GAAI+E,CAAC;IAChE,EAAA,MAAMG,IAAI,GAAI,EAAE,GAAG5M,CAAC,GAAG0H,IAAI,GAAGA,IAAI,IAAKqC,WAAW,GAAGA,WAAW,CAAC;IACjE,EAAA,MAAM8C,OAAO,GACT,EAAE,GAAGpG,mBAAmB,GAAGzG,CAAC,GAAGA,CAAC,IAAK0H,IAAI,GAAGA,IAAI,GAAGA,IAAI,CAAC,GAAI+E,CAAC;IACjE,EAAA,MAAMK,OAAO,GAAI,CAAC,GAAGpF,IAAI,GAAG1H,CAAC,GAAGA,CAAC,IAAK+J,WAAW,GAAGA,WAAW,CAAC;MAChE,OAAO;QACL/B,GAAG,EAAE,CAAC,CAAC,GAAGyC,EAAE,IAAIiC,OAAO,GAAGjC,EAAE,GAAGgC,CAAC;QAChC3D,EAAE,EAAE,CAAC,CAAC,GAAG2B,EAAE,IAAImC,IAAI,GAAGnC,EAAE,GAAGkC,IAAI;QAC/B5D,KAAK,EAAE,CAAC,CAAC,GAAG0B,EAAE,IAAIqC,OAAO,GAAGrC,EAAE,GAAGoC,OAAO;QACxCR,GAAG,EAAEI,CAAC,GAAGC;IACV,GAAA;IACH;IAEO,MAAMX,sBAAsB,GAAGA,CAAC9H,KAAa,EAAEwG,EAAE,GAAG,GAAG,KAAI;IAChE,EAAA,OAAOxG,KAAK,IAAIwG,EAAE,GAAGxD,mBAAmB,GAAG,CAAC,CAAC;IAC/C,CAAC;IAEM,MAAM6E,sBAAsB,GAAGA,CAACpE,IAAY,EAAE+C,EAAE,GAAG,GAAG,KAAI;IAC/D,EAAA,OAAO/C,IAAI,IAAI+C,EAAE,GAAGxD,mBAAmB,GAAG,CAAC,CAAC;IAC9C,CAAC;IAEM,MAAMgF,kBAAkB,GAAIjR,OAAkC,IAAI;MACvE,MAAM;IAAE0M,IAAAA,IAAI,GAAG,GAAG;IAAES,IAAAA,MAAM,GAAG,CAAC;IAAEsC,IAAAA,EAAE,GAAG;IAAG,GAAE,GAAGzP,OAAO;IACpD,EAAA,OAAQ0M,IAAI,GAAGS,MAAM,IAAIsC,EAAE,GAAG7D,gBAAgB,GAAG,CAAC,CAAC,GAAG6D,EAAE,IAAI5O,IAAI,CAACgL,EAAE,CAAC,GAAI,CAAC;IAC3E,CAAC;IAEM,MAAMqF,oBAAoB,GAAGA,CAAC3D,IAAI,GAAG,MAAM,EAAEkC,EAAE,GAAG,GAAG,KAAI;IAC9D,EAAA,OAAOF,qBAAqB,CAAChC,IAAI,EAAEkC,EAAE,CAAC;IACxC,CAAC;IAEM,MAAM2B,kBAAkB,GAAGA,CAChCjD,KAAA,GAAiC,EAAE,EACnCnO,OAAA,GAA4B,EAAE,KAC5B;MACF,MAAM;IAAE0M,IAAAA,IAAI,GAAG,GAAG;IAAE+C,IAAAA,EAAE,GAAG;IAAG,GAAE,GAAGtB,KAAK;MACtC,MAAM;IAAEC,IAAAA,MAAM,GAAG8C,oBAAoB,CAAC,KAAK,EAAEzB,EAAE;IAAC,GAAE,GAAGzP,OAAO;MAC5D,IAAI;QAAES,MAAM;QAAE0M,MAAM,GAAGgE,0BAA0B,CAAC;UAAEzE,IAAI;UAAE+C,EAAE;IAAElC,MAAAA,IAAI,EAAE;SAAG;IAAC,GAAE,GACxEvN,OAAO;MAET,IAAI,CAACmN,MAAM,EAAE;IACXA,IAAAA,MAAM,GACJ,CAAC,IACCsC,EAAE,GAAG5O,IAAI,CAACoG,IAAI,CAAC,CAACwE,mBAAmB,GAAG5K,IAAI,CAACgL,EAAE,CAAC,GAAIa,IAAI,GACrD,CAAC,CAAC,GAAG+C,EAAE,IAAI/C,IAAI,GAAG7L,IAAI,CAACgL,EAAE,GAAI,CAAC,CAAC;IACtC,EAAA;MAEA,IAAI,CAACpL,MAAM,EAAE;IACXA,IAAAA,MAAM,GAAGI,IAAI,CAAC6F,GAAG,CAAC7F,IAAI,CAACwN,IAAI,CAAC3B,IAAI,GAAG0B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxD,IAAA,IAAI3N,MAAM,GAAG,CAAC,KAAK,CAAC,EAAEA,MAAM,EAAE;IAChC,EAAA;IAEA,EAAA,MAAMuB,MAAM,GAAG,CAACvB,MAAM,GAAG,CAAC,IAAI,CAAC;IAC/B,EAAA,MAAMqJ,IAAI,GAAG,IAAI7I,YAAY,CAACR,MAAM,CAAC;MACrC,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIU,MAAM,EAAEV,CAAC,EAAE,EAAE;IAChC,IAAA,MAAM9B,KAAK,GAAGwR,cAAc,CAAC1P,CAAC,GAAGU,MAAM,EAAE0K,IAAI,EAAE+C,EAAE,CAAC,GAAGtC,MAAM;IAC3DrD,IAAAA,IAAI,CAACxI,CAAC,CAAC,GAAG9B,KAAK;QACfsK,IAAI,CAACrJ,MAAM,GAAG,CAAC,GAAGa,CAAC,CAAC,GAAG9B,KAAK;IAC9B,EAAA;IAEA,EAAA,OAAOsK,IAAI;IACb,CAAC;;ICxMD;;;;;IAKM,MAAOiI,cAAc,CAAA;IACTtF,EAAAA,IAAI,GAAG,gBAAyB;MACxCuF,MAAM;MACNC,MAAM;MACNC,KAAK;MACLC,GAAG;MACHC,wBAAwB;MAEhCzF,WAAAA,CAAmB3M,OAAA,GAAsC,EAAE,EAAA;QACzD,MAAM;UAAEqS,KAAK;UAAEC,KAAK;UAAE5F,IAAI;IAAE+C,MAAAA,EAAE,GAAG;IAAG,KAAE,GAAGzP,OAAO;QAEhD,IAAI,CAACmS,GAAG,GAAG1C,EAAE;QACb,IAAI,CAACyC,KAAK,GAAG,CAAC;QACd,IAAI,CAACF,MAAM,GAAG,CAAC;QACf,IAAI,CAACC,MAAM,GAAG,CAAC;QACf,IAAI,CAACG,wBAAwB,GAAGG,uBAAuB,CAAC,CAAC,GAAG9C,EAAE,CAAC;IAE/D,IAAA,IAAI4C,KAAK,KAAK7R,SAAS,IAAI8R,KAAK,KAAK9R,SAAS,EAAE;UAC9C,IAAI,CAACwR,MAAM,GAAGK,KAAK;UACnB,IAAI,CAACC,KAAK,GAAGA,KAAK;IACpB,IAAA,CAAC,MAAM,IAAI5F,IAAI,KAAKlM,SAAS,EAAE;UAC7B,IAAI,CAACkM,IAAI,GAAGA,IAAI;IAClB,IAAA;IACF,EAAA;MAEA,IAAW2F,KAAKA,CAAC7S,KAAa,EAAA;QAC5B,MAAMgT,aAAa,GAAGC,qBAAqB,CAACjT,KAAK,EAAE,IAAI,CAACyS,MAAM,CAAC;IAC/D,IAAA,MAAMS,kBAAkB,GAAG,IAAI,CAACT,MAAM,GAAGO,aAAa;QACtD,IAAI,CAACN,KAAK,GAAGM,aAAa;QAC1B,IAAI,CAACL,GAAG,GACN,CAAC,IACA,OAAO,GAAGO,kBAAkB,GAC3B,OAAO,GAAGA,kBAAkB,GAAGA,kBAAkB,GACjD,OAAO,GAAGA,kBAAkB,GAAGA,kBAAkB,GAAGA,kBAAkB,CAAC;QAC3E,IAAI,CAACV,MAAM,GAAGxS,KAAK;QACnB,IAAI,CAAC4S,wBAAwB,GAAGM,kBAAkB;IACpD,EAAA;IAEA,EAAA,IAAWL,KAAKA,GAAA;QACd,OAAO,IAAI,CAACL,MAAM;IACpB,EAAA;MAEA,IAAWM,KAAKA,CAAC9S,KAAa,EAAA;QAC5B,MAAMgT,aAAa,GAAGC,qBAAqB,CAAC,IAAI,CAACT,MAAM,EAAExS,KAAK,CAAC;IAC/D,IAAA,MAAMkT,kBAAkB,GAAGlT,KAAK,GAAGgT,aAAa;QAChD,IAAI,CAACN,KAAK,GAAGM,aAAa;QAC1B,IAAI,CAACL,GAAG,GACN,CAAC,IACA,OAAO,GAAGO,kBAAkB,GAC3B,OAAO,GAAGA,kBAAkB,GAAGA,kBAAkB,GACjD,OAAO,GAAGA,kBAAkB,GAAGA,kBAAkB,GAAGA,kBAAkB,CAAC;QAC3E,IAAI,CAACT,MAAM,GAAGzS,KAAK;QACnB,IAAI,CAAC4S,wBAAwB,GAAGM,kBAAkB;IACpD,EAAA;IAEA,EAAA,IAAWJ,KAAKA,GAAA;QACd,OAAO,IAAI,CAACL,MAAM;IACpB,EAAA;MAEA,IAAWxC,EAAEA,CAACjQ,KAAa,EAAA;IACzB,IAAA,MAAMkT,kBAAkB,GAAGH,uBAAuB,CAAC,CAAC,GAAG/S,KAAK,CAAC;QAC7D,IAAI,CAAC4S,wBAAwB,GAAGM,kBAAkB;IAClD,IAAA,IAAI,CAACT,MAAM,GAAG,IAAI,CAACC,KAAK,GAAGQ,kBAAkB;QAC7C,IAAI,CAACV,MAAM,GAAG,IAAI,CAACE,KAAK,GAAGS,qBAAqB,CAACD,kBAAkB,CAAC;QACpE,IAAI,CAACP,GAAG,GAAG3S,KAAK;IAClB,EAAA;IAEA,EAAA,IAAWiQ,EAAEA,GAAA;QACX,OAAO,IAAI,CAAC0C,GAAG;IACjB,EAAA;MAEA,IAAWzF,IAAIA,CAAClN,KAAa,EAAA;IAC3B,IAAA,MAAMkT,kBAAkB,GACtB,IAAI,CAACN,wBAAwB,IAAIG,uBAAuB,CAAC,CAAC,GAAG,IAAI,CAACJ,GAAG,CAAC;IACxE,IAAA,IAAI,CAACF,MAAM,GAAGzS,KAAK,GAAGkT,kBAAkB;QACxC,IAAI,CAACV,MAAM,GAAGxS,KAAK,GAAGmT,qBAAqB,CAACD,kBAAkB,CAAC;QAC/D,IAAI,CAACR,KAAK,GAAG1S,KAAK;IACpB,EAAA;IAEA,EAAA,IAAWkN,IAAIA,GAAA;QACb,OAAO,IAAI,CAACwF,KAAK;IACnB,EAAA;MAEOrF,WAAWA,CAACH,IAAI,GAAG,IAAI,CAACwF,KAAK,EAAEzC,EAAE,GAAG,IAAI,CAAC0C,GAAG,EAAA;IACjD,IAAA,OAAOrB,sBAAsB,CAACpE,IAAI,EAAE+C,EAAE,CAAC;IACzC,EAAA;IAEO1C,EAAAA,WAAWA,CAAC9D,KAAa,EAAEwG,EAAA,GAAa,IAAI,CAAC0C,GAAG,EAAA;IACrD,IAAA,OAAOpB,sBAAsB,CAAC9H,KAAK,EAAEwG,EAAE,CAAC;IAC1C,EAAA;IAEOzC,EAAAA,GAAGA,CAAChI,CAAS,EAAA;QAClB,OAAOgM,cAAc,CAAChM,CAAC,EAAE,IAAI,CAACkN,KAAK,EAAE,IAAI,CAACC,GAAG,CAAC;IAChD,EAAA;MAEOjF,OAAOA,CAACC,MAAM,GAAG,CAAC,EAAA;IACvB,IAAA,OAAO8D,kBAAkB,CAAC;UAAEvE,IAAI,EAAE,IAAI,CAACwF,KAAK;UAAE/E,MAAM;UAAEsC,EAAE,EAAE,IAAI,CAAC0C;IAAG,KAAE,CAAC;IACvE,EAAA;IAEO7E,EAAAA,SAASA,CAACC,IAAa,EAAA;IAC5B,IAAA,OAAO2D,oBAAoB,CAAC3D,IAAI,EAAE,IAAI,CAAC4E,GAAG,CAAC;IAC7C,EAAA;MAEO1E,OAAOA,CAACzN,OAAA,GAA4B,EAAE,EAAA;QAC3C,MAAM;UACJS,MAAM;UACN2N,MAAM;UACNjB,MAAM,GAAGgE,0BAA0B,CAAC;YAClCzE,IAAI,EAAE,IAAI,CAACwF,KAAK;YAChBzC,EAAE,EAAE,IAAI,CAAC0C,GAAG;IACZ5E,QAAAA,IAAI,EAAE;IACP,OAAA;IAAC,KACH,GAAGvN,OAAO;QACX,OAAOoR,kBAAkB,CAAC,IAAI,EAAE;UAAEhD,MAAM;UAAE3N,MAAM;IAAE0M,MAAAA;IAAM,KAAE,CAAC;IAC7D,EAAA;MAEOQ,eAAeA,CAACJ,IAAI,GAAG,CAAC,EAAA;IAC7B,IAAA,OAAO4D,0BAA0B,CAAC;UAChCzE,IAAI,EAAE,IAAI,CAACwF,KAAK;UAChBzC,EAAE,EAAE,IAAI,CAAC0C,GAAG;IACZ5E,MAAAA;SACD,CAAC;IACJ,EAAA;IAEOK,EAAAA,aAAaA,GAAA;IAClB,IAAA,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;IAC3B,EAAA;IAEA;;;;;;;;IAQOC,EAAAA,MAAMA,GAAA;QACX,OAAO;UAAEpB,IAAI,EAAE,IAAI,CAACA,IAAI;UAAE4F,KAAK,EAAE,IAAI,CAACL,MAAM;UAAEM,KAAK,EAAE,IAAI,CAACL;SAAQ;IACpE,EAAA;IAEO/R,EAAAA,UAAUA,CAAC8E,CAAS,EAAA;QACzB,MAAM;UAAEgI,GAAG;UAAEc,EAAE;UAAE8E,MAAM;IAAEC,MAAAA;IAAM,KAAE,GAAGC,wBAAwB,CAC1D9N,CAAC,EACD,IAAI,CAACgN,MAAM,EACX,IAAI,CAACC,MAAM,CACZ;QACD,OAAO;UAAEjF,GAAG;UAAEc,EAAE;IAAEG,MAAAA,UAAU,EAAE,CAAC2E,MAAM,EAAEC,MAAM;SAAG;IAClD,EAAA;;IAMF;;;;;;;;;IASM,SAAUC,wBAAwBA,CACtC9N,CAAS,EACTqN,KAAa,EACbC,KAAa,EAAA;IAEb,EAAA,MAAME,aAAa,GAAGC,qBAAqB,CAACJ,KAAK,EAAEC,KAAK,CAAC;IACzD,EAAA,MAAMS,CAAC,GAAGP,aAAa,IAAI,CAAC,CAAC;IAE7B;IACA,EAAA,MAAMQ,QAAQ,GACZ,CAAC,GAAGX,KAAK,IAAI,CAAC,GACd,QAAQ,GAAGA,KAAK,IAAI,CAAC,GAAGC,KAAK,GAC7B,OAAO,GAAGD,KAAK,IAAI,CAAC,GAAGC,KAAK,IAAI,CAAC,GACjC,OAAO,GAAGD,KAAK,GAAGC,KAAK,IAAI,CAAC,GAC5B,OAAO,GAAGA,KAAK,IAAI,CAAC;IACtB,EAAA,MAAMW,QAAQ,GACZ,OAAO,GAAGZ,KAAK,IAAI,CAAC,GACpB,OAAO,GAAGA,KAAK,IAAI,CAAC,GAAGC,KAAK,GAC5B,QAAQ,GAAGD,KAAK,IAAI,CAAC,GAAGC,KAAK,IAAI,CAAC,GAClC,OAAO,GAAGD,KAAK,GAAGC,KAAK,IAAI,CAAC,GAC5B,CAAC,GAAGA,KAAK,IAAI,CAAC;IAEhB;MACA,MAAMY,WAAW,GAAI,GAAG,GAAGV,aAAa,GAAGQ,QAAQ,GAAID,CAAC;MACxD,MAAMI,WAAW,GAAI,GAAG,GAAGX,aAAa,GAAGS,QAAQ,GAAIF,CAAC;IAExD;IACA,EAAA,MAAML,kBAAkB,GAAGJ,KAAK,GAAGE,aAAa;MAChD,MAAMY,yBAAyB,GAC5B,CAACd,KAAK,IAAIE,aAAa,GAAGA,aAAa,CAAC,GAAIU,WAAW;IAC1D,EAAA,MAAMG,yBAAyB,GAC7B,CAAC,GAAGb,aAAa,GAAIF,KAAK,IAAIE,aAAa,GAAGA,aAAa,CAAC,GAAIW,WAAW;IAE7E;IACA,EAAA,MAAMG,cAAc,GAClB,OAAO,GACP,OAAO,GAAGZ,kBAAkB,GAC5B,OAAO,GAAGA,kBAAkB,GAAGA,kBAAkB;IACnD,EAAA,MAAMa,SAAS,GAAG,CAACD,cAAc,GAAGF,yBAAyB;IAC7D,EAAA,MAAMI,SAAS,GAAG,CAACF,cAAc,GAAGD,yBAAyB;MAE7D,MAAM5D,EAAE,GACN,CAAC,IACA,OAAO,GAAGiD,kBAAkB,GAC3B,OAAO,GAAGA,kBAAkB,GAAGA,kBAAkB,GACjD,OAAO,GAAGA,kBAAkB,GAAGA,kBAAkB,GAAGA,kBAAkB,CAAC;IAE3E;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EAAA,MAAMlB,CAAC,GAAGxM,CAAC,GAAGwN,aAAa;MAC3B,MAAMf,CAAC,GACLhC,EAAE,KAAK,CAAC,IAAI+B,CAAC,GAAGA,CAAC,GAAG7F,eAAe,GAC/B,CAAC,GACD9K,IAAI,CAACqN,GAAG,CAACzC,mBAAmB,GAAG+F,CAAC,GAAGA,CAAC,CAAC;MAC3C,MAAMiC,YAAY,GAAG,CAAC,GAAGzO,CAAC,GAAGA,CAAC,GAAGwN,aAAa,GAAGA,aAAa;IAC9D,EAAA,MAAMd,OAAO,GAAIc,aAAa,GAAGA,aAAa,GAAIiB,YAAY;IAC9D,EAAA,MAAM9B,IAAI,GACN,CAAC,GAAGlG,mBAAmB,GAAGzG,CAAC,IAAKwN,aAAa,GAAGA,aAAa,CAAC,GAAIf,CAAC;IACvE,EAAA,MAAMG,IAAI,GACP,EAAE,GAAG5M,CAAC,GAAGwN,aAAa,GAAGA,aAAa,IAAKiB,YAAY,GAAGA,YAAY,CAAC;IAC1E,EAAA,MAAM5B,OAAO,GACT,EAAE,GAAGpG,mBAAmB,GAAGzG,CAAC,GAAGA,CAAC,IAC/BwN,aAAa,GAAGA,aAAa,GAAGA,aAAa,CAAC,GACjDf,CAAC;IACH,EAAA,MAAMK,OAAO,GAAI,CAAC,GAAGU,aAAa,GAAGxN,CAAC,GAAGA,CAAC,IAAKyO,YAAY,GAAGA,YAAY,CAAC;MAC3E,MAAM1F,KAAK,GAAG,CAAC,CAAC,GAAG0B,EAAE,IAAIqC,OAAO,GAAGrC,EAAE,GAAGoC,OAAO;IAC/C,EAAA,MAAMR,GAAG,GAAGI,CAAC,GAAGC,OAAO;MACvB,OAAO;QACL1E,GAAG,EAAE,CAAC,CAAC,GAAGyC,EAAE,IAAIiC,OAAO,GAAGjC,EAAE,GAAGgC,CAAC;QAChC3D,EAAE,EAAE,CAAC,CAAC,GAAG2B,EAAE,IAAImC,IAAI,GAAGnC,EAAE,GAAGkC,IAAI;IAC/BiB,IAAAA,MAAM,EAAE7E,KAAK,GAAGmF,WAAW,GAAG7B,GAAG,GAAGkC,SAAS;IAC7CV,IAAAA,MAAM,EAAE9E,KAAK,GAAGoF,WAAW,GAAG9B,GAAG,GAAGmC;IACrC,GAAA;IACH;IAEA;;;;;;;IAOA,SAASf,qBAAqBA,CAACJ,KAAa,EAAEC,KAAa,EAAA;MACzD,OACE,CAACD,KAAK,IAAI,CAAC,GACT,OAAO,GAAGA,KAAK,IAAI,CAAC,GAAGC,KAAK,GAC5B,OAAO,GAAGD,KAAK,IAAI,CAAC,GAAGC,KAAK,IAAI,CAAC,GACjC,OAAO,GAAGD,KAAK,IAAI,CAAC,GAAGC,KAAK,IAAI,CAAC,GACjC,OAAO,GAAGD,KAAK,GAAGC,KAAK,IAAI,CAAC,GAC5BA,KAAK,IAAI,CAAC,KACZ,GAAG;IAEP;IAEA;;;;;;IAMA,SAASC,uBAAuBA,CAACG,kBAA0B,EAAA;MACzD,IAAIgB,QAAQ,GAAGhB,kBAAkB;MACjC,KAAK,IAAIpR,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,CAAC,EAAEA,CAAC,EAAE,EAAE;QAC1B,MAAMqS,CAAC,GACL,OAAO,GAAGD,QAAQ,GAClB,OAAO,GAAGA,QAAQ,GAAGA,QAAQ,GAC7B,OAAO,GAAGA,QAAQ,GAAGA,QAAQ,GAAGA,QAAQ,GACxChB,kBAAkB;IACpB,IAAA,MAAMkB,EAAE,GACN,OAAO,GAAG,CAAC,GAAG,OAAO,GAAGF,QAAQ,GAAG,CAAC,GAAG,OAAO,GAAGA,QAAQ,GAAGA,QAAQ;QACtEA,QAAQ,IAAIC,CAAC,GAAGC,EAAE;IACpB,EAAA;IACA,EAAA,OAAOF,QAAQ;IACjB;IAEA;;;;;;;;;;IAUA,SAASf,qBAAqBA,CAACD,kBAA0B,EAAA;MACvD,MAAMmB,CAAC,GAAGnB,kBAAkB;IAC5B,EAAA,IAAIoB,CAAC,GAAG,CAAC,GAAGD,CAAC;MACb,KAAK,IAAIvS,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,CAAC,EAAEA,CAAC,EAAE,EAAE;QAC1B,MAAMqS,CAAC,GACLG,CAAC,IAAI,CAAC,GACN,OAAO,GAAGA,CAAC,IAAI,CAAC,GAAGD,CAAC,GACpB,OAAO,GAAGC,CAAC,IAAI,CAAC,GAAGD,CAAC,IAAI,CAAC,GACzB,OAAO,GAAGC,CAAC,IAAI,CAAC,GAAGD,CAAC,IAAI,CAAC,GACzB,OAAO,GAAGC,CAAC,GAAGD,CAAC,IAAI,CAAC,GACpBA,CAAC,IAAI,CAAC,GACN,CAAC;IACH,IAAA,MAAMD,EAAE,GACN,CAAC,GAAGE,CAAC,IAAI,CAAC,GACV,QAAQ,GAAGA,CAAC,IAAI,CAAC,GAAGD,CAAC,GACrB,OAAO,GAAGC,CAAC,IAAI,CAAC,GAAGD,CAAC,IAAI,CAAC,GACzB,OAAO,GAAGC,CAAC,GAAGD,CAAC,IAAI,CAAC,GACpB,OAAO,GAAGA,CAAC,IAAI,CAAC;QAClB,IAAID,EAAE,KAAK,CAAC,EAAE;QACdE,CAAC,IAAIH,CAAC,GAAGC,EAAE;IACb,EAAA;IACA,EAAA,OAAOE,CAAC;IACV;;ICtUA;;;;;;IAMM,MAAOC,qBAAqB,CAAA;IAChBtH,EAAAA,IAAI,GAAG,uBAAgC;IACvD;;;;MAIOC,IAAI;IACX;;;;MAIOtC,KAAK;MAEZuC,WAAAA,CAAmB3M,OAAA,GAA6C,EAAE,EAAA;QAChE,MAAM;IAAE0M,MAAAA,IAAI,GAAG,GAAG;IAAEtC,MAAAA,KAAK,GAAG;IAAG,KAAE,GAAGpK,OAAO;QAE3C,IAAI,CAAC0M,IAAI,GAAGA,IAAI;QAChB,IAAI,CAACtC,KAAK,GAAGA,KAAK;IACpB,EAAA;IAEOyC,EAAAA,WAAWA,CAACH,IAAI,GAAG,IAAI,CAACA,IAAI,EAAA;QACjC,OAAOsH,gCAAgC,CAACtH,IAAI,CAAC;IAC/C,EAAA;IAEOK,EAAAA,WAAWA,CAAC9D,KAAa,EAAA;QAC9B,OAAOgL,gCAAgC,CAAChL,KAAK,CAAC;IAChD,EAAA;IAEO+D,EAAAA,GAAGA,CAAChI,CAAS,EAAA;QAClB,OAAOkP,wBAAwB,CAAClP,CAAC,EAAE,IAAI,CAAC0H,IAAI,EAAE,IAAI,CAACtC,KAAK,CAAC;IAC3D,EAAA;MAEO8C,OAAOA,CAACC,MAAM,GAAG,CAAC,EAAA;IACvB,IAAA,OAAOgH,4BAA4B,CAAC;UAClCzH,IAAI,EAAE,IAAI,CAACA,IAAI;UACfS,MAAM;UACN/C,KAAK,EAAE,IAAI,CAACA;SACb,CAAC;IACJ,EAAA;IAEOkD,EAAAA,SAASA,CAACC,IAAa,EAAA;QAC5B,OAAO6G,8BAA8B,CAAC7G,IAAI,CAAC;IAC7C,EAAA;MAEOE,OAAOA,CAACzN,OAAA,GAA4B,EAAE,EAAA;IAC3C,IAAA,OAAOqU,4BAA4B,CAAC,IAAI,EAAErU,OAAO,CAAC;IACpD,EAAA;MAEO2N,eAAeA,CAACJ,IAAI,GAAG,CAAC,EAAA;QAC7B,MAAM;UAAEnD,KAAK;IAAEsC,MAAAA;IAAI,KAAE,GAAG,IAAI;IAC5B,IAAA,OAAO4H,oCAAoC,CAAC;UAAE5H,IAAI;UAAEa,IAAI;IAAEnD,MAAAA;IAAK,KAAE,CAAC;IACpE,EAAA;IAEOwD,EAAAA,aAAaA,GAAA;IAClB,IAAA,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1B,EAAA;IAEA;;;;IAIOC,EAAAA,MAAMA,GAAA;QACX,OAAO;UAAEpB,IAAI,EAAE,IAAI,CAACA,IAAI;UAAEC,IAAI,EAAE,IAAI,CAACA,IAAI;UAAEtC,KAAK,EAAE,IAAI,CAACA;SAAO;IAChE,EAAA;IAEOlK,EAAAA,UAAUA,CAAC8E,CAAS,EAAA;QACzB,MAAM;UAAEgI,GAAG;UAAEc,EAAE;UAAEC,KAAK;IAAEwG,MAAAA;IAAM,KAAE,GAAGC,+BAA+B,CAChExP,CAAC,EACD,IAAI,CAAC0H,IAAI,EACT,IAAI,CAACtC,KAAK,CACX;QACD,OAAO;UAAE4C,GAAG;UAAEc,EAAE;IAAEG,MAAAA,UAAU,EAAE,CAACF,KAAK,EAAEwG,MAAM;SAAG;IACjD,EAAA;;IAMK,MAAMD,oCAAoC,GAAGA,CAAC;IACnD5H,EAAAA,IAAI,GAAG,CAAC;IACRtC,EAAAA,KAAK,GAAG,CAAC;IACTmD,EAAAA,IAAI,GAAG;IAAC,CACT,KAAI;MACH,OAAQA,IAAI,GAAGb,IAAI,IAAI,OAAO,GAAG,QAAQ,GAAGtC,KAAK,CAAC,GAAI,CAAC;IACzD,CAAC;IAED;;;;;IAKO,MAAM+J,4BAA4B,GACvCnU,OAA4C,IAC1C;MACF,MAAM;IAAE0M,IAAAA,IAAI,GAAG,GAAG;IAAES,IAAAA,MAAM,GAAG,CAAC;IAAE/C,IAAAA,KAAK,GAAG;IAAC,GAAE,GAAGpK,OAAO;MACrD,OAAQmN,MAAM,GAAGT,IAAI,IAAI,OAAO,GAAG,QAAQ,GAAGtC,KAAK,CAAC,GAAI,CAAC;IAC3D,CAAC;IAEM,MAAM8J,wBAAwB,GAAGA,CACtClP,CAAS,EACT0H,IAAY,EACZtC,KAAa,KACX;MACF,MAAMqK,CAAC,GAAG,CAAE,CAAC,GAAGzP,CAAC,GAAI0H,IAAI,KAAK,CAAC;MAC/B,OAAO,CAAC,CAAC,GAAGtC,KAAK,KAAK,CAAC,GAAGqK,CAAC,CAAC,GAAIrK,KAAK,IAAI,CAAC,GAAGqK,CAAC,GAAG,CAAC,CAAC,IAAK,CAAC,GAAGA,CAAC,GAAGA,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAED;;;;;;;IAOM,SAAUD,+BAA+BA,CAC7CxP,CAAS,EACT0H,IAAY,EACZtC,KAAa,EAAA;MAEb,MAAMqK,CAAC,GAAG,CAAE,CAAC,GAAGzP,CAAC,GAAI0H,IAAI,KAAK,CAAC;MAC/B,MAAM6E,UAAU,GAAG,CAAC,IAAI,CAAC,GAAGkD,CAAC,CAAC,CAAC;IAC/B,EAAA,MAAMC,QAAQ,GAAG,CAAC,CAAC,GAAGD,CAAC,GAAG,CAAC,KAAK,CAAC,GAAGA,CAAC,GAAGA,CAAC,GAAGA,CAAC,CAAC,CAAC;MAC/C,MAAMzH,GAAG,GAAG,CAAC,CAAC,GAAG5C,KAAK,IAAImH,UAAU,GAAGnH,KAAK,GAAGsK,QAAQ;IAEvD;IACA,EAAA,MAAMC,aAAa,GAAG,EAAE,IAAI,CAAC,CAAC,GAAGF,CAAC,KAAK,CAAC,GAAGA,CAAC,CAAC,CAAC;MAC9C,MAAM1F,WAAW,GAAG,CAAC,GAAG0F,CAAC,GAAGA,CAAC,GAAGA,CAAC;IACjC,EAAA,MAAMG,WAAW,GACf,EAAE,GAAG,GAAG,CAAC,GAAGH,CAAC,GAAG,GAAG,GAAGA,CAAC,GAAGA,CAAC,CAAC,IAAI1F,WAAW,GAAGA,WAAW,CAAC;MAC5D,MAAM8F,MAAM,GAAG,CAAC,CAAC,GAAGzK,KAAK,IAAIuK,aAAa,GAAGvK,KAAK,GAAGwK,WAAW;MAEhE,MAAME,IAAI,GAAI,CAAC,GAAG9P,CAAC,IAAK0H,IAAI,GAAGA,IAAI,CAAC;IACpC,EAAA,MAAMqI,OAAO,GAAI,EAAE,GAAG/P,CAAC,GAAGA,CAAC,IAAK0H,IAAI,GAAGA,IAAI,GAAGA,IAAI,CAAC;IAEnD,EAAA,MAAMoB,EAAE,GAAG+G,MAAM,GAAGC,IAAI;IACxB,EAAA,MAAM/G,KAAK,GAAG8G,MAAM,GAAGE,OAAO;IAC9B,EAAA,MAAMR,MAAM,GAAGG,QAAQ,GAAGnD,UAAU,CAAC;MACrC,OAAO;QAAEvE,GAAG;QAAEc,EAAE;QAAEC,KAAK;IAAEwG,IAAAA;OAAQ;IACnC;IAEO,MAAMN,gCAAgC,GAAIhL,KAAa,IAAI;MAChE,OAAOA,KAAK,GAAG8C,UAAU;IAC3B,CAAC;IAEM,MAAMiI,gCAAgC,GAAItH,IAAY,IAAI;MAC/D,OAAOA,IAAI,GAAGX,UAAU;IAC1B,CAAC;IAED,MAAMiJ,6BAA6B,GAAI3K,CAAS,IAC9CxJ,IAAI,CAACoO,GAAG,CAACpO,IAAI,CAACgL,EAAE,IAAIxB,CAAC,GAAG,GAAG,CAAC,CAAC;IAExB,MAAM+J,8BAA8B,GAAGA,CAAC7G,IAAI,GAAG,MAAM,KAAI;MAC9D,IAAIA,IAAI,IAAI,CAAC,EAAE;IACb,IAAA,MAAM,IAAIjJ,KAAK,CAAC,wBAAwB,CAAC;IAC3C,EAAA;IACA,EAAA,MAAM4K,YAAY,GAAG,CAAC,CAAC,GAAG3B,IAAI,IAAI,GAAG;IACrC,EAAA,OACE,CAACyH,6BAA6B,CAAC,CAAC,GAAG9F,YAAY,CAAC,GAC9C8F,6BAA6B,CAAC9F,YAAY,CAAC,IAC7C,CAAC;IAEL,CAAC;IAMM,MAAMmF,4BAA4B,GAAGA,CAC1ClG,KAAA,GAA2C,EAAE,EAC7CnO,OAAA,GAAwC,EAAE,KACxC;MACF,MAAM;IAAE0M,IAAAA,IAAI,GAAG,GAAG;IAAEtC,IAAAA,KAAK,GAAG;IAAC,GAAE,GAAG+D,KAAK;MACvC,MAAM;QACJC,MAAM,GAAGgG,8BAA8B,EAAE;QACzCjH,MAAM,GAAGmH,oCAAoC,CAAC;UAAE5H,IAAI;IAAEa,MAAAA,IAAI,EAAE,CAAC;IAAEnD,MAAAA;SAAO;IAAC,GACxE,GAAGpK,OAAO;MACX,IAAI;IAAES,IAAAA;IAAM,GAAE,GAAGT,OAAO;MAExB,IAAI,CAACS,MAAM,EAAE;IACXA,IAAAA,MAAM,GAAGI,IAAI,CAAC6F,GAAG,CAAC7F,IAAI,CAACwN,IAAI,CAAC3B,IAAI,GAAG0B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxD,IAAA,IAAI3N,MAAM,GAAG,CAAC,KAAK,CAAC,EAAEA,MAAM,EAAE;IAChC,EAAA;IAEA,EAAA,MAAMuB,MAAM,GAAG,CAACvB,MAAM,GAAG,CAAC,IAAI,CAAC;IAC/B,EAAA,MAAMqJ,IAAI,GAAG,IAAI7I,YAAY,CAACR,MAAM,CAAC;MACrC,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIU,MAAM,EAAEV,CAAC,EAAE,EAAE;IAChC,IAAA,MAAM9B,KAAK,GAAG0U,wBAAwB,CAAC5S,CAAC,GAAGU,MAAM,EAAE0K,IAAI,EAAEtC,KAAK,CAAC,GAAG+C,MAAM;IACxErD,IAAAA,IAAI,CAACxI,CAAC,CAAC,GAAG9B,KAAK;QACfsK,IAAI,CAACrJ,MAAM,GAAG,CAAC,GAAGa,CAAC,CAAC,GAAG9B,KAAK;IAC9B,EAAA;IAEA,EAAA,OAAOsK,IAAI;IACb,CAAC;;IC3KK,MAAOmL,aAAa,CAAA;IACRxI,EAAAA,IAAI,GAAG,eAAwB;IAC/C;;;;MAIOyI,OAAO;IACd;;;;MAIOC,QAAQ;MAEfxI,WAAAA,CAAmB3M,OAAA,GAAqC,EAAE,EAAA;QACxD,MAAM;IAAEkV,MAAAA,OAAO,GAAG,GAAG;IAAEC,MAAAA,QAAQ,GAAG;IAAG,KAAE,GAAGnV,OAAO;QAEjD,IAAI,CAACkV,OAAO,GAAGA,OAAO;QACtB,IAAI,CAACC,QAAQ,GAAGA,QAAQ;IAC1B,EAAA;IAEA;;;;;;IAMA,EAAA,IAAWzI,IAAIA,GAAA;QACb,OAAO,CAAC,IAAI,CAACwI,OAAO,GAAG,IAAI,CAACC,QAAQ,IAAI,CAAC;IAC3C,EAAA;IAEA;;;;;;;MAOA,IAAWzI,IAAIA,CAAClN,KAAa,EAAA;QAC3B,MAAM;IAAEkN,MAAAA;IAAI,KAAE,GAAG,IAAI;QAErB,IAAIA,IAAI,KAAK,CAAC,EAAE;UACd,IAAI,CAACwI,OAAO,GAAG1V,KAAK;UACpB,IAAI,CAAC2V,QAAQ,GAAG3V,KAAK;IACrB,MAAA;IACF,IAAA;IAEA,IAAA,MAAM4V,KAAK,GAAG5V,KAAK,GAAGkN,IAAI;QAC1B,IAAI,CAACwI,OAAO,IAAIE,KAAK;QACrB,IAAI,CAACD,QAAQ,IAAIC,KAAK;IACxB,EAAA;IAEA;;;;;;IAMOvI,EAAAA,WAAWA,CAACH,IAAI,GAAG,IAAI,CAACA,IAAI,EAAA;QACjC,OAAOI,mBAAmB,CAACJ,IAAI,CAAC;IAClC,EAAA;IAEA;;;;;;;IAOOK,EAAAA,WAAWA,CAAC9D,KAAa,EAAA;QAC9B,OAAO2D,mBAAmB,CAAC3D,KAAK,CAAC;IACnC,EAAA;IAEO+D,EAAAA,GAAGA,CAAChI,CAAS,EAAA;QAClB,OAAOqQ,gBAAgB,CAACrQ,CAAC,EAAE,IAAI,CAACkQ,OAAO,EAAE,IAAI,CAACC,QAAQ,CAAC;IACzD,EAAA;IAEOjI,EAAAA,OAAOA,CACZC,MAAM,GAAGmI,4BAA4B,CAAC;QACpCJ,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBC,QAAQ,EAAE,IAAI,CAACA;OAChB,CAAC,EAAA;IAEF,IAAA,OAAOI,oBAAoB,CAAC;UAC1BL,OAAO,EAAE,IAAI,CAACA,OAAO;UACrBC,QAAQ,EAAE,IAAI,CAACA,QAAQ;IACvBhI,MAAAA;SACD,CAAC;IACJ,EAAA;IAEOG,EAAAA,SAASA,CAACC,IAAa,EAAA;QAC5B,OAAOC,iBAAiB,CAACD,IAAI,CAAC;IAChC,EAAA;MAEOE,OAAOA,CAACzN,OAAA,GAA4B,EAAE,EAAA;IAC3C,IAAA,OAAOwV,oBAAoB,CAAC,IAAI,EAAExV,OAAO,CAAC;IAC5C,EAAA;MAEO2N,eAAeA,CAACJ,IAAI,GAAG,CAAC,EAAA;IAC7B,IAAA,OAAO+H,4BAA4B,CAAC;UAClCJ,OAAO,EAAE,IAAI,CAACA,OAAO;UACrBC,QAAQ,EAAE,IAAI,CAACA,QAAQ;IACvB5H,MAAAA;SACD,CAAC;IACJ,EAAA;IAEOK,EAAAA,aAAaA,GAAA;IAClB,IAAA,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC;IAChC,EAAA;IAEA;;;;IAIOC,EAAAA,MAAMA,GAAA;QACX,OAAO;UACLpB,IAAI,EAAE,IAAI,CAACA,IAAI;UACfyI,OAAO,EAAE,IAAI,CAACA,OAAO;UACrBC,QAAQ,EAAE,IAAI,CAACA;IAChB,KAAA;IACH,EAAA;IAEOjV,EAAAA,UAAUA,CAAC8E,CAAS,EAAA;QACzB,MAAM;UAAEgI,GAAG;UAAEc,EAAE;UAAE2H,QAAQ;IAAEC,MAAAA;IAAS,KAAE,GAAGC,uBAAuB,CAC9D3Q,CAAC,EACD,IAAI,CAACkQ,OAAO,EACZ,IAAI,CAACC,QAAQ,CACd;QACD,OAAO;UAAEnI,GAAG;UAAEc,EAAE;IAAEG,MAAAA,UAAU,EAAE,CAACwH,QAAQ,EAAEC,SAAS;SAAG;IACvD,EAAA;;IAMF;;;;;IAKM,SAAUJ,4BAA4BA,CAC1CtV,OAA4C,EAAA;MAE5C,MAAM;IAAEkV,IAAAA,OAAO,GAAG,GAAG;IAAEC,IAAAA,QAAQ,GAAG,GAAG;IAAE5H,IAAAA,IAAI,GAAG;IAAC,GAAE,GAAGvN,OAAO;MAC3D,OAAQ,CAAC,GAAGuN,IAAI,GAAI3B,gBAAgB,IAAIsJ,OAAO,GAAGC,QAAQ,CAAC;IAC7D;IAEA;;;;;;;;IAQM,SAAUE,gBAAgBA,CAACrQ,CAAS,EAAEkQ,OAAe,EAAEC,QAAgB,EAAA;IAC3E,EAAA,OAAOnQ,CAAC,IAAI,CAAC,GAAGiI,WAAW,CAACjI,CAAC,EAAEkQ,OAAO,CAAC,GAAGjI,WAAW,CAACjI,CAAC,EAAEmQ,QAAQ,CAAC;IACpE;IAEA;;;;;;;;IAQM,SAAUQ,uBAAuBA,CACrC3Q,CAAS,EACTkQ,OAAe,EACfC,QAAgB,EAAA;MAEhB,IAAInQ,CAAC,IAAI,CAAC,EAAE;QACV,MAAM;UAAEgI,GAAG;UAAEc,EAAE;IAAEC,MAAAA;IAAK,KAAE,GAAGC,kBAAkB,CAAChJ,CAAC,EAAEkQ,OAAO,CAAC;QACzD,OAAO;UAAElI,GAAG;UAAEc,EAAE;IAAE2H,MAAAA,QAAQ,EAAE1H,KAAK;IAAE2H,MAAAA,SAAS,EAAE;SAAG;IACnD,EAAA;MACA,MAAM;QAAE1I,GAAG;QAAEc,EAAE;IAAEC,IAAAA;IAAK,GAAE,GAAGC,kBAAkB,CAAChJ,CAAC,EAAEmQ,QAAQ,CAAC;MAC1D,OAAO;QAAEnI,GAAG;QAAEc,EAAE;IAAE2H,IAAAA,QAAQ,EAAE,CAAC;IAAEC,IAAAA,SAAS,EAAE3H;OAAO;IACnD;IAEA;;;;;IAKM,SAAUwH,oBAAoBA,CAACvV,OAAoC,EAAA;MACvE,MAAM;IAAEkV,IAAAA,OAAO,GAAG,GAAG;IAAEC,IAAAA,QAAQ,GAAG,GAAG;IAAEhI,IAAAA,MAAM,GAAG;IAAC,GAAE,GAAGnN,OAAO;MAC7D,OAAQmN,MAAM,GAAGvB,gBAAgB,IAAIsJ,OAAO,GAAGC,QAAQ,CAAC,GAAI,CAAC;IAC/D;IAEA;;;;;;IAMM,SAAUK,oBAAoBA,CAClCrH,KAAA,GAAmC,EAAE,EACrCnO,OAAA,GAA4B,EAAE,EAAA;MAE9B,MAAM;IAAEkV,IAAAA,OAAO,GAAG,GAAG;IAAEC,IAAAA,QAAQ,GAAG;IAAG,GAAE,GAAGhH,KAAK;MAE/C,MAAM;QACJC,MAAM,GAAGZ,iBAAiB,EAAE;QAC5BL,MAAM,GAAGmI,4BAA4B,CAAC;UAAEJ,OAAO;IAAEC,MAAAA;SAAU;IAAC,GAC7D,GAAGnV,OAAO;MACX,IAAI;IAAES,IAAAA;IAAM,GAAE,GAAGT,OAAO;MAExB,IAAI,CAACS,MAAM,EAAE;QACXA,MAAM,GAAGI,IAAI,CAAC6F,GAAG,CACf7F,IAAI,CAACwN,IAAI,CAACxN,IAAI,CAAC8F,GAAG,CAACuO,OAAO,EAAEC,QAAQ,CAAC,GAAG/G,MAAM,CAAC,EAC/C,CAAC,IAAI,EAAE,GAAG,CAAC,CACZ;IACD,IAAA,IAAI3N,MAAM,GAAG,CAAC,KAAK,CAAC,EAAEA,MAAM,EAAE;IAChC,EAAA;IAEA,EAAA,MAAMuB,MAAM,GAAG,CAACvB,MAAM,GAAG,CAAC,IAAI,CAAC;IAC/B,EAAA,MAAMqJ,IAAI,GAAG,IAAI7I,YAAY,CAACR,MAAM,CAAC;MACrC,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGb,MAAM,EAAEa,CAAC,EAAE,EAAE;IAC/BwI,IAAAA,IAAI,CAACxI,CAAC,CAAC,GAAG+T,gBAAgB,CAAC/T,CAAC,GAAGU,MAAM,EAAEkT,OAAO,EAAEC,QAAQ,CAAC,GAAGhI,MAAM;IACpE,EAAA;IAEA,EAAA,OAAOrD,IAAI;IACb;;ICxQM,SAAU8L,UAAUA,CAACzH,KAAc,EAAA;MACvC,MAAM;IAAE1B,IAAAA;IAAI,GAAE,GAAG0B,KAAK;IACtB,EAAA,QAAQ1B,IAAI;IACV,IAAA,KAAK,UAAU;IACb,MAAA,OAAO,IAAID,QAAQ,CAAC2B,KAAK,CAAC;IAC5B,IAAA,KAAK,YAAY;IACf,MAAA,OAAO,IAAIG,UAAU,CAACH,KAAK,CAAC;IAC9B,IAAA,KAAK,aAAa;IAChB,MAAA,OAAO,IAAI0C,WAAW,CAAC1C,KAAK,CAAC;IAC/B,IAAA,KAAK,gBAAgB;IACnB,MAAA,OAAO,IAAI4D,cAAc,CAAC5D,KAAK,CAAC;IAClC,IAAA,KAAK,sBAAsB;IACzB,MAAA,OAAO,IAAIgB,oBAAoB,CAAChB,KAAK,CAAC;IACxC,IAAA,KAAK,uBAAuB;IAC1B,MAAA,OAAO,IAAI4F,qBAAqB,CAAC5F,KAAK,CAAC;IACzC,IAAA,KAAK,eAAe;IAClB,MAAA,OAAO,IAAI8G,aAAa,CAAC9G,KAAK,CAAC;IACjC,IAAA;IACE,MAAA,MAAM,IAAI7J,KAAK,CAAC,CAAA,qBAAA,EAAwBmI,IAAc,EAAE,CAAC;IAC7D;IACF;;IClCA;;;;;IAMM,SAAUoJ,cAAcA,CAACC,aAA6B,EAAA;MAC1D,OAAO,SAASC,WAAWA,CAAC9H,UAAuB,EAAA;IACjD,IAAA,KAAK,MAAMlE,IAAI,IAAI+L,aAAa,EAAE;IAChC,MAAA,KAAK,IAAIxU,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGyI,IAAI,CAACkE,UAAU,CAACxN,MAAM,EAAEa,CAAC,EAAE,EAAE;IAE/C,QAAA,MAAM0U,WAAW,GAAGjM,IAAI,CAACkE,UAAU,CAAC3M,CAAC,CAGpC;IACDyI,QAAAA,IAAI,CAACkM,QAAQ,CAACD,WAAW,CAAC,GAAG/H,UAAU,CAAClE,IAAI,CAAC3G,SAAS,GAAG9B,CAAC,CAAC;IAC7D,MAAA;IACF,IAAA;IACA,IAAA,OAAQ0D,CAAS,IAAI;UACnB,IAAIkR,MAAM,GAAG,CAAC;IACd,MAAA,KAAK,MAAMnM,IAAI,IAAI+L,aAAa,EAAE;IAChC,QAAA,MAAMK,KAAK,GAAGlI,UAAU,CAAClE,IAAI,CAAC3G,SAAS,CAAC;YACxC,MAAM+D,CAAC,GAAG8G,UAAU,CAAClE,IAAI,CAAC3G,SAAS,GAAG,CAAC,CAAC;IACxC8S,QAAAA,MAAM,IAAI/O,CAAC,GAAG4C,IAAI,CAACkM,QAAQ,CAACjJ,GAAG,CAAChI,CAAC,GAAGmR,KAAK,CAAC;IAC5C,MAAA;IACA,MAAA,OAAOD,MAAM;QACf,CAAC;MACH,CAAC;IACH;;IChCA;;;;;IAKM,SAAUE,MAAMA,CAAC5W,KAAc,EAAE6W,OAAgB,EAAA;MACrD,IAAI,CAAC7W,KAAK,EAAE;IACV,IAAA,MAAM,IAAI8E,KAAK,CAAC+R,OAAO,IAAI,aAAa,CAAC;IAC3C,EAAA;IACF;;ICsFA;;;;;;;;;;;IAWM,SAAUC,uBAAuBA,CACrCR,aAA6B,EAC7BjN,KAAa,EACb7I,OAAwB,EACxBuW,MAAM,GAAG,CAAC,EAAA;MAEV,MAAMC,KAAK,GAAGC,mBAAmB,CAACX,aAAa,EAAEjN,KAAK,EAAE7I,OAAO,CAAC;MAChE,MAAM0W,SAAS,GAAGC,0BAA0B,CAC1CH,KAAK,EACLxW,OAAO,CAAC4W,gBAAgB,EACxBL,MAAM,CACP;MAED,MAAMM,WAAW,GAAG,IAAI5V,YAAY,CAACyV,SAAS,CAACjW,MAAM,CAAC;MACtD,MAAMqW,WAAW,GAAG,IAAI7V,YAAY,CAACyV,SAAS,CAACjW,MAAM,CAAC;MACtD,MAAMsW,YAAY,GAAG,IAAI9V,YAAY,CAACyV,SAAS,CAACjW,MAAM,CAAC;MACvD,MAAMuW,YAAY,GAAG,IAAI/V,YAAY,CAACyV,SAAS,CAACjW,MAAM,CAAC;MACvD,MAAMwW,WAAW,GAAa,EAAE;IAEhC,EAAA,KAAK,IAAI3V,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGoV,SAAS,CAACjW,MAAM,EAAEa,CAAC,EAAE,EAAE;IACzC,IAAA,MAAM4V,QAAQ,GAAGR,SAAS,CAACpV,CAAC,CAAC;IAC7BuV,IAAAA,WAAW,CAACvV,CAAC,CAAC,GAAG4V,QAAQ,CAACxQ,GAAG;IAC7BoQ,IAAAA,WAAW,CAACxV,CAAC,CAAC,GAAG4V,QAAQ,CAACvQ,GAAG;IAC7BoQ,IAAAA,YAAY,CAACzV,CAAC,CAAC,GAAG4V,QAAQ,CAACC,IAAI;IAC/BH,IAAAA,YAAY,CAAC1V,CAAC,CAAC,GAAG4V,QAAQ,CAACE,kBAAkB;QAC7C,IAAIF,QAAQ,CAACG,QAAQ,EAAE;IACrBJ,MAAAA,WAAW,CAACvP,IAAI,CAACpG,CAAC,CAAC;IACrB,IAAA;IACF,EAAA;MAEA,OAAO;QACLkV,KAAK;QACLE,SAAS;QACTO,WAAW;QACXJ,WAAW;QACXC,WAAW;QACXC,YAAY;QACZC,YAAY;IACZM,IAAAA,oBAAoBA,CAACC,cAAiC,EAAA;UACpD,MAAMC,YAAY,GAAG,IAAIxU,KAAK,CAASwT,KAAK,CAAC/V,MAAM,CAAC;IACpD,MAAA,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGoV,SAAS,CAACjW,MAAM,EAAEa,CAAC,EAAE,EAAE;IACzC,QAAA,MAAMmW,aAAa,GAAGF,cAAc,CAACjW,CAAC,CAAC;IACvC,QAAA,MAAMoW,OAAO,GAAGhB,SAAS,CAACpV,CAAC,CAAC,CAACoW,OAAO;IACpC,QAAA,KAAK,MAAMC,MAAM,IAAID,OAAO,EAAE;IAC5BF,UAAAA,YAAY,CAACG,MAAM,CAACC,WAAW,CAAC,GAC9BH,aAAa,GAAGE,MAAM,CAACvJ,MAAM,GAAGuJ,MAAM,CAACE,MAAM;IACjD,QAAA;IACF,MAAA;IACA,MAAA,OAAOL,YAAY;IACrB,IAAA;IACD,GAAA;IACH;IAEA;;;;;;;IAOA,SAASf,mBAAmBA,CAC1BX,aAA6B,EAC7BjN,KAAa,EACb7I,OAAwB,EAAA;MAExB,MAAMwW,KAAK,GAAoB,EAAE;IAEjC,EAAA,KAAK,IAAIsB,SAAS,GAAG,CAAC,EAAEA,SAAS,GAAGhC,aAAa,CAACrV,MAAM,EAAEqX,SAAS,EAAE,EAAE;IACrE,IAAA,MAAMC,YAAY,GAAGjC,aAAa,CAACgC,SAAS,CAAC;IAC7C,IAAA,KAAK,IAAIxW,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGyW,YAAY,CAAC9J,UAAU,CAACxN,MAAM,EAAEa,CAAC,EAAE,EAAE;IACvD,MAAA,MAAM0W,SAAS,GAAGD,YAAY,CAAC9J,UAAU,CAAC3M,CAAC,CAAC;UAC5CkV,KAAK,CAAC9O,IAAI,CAAC;IACTkQ,QAAAA,WAAW,EAAEG,YAAY,CAAC3U,SAAS,GAAG9B,CAAC;YACvCwW,SAAS;YACTG,MAAM,EAAEF,YAAY,CAAC7O,EAAE;YACvB8O,SAAS;YACTb,IAAI,EAAEY,YAAY,CAACG,gBAAgB,CAACf,IAAI,CAAC7V,CAAC,CAAC;YAC3CoF,GAAG,EAAEqR,YAAY,CAACG,gBAAgB,CAACxR,GAAG,CAACpF,CAAC,CAAC;YACzCqF,GAAG,EAAEoR,YAAY,CAACG,gBAAgB,CAACvR,GAAG,CAACrF,CAAC,CAAC;YACzC8V,kBAAkB,EAAEW,YAAY,CAACG,gBAAgB,CAACd,kBAAkB,CAAC9V,CAAC,CAAC;YACvE+V,QAAQ,EAAEc,eAAe,CAACtP,KAAK,CAACiP,SAAS,CAAC,EAAEE,SAAS,EAAEhY,OAAO;WAC/D,CAAC;IACJ,IAAA;IACF,EAAA;IAEA,EAAA,OAAOwW,KAAK;IACd;IAEA;;;;;;;IAOA,SAASG,0BAA0BA,CACjCH,KAAsB,EACtBI,gBAA+C,EAC/CL,MAAc,EAAA;IAEd,EAAA,MAAM6B,oBAAoB,GAAG,IAAIC,GAAG,EAAU;MAC9C,MAAM3B,SAAS,GAAuB,EAAE;IACxC,EAAA,MAAM4B,UAAU,GAAG,IAAIC,GAAG,EAAyB;IACnD,EAAA,MAAMC,WAAW,GAAG,IAAID,GAAG,EAAoB;IAC/C,EAAA,KAAK,MAAME,IAAI,IAAIjC,KAAK,EAAE;IACxB8B,IAAAA,UAAU,CAACI,GAAG,CAACC,UAAU,CAACF,IAAI,CAACX,SAAS,EAAEW,IAAI,CAACT,SAAS,CAAC,EAAES,IAAI,CAAC;QAChE,IAAIA,IAAI,CAACR,MAAM,EAAE;UACf,MAAMW,OAAO,GAAGJ,WAAW,CAACK,GAAG,CAACJ,IAAI,CAACR,MAAM,CAAC,IAAI,EAAE;UAClD,IAAI,CAACW,OAAO,CAAChZ,QAAQ,CAAC6Y,IAAI,CAACX,SAAS,CAAC,EAAE;IACrCc,QAAAA,OAAO,CAAClR,IAAI,CAAC+Q,IAAI,CAACX,SAAS,CAAC;IAC9B,MAAA;UACAU,WAAW,CAACE,GAAG,CAACD,IAAI,CAACR,MAAM,EAAEW,OAAO,CAAC;IACvC,IAAA;IACF,EAAA;IAEA,EAAA,KAAK,MAAME,eAAe,IAAIlC,gBAAgB,IAAI,EAAE,EAAE;IACpDF,IAAAA,SAAS,CAAChP,IAAI,CACZqR,mBAAmB,CACjBD,eAAe,EACfR,UAAU,EACVF,oBAAoB,EACpBI,WAAW,EACXjC,MAAM,CACP,CACF;IACH,EAAA;IAEA,EAAA,KAAK,MAAMkC,IAAI,IAAIjC,KAAK,EAAE;QACxB,IAAI4B,oBAAoB,CAACY,GAAG,CAACP,IAAI,CAACb,WAAW,CAAC,EAAE;IAC9C,MAAA;IACF,IAAA;QAEAlB,SAAS,CAAChP,IAAI,CAAC;UACbuR,OAAO,EAAER,IAAI,CAACb,WAAW;UACzBI,SAAS,EAAES,IAAI,CAACT,SAAS;UACzBb,IAAI,EAAEsB,IAAI,CAACtB,IAAI;UACfzQ,GAAG,EAAE+R,IAAI,CAAC/R,GAAG;UACbC,GAAG,EAAE8R,IAAI,CAAC9R,GAAG;UACbyQ,kBAAkB,EAAEqB,IAAI,CAACrB,kBAAkB;UAC3CC,QAAQ,EAAEoB,IAAI,CAACpB,QAAQ;IACvBK,MAAAA,OAAO,EAAE,CACP;YACEE,WAAW,EAAEa,IAAI,CAACb,WAAW;YAC7BE,SAAS,EAAEW,IAAI,CAACX,SAAS;YACzBE,SAAS,EAAES,IAAI,CAACT,SAAS;IACzB5J,QAAAA,MAAM,EAAE,CAAC;IACTyJ,QAAAA,MAAM,EAAE;IACT,OAAA;SAEJ,CAAC;IACJ,EAAA;IAEAnB,EAAAA,SAAS,CAAClL,IAAI,CAAC,CAAChJ,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACyW,OAAO,GAAGxW,CAAC,CAACwW,OAAO,CAAC;IAC/C,EAAA,OAAOvC,SAAS,CAACwC,GAAG,CAAC,CAAC;IAAED,IAAAA,OAAO,EAAEE,QAAQ;QAAE,GAAGjC;OAAU,KAAKA,QAAQ,CAAC;IACxE;IAEA,SAAS6B,mBAAmBA,CAC1BD,eAAgC,EAChCR,UAAsC,EACtCF,oBAAiC,EACjCI,WAAkC,EAClCjC,MAAc,EAAA;IAEd,EAAA,IAAIuC,eAAe,CAACjQ,KAAK,CAACpI,MAAM,KAAK,CAAC,EAAE;QACtC,MAAM,IAAI6D,KAAK,CACb,CAAA,qBAAA,EAAwBwU,eAAe,CAACd,SAAS,iCAAiC,CACnF;IACH,EAAA;MAEA,MAAMoB,eAAe,GAAGN,eAAe,CAACjQ,KAAK,CAACqQ,GAAG,CAAEnP,IAAI,IAAI;IACzD,IAAA,MAAM0O,IAAI,GAAGY,iBAAiB,CAC5BtP,IAAI,EACJ+O,eAAe,CAACd,SAAS,EACzBM,UAAU,EACVE,WAAW,CACZ;QACD,IAAIJ,oBAAoB,CAACY,GAAG,CAACP,IAAI,CAACb,WAAW,CAAC,EAAE;IAC9C,MAAA,MAAM,IAAItT,KAAK,CACb,CAAA,KAAA,EAAQgV,MAAM,CAACvP,IAAI,CAACb,EAAE,CAAC,CAAA,WAAA,EAAc4P,eAAe,CAACd,SAAS,oBAAoB,CACnF;IACH,IAAA;QACA,OAAO;UACLS,IAAI;UACJrK,MAAM,EAAEd,SAAS,CAACvD,IAAI,EAAE+O,eAAe,CAACd,SAAS,CAAC;UAClDH,MAAM,EAAE0B,SAAS,CAACxP,IAAI,EAAE+O,eAAe,CAACd,SAAS,EAAEzB,MAAM;IAC1D,KAAA;IACH,EAAA,CAAC,CAAC;IAEF,EAAA,MAAMiD,mBAAmB,GAAG,IAAInB,GAAG,EAAU;IAC7C,EAAA,KAAK,MAAMV,MAAM,IAAIyB,eAAe,EAAE;QACpC,IAAII,mBAAmB,CAACR,GAAG,CAACrB,MAAM,CAACc,IAAI,CAACb,WAAW,CAAC,EAAE;UACpD,MAAM,IAAItT,KAAK,CACb,CAAA,qBAAA,EAAwBwU,eAAe,CAACd,SAAS,wCAAwC,CAC1F;IACH,IAAA;QACAwB,mBAAmB,CAACC,GAAG,CAAC9B,MAAM,CAACc,IAAI,CAACb,WAAW,CAAC;IAClD,EAAA;IAEA,EAAA,MAAM8B,WAAW,GAAGN,eAAe,CAAC,CAAC,CAAC;IACtC,EAAA,IAAIO,SAAS,GAAGvZ,MAAM,CAACwZ,iBAAiB;IACxC,EAAA,IAAIC,SAAS,GAAGzZ,MAAM,CAACyE,iBAAiB;IACxC,EAAA,MAAMwS,QAAQ,GAAGqC,WAAW,CAACjB,IAAI,CAACpB,QAAQ;MAC1C,MAAMyC,oBAAoB,GAAa,EAAE;IAEzC,EAAA,KAAK,MAAMnC,MAAM,IAAIyB,eAAe,EAAE;IACpC,IAAA,IAAIzB,MAAM,CAACc,IAAI,CAACpB,QAAQ,KAAKA,QAAQ,EAAE;UACrC,MAAM,IAAI/S,KAAK,CACb,CAAA,iBAAA,EAAoBwU,eAAe,CAACd,SAAS,yDAAyD,CACvG;IACH,IAAA;QAEA,IAAIL,MAAM,CAACc,IAAI,CAAC/R,GAAG,GAAGiR,MAAM,CAACc,IAAI,CAAC9R,GAAG,EAAE;UACrC,MAAM,IAAIrC,KAAK,CACb,CAAA,iBAAA,EAAoBwU,eAAe,CAACd,SAAS,6CAA6C,CAC3F;IACH,IAAA;IAEA,IAAA,MAAM+B,cAAc,GAAGC,uBAAuB,CAACrC,MAAM,CAAC;QACtDgC,SAAS,GAAG9Y,IAAI,CAAC8F,GAAG,CAACgT,SAAS,EAAEI,cAAc,CAACrT,GAAG,CAAC;QACnDmT,SAAS,GAAGhZ,IAAI,CAAC6F,GAAG,CAACmT,SAAS,EAAEE,cAAc,CAACpT,GAAG,CAAC;IACnDmT,IAAAA,oBAAoB,CAACpS,IAAI,CACvB,CAACiQ,MAAM,CAACc,IAAI,CAACtB,IAAI,GAAGQ,MAAM,CAACE,MAAM,IAAIF,MAAM,CAACvJ,MAAM,CACnD;IACH,EAAA;MAEA,IAAIuL,SAAS,GAAGE,SAAS,EAAE;QACzB,MAAM,IAAIvV,KAAK,CACb,CAAA,iBAAA,EAAoBwU,eAAe,CAACd,SAAS,6CAA6C,CAC3F;IACH,EAAA;IAEA,EAAA,KAAK,MAAML,MAAM,IAAIyB,eAAe,EAAE;QACpChB,oBAAoB,CAACqB,GAAG,CAAC9B,MAAM,CAACc,IAAI,CAACb,WAAW,CAAC;IACnD,EAAA;MAEA,OAAO;IACLqB,IAAAA,OAAO,EAAEpY,IAAI,CAAC6F,GAAG,CACf,GAAG0S,eAAe,CAACF,GAAG,CAAEvB,MAAM,IAAKA,MAAM,CAACc,IAAI,CAACb,WAAW,CAAC,CAC5D;QACDI,SAAS,EAAEc,eAAe,CAACd,SAAS;IACpCb,IAAAA,IAAI,EAAE5R,KAAK,CAACuU,oBAAoB,CAAC;IACjCpT,IAAAA,GAAG,EAAEiT,SAAS;IACdhT,IAAAA,GAAG,EAAEkT,SAAS;QACdzC,kBAAkB,EAAEvW,IAAI,CAAC6F,GAAG,CAC1B,GAAG0S,eAAe,CAACF,GAAG,CAAE/W,CAAC,IAAKtB,IAAI,CAAC6D,GAAG,CAACvC,CAAC,CAACsW,IAAI,CAACrB,kBAAkB,CAAC,CAAC,CACnE;QACDC,QAAQ;IACRK,IAAAA,OAAO,EAAE0B,eAAe,CAACF,GAAG,CAAEvB,MAAM,KAAM;IACxCC,MAAAA,WAAW,EAAED,MAAM,CAACc,IAAI,CAACb,WAAW;IACpCE,MAAAA,SAAS,EAAEH,MAAM,CAACc,IAAI,CAACX,SAAS;IAChCE,MAAAA,SAAS,EAAEL,MAAM,CAACc,IAAI,CAACT,SAAS;UAChC5J,MAAM,EAAEuJ,MAAM,CAACvJ,MAAM;UACrByJ,MAAM,EAAEF,MAAM,CAACE;SAChB,CAAC;IACH,GAAA;IACH;IAEA,SAASwB,iBAAiBA,CACxBtP,IAAyB,EACzBiO,SAAiB,EACjBM,UAAsC,EACtCE,WAAkC,EAAA;MAElC,MAAMV,SAAS,GACb,OAAO/N,IAAI,CAACb,EAAE,KAAK,QAAQ,GACvBa,IAAI,CAACb,EAAE,GACP+Q,oBAAoB,CAAClQ,IAAI,CAACb,EAAE,EAAEsP,WAAW,CAAC;MAEhD,IAAI,CAACpY,MAAM,CAACC,SAAS,CAACyX,SAAS,CAAC,IAAIA,SAAS,GAAG,CAAC,EAAE;QACjD,MAAM,IAAIxT,KAAK,CAAC,CAAA,uBAAA,EAA0BgV,MAAM,CAACvP,IAAI,CAACb,EAAE,CAAC,CAAA,CAAE,CAAC;IAC9D,EAAA;IAEA,EAAA,MAAMuP,IAAI,GAAGH,UAAU,CAACO,GAAG,CAACF,UAAU,CAACb,SAAS,EAAEE,SAAS,CAAC,CAAC;MAC7D,IAAI,CAACS,IAAI,EAAE;IACT,IAAA,MAAM,IAAInU,KAAK,CACb,CAAA,kBAAA,EAAqB0T,SAAS,CAAA,UAAA,EAAasB,MAAM,CAACvP,IAAI,CAACb,EAAE,CAAC,EAAE,CAC7D;IACH,EAAA;IAEA,EAAA,OAAOuP,IAAI;IACb;IAEA,SAASwB,oBAAoBA,CAC3BhC,MAAc,EACdO,WAAkC,EAAA;IAElC,EAAA,MAAMI,OAAO,GAAGJ,WAAW,CAACK,GAAG,CAACZ,MAAM,CAAC;MACvC,IAAI,CAACW,OAAO,IAAIA,OAAO,CAACnY,MAAM,KAAK,CAAC,EAAE;IACpC,IAAA,MAAM,IAAI6D,KAAK,CAAC,CAAA,gBAAA,EAAmB2T,MAAM,EAAE,CAAC;IAC9C,EAAA;MACA,IAAI,IAAII,GAAG,CAACO,OAAO,CAAC,CAACsB,IAAI,GAAG,CAAC,EAAE;IAC7B,IAAA,MAAM,IAAI5V,KAAK,CACb,CAAA,QAAA,EAAW2T,MAAM,oDAAoD,CACtE;IACH,EAAA;MAEA,OAAOW,OAAO,CAAC,CAAC,CAAC;IACnB;IAEA,SAAStL,SAASA,CAACvD,IAAyB,EAAEiO,SAAiB,EAAA;IAC7D,EAAA,MAAM5J,MAAM,GAAGrE,IAAI,CAACqE,MAAM,IAAI,CAAC;MAC/B,IAAI,CAAChO,MAAM,CAAC+Z,QAAQ,CAAC/L,MAAM,CAAC,IAAIA,MAAM,KAAK,CAAC,EAAE;IAC5C,IAAA,MAAM,IAAI9J,KAAK,CACb,CAAA,iBAAA,EAAoB0T,SAAS,oCAAoC,CAClE;IACH,EAAA;IACA,EAAA,OAAO5J,MAAM;IACf;IAEA,SAASmL,SAASA,CAChBxP,IAAyB,EACzBiO,SAAiB,EACjBzB,MAAc,EAAA;IAEd,EAAA,MAAMsB,MAAM,GAAG9N,IAAI,CAAC8N,MAAM,IAAI,CAAC;IAC/B,EAAA,IAAI,CAACzX,MAAM,CAAC+Z,QAAQ,CAACtC,MAAM,CAAC,EAAE;IAC5B,IAAA,MAAM,IAAIvT,KAAK,CAAC,CAAA,iBAAA,EAAoB0T,SAAS,2BAA2B,CAAC;IAC3E,EAAA;MACA,IAAIA,SAAS,KAAK,GAAG,EAAE;QACrB,OAAOH,MAAM,GAAGtB,MAAM;IACxB,EAAA;IACA,EAAA,OAAOsB,MAAM;IACf;IAEA,SAASmC,uBAAuBA,CAACrC,MAIhC,EAAA;IACC,EAAA,MAAMyC,cAAc,GAAG,CAACzC,MAAM,CAACc,IAAI,CAAC/R,GAAG,GAAGiR,MAAM,CAACE,MAAM,IAAIF,MAAM,CAACvJ,MAAM;IACxE,EAAA,MAAMiM,cAAc,GAAG,CAAC1C,MAAM,CAACc,IAAI,CAAC9R,GAAG,GAAGgR,MAAM,CAACE,MAAM,IAAIF,MAAM,CAACvJ,MAAM;MAExE,OAAO;QACL1H,GAAG,EAAE7F,IAAI,CAAC6F,GAAG,CAAC0T,cAAc,EAAEC,cAAc,CAAC;IAC7C1T,IAAAA,GAAG,EAAE9F,IAAI,CAAC8F,GAAG,CAACyT,cAAc,EAAEC,cAAc;IAC7C,GAAA;IACH;IAEA,SAASlC,eAAeA,CACtBpO,IAAsB,EACtBiO,SAAiB,EACjBhY,OAAwB,EAAA;MAExBoW,MAAM,CAACrM,IAAI,CAAC;MACZ,IAAIuQ,YAAY,GAAG,IAAI;IACvB,EAAA,MAAMC,YAAY,GAAGxQ,IAAI,CAACkE,UAAU,GAAG+J,SAAS,CAAC;IACjD,EAAA,MAAMwC,WAAW,GAAGxa,OAAO,CAACiO,UAAU,GAAG+J,SAAS,CAAC;IAEnD,EAAA,IAAIuC,YAAY,EAAElD,QAAQ,KAAK7W,SAAS,EAAE;IACxC,IAAA,IAAI,OAAO+Z,YAAY,CAAClD,QAAQ,KAAK,UAAU,EAAE;IAC/CiD,MAAAA,YAAY,GAAGC,YAAY,CAAClD,QAAQ,CAACtN,IAAI,CAAC;IAC5C,IAAA,CAAC,MAAM;UACL,MAAM;IAAEsN,QAAAA,QAAQ,GAAG;IAAI,OAAE,GAAGkD,YAAY;IACxCD,MAAAA,YAAY,GAAGjD,QAAQ;IACzB,IAAA;IACF,EAAA,CAAC,MAAM,IAAImD,WAAW,EAAEnD,QAAQ,KAAK7W,SAAS,EAAE;IAC9C,IAAA,IAAI,OAAOga,WAAW,CAACnD,QAAQ,KAAK,UAAU,EAAE;IAC9CiD,MAAAA,YAAY,GAAGE,WAAW,CAACnD,QAAQ,CAACtN,IAAI,CAAC;IAC3C,IAAA,CAAC,MAAM;UACL,MAAM;IAAEsN,QAAAA,QAAQ,GAAG;IAAI,OAAE,GAAGmD,WAAW;IACvCF,MAAAA,YAAY,GAAGjD,QAAQ;IACzB,IAAA;IACF,EAAA;IAEA,EAAA,OAAOiD,YAAY;IACrB;IAEA,SAAS3B,UAAUA,CAACb,SAAiB,EAAEE,SAAiB,EAAA;IACtD,EAAA,OAAO,CAAA,EAAGF,SAAS,CAAA,CAAA,EAAIE,SAAS,CAAA,CAAE;IACpC;;ICrdA;;;;;;;;;IAUM,SAAUyC,gBAAgBA,CAC9B3E,aAA6B,EAC7B0B,YAAyB,EACzBjB,MAAc,EAAA;MAEd,MAAMmE,QAAQ,GAAmC,EAAE;IAEnD,EAAA,KAAK,MAAM3Q,IAAI,IAAI+L,aAAa,EAAE;QAChC,MAAM;UAAE5M,EAAE;UAAEiF,KAAK;UAAEF,UAAU;IAAE7K,MAAAA;IAAS,KAAE,GAAG2G,IAAI;IAEjD,IAAA,IAAI4Q,OAAO,GAAG;IAAE3V,MAAAA,CAAC,EAAE,CAAC;IAAEmC,MAAAA,CAAC,EAAE,CAAC;IAAEgH,MAAAA;SAAkC;IAE9D,IAAA,IAAIjF,EAAE,EAAE;IACNyR,MAAAA,OAAO,GAAG;IAAE,QAAA,GAAGA,OAAO;IAAEzR,QAAAA;WAAI;IAC9B,IAAA;IAEAyR,IAAAA,OAAO,CAAC3V,CAAC,GAAGwS,YAAY,CAACpU,SAAS,CAAC;QACnCuX,OAAO,CAACxT,CAAC,GAAGqQ,YAAY,CAACpU,SAAS,GAAG,CAAC,CAAC,GAAGmT,MAAM;IAChD,IAAA,KAAK,IAAIjV,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG2M,UAAU,CAACxN,MAAM,EAAEa,CAAC,EAAE,EAAE;IAC1C;IACAqZ,MAAAA,OAAO,CAACxM,KAAK,CAACF,UAAU,CAAC3M,CAAC,CAAC,CAAC,GAAGkW,YAAY,CAACpU,SAAS,GAAG9B,CAAC,CAAC;IAC5D,IAAA;IACAoZ,IAAAA,QAAQ,CAAChT,IAAI,CAACiT,OAAO,CAAC;IACxB,EAAA;IAEA,EAAA,OAAOD,QAAQ;IACjB;;ICnCA;;;;;;;;;;;;;IAaM,SAAUE,wBAAwBA,CACtC9E,aAA6B,EAC7B+E,WAAwB,EACxB7V,CAAc,EACd8V,UAAuB,EACvBC,eAAmE,EACnExE,MAAc,EAAA;IAMd,EAAA,MAAMvJ,GAAG,GAAG+N,eAAe,CAACD,UAAU,CAAC;MACvC,IAAIE,KAAK,GAAG,CAAC;IACb,EAAA,KAAK,IAAI1Z,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGuZ,WAAW,CAACpa,MAAM,EAAEa,CAAC,EAAE,EAAE;IAC3C0Z,IAAAA,KAAK,IAAI,CAACH,WAAW,CAACvZ,CAAC,CAAC,GAAG0L,GAAG,CAAChI,CAAC,CAAC1D,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,EAAA;MAEA,OAAO;QACL0Z,KAAK;IACLC,IAAAA,UAAU,EAAE,CAAC;IACbpS,IAAAA,KAAK,EAAE4R,gBAAgB,CAAI3E,aAAa,EAAEgF,UAAU,EAAEvE,MAAM;IAC7D,GAAA;IACH;;ICnCO,MAAM2E,iBAAiB,GAAG;IAC/BlW,EAAAA,CAAC,EAAE;IACDmS,IAAAA,IAAI,EAAGpN,IAAU,IAAKA,IAAI,CAAC/E,CAAC;IAC5B0B,IAAAA,GAAG,EAAEA,CAACqD,IAAU,EAAEoR,SAA0B,KAC1CpR,IAAI,CAAC/E,CAAC,GAAGmW,SAAS,CAACzO,IAAI,GAAG,CAAC;IAC7B/F,IAAAA,GAAG,EAAEA,CAACoD,IAAU,EAAEoR,SAA0B,KAC1CpR,IAAI,CAAC/E,CAAC,GAAGmW,SAAS,CAACzO,IAAI,GAAG,CAAC;QAC7B0K,kBAAkB,EAAEA,CAACrN,IAAU,EAAEoR,SAA0B,KACzDA,SAAS,CAACzO,IAAI,GAAG;IACpB,GAAA;IACDvF,EAAAA,CAAC,EAAE;IACDgQ,IAAAA,IAAI,EAAGpN,IAAU,IAAKA,IAAI,CAAC5C,CAAC;IAC5BT,IAAAA,GAAG,EAAGqD,IAAU,IAAMA,IAAI,CAAC5C,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAE;QAC5CR,GAAG,EAAGoD,IAAU,IAAMA,IAAI,CAAC5C,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAI;QAC3CiQ,kBAAkB,EAAEA,MAAM;IAC3B,GAAA;IACD1K,EAAAA,IAAI,EAAE;QACJyK,IAAI,EAAEA,CAACpN,IAAU,EAAEoR,SAA0B,KAAKA,SAAS,CAACzO,IAAI;QAChEhG,GAAG,EAAEA,CAACqD,IAAU,EAAEoR,SAA0B,KAAKA,SAAS,CAACzO,IAAI,GAAG,IAAI;QACtE/F,GAAG,EAAEA,CAACoD,IAAU,EAAEoR,SAA0B,KAAKA,SAAS,CAACzO,IAAI,GAAG,CAAC;QACnE0K,kBAAkB,EAAEA,CAACrN,IAAU,EAAEoR,SAA0B,KACzDA,SAAS,CAACzO,IAAI,GAAG;IACpB,GAAA;IACD2F,EAAAA,KAAK,EAAE;QACL8E,IAAI,EAAEA,CAACpN,IAAU,EAAEoR,SAA0B,KAAKA,SAAS,CAACzO,IAAI,GAAG,GAAG;IACtEhG,IAAAA,GAAG,EAAEA,CAACqD,IAAU,EAAEoR,SAA0B,KAC1CA,SAAS,CAACzO,IAAI,GAAG,GAAG,GAAG,IAAI;IAC7B/F,IAAAA,GAAG,EAAEA,CAACoD,IAAU,EAAEoR,SAA0B,KAAKA,SAAS,CAACzO,IAAI,GAAG,GAAG,GAAG,CAAC;QACzE0K,kBAAkB,EAAEA,CAACrN,IAAU,EAAEoR,SAA0B,KACzDA,SAAS,CAACzO,IAAI,GAAG,GAAG,GAAG;IAC1B,GAAA;IACD4F,EAAAA,KAAK,EAAE;QACL6E,IAAI,EAAEA,CAACpN,IAAU,EAAEoR,SAA0B,KAAKA,SAAS,CAACzO,IAAI,GAAG,GAAG;IACtEhG,IAAAA,GAAG,EAAEA,CAACqD,IAAU,EAAEoR,SAA0B,KAC1CA,SAAS,CAACzO,IAAI,GAAG,GAAG,GAAG,IAAI;IAC7B/F,IAAAA,GAAG,EAAEA,CAACoD,IAAU,EAAEoR,SAA0B,KAAKA,SAAS,CAACzO,IAAI,GAAG,GAAG,GAAG,CAAC;QACzE0K,kBAAkB,EAAEA,CAACrN,IAAU,EAAEoR,SAA0B,KACzDA,SAAS,CAACzO,IAAI,GAAG,GAAG,GAAG;IAC1B,GAAA;IACD+C,EAAAA,EAAE,EAAE;QACF0H,IAAI,EAAEA,CAACpN,IAAU,EAAEoR,SAAsB,KAAKA,SAAS,CAAC1L,EAAE;QAC1D/I,GAAG,EAAEA,MAAM,CAAC;QACZC,GAAG,EAAEA,MAAM,CAAC;QACZyQ,kBAAkB,EAAEA,MAAM;IAC3B,GAAA;IACDhN,EAAAA,KAAK,EAAE;QACL+M,IAAI,EAAEA,CAACpN,IAAU,EAAEoR,SAAgC,KACjDA,SAAS,CAAC/Q,KAAK,IAAI,GAAG;IACxB1D,IAAAA,GAAG,EAAEA,MAAM,EAAE;QACbC,GAAG,EAAEA,MAAM,CAAC;QACZyQ,kBAAkB,EAAEA,MAAM;;IAE7B,CAAA;;IChDD,MAAMgE,UAAU,GAAe,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,CAAC;IAW3E;;;;;;;;IAQM,SAAUC,gBAAgBA,CAC9BxS,KAAa,EACb0N,MAAc,EACdvW,OAAA,GAA2B,EAAE,EAAA;MAE7B,IAAI2E,KAAK,GAAG,CAAC;MACb,MAAMmR,aAAa,GAAmB,EAAE;IACxC,EAAA,KAAK,MAAMwF,YAAY,IAAIzS,KAAK,EAAE;IAChC,IAAA,MAAM0S,cAAc,GAAG;IACrB,MAAA,GAAGD,YAAY;IACfnU,MAAAA,CAAC,EAAEmU,YAAY,CAACnU,CAAC,GAAGoP;IACrB,KAAA;QACD,MAAMxM,IAAI,GAAGwR,cAAc;QAC3B,MAAM;UAAErS,EAAE;IAAEiF,MAAAA,KAAK,GAAGnO,OAAO,CAACmO,KAAK,IAAI;IAAE1B,QAAAA,IAAI,EAAE;IAAU;IAAE,KAAE,GAAG1C,IAAI;IAElE,IAAA,MAAMkM,QAAQ,GAAoBL,UAAU,CAACzH,KAAK,CAAC;IAEnD,IAAA,MAAMF,UAAU,GAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAGgI,QAAQ,CAACrI,aAAa,EAAE,CAAC;IAEvE,IAAA,MAAM4N,wBAAwB,GAA+B;IAC3D9U,MAAAA,GAAG,EAAE,EAAE;IACPC,MAAAA,GAAG,EAAE,EAAE;IACPwQ,MAAAA,IAAI,EAAE,EAAE;IACRC,MAAAA,kBAAkB,EAAE;IACrB,KAAA;IAED,IAAA,KAAK,MAAMY,SAAS,IAAI/J,UAAU,EAAE;IAClC,MAAA,KAAK,MAAMwN,QAAQ,IAAIL,UAAU,EAAE;IACjC;YACA,IAAIM,aAAa,GAAG3R,IAAI,EAAEkE,UAAU,GAAG+J,SAAS,CAAC,GAAGyD,QAAQ,CAAC;YAC7D,IAAIC,aAAa,KAAKlb,SAAS,EAAE;cAC/Bkb,aAAa,GAAGC,kBAAkB,CAChCD,aAAa,EACb1D,SAAS,EACTyD,QAAQ,EACRlF,MAAM,CACP;IAEDiF,UAAAA,wBAAwB,CAACC,QAAQ,CAAC,CAAC/T,IAAI,CAACgU,aAAa,CAAC;IACtD,UAAA;IACF,QAAA;IACA;YAEA,IAAIE,qBAAqB,GACvB5b,OAAO,EAAEiO,UAAU,GAAG+J,SAAS,CAAC,GAAGyD,QAAQ,CAAC;YAC9C,IAAIG,qBAAqB,KAAKpb,SAAS,EAAE;IACvC,UAAA,IAAI,OAAOob,qBAAqB,KAAK,QAAQ,EAAE;gBAC7CA,qBAAqB,GAAGD,kBAAkB,CACxCC,qBAAqB,EACrB5D,SAAS,EACTyD,QAAQ,EACRlF,MAAM,CACP;IACDiF,YAAAA,wBAAwB,CAACC,QAAQ,CAAC,CAAC/T,IAAI,CAACkU,qBAAqB,CAAC;IAC9D,YAAA;IACF,UAAA,CAAC,MAAM;IACL;IACA,YAAA,IAAIpc,KAAK,GAAGoc,qBAAqB,CAACN,YAAY,CAAC;gBAC/C9b,KAAK,GAAGmc,kBAAkB,CAACnc,KAAK,EAAEwY,SAAS,EAAEyD,QAAQ,EAAElF,MAAM,CAAC;IAC9DiF,YAAAA,wBAAwB,CAACC,QAAQ,CAAC,CAAC/T,IAAI,CAAClI,KAAK,CAAC;IAC9C,YAAA;IACF,UAAA;IACF,QAAA;IAEA;YACA4W,MAAM,CACJ8E,iBAAiB,CAAClD,SAAS,CAAC,EAC5B,CAAA,yBAAA,EAA4BA,SAAS,CAAA,CAAE,CACxC;YACD,MAAM6D,sBAAsB,GAAGX,iBAAiB,CAAClD,SAAS,CAAC,CAACyD,QAAQ,CAAC;IACrED,QAAAA,wBAAwB,CAACC,QAAQ,CAAC,CAAC/T,IAAI;IACrC;IACAmU,QAAAA,sBAAsB,CAAC9R,IAAI,EAAEkM,QAAQ,CAAC,CACvC;IACH,MAAA;IACF,IAAA;QAEA,MAAM7S,SAAS,GAAGuB,KAAK;QACvB,MAAMtB,OAAO,GAAGD,SAAS,GAAG6K,UAAU,CAACxN,MAAM,GAAG,CAAC;IACjDkE,IAAAA,KAAK,IAAItB,OAAO,GAAGD,SAAS,GAAG,CAAC;IAEhC,IAAA,MAAM8U,gBAAgB,GAAkC;UACtDxR,GAAG,EAAE8U,wBAAwB,CAAC9U,GAAG;UACjCC,GAAG,EAAE6U,wBAAwB,CAAC7U,GAAG;UACjCwQ,IAAI,EAAEqE,wBAAwB,CAACrE,IAAI;UACnCC,kBAAkB,EAAEoE,wBAAwB,CAACpE;IAC9C,KAAA;QAEDtB,aAAa,CAACpO,IAAI,CAAC;UACjBwB,EAAE;UACFiF,KAAK;UACL8H,QAAQ;UACRhI,UAAU;UACViK,gBAAgB;UAChB9U,SAAS;IACTC,MAAAA;SACD,CAAC;IACJ,EAAA;IACA,EAAA,OAAOyS,aAAa;IACtB;IAEA,SAAS6F,kBAAkBA,CACzBnc,KAAa,EACbwY,SAAiB,EACjByD,QAAgB,EAChBlF,MAAc,EAAA;MAEd,IAAIyB,SAAS,KAAK,GAAG,EAAE;QACrB,IAAIyD,QAAQ,KAAK,oBAAoB,EAAE;IACrC,MAAA,OAAOjc,KAAK;IACd,IAAA,CAAC,MAAM;UACL,OAAOA,KAAK,GAAG+W,MAAM;IACvB,IAAA;IACF,EAAA;IACA,EAAA,OAAO/W,KAAK;IACd;;IClJA;IACA,MAAMJ,QAAQ,GAAGC,MAAM,CAACC,SAAS,CAACF,QAAQ;IAc1C;;;;;IAKM,SAAUG,UAAUA,CAACC,KAAc,EAAA;IACvC,EAAA,MAAMC,GAAG,GAAGL,QAAQ,CAACM,IAAI,CAACF,KAAK,CAAC;IAChC,EAAA,OAAOC,GAAG,CAACE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAACF,GAAG,CAACG,QAAQ,CAAC,KAAK,CAAC;IACvD;;ICHc,SAAUkc,YAAYA,CAClChS,IAAY,EACZ9J,OAAkC,EAAA;MAElC,MAAM;QACJ+b,OAAO;QACPC,aAAa;IACb9a,IAAAA,OAAO,GAAG,CAAC;IACX+a,IAAAA,OAAO,GAAG,IAAI;IACdC,IAAAA,aAAa,GAAG,EAAE;IAClBC,IAAAA,eAAe,GAAG,CAAC;IACnBC,IAAAA,aAAa,GAAG,GAAG;IACnBC,IAAAA,cAAc,GAAG,IAAI;IACrBC,IAAAA,iBAAiB,GAAG,KAAK;IACzBlF,IAAAA,kBAAkB,GAAG,KAAK;IAC1BmF,IAAAA,oBAAoB,GAAG;IAAI,GAC5B,GAAGvc,OAAO;MACX,IAAI;QAAEwc,SAAS;IAAEC,IAAAA;IAAS,GAAE,GAAGzc,OAAO;MAEtC,IAAIic,OAAO,IAAI,CAAC,EAAE;IAChB,IAAA,MAAM,IAAI3X,KAAK,CAAC,8CAA8C,CAAC;MACjE,CAAC,MAAM,IAAI,CAACwF,IAAI,CAAC9E,CAAC,IAAI,CAAC8E,IAAI,CAAC3C,CAAC,EAAE;IAC7B,IAAA,MAAM,IAAI7C,KAAK,CAAC,+CAA+C,CAAC;IAClE,EAAA,CAAC,MAAM,IACL,CAAC/E,UAAU,CAACuK,IAAI,CAAC9E,CAAC,CAAC,IACnB8E,IAAI,CAAC9E,CAAC,CAACvE,MAAM,GAAG,CAAC,IACjB,CAAClB,UAAU,CAACuK,IAAI,CAAC3C,CAAC,CAAC,IACnB2C,IAAI,CAAC3C,CAAC,CAAC1G,MAAM,GAAG,CAAC,EACjB;IACA,IAAA,MAAM,IAAI6D,KAAK,CACb,sEAAsE,CACvE;IACH,EAAA,CAAC,MAAM,IAAIwF,IAAI,CAAC9E,CAAC,CAACvE,MAAM,KAAKqJ,IAAI,CAAC3C,CAAC,CAAC1G,MAAM,EAAE;IAC1C,IAAA,MAAM,IAAI6D,KAAK,CAAC,qDAAqD,CAAC;IACxE,EAAA;MAEA,IAAI,EAAE0X,aAAa,IAAIA,aAAa,CAACvb,MAAM,GAAG,CAAC,CAAC,EAAE;IAChD,IAAA,MAAM,IAAI6D,KAAK,CACb,4DAA4D,CAC7D;IACH,EAAA;IACA,EAAA,MAAM2J,UAAU,GAAGjL,KAAK,CAACiC,IAAI,CAAC+W,aAAa,CAAC;IAE5C,EAAA,MAAMU,MAAM,GAAGzO,UAAU,CAACxN,MAAM;IAChCgc,EAAAA,SAAS,GAAGA,SAAS,IAAI,IAAIzZ,KAAK,CAAC0Z,MAAM,CAAC,CAACC,IAAI,CAACvc,MAAM,CAAC6F,gBAAgB,CAAC;IACxEuW,EAAAA,SAAS,GAAGA,SAAS,IAAI,IAAIxZ,KAAK,CAAC0Z,MAAM,CAAC,CAACC,IAAI,CAACvc,MAAM,CAACwc,gBAAgB,CAAC;IAExE,EAAA,IAAIH,SAAS,CAAChc,MAAM,KAAK+b,SAAS,CAAC/b,MAAM,EAAE;IACzC,IAAA,MAAM,IAAI6D,KAAK,CAAC,+CAA+C,CAAC;IAClE,EAAA;IAEA,EAAA,MAAMuY,uBAAuB,GAAGC,0BAA0B,CACxD1F,kBAAkB,EAClBnJ,UAAU,CACX;MAED,MAAM8O,MAAM,GAAGC,SAAS,CAAC9b,OAAO,EAAE4I,IAAI,CAAC9E,CAAC,CAACvE,MAAM,CAAC;IAChD,EAAA,MAAMwc,YAAY,GAAGC,eAAe,CAACnB,OAAO,CAAC;IAE7C,EAAA,MAAMoB,YAAY,GAAGna,KAAK,CAACiC,IAAI,CAAC;IAAExE,IAAAA,MAAM,EAAEqJ,IAAI,CAAC9E,CAAC,CAACvE;OAAQ,EAAE,CAAC2c,CAAC,EAAE9b,CAAC,KAC9Dyb,MAAM,CAACzb,CAAC,CAAC,CACV;MAED,OAAO;QACL2b,YAAY;QACZT,SAAS;QACTC,SAAS;QACTxO,UAAU;QACVkP,YAAY;QACZlB,OAAO;QACPC,aAAa;QACbC,eAAe;QACfC,aAAa;QACbC,cAAc;QACdC,iBAAiB;IACjBlF,IAAAA,kBAAkB,EAAEyF,uBAAuB;IAC3CN,IAAAA;IACD,GAAA;IACH;IAEA,SAASO,0BAA0BA,CACjC1F,kBAA8C,EAC9CnJ,UAAoB,EAAA;IAEpB,EAAA,IAAI,OAAOmJ,kBAAkB,KAAK,QAAQ,EAAE;QAC1C,OAAO,IAAIpU,KAAK,CAACiL,UAAU,CAACxN,MAAM,CAAC,CAACkc,IAAI,CAACvF,kBAAkB,CAAC;IAC9D,EAAA,CAAC,MAAM,IAAI7X,UAAU,CAAC6X,kBAAkB,CAAC,EAAE;IACzC,IAAA,MAAMsF,MAAM,GAAGzO,UAAU,CAACxN,MAAM;IAChC,IAAA,IAAI2W,kBAAkB,CAAC3W,MAAM,KAAKic,MAAM,EAAE;IACxC,MAAA,OAAO,IAAI1Z,KAAK,CAAC0Z,MAAM,CAAC,CAACC,IAAI,CAACvF,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACtD,IAAA;IACA,IAAA,OAAOpU,KAAK,CAACiC,IAAI,CAACmS,kBAAkB,CAAC;IACvC,EAAA;IAEA,EAAA,MAAM,IAAI9S,KAAK,CACb,8FAA8F,CAC/F;IACH;IAEA,SAAS0Y,SAASA,CAChB9b,OAAmC,EACnCmc,UAAkB,EAAA;IAElB,EAAA,IAAI,OAAOnc,OAAO,KAAK,QAAQ,EAAE;IAC/B,IAAA,MAAM1B,KAAK,GAAG,CAAC,GAAG0B,OAAO,IAAI,CAAC;IAC9B,IAAA,OAAO,MAAM1B,KAAK;IACpB,EAAA,CAAC,MAAM,IAAID,UAAU,CAAC2B,OAAO,CAAC,EAAE;IAC9B,IAAA,IAAIA,OAAO,CAACT,MAAM,GAAG4c,UAAU,EAAE;UAC/B,MAAM7d,KAAK,GAAG,CAAC,GAAG0B,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,MAAA,OAAO,MAAM1B,KAAK;IACpB,IAAA;QAEA,OAAQ8B,CAAS,IAAK,CAAC,GAAGJ,OAAO,CAACI,CAAC,CAAC,IAAI,CAAC;IAC3C,EAAA;IAEA,EAAA,MAAM,IAAIgD,KAAK,CACb,oFAAoF,CACrF;IACH;IAEA,SAAS4Y,eAAeA,CAACnB,OAA2B,EAAA;MAClD,IAAIA,OAAO,KAAKvb,SAAS,EAAE;IACzB,IAAA,IAAI,OAAOub,OAAO,KAAK,QAAQ,EAAE;IAC/B,MAAA,MAAM,IAAIzX,KAAK,CAAC,4BAA4B,CAAC;IAC/C,IAAA;QACA,MAAMgZ,OAAO,GAAGC,IAAI,CAACC,GAAG,EAAE,GAAGzB,OAAO,GAAG,IAAI;IAC3C,IAAA,OAAO,MAAMwB,IAAI,CAACC,GAAG,EAAE,GAAGF,OAAO;IACnC,EAAA,CAAC,MAAM;IACL,IAAA,OAAO,MAAM,KAAK;IACpB,EAAA;IACF;;ICpJA;;;;;;;;;IASc,SAAUG,gBAAgBA,CACtC3T,IAAY,EACZmE,UAAoB,EACpByP,qBAA4C,EAC5CP,YAAsB,EAAA;MAEtB,IAAInC,KAAK,GAAG,CAAC;IACb,EAAA,MAAM2C,IAAI,GAAGD,qBAAqB,CAACzP,UAAU,CAAC;IAC9C,EAAA,KAAK,IAAI3M,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGwI,IAAI,CAAC9E,CAAC,CAACvE,MAAM,EAAEa,CAAC,EAAE,EAAE;QACtC0Z,KAAK,IAAI,CAAClR,IAAI,CAAC3C,CAAC,CAAC7F,CAAC,CAAC,GAAGqc,IAAI,CAAC7T,IAAI,CAAC9E,CAAC,CAAC1D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG6b,YAAY,CAAC7b,CAAC,CAAC;IAC/D,EAAA;IAEA,EAAA,OAAO0Z,KAAK;IACd;;ICpBA;;;;;;;;;IASc,SAAU4C,gBAAgBA,CACtC9T,IAAY,EACZ+T,aAA2B,EAC3BC,MAAgB,EAChB1G,kBAA4B,EAC5B2G,aAAoC,EACpCzB,iBAA0B,EAAA;IAE1B,EAAA,MAAM0B,QAAQ,GAAGF,MAAM,CAACrd,MAAM;IAC9B,EAAA,MAAMwd,QAAQ,GAAGnU,IAAI,CAAC9E,CAAC,CAACvE,MAAM;MAC9B,MAAMO,GAAG,GAAGqE,MAAM,CAAC6Y,KAAK,CAACF,QAAQ,EAAEC,QAAQ,CAAC;MAE5C,IAAIE,QAAQ,GAAG,CAAC;MAChB,KAAK,IAAIC,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGJ,QAAQ,EAAEI,KAAK,EAAE,EAAE;IAC7C,IAAA,IAAIhH,kBAAkB,CAACgH,KAAK,CAAC,KAAK,CAAC,EAAE;IACrC,IAAA,IAAIC,KAAK,GAAGjH,kBAAkB,CAACgH,KAAK,CAAC;IACrC,IAAA,IAAIE,SAAS,GAAGR,MAAM,CAACva,KAAK,EAAE;IAC9B+a,IAAAA,SAAS,CAACF,KAAK,CAAC,IAAIC,KAAK;IACzB,IAAA,MAAME,SAAS,GAAGR,aAAa,CAACO,SAAS,CAAC;QAC1C,IAAI,CAAChC,iBAAiB,EAAE;UACtB,KAAK,IAAIkC,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGP,QAAQ,EAAEO,KAAK,EAAE,EAAE;YAC7Cxd,GAAG,CAAC0X,GAAG,CACLyF,QAAQ,EACRK,KAAK,EACL,CAACX,aAAa,CAACW,KAAK,CAAC,GAAGD,SAAS,CAACzU,IAAI,CAAC9E,CAAC,CAACwZ,KAAK,CAAC,CAAC,IAAIH,KAAK,CAC1D;IACH,MAAA;IACF,IAAA,CAAC,MAAM;IACLC,MAAAA,SAAS,GAAGR,MAAM,CAACva,KAAK,EAAE;IAC1B+a,MAAAA,SAAS,CAACF,KAAK,CAAC,IAAIC,KAAK;IACzBA,MAAAA,KAAK,IAAI,CAAC;IACV,MAAA,MAAMI,UAAU,GAAGV,aAAa,CAACO,SAAS,CAAC;UAC3C,KAAK,IAAIE,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGP,QAAQ,EAAEO,KAAK,EAAE,EAAE;IAC7Cxd,QAAAA,GAAG,CAAC0X,GAAG,CACLyF,QAAQ,EACRK,KAAK,EACL,CAACC,UAAU,CAAC3U,IAAI,CAAC9E,CAAC,CAACwZ,KAAK,CAAC,CAAC,GAAGD,SAAS,CAACzU,IAAI,CAAC9E,CAAC,CAACwZ,KAAK,CAAC,CAAC,IAAIH,KAAK,CAC/D;IACH,MAAA;IACF,IAAA;IACAF,IAAAA,QAAQ,EAAE;IACZ,EAAA;IAEA,EAAA,OAAOnd,GAAG;IACZ;;IChDA;;;;;;;;;IASA,SAAS0d,kBAAkBA,CACzB5U,IAAY,EACZgU,MAAgB,EAChBa,gBAAkC,EAAA;IAElC,EAAA,MAAMX,QAAQ,GAAGF,MAAM,CAACrd,MAAM;IAC9B,EAAA,MAAMwd,QAAQ,GAAGnU,IAAI,CAAC9E,CAAC,CAACvE,MAAM;MAC9B,MAAMO,GAAG,GAAGqE,MAAM,CAAC6Y,KAAK,CAACF,QAAQ,EAAEC,QAAQ,CAAC;IAC5C,EAAA,MAAMW,QAAQ,GAAGD,gBAAgB,CAACb,MAAM,CAAC;MACzC,KAAK,IAAIU,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGP,QAAQ,EAAEO,KAAK,EAAE,EAAE;QAC7C,MAAMK,QAAQ,GAAGD,QAAQ,CAAC9U,IAAI,CAAC9E,CAAC,CAACwZ,KAAK,CAAC,CAAC;QACxC,KAAK,IAAIJ,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGJ,QAAQ,EAAEI,KAAK,EAAE,EAAE;IAC7Cpd,MAAAA,GAAG,CAAC0X,GAAG,CAAC0F,KAAK,EAAEI,KAAK,EAAE,CAACK,QAAQ,CAACT,KAAK,CAAC,CAAC;IACzC,IAAA;IACF,EAAA;IACA,EAAA,OAAOpd,GAAG;IACZ;IAEA;;;;;;IAMA,SAAS8d,cAAcA,CAAChV,IAAY,EAAE+T,aAA2B,EAAA;IAC/D,EAAA,MAAM1b,CAAC,GAAG2H,IAAI,CAAC9E,CAAC,CAACvE,MAAM;MAEvB,MAAMO,GAAG,GAAG,IAAIqE,MAAM,CAAClD,CAAC,EAAE,CAAC,CAAC;MAE5B,KAAK,IAAIqc,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGrc,CAAC,EAAEqc,KAAK,EAAE,EAAE;IACtCxd,IAAAA,GAAG,CAAC0X,GAAG,CAAC8F,KAAK,EAAE,CAAC,EAAE1U,IAAI,CAAC3C,CAAC,CAACqX,KAAK,CAAC,GAAGX,aAAa,CAACW,KAAK,CAAC,CAAC;IACzD,EAAA;IACA,EAAA,OAAOxd,GAAG;IACZ;IAEA;;;;;;;;;;;;IAYc,SAAU+d,IAAIA,CAC1BjV,IAAY,EACZgU,MAAgB,EAChB7B,OAAe,EACf7E,kBAA4B,EAC5BsG,qBAA4C,EAC5CpB,iBAA0B,EAC1Bpb,OAA0B,EAC1Byd,gBAAmC,EAAA;IAEnC,EAAA,MAAMhB,IAAI,GAAGD,qBAAqB,CAACI,MAAM,CAAC;MAE1C,MAAMD,aAAa,GAAG,IAAI5c,YAAY,CAAC6I,IAAI,CAAC9E,CAAC,CAACvE,MAAM,CAAC;IACrD,EAAA,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGwI,IAAI,CAAC9E,CAAC,CAACvE,MAAM,EAAEa,CAAC,EAAE,EAAE;IACtCuc,IAAAA,aAAa,CAACvc,CAAC,CAAC,GAAGqc,IAAI,CAAC7T,IAAI,CAAC9E,CAAC,CAAC1D,CAAC,CAAC,CAAC;IACpC,EAAA;MAEA,MAAM0d,YAAY,GAAGL,gBAAgB,GACjCD,kBAAkB,CAAC5U,IAAI,EAAEgU,MAAM,EAAEa,gBAAgB,CAAC,GAClDf,gBAAgB,CACd9T,IAAI,EACJ+T,aAAa,EACbC,MAAM,EACN1G,kBAAkB,EAClBsG,qBAAqB,EACrBpB,iBAAiB,CAClB;IACL,EAAA,MAAM2C,aAAa,GAAGH,cAAc,CAAChV,IAAI,EAAE+T,aAAa,CAAC;IAEzD,EAAA,MAAMqB,oBAAoB,GAAGF,YAAY,CAACG,eAAe,CAACje,OAAO,CAAC;IAClE,EAAA,KAAK,IAAII,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGwc,MAAM,CAACrd,MAAM,EAAEa,CAAC,EAAE,EAAE;IACtC4d,IAAAA,oBAAoB,CAACxG,GAAG,CAACpX,CAAC,EAAEA,CAAC,EAAE4d,oBAAoB,CAACrG,GAAG,CAACvX,CAAC,EAAEA,CAAC,CAAC,GAAG2a,OAAO,CAAC;IAC1E,EAAA;MACA,MAAMmD,2BAA2B,GAAGJ,YAAY,CAACK,IAAI,CACnDJ,aAAa,CAACK,KAAK,CAAC,KAAK,EAAE;IAAEA,IAAAA,KAAK,EAAEpe;IAAO,GAAE,CAAC,CAC/C;IAED;IACA;IACA;IACA;IACA,EAAA,MAAMqe,QAAQ,GAAG,IAAIpa,qBAAqB,CAAC+Z,oBAAoB,CAAC;MAChE,MAAMM,aAAa,GAAGD,QAAQ,CAACE,kBAAkB,EAAE,GAC/CF,QAAQ,CAACG,KAAK,CAACN,2BAA2B,CAAC,GAC3C9Z,OAAO,CAAC4Z,oBAAoB,CAAC,CAACG,IAAI,CAACD,2BAA2B,CAAC;MAEnE,OAAO;QACLI,aAAa;IACbJ,IAAAA;IACD,GAAA;IACH;;ICzGA;;;;;;IAMM,SAAUO,kBAAkBA,CAChC7V,IAAY,EACZ4T,qBAA4C,EAC5C1d,OAAkC,EAAA;IAElC,EAAA,MAAM4f,cAAc,GAAG9D,YAAY,CAAChS,IAAI,EAAE9J,OAAO,CAAC;MAClD,MAAM;QACJid,YAAY;QACZT,SAAS;QACTC,SAAS;QACTxO,UAAU;QACVkP,YAAY;QACZjB,aAAa;QACbC,eAAe;QACfC,aAAa;QACbC,cAAc;QACdC,iBAAiB;QACjBlF,kBAAkB;IAClBmF,IAAAA;IAAoB,GACrB,GAAGqD,cAAc;IAClB,EAAA,IAAI3D,OAAO,GAAG2D,cAAc,CAAC3D,OAAO;MACpC,MAAM;IAAE0C,IAAAA;IAAgB,GAAE,GAAG3e,OAAO;MAEpC,IAAIgb,KAAK,GAAGyC,gBAAgB,CAC1B3T,IAAI,EACJmE,UAAU,EACVyP,qBAAqB,EACrBP,YAAY,CACb;MACD,IAAI0C,YAAY,GAAG7E,KAAK;IACxB,EAAA,IAAI8E,iBAAiB,GAAG7R,UAAU,CAAC1K,KAAK,EAAE;IAE1C,EAAA,IAAIwc,SAAS,GAAG/E,KAAK,IAAIqB,cAAc;MAEvC,IAAI2D,SAAS,GAAG,CAAC;MACjB,OAAOA,SAAS,GAAG5D,aAAa,IAAI,CAAC2D,SAAS,EAAEC,SAAS,EAAE,EAAE;QAC3D,MAAMC,aAAa,GAAGjF,KAAK;QAE3B,MAAM;UAAEwE,aAAa;IAAEJ,MAAAA;IAA2B,KAAE,GAAGL,IAAI,CACzDjV,IAAI,EACJmE,UAAU,EACVgO,OAAO,EACP7E,kBAAkB,EAClBsG,qBAAqB,EACrBpB,iBAAiB,EACjBa,YAAY,EACZwB,gBAAgB,CACjB;IAED,IAAA,KAAK,IAAIvc,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6L,UAAU,CAACxN,MAAM,EAAE2B,CAAC,EAAE,EAAE;IAC1C6L,MAAAA,UAAU,CAAC7L,CAAC,CAAC,GAAGvB,IAAI,CAAC6F,GAAG,CACtB7F,IAAI,CAAC8F,GAAG,CAAC6V,SAAS,CAACpa,CAAC,CAAC,EAAE6L,UAAU,CAAC7L,CAAC,CAAC,GAAGod,aAAa,CAAC3G,GAAG,CAACzW,CAAC,EAAE,CAAC,CAAC,CAAC,EAC/Dqa,SAAS,CAACra,CAAC,CAAC,CACb;IACH,IAAA;QAEA4Y,KAAK,GAAGyC,gBAAgB,CACtB3T,IAAI,EACJmE,UAAU,EACVyP,qBAAqB,EACrBP,YAAY,CACb;IAED,IAAA,IAAI+C,KAAK,CAAClF,KAAK,CAAC,EAAE;IAElB,IAAA,IAAIA,KAAK,GAAG6E,YAAY,GAAGxD,cAAc,EAAE;IACzCwD,MAAAA,YAAY,GAAG7E,KAAK;IACpB8E,MAAAA,iBAAiB,GAAG7R,UAAU,CAAC1K,KAAK,EAAE;IACxC,IAAA;IAEA,IAAA,MAAM4c,iBAAiB,GACrB,CAACF,aAAa,GAAGjF,KAAK,IACtBwE,aAAa,CACVY,SAAS,EAAE,CACXf,IAAI,CAACG,aAAa,CAACa,GAAG,CAACpE,OAAO,CAAC,CAACxC,GAAG,CAAC2F,2BAA2B,CAAC,CAAC,CACjEvG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAEd,IAAIsH,iBAAiB,GAAG5D,oBAAoB,EAAE;UAC5CN,OAAO,GAAGpb,IAAI,CAAC8F,GAAG,CAACsV,OAAO,GAAGE,eAAe,EAAE,IAAI,CAAC;IACrD,IAAA,CAAC,MAAM;UACLF,OAAO,GAAGpb,IAAI,CAAC6F,GAAG,CAACuV,OAAO,GAAGC,aAAa,EAAE,GAAG,CAAC;IAClD,IAAA;QAEA,IAAIe,YAAY,EAAE,EAAE;UAClB,MAAM,IAAI3Y,KAAK,CACb,CAAA,8BAAA,EAAiCtE,OAAO,CAAC+b,OAAO,UAAU,CAC3D;IACH,IAAA;QAEAgE,SAAS,GAAG/E,KAAK,IAAIqB,cAAc;IACrC,EAAA;MAEA,OAAO;IACLiE,IAAAA,eAAe,EAAER,iBAAiB;IAClCS,IAAAA,cAAc,EAAEV,YAAY;IAC5B5E,IAAAA,UAAU,EAAE+E;IACb,GAAA;IACH;;ICjHA;IACA;IACA;IACA;IACA;IACA;IACA;IACe,SAASQ,mBAAmBA,CAACxb,CAAC,EAAEmC,CAAC,EAAE;IAChD,EAAA,IAAInC,CAAC,CAACvE,MAAM,KAAK0G,CAAC,CAAC1G,MAAM,EAAE;IACzB,IAAA,MAAM,IAAIH,UAAU,CAAC,0CAA0C,CAAC;IAClE,EAAA;IAEA,EAAA,MAAM2d,QAAQ,GAAGjZ,CAAC,CAACvE,MAAM,GAAG,CAAC;IAC7B,EAAA,IAAIwd,QAAQ,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;MAC9B,IAAIA,QAAQ,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;MAEjC,IAAIwC,YAAY,GAAG,CAAC;IACpB,EAAA,IAAI1Z,MAAM,GAAG,IAAI/D,KAAK,CAACgC,CAAC,CAACvE,MAAM,CAAC,CAACkc,IAAI,CAAC,IAAI,CAAC;IAC3C,EAAA,OAAO,IAAI,EAAE;QACX,MAAMna,CAAC,GAAGie,YAAY;QACtB,MAAMhe,CAAC,GAAGie,MAAM,CAACD,YAAY,EAAExC,QAAQ,EAAElX,MAAM,CAAC;IAChD,IAAA,MAAM4Z,CAAC,GAAGD,MAAM,CAACA,MAAM,CAACD,YAAY,EAAExC,QAAQ,EAAElX,MAAM,CAAC,EAAEkX,QAAQ,EAAElX,MAAM,CAAC;QAE1E,MAAM6Z,GAAG,GACP5b,CAAC,CAAC2b,CAAC,CAAC,IAAIxZ,CAAC,CAAC3E,CAAC,CAAC,GAAG2E,CAAC,CAAC1E,CAAC,CAAC,CAAC,GAAGuC,CAAC,CAACxC,CAAC,CAAC,IAAI2E,CAAC,CAAC1E,CAAC,CAAC,GAAG0E,CAAC,CAACwZ,CAAC,CAAC,CAAC,GAAG3b,CAAC,CAACvC,CAAC,CAAC,IAAI0E,CAAC,CAACwZ,CAAC,CAAC,GAAGxZ,CAAC,CAAC3E,CAAC,CAAC,CAAC;IAEpE,IAAA,MAAMqe,QAAQ,GAAGD,GAAG,IAAI,CAAC;IAEzB,IAAA,IAAIC,QAAQ,EAAE;IACZJ,MAAAA,YAAY,GAAGhe,CAAC;IAClB,IAAA,CAAC,MAAM;IACLsE,MAAAA,MAAM,CAACtE,CAAC,CAAC,GAAG,KAAK;UACjBge,YAAY,GAAGK,QAAQ,CAACL,YAAY,EAAExC,QAAQ,EAAElX,MAAM,CAAC;IACzD,IAAA;QACA,IAAI4Z,CAAC,KAAK1C,QAAQ,EAAE;IACtB,EAAA;MAEA,OAAOlX,MAAM,CACVmS,GAAG,CAAC,CAAC6H,IAAI,EAAEpc,KAAK,KAAMoc,IAAI,KAAK,KAAK,GAAG,KAAK,GAAGpc,KAAM,CAAC,CACtDqc,MAAM,CAAED,IAAI,IAAKA,IAAI,KAAK,KAAK,CAAC;IACrC;;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;;IAEA,SAASD,QAAQA,CAACL,YAAY,EAAExC,QAAQ,EAAEgD,MAAM,EAAE;IAChD,EAAA,IAAIC,OAAO,GAAGT,YAAY,GAAG,CAAC;MAC9B,OAAOQ,MAAM,CAACC,OAAO,CAAC,KAAK,KAAK,EAAEA,OAAO,EAAE;IAC3C,EAAA,OAAOT,YAAY,KAAK,CAAC,GAAGxC,QAAQ,GAAGiD,OAAO;IAChD;IAEA,SAASR,MAAMA,CAACD,YAAY,EAAExC,QAAQ,EAAEgD,MAAM,EAAE;IAC9C,EAAA,IAAIC,OAAO,GAAGT,YAAY,GAAG,CAAC;MAC9B,OAAOQ,MAAM,CAACC,OAAO,CAAC,KAAK,KAAK,EAAEA,OAAO,EAAE;IAC3C,EAAA,OAAOT,YAAY,KAAKxC,QAAQ,GAAG,CAAC,GAAGiD,OAAO;IAChD;;ICxDA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;IAEe,SAASC,MAAMA,CAC5BC,iBAAiB,EACjBC,eAAe,EACfC,eAAe,EACfthB,OAAO,GAAG,EAAE,EACZ;MACA,MAAM;IACJib,IAAAA,UAAU,GAAG,EAAE;IACfsG,IAAAA,OAAO,GAAG,IAAI;IACdzb,IAAAA,SAAS,GAAG,KAAK;IACjB0b,IAAAA,UAAU,GAAG,KAAK;IAClBC,IAAAA,YAAY,GAAG;IACjB,GAAC,GAAGzhB,OAAO;MAEX,IACEohB,iBAAiB,KAAK5gB,SAAS,IAC/B6gB,eAAe,KAAK7gB,SAAS,IAC7B8gB,eAAe,KAAK9gB,SAAS,EAC7B;IACA,IAAA,MAAM,IAAIF,UAAU,CAAC,8BAA8B,CAAC;IACtD,EAAA;IAEA+gB,EAAAA,eAAe,GAAG,IAAIpgB,YAAY,CAACogB,eAAe,CAAC;IACnDC,EAAAA,eAAe,GAAG,IAAIrgB,YAAY,CAACqgB,eAAe,CAAC;IAEnD,EAAA,IAAID,eAAe,CAAC5gB,MAAM,KAAK6gB,eAAe,CAAC7gB,MAAM,EAAE;IACrD,IAAA,MAAM,IAAI6D,KAAK,CACb,gEACF,CAAC;IACH,EAAA;;IAEA;IACA;IACA;IACA,EAAA,IAAIxB,CAAC,GAAGue,eAAe,CAAC5gB,MAAM;IAC9B,EAAA,IAAIihB,WAAW,GAAGJ,eAAe,CAACpI,GAAG,CAAC,CAAClU,CAAC,EAAE1D,CAAC,KAAK0D,CAAC,GAAGqc,eAAe,CAAC/f,CAAC,CAAC,CAAC;MAEvE,IAAI;IACFqgB,IAAAA,kBAAkB,GAAG,CAAC;IACtBC,IAAAA,eAAe,GAAG,CAAC;IACnBC,IAAAA,kBAAkB,GAAG,CAAC,IAAI5gB,YAAY,CAAC6B,CAAC,CAAC,CAAC6Z,IAAI,CAAC,GAAG,CAAC,CAAC;IACpDmF,IAAAA,WAAW,GAAG,IAAI7gB,YAAY,CAAC6B,CAAC,CAAC,CAACoW,GAAG,CAAC,CAAC1Z,KAAK,EAAEmF,KAAK,KAAK;IACtD,MAAA,OACE0c,eAAe,CAAC1c,KAAK,CAAC,GACtBkd,kBAAkB,CAAC,CAAC,CAAC,CAACld,KAAK,CAAC,GAAG+c,WAAW,CAAC/c,KAAK,CAAC;IAErD,IAAA,CAAC,CAAC;IACFod,IAAAA,gBAAgB,GAAGX,iBAAiB,CAACU,WAAW,CAAC;IACjDE,IAAAA,MAAM,GAAG,CAAC;IACVC,IAAAA,eAAe,GAAG,CAAC;IACnBC,IAAAA,SAAS,GAAG,CAAC,IAAIjhB,YAAY,CAAC6B,CAAC,CAAC,CAAC6Z,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3CwF,IAAAA,iBAAiB,GAAG,CAACthB,IAAI,CAACoG,IAAI,CAACnE,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;QAC7Csf,cAAc,GAAG,CAACL,gBAAgB,CAAC;IACnCM,IAAAA,kBAAkB,GAAGF,iBAAiB;QACtCG,uBAAuB,GAAG,CAACP,gBAAgB,CAAC;IAC5CQ,IAAAA,WAAW,GAAG/hB;IAChB,GAAC,GAAGihB,YAAY;MAChB,IACEA,YAAY,CAACe,mBAAmB,IAChCf,YAAY,CAACe,mBAAmB,CAAC/hB,MAAM,GAAG,CAAC,EAC3C;IACAshB,IAAAA,gBAAgB,GAAGpc,SAAS,CAACyc,cAAc,CAAC;QAC5CG,WAAW,GACThB,OAAO,GAAG1gB,IAAI,CAAC6D,GAAG,CAACqd,gBAAgB,CAAC,GAAG,IAAI,GACvCR,OAAO,GAAG1gB,IAAI,CAAC6D,GAAG,CAACqd,gBAAgB,CAAC,GACpC,IAAI;QAEVE,eAAe,GAAGQ,WAAW,CAC3BL,cAAc,EACdD,iBAAiB,EACjBI,WAAW,EACXR,gBACF,CAAC;IAEDF,IAAAA,kBAAkB,GAAGJ,YAAY,CAACe,mBAAmB,CAACjf,KAAK,EAAE;IAC7D,IAAA,KAAK,IAAIZ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGkf,kBAAkB,CAACphB,MAAM,EAAEkC,CAAC,EAAE,EAAE;IAClD,MAAA,KAAK,IAAIrB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG+f,eAAe,CAAC5gB,MAAM,EAAEa,CAAC,EAAE,EAAE;YAC/CugB,kBAAkB,CAAClf,CAAC,CAAC,CAACrB,CAAC,CAAC,GACtB,CAACugB,kBAAkB,CAAClf,CAAC,CAAC,CAACrB,CAAC,CAAC,GAAG+f,eAAe,CAAC/f,CAAC,CAAC,IAAIogB,WAAW,CAACpgB,CAAC,CAAC;IACpE,MAAA;IACF,IAAA;IACF,EAAA;MAEA,IAAI0e,SAAS,GAAG,CAAC;IACjB;IACA;IACA;;MAEA,OAAOA,SAAS,GAAG/E,UAAU,EAAE;IAC7B;IACA;IACA;;QAEA,IAAIyH,EAAE,GAAG,EAAE;IACX,IAAA,IAAIC,GAAG,GAAGN,kBAAkB,CAACO,SAAS;IACpC;IACCnR,IAAAA,CAAC,IAAKA,CAAC,KAAK0Q,iBAAiB,CAACF,eAAe,CAChD,CAAC;QACD,IAAIf,OAAO,GAAG,CAAC;IACf,IAAA,KAAK,IAAI5f,CAAC,GAAGqhB,GAAG,EAAErhB,CAAC,GAAG+gB,kBAAkB,CAAC5hB,MAAM,EAAEa,CAAC,EAAE,EAAE;IACpD,MAAA,KAAK,IAAIqS,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGyO,cAAc,CAAC3hB,MAAM,EAAEkT,CAAC,EAAE,EAAE;IAC9C,QAAA,IACGyO,cAAc,CAACzO,CAAC,CAAC,KAAK2O,uBAAuB,CAAChhB,CAAC,CAAC,GAChD6gB,iBAAiB,CAACxO,CAAC,CAAC,KAAK0O,kBAAkB,CAAC/gB,CAAC,CAAE,EAChD;IACAohB,UAAAA,EAAE,CAACxB,OAAO,EAAE,CAAC,GAAGvN,CAAC;IACnB,QAAA;IACF,MAAA;IACF,IAAA;QAEA,IAAIkP,kBAAkB,EAAEC,EAAE;IAC1B,IAAA,IAAIT,kBAAkB,CAAC5hB,MAAM,GAAGkiB,GAAG,GAAG,CAAC,EAAE;IACvC,MAAA,IAAIvS,EAAE,GAAG+R,iBAAiB,CAACF,eAAe,CAAC;IAC3C,MAAA,IAAIc,EAAE,GAAGX,cAAc,CAACH,eAAe,CAAC;UACxC,IAAI5R,EAAE,GAAGgS,kBAAkB,CAACA,kBAAkB,CAAC5hB,MAAM,GAAG,CAAC,CAAC;UAC1D,IAAIuiB,EAAE,GAAGV,uBAAuB,CAACD,kBAAkB,CAAC5hB,MAAM,GAAG,CAAC,CAAC;UAC/D,IAAIwiB,KAAK,GAAG,CAACD,EAAE,GAAGD,EAAE,KAAK1S,EAAE,GAAGD,EAAE,CAAC;IACjC,MAAA,IAAI8S,QAAQ,GAAGH,EAAE,GAAGE,KAAK,GAAG7S,EAAE;IAC9B,MAAA,IAAI+S,EAAE,GAAG,IAAIC,WAAW,CAAClC,OAAO,CAAC;IACjCA,MAAAA,OAAO,GAAG,CAAC;IACX,MAAA,KAAK,IAAI5f,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6hB,EAAE,CAAC1iB,MAAM,EAAEa,CAAC,EAAE,EAAE;IAClC,QAAA,IAAIqB,CAAC,GAAG+f,EAAE,CAACphB,CAAC,CAAC;IACb,QAAA,IACE8gB,cAAc,CAACzf,CAAC,CAAC,IACjBsgB,KAAK,GAAGd,iBAAiB,CAACxf,CAAC,CAAC,GAAGugB,QAAQ,GAAG1B,UAAU,EACpD;IACA2B,UAAAA,EAAE,CAACjC,OAAO,EAAE,CAAC,GAAGve,CAAC;IACnB,QAAA;IACF,MAAA;UAEA,IAAI0gB,KAAK,GAAG,EAAE;UACd,IAAIC,KAAK,GAAG,EAAE;UACd,KAAK,IAAIhiB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG4f,OAAO,EAAE5f,CAAC,EAAE,EAAE;YAChC+hB,KAAK,CAAC3b,IAAI,CAACya,iBAAiB,CAACgB,EAAE,CAAC7hB,CAAC,CAAC,CAAC,CAAC;YACpCgiB,KAAK,CAAC5b,IAAI,CAAC0a,cAAc,CAACe,EAAE,CAAC7hB,CAAC,CAAC,CAAC,CAAC;IACnC,MAAA;IAEA,MAAA,IAAIiiB,cAAc,GAAG/C,mBAAmB,CAAC6C,KAAK,EAAEC,KAAK,CAAC;IAEtDR,MAAAA,EAAE,GAAG,EAAE;IACP,MAAA,KAAK,IAAIxhB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGiiB,cAAc,CAAC9iB,MAAM,EAAEa,CAAC,EAAE,EAAE;YAC9CwhB,EAAE,CAACpb,IAAI,CAACyb,EAAE,CAACI,cAAc,CAACjiB,CAAC,CAAC,CAAC,CAAC;IAChC,MAAA;IACF,IAAA,CAAC,MAAM;UACLwhB,EAAE,GAAGJ,EAAE,CAACnf,KAAK,CAAC,CAAC,EAAE2d,OAAO,CAAC;IAC3B,IAAA;IACA2B,IAAAA,kBAAkB,GAAGC,EAAE;IACvB;IACA;IACA;IACA,IAAA,KAAK,IAAI1gB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGygB,kBAAkB,CAACpiB,MAAM,EAAE2B,CAAC,EAAE,EAAE;IAClD,MAAA,IAAIO,CAAC,GAAGkgB,kBAAkB,CAACzgB,CAAC,CAAC;UAC7B,IAAIohB,UAAU,GAAG/d,SAAS,CAACyc,SAAS,CAACvf,CAAC,CAAC,CAAC;UACxC,IAAI8gB,eAAe,GAAG,IAAIL,WAAW,CAAClB,SAAS,CAACvf,CAAC,CAAC,CAAClC,MAAM,CAAC;IAC1DygB,MAAAA,OAAO,GAAG,CAAC;IACX,MAAA,KAAK,IAAI5f,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG4gB,SAAS,CAACvf,CAAC,CAAC,CAAClC,MAAM,EAAEa,CAAC,EAAE,EAAE;IAC5C,QAAA,IAAIT,IAAI,CAAC6D,GAAG,CAACwd,SAAS,CAACvf,CAAC,CAAC,CAACrB,CAAC,CAAC,GAAGkiB,UAAU,CAAC,GAAG1d,SAAS,EAAE;IACtD2d,UAAAA,eAAe,CAACvC,OAAO,EAAE,CAAC,GAAG5f,CAAC;IAChC,QAAA;IACF,MAAA;IACA,MAAA,IAAI+c,KAAK,GAAI,CAAC,GAAGmF,UAAU,GAAI,CAAC;UAChC,IAAIE,kBAAkB,GAAG,EAAE;UAC3B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGzC,OAAO,EAAEyC,CAAC,EAAE,EAAE;IAChC,QAAA,IAAIriB,CAAC,GAAGmiB,eAAe,CAACE,CAAC,CAAC;YAC1B,IAAIC,iBAAiB,GAAG/B,kBAAkB,CAAClf,CAAC,CAAC,CAACY,KAAK,EAAE;YACrD,IAAIsgB,kBAAkB,GAAGhC,kBAAkB,CAAClf,CAAC,CAAC,CAACY,KAAK,EAAE;IACtDqgB,QAAAA,iBAAiB,CAACtiB,CAAC,CAAC,IAAI+c,KAAK;IAC7BwF,QAAAA,kBAAkB,CAACviB,CAAC,CAAC,IAAI+c,KAAK;YAC9B,IAAIyF,gBAAgB,GAAG,IAAI7iB,YAAY,CAAC2iB,iBAAiB,CAACnjB,MAAM,CAAC;YACjE,IAAIsjB,iBAAiB,GAAG,IAAI9iB,YAAY,CAAC4iB,kBAAkB,CAACpjB,MAAM,CAAC;IACnE,QAAA,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGsiB,iBAAiB,CAACnjB,MAAM,EAAEa,CAAC,EAAE,EAAE;IACjDwiB,UAAAA,gBAAgB,CAACxiB,CAAC,CAAC,GACjB+f,eAAe,CAAC/f,CAAC,CAAC,GAAGsiB,iBAAiB,CAACtiB,CAAC,CAAC,GAAGogB,WAAW,CAACpgB,CAAC,CAAC;IAC5DyiB,UAAAA,iBAAiB,CAACziB,CAAC,CAAC,GAClB+f,eAAe,CAAC/f,CAAC,CAAC,GAAGuiB,kBAAkB,CAACviB,CAAC,CAAC,GAAGogB,WAAW,CAACpgB,CAAC,CAAC;IAC/D,QAAA;IACA,QAAA,IAAI0iB,aAAa,GAAG5C,iBAAiB,CAAC0C,gBAAgB,CAAC;IACvD,QAAA,IAAIG,cAAc,GAAG7C,iBAAiB,CAAC2C,iBAAiB,CAAC;IACzD/B,QAAAA,MAAM,IAAI,CAAC;YACX0B,kBAAkB,CAAChc,IAAI,CAAC;cACtB9B,QAAQ,EAAE/E,IAAI,CAAC6F,GAAG,CAACsd,aAAa,EAAEC,cAAc,CAAC;IACjDtf,UAAAA,KAAK,EAAEgf;IACT,SAAC,CAAC;IACF;IACA9B,QAAAA,kBAAkB,CAACna,IAAI,CAACkc,iBAAiB,EAAEC,kBAAkB,CAAC;IAC9DzB,QAAAA,cAAc,CAAC1a,IAAI,CAACsc,aAAa,EAAEC,cAAc,CAAC;IACpD,MAAA;IAEA,MAAA,IAAIxhB,CAAC,GAAGihB,kBAAkB,CAAClY,IAAI,CAAC,CAAChJ,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACoD,QAAQ,GAAGnD,CAAC,CAACmD,QAAQ,CAAC;UAClE,KAAK,IAAI+d,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGzC,OAAO,EAAEyC,CAAC,EAAE,EAAE;YAChC,IAAIlP,CAAC,GAAGgP,eAAe,CAAChhB,CAAC,CAACkhB,CAAC,CAAC,CAAChf,KAAK,CAAC;IACnC,QAAA,IAAIuf,GAAG,GAAGvC,kBAAkB,GAAG,CAAC,IAAIlf,CAAC,CAACkhB,CAAC,CAAC,CAAChf,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;IACvD,QAAA,IAAIwf,GAAG,GAAGxC,kBAAkB,GAAG,CAAC,IAAIlf,CAAC,CAACkhB,CAAC,CAAC,CAAChf,KAAK,GAAG,CAAC,CAAC;YACnDud,SAAS,CAACvf,CAAC,CAAC,CAAC8R,CAAC,CAAC,GAAG4J,KAAK,GAAG,CAAC;YAC3B6D,SAAS,CAACgC,GAAG,CAAC,GAAGhC,SAAS,CAACvf,CAAC,CAAC,CAACY,KAAK,EAAE;YACrC2e,SAAS,CAACiC,GAAG,CAAC,GAAGjC,SAAS,CAACvf,CAAC,CAAC,CAACY,KAAK,EAAE;YACrC4e,iBAAiB,CAACxf,CAAC,CAAC,GAAGmE,KAAK,CAACob,SAAS,CAACvf,CAAC,CAAC,CAAC;IAC1Cwf,QAAAA,iBAAiB,CAAC+B,GAAG,CAAC,GAAG/B,iBAAiB,CAACxf,CAAC,CAAC;IAC7Cwf,QAAAA,iBAAiB,CAACgC,GAAG,CAAC,GAAGhC,iBAAiB,CAACxf,CAAC,CAAC;IAC/C,MAAA;UACAgf,kBAAkB,IAAI,CAAC,GAAGT,OAAO;IACnC,IAAA;;IAEA;IACA;IACA;;IAEAa,IAAAA,gBAAgB,GAAGpc,SAAS,CAACyc,cAAc,CAAC;QAE5CG,WAAW,GACThB,OAAO,GAAG1gB,IAAI,CAAC6D,GAAG,CAACqd,gBAAgB,CAAC,GAAG,IAAI,GACvCR,OAAO,GAAG1gB,IAAI,CAAC6D,GAAG,CAACqd,gBAAgB,CAAC,GACpC,IAAI;IAEVE,IAAAA,eAAe,GAAGQ,WAAW,CAC3BL,cAAc,EACdD,iBAAiB,EACjBI,WAAW,EACXR,gBAEF,CAAC;QAEDM,kBAAkB,GAAGrf,KAAK,CAACiC,IAAI,CAAC,IAAIoT,GAAG,CAAC8J,iBAAiB,CAAC,CAAC;IAC3DE,IAAAA,kBAAkB,GAAGA,kBAAkB,CAAC7W,IAAI,CAAC,CAAChJ,CAAC,EAAEC,CAAC,KAAKD,CAAC,GAAGC,CAAC,CAAC;IAE7D6f,IAAAA,uBAAuB,GAAG,EAAE;IAC5B,IAAA,KAAK,IAAIhhB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG+gB,kBAAkB,CAAC5hB,MAAM,EAAEa,CAAC,EAAE,EAAE;IAClD,MAAA,IAAI8iB,QAAQ;IACZ,MAAA,IAAIxe,QAAQ,GAAGxF,MAAM,CAACyE,iBAAiB;IACvC,MAAA,KAAK,IAAIzC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG+f,iBAAiB,CAAC1hB,MAAM,EAAE2B,CAAC,EAAE,EAAE;YACjD,IAAI+f,iBAAiB,CAAC/f,CAAC,CAAC,KAAKigB,kBAAkB,CAAC/gB,CAAC,CAAC,EAAE;IAClD,UAAA,IAAI8gB,cAAc,CAAChgB,CAAC,CAAC,GAAGwD,QAAQ,EAAE;IAChCA,YAAAA,QAAQ,GAAGwc,cAAc,CAAChgB,CAAC,CAAC;IAC5BgiB,YAAAA,QAAQ,GAAGhiB,CAAC;IACd,UAAA;IACF,QAAA;IACF,MAAA;IACAkgB,MAAAA,uBAAuB,CAAC5a,IAAI,CAAC0a,cAAc,CAACgC,QAAQ,CAAC,CAAC;IACxD,IAAA;IAGA,IAAA,KAAK,IAAIzhB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGyf,cAAc,CAAC3hB,MAAM,EAAEkC,CAAC,EAAE,EAAE;IAC9C,MAAA,IAAIyf,cAAc,CAACzf,CAAC,CAAC,KAAKof,gBAAgB,EAAE;YAC1C,IAAI5d,IAAI,GAAG,EAAE;IACb,QAAA,KAAK,IAAI7C,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG+f,eAAe,CAAC5gB,MAAM,EAAEa,CAAC,EAAE,EAAE;cAC/C6C,IAAI,CAACuD,IAAI,CACP2Z,eAAe,CAAC/f,CAAC,CAAC,GAAGugB,kBAAkB,CAAClf,CAAC,CAAC,CAACrB,CAAC,CAAC,GAAGogB,WAAW,CAACpgB,CAAC,CAC/D,CAAC;IACH,QAAA;IAEF,MAAA;IACF,IAAA;IACA0e,IAAAA,SAAS,IAAI,CAAC;IAChB,EAAA;IACA;IACA;IACA;;MAEA,IAAIjZ,MAAM,GAAG,EAAE;MACfA,MAAM,CAACsd,gBAAgB,GAAGtC,gBAAgB;MAC1Chb,MAAM,CAACkU,UAAU,GAAG+E,SAAS;MAC7B,IAAIwC,mBAAmB,GAAG,EAAE;IAC5B,EAAA,KAAK,IAAI7f,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgf,kBAAkB,GAAG,CAAC,EAAEhf,CAAC,EAAE,EAAE;QAC/C,IAAI2hB,IAAI,GAAG,EAAE;IACb,IAAA,KAAK,IAAIhjB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG+f,eAAe,CAAC5gB,MAAM,EAAEa,CAAC,EAAE,EAAE;UAC/CgjB,IAAI,CAAC5c,IAAI,CAAC2Z,eAAe,CAAC/f,CAAC,CAAC,GAAGugB,kBAAkB,CAAClf,CAAC,CAAC,CAACrB,CAAC,CAAC,GAAGogB,WAAW,CAACpgB,CAAC,CAAC,CAAC;IAC3E,IAAA;IACAkhB,IAAAA,mBAAmB,CAAC9a,IAAI,CAAC4c,IAAI,CAAC;IAChC,EAAA;MAEAvd,MAAM,CAACwd,UAAU,GAAG;QAClB5C,kBAAkB;QAClBC,eAAe,EAAGA,eAAe,IAAI3G,UAAW;QAChDuH,mBAAmB;QACnBV,WAAW;QACXE,MAAM;QACNC,eAAe;QACfC,SAAS;QACTC,iBAAiB;QACjBC,cAAc;QACdC,kBAAkB;QAClBC,uBAAuB;IACvBC,IAAAA;OACD;MAED,IAAIiC,SAAS,GAAG,EAAE;IAClB,EAAA,KAAK,IAAIljB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG8gB,cAAc,CAAC3hB,MAAM,EAAEa,CAAC,EAAE,EAAE;IAC9C,IAAA,IAAI8gB,cAAc,CAAC9gB,CAAC,CAAC,KAAKygB,gBAAgB,EAAE;IAC1CyC,MAAAA,SAAS,CAAC9c,IAAI,CAAC8a,mBAAmB,CAAClhB,CAAC,CAAC,CAAC;IACxC,IAAA;IACF,EAAA;MAEAyF,MAAM,CAAC0d,MAAM,GAAGD,SAAS;IACzB,EAAA,OAAOzd,MAAM;IACf;IAEA,SAAS0b,WAAWA,CAClBL,cAAc,EACdD,iBAAiB,EACjBI,WAAW,EACXR,gBAAgB,EAChB;MACA,IAAIhB,IAAI,GAAG,EAAE;IACb,EAAA,KAAK,IAAIzf,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG8gB,cAAc,CAAC3hB,MAAM,EAAEa,CAAC,EAAE,EAAE;QAC9Cyf,IAAI,CAACzf,CAAC,CAAC,GACLT,IAAI,CAAC6D,GAAG,CAAC0d,cAAc,CAAC9gB,CAAC,CAAC,IAAIygB,gBAAgB,GAAGQ,WAAW,CAAC,CAAC,GAC9DJ,iBAAiB,CAAC7gB,CAAC,CAAC;IACxB,EAAA;IACA,EAAA,MAAMoF,GAAG,GAAGf,SAAS,CAACob,IAAI,CAAC;MAC3B,IAAIha,MAAM,GAAGga,IAAI,CAAC6B,SAAS,CAAE5d,CAAC,IAAKA,CAAC,KAAK0B,GAAG,CAAC;IAC7C,EAAA,OAAOK,MAAM;IACf;;ICjUA;;;;;;;IAOM,SAAU2d,kBAAkBA,CAChC5a,IAAY,EACZiM,WAA+D,EAC/D/V,OAA0C,EAAA;MAE1C,MAAM;QACJwc,SAAS;QACTC,SAAS;QACTL,aAAa;QACbmF,OAAO;QACPzb,SAAS;QACT0b,UAAU;IACVC,IAAAA;IAAY,GACb,GAAGzhB,OAAO;IACX,EAAA,MAAMohB,iBAAiB,GAAGuD,oBAAoB,CAAC7a,IAAI,EAAEiM,WAAW,CAAC;IACjE,EAAA,MAAMhP,MAAM,GAAGoa,MAAM,CACnBC,iBAAiB;IACjB;IACA;MACA5E,SAAqB,EACrBC,SAAqB,EACrB;IACExB,IAAAA,UAAU,EAAEmB,aAAa;QACzBmF,OAAO;QACPzb,SAAS;QACT0b,UAAU;IACVC,IAAAA;OACD,CACF;MAED,MAAM;QAAEgD,MAAM;QAAEJ,gBAAgB;IAAEpJ,IAAAA;IAAU,GAAE,GAAGlU,MAAM;MAEvD,OAAO;IACLwZ,IAAAA,cAAc,EAAE8D,gBAAgB;QAChCpJ,UAAU;QACVqF,eAAe,EAAEmE,MAAM,CAAC,CAAC;IAC1B,GAAA;IACH;IAEA,SAASE,oBAAoBA,CAC3B7a,IAAY,EACZiM,WAA+D,EAAA;MAE/D,MAAM;QAAE/Q,CAAC;IAAEmC,IAAAA;IAAC,GAAE,GAAG2C,IAAI;IACrB,EAAA,MAAMmU,QAAQ,GAAGjZ,CAAC,CAACvE,MAAM;IACzB,EAAA,OAAQwN,UAAuB,IAAI;IACjC,IAAA,MAAMjB,GAAG,GAAG+I,WAAW,CAAC9H,UAAU,CAAC;QACnC,IAAI+M,KAAK,GAAG,CAAC;QACb,KAAK,IAAI1Z,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG2c,QAAQ,EAAE3c,CAAC,EAAE,EAAE;IACjC0Z,MAAAA,KAAK,IAAI,CAAC7T,CAAC,CAAC7F,CAAC,CAAC,GAAG0L,GAAG,CAAChI,CAAC,CAAC1D,CAAC,CAAC,CAAC,KAAK,CAAC;IAClC,IAAA;IACA,IAAA,OAAO0Z,KAAK;MACd,CAAC;IACH;;ICnEA;;;;;IAKM,SAAU4J,YAAYA,CAACC,mBAAA,GAA2C,EAAE,EAAA;MACxE,MAAM;IAAEpY,IAAAA,IAAI,GAAG,IAAI;IAAEzM,IAAAA;IAAO,GAAE,GAAG6kB,mBAAmB;IAEpD,EAAA,QAAQpY,IAAI;IACV,IAAA,KAAK,IAAI;IACT,IAAA,KAAK,oBAAoB;UACvB,OAAO;IACLqY,QAAAA,SAAS,EAAEnF,kBAAkB;IAC7BkF,QAAAA,mBAAmB,EAAE;IACnB5I,UAAAA,OAAO,EAAE,GAAG;IACZG,UAAAA,aAAa,EAAE,GAAG;IAClBC,UAAAA,cAAc,EAAE,IAAI;cACpB,GAAGrc;;IAEN,OAAA;IACH,IAAA,KAAK,QAAQ;IAAE,MAAA;YACb,OAAO;IACL8kB,UAAAA,SAAS,EAAEJ,kBAAkB;IAC7BG,UAAAA,mBAAmB,EAAE;IACnBzI,YAAAA,aAAa,EAAE,EAAE;IACjBmF,YAAAA,OAAO,EAAE,IAAI;IACbzb,YAAAA,SAAS,EAAE,KAAK;IAChB0b,YAAAA,UAAU,EAAE,KAAK;IACjBC,YAAAA,YAAY,EAAE,EAAE;gBAChB,GAAGzhB;;IAEN,SAAA;IACH,MAAA;IACA,IAAA;IACE,MAAA,MAAM,IAAIsE,KAAK,CAAC,CAAA,yBAAA,CAA2B,CAAC;IAChD;IACF;;ICmGA;;;;;;;IAOM,SAAU+S,QAAQA,CACtBvN,IAAY,EACZjB,KAAU,EACV7I,OAAA,GAA2B,EAAE,EAAA;IAM7B;IACA,EAAA,MAAM2G,GAAG,GAAGN,iBAAiB,CAACyD,IAAI,CAAC3C,CAAC,CAAC;MACrC,MAAMoP,MAAM,GAAG5P,GAAG,KAAK,CAAC,GAAG,CAAC,GAAGA,GAAG;MAElC,MAAMmP,aAAa,GAAGuF,gBAAgB,CAACxS,KAAK,EAAE0N,MAAM,EAAEvW,OAAO,CAAC;IAC9D;MACA,MAAM6a,WAAW,GAAG,IAAI5Z,YAAY,CAAC6I,IAAI,CAAC3C,CAAC,CAAC1G,MAAM,CAAC;IACnD,EAAA,KAAK,IAAIa,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGwI,IAAI,CAAC3C,CAAC,CAAC1G,MAAM,EAAEa,CAAC,EAAE,EAAE;QACtCuZ,WAAW,CAACvZ,CAAC,CAAC,GAAGwI,IAAI,CAAC3C,CAAC,CAAC7F,CAAC,CAAC,GAAGiV,MAAM;IACrC,EAAA;MAEA,MAAMwO,kBAAkB,GAAGzO,uBAAuB,CAChDR,aAAa,EACbjN,KAAK,EACL7I,OAAO,EACPuW,MAAM,CACP;MAED,MAAM;QACJU,WAAW;QACXJ,WAAW;QACXC,WAAW;QACXC,YAAY;QACZC,YAAY;IACZN,IAAAA;IAAS,GACV,GAAGqO,kBAAkB;MAEtB,MAAM;QAAED,SAAS;IAAED,IAAAA;IAAmB,GAAE,GAAGD,YAAY,CAAC5kB,OAAO,CAACglB,YAAY,CAAC;IAE7E,EAAA,MAAMjK,eAAe,GAAGlF,cAAc,CAACC,aAAa,CAAC;MACrD,MAAMmP,uBAAuB,GAAI1N,cAA2B,IAAI;QAC9D,OAAOwD,eAAe,CACpBgK,kBAAkB,CAACzN,oBAAoB,CAACC,cAAc,CAAC,CACxD;MACH,CAAC;IAED,EAAA,IAAIN,WAAW,CAACxW,MAAM,KAAK,CAAC,EAAE;QAC5B,OAAOma,wBAAwB,CAC7B9E,aAAa,EACb+E,WAAW,EACX/Q,IAAI,CAAC9E,CAAC,EACN+f,kBAAkB,CAACzN,oBAAoB,CAACP,YAAY,CAAC,EACrDgE,eAAe,EACfxE,MAAM,CACP;IACH,EAAA;IAEA;IACA,EAAA,IAAIiG,SAAsB;IAC1B,EAAA,IAAIC,SAAsB;IAC1B,EAAA,IAAIT,aAA0B;IAC9B,EAAA,IAAIkJ,mBAAgC;MACpC,IAAIC,gBAAgB,GAAGF,uBAAuB;IAE9C,EAAA,IAAIhO,WAAW,CAACxW,MAAM,KAAKiW,SAAS,CAACjW,MAAM,EAAE;IAC3C;IACA+b,IAAAA,SAAS,GAAG3F,WAAW;IACvB4F,IAAAA,SAAS,GAAG3F,WAAW;IACvBkF,IAAAA,aAAa,GAAGjF,YAAY;IAC5BmO,IAAAA,mBAAmB,GAAGlO,YAAY;IACpC,EAAA,CAAC,MAAM;IACL;QACA,MAAMoO,qBAAqB,GAAIC,iBAA8B,IAAI;UAC/D,MAAMC,IAAI,GAAG,IAAIrkB,YAAY,CAACyV,SAAS,CAACjW,MAAM,CAAC;IAC/C6kB,MAAAA,IAAI,CAAC5M,GAAG,CAAC3B,YAAY,CAAC;IACtB,MAAA,KAAK,IAAI3U,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6U,WAAW,CAACxW,MAAM,EAAE2B,CAAC,EAAE,EAAE;YAC3CkjB,IAAI,CAACrO,WAAW,CAAC7U,CAAC,CAAC,CAAC,GAAGijB,iBAAiB,CAACjjB,CAAC,CAAC;IAC7C,MAAA;UACA,OAAO6iB,uBAAuB,CAACK,IAAI,CAAC;QACtC,CAAC;IAED9I,IAAAA,SAAS,GAAG,IAAIvb,YAAY,CAACgW,WAAW,CAACxW,MAAM,CAAC;IAChDgc,IAAAA,SAAS,GAAG,IAAIxb,YAAY,CAACgW,WAAW,CAACxW,MAAM,CAAC;IAChDub,IAAAA,aAAa,GAAG,IAAI/a,YAAY,CAACgW,WAAW,CAACxW,MAAM,CAAC;IACpDykB,IAAAA,mBAAmB,GAAG,IAAIjkB,YAAY,CAACgW,WAAW,CAACxW,MAAM,CAAC;IAC1D,IAAA,KAAK,IAAIkC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGsU,WAAW,CAACxW,MAAM,EAAEkC,CAAC,EAAE,EAAE;IAC3C,MAAA,MAAMrB,CAAC,GAAG2V,WAAW,CAACtU,CAAC,CAAC;IACxB6Z,MAAAA,SAAS,CAAC7Z,CAAC,CAAC,GAAGkU,WAAW,CAACvV,CAAC,CAAC;IAC7Bmb,MAAAA,SAAS,CAAC9Z,CAAC,CAAC,GAAGmU,WAAW,CAACxV,CAAC,CAAC;IAC7B0a,MAAAA,aAAa,CAACrZ,CAAC,CAAC,GAAGoU,YAAY,CAACzV,CAAC,CAAC;IAClC4jB,MAAAA,mBAAmB,CAACviB,CAAC,CAAC,GAAGqU,YAAY,CAAC1V,CAAC,CAAC;IAC1C,IAAA;IACA6jB,IAAAA,gBAAgB,GAAGC,qBAAqB;IAC1C,EAAA;MAEA,MAAMG,MAAM,GAAGT,SAAS,CAAC;QAAE9f,CAAC,EAAE8E,IAAI,CAAC9E,CAAC;IAAEmC,IAAAA,CAAC,EAAE0T;OAAa,EAAEsK,gBAAgB,EAAE;QACxE3I,SAAS;QACTC,SAAS;QACTT,aAAa;IACb5E,IAAAA,kBAAkB,EAAE8N,mBAAmB;QACvC,GAAGL;OACJ,CAAC;IAEF,EAAA,IAAIW,oBAAiC;IACrC,EAAA,IAAIvO,WAAW,CAACxW,MAAM,KAAKiW,SAAS,CAACjW,MAAM,EAAE;QAC3C+kB,oBAAoB,GAAGD,MAAM,CAACjF,eAAe;IAC/C,EAAA,CAAC,MAAM;IACL,IAAA,MAAMgF,IAAI,GAAGvO,YAAY,CAACxT,KAAK,EAAE;IACjC,IAAA,KAAK,IAAInB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6U,WAAW,CAACxW,MAAM,EAAE2B,CAAC,EAAE,EAAE;IAC3CkjB,MAAAA,IAAI,CAACrO,WAAW,CAAC7U,CAAC,CAAC,CAAC,GAAGmjB,MAAM,CAACjF,eAAe,CAACle,CAAC,CAAC;IAClD,IAAA;IACAojB,IAAAA,oBAAoB,GAAGF,IAAI;IAC7B,EAAA;IAEA,EAAA,MAAMG,YAAY,GAChBV,kBAAkB,CAACzN,oBAAoB,CAACkO,oBAAoB,CAAC;MAE/D,OAAO;QACLxK,KAAK,EAAEuK,MAAM,CAAChF,cAAc;QAC5BtF,UAAU,EAAEsK,MAAM,CAACtK,UAAU;IAC7BpS,IAAAA,KAAK,EAAE4R,gBAAgB,CAAI3E,aAAa,EAAE2P,YAAY,EAAElP,MAAM;IAC/D,GAAA;IACH;;IC7PA;;;;;;;IAOM,SAAUmP,eAAeA,CAC7B7c,KAAU,EACV7I,OAAA,GAAqC,EAAE,EAAA;MAEvC,MAAM;IAAEmO,IAAAA,KAAK,GAAG;IAAE1B,MAAAA,IAAI,EAAE;SAAY;QAAEkZ,MAAM,GAAGC,eAAe,CAAC/c,KAAK;IAAC,GAAE,GACrE7I,OAAO;IACT,EAAA,MAAM6lB,oBAAoB,GAAGjQ,UAAU,CAACzH,KAAK,CAAC;IAC9C,EAAA,OAAOwX,MAAM,CAACzM,GAAG,CAAEnP,IAAI,IAAI;IACzB,IAAA,IAAI+b,QAAQ,CAAC/b,IAAI,CAAC,EAAE;IAClB,MAAA,IAAI,EAAE,MAAM,IAAIA,IAAI,CAACoE,KAAK,CAAC,EAAE;IAC3BpE,QAAAA,IAAI,CAACoE,KAAK,CAACzB,IAAI,GAAGkJ,UAAU,CAAC7L,IAAI,CAACoE,KAAK,CAAC,CAACpB,WAAW,CAAChD,IAAI,CAACd,KAAK,CAAC;IAClE,MAAA;IACA,MAAA,OAAOc,IAAI;IACb,IAAA;QACA,OAAO;IACL,MAAA,GAAGA,IAAI;IACPoE,MAAAA,KAAK,EAAE;YACLzB,IAAI,EAAEmZ,oBAAoB,CAAC9Y,WAAW,CAAChD,IAAI,CAACd,KAAK,CAAC;YAClD,GAAGkF;;IAEN,KAAA;IACH,EAAA,CAAC,CAAC;IACJ;IAEA,SAAS2X,QAAQA,CACf/b,IAAO,EAAA;MAEP,OAAO,OAAO,IAAIA,IAAI;IACxB;;ICnDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgCM,SAAUgc,UAAUA,CACxBC,KAAU,EACVC,gBAAwB,EAAA;IAExB,EAAA,MAAMC,MAAM,GAAU,CAACF,KAAK,CAAC;IAE7B,EAAA,OAAO,IAAI,EAAE;IACX,IAAA,MAAMrhB,KAAK,GAAGuhB,MAAM,CAACtD,SAAS,CAAE9O,CAAC,IAAKA,CAAC,CAACrT,MAAM,GAAGwlB,gBAAgB,CAAC;IAElE,IAAA,IAAIthB,KAAK,KAAK,EAAE,EAAE;IAElB,IAAA,MAAMwhB,OAAO,GAAGD,MAAM,CAACvhB,KAAK,CAAC;IAC7B,IAAA,MAAMyhB,GAAG,GAAGC,WAAW,CAACF,OAAO,CAAC;QAEhCD,MAAM,CAACI,MAAM,CAAC3hB,KAAK,EAAE,CAAC,EAAEwhB,OAAO,CAAC5iB,KAAK,CAAC,CAAC,EAAE6iB,GAAG,CAAC,EAAED,OAAO,CAAC5iB,KAAK,CAAC6iB,GAAG,CAAC,CAAC;IACpE,EAAA;IAEA,EAAA,OAAOF,MAAM;IACf;IAEA,SAASG,WAAWA,CAACL,KAA0C,EAAA;MAC7D,IAAIO,SAAS,GAAG,CAACC,QAAQ;MACzB,MAAMC,UAAU,GAA8C,EAAE;IAEhE,EAAA,KAAK,IAAInlB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG0kB,KAAK,CAACvlB,MAAM,EAAEa,CAAC,EAAE,EAAE;IACrC,IAAA,MAAMolB,KAAK,GACT,CAACV,KAAK,CAAC1kB,CAAC,CAAC,CAAC0D,CAAC,GAAGghB,KAAK,CAAC1kB,CAAC,GAAG,CAAC,CAAC,CAAC0D,CAAC,KAC3B,CAACghB,KAAK,CAAC1kB,CAAC,CAAC,CAAC2H,KAAK,GAAG+c,KAAK,CAAC1kB,CAAC,GAAG,CAAC,CAAC,CAAC2H,KAAK,IAAI,CAAC,CAAC;QAE7C,IAAIyd,KAAK,GAAGH,SAAS,EAAE;IACrBA,MAAAA,SAAS,GAAGG,KAAK;UACjBD,UAAU,CAAChmB,MAAM,GAAG,CAAC;IACvB,IAAA;QAEA,IAAIimB,KAAK,KAAKH,SAAS,EAAE;UACvBE,UAAU,CAAC/e,IAAI,CAAC;IACd/C,QAAAA,KAAK,EAAErD,CAAC;IACRqlB,QAAAA,OAAO,EAAE9lB,IAAI,CAAC6D,GAAG,CAACpD,CAAC,IAAI0kB,KAAK,CAACvlB,MAAM,GAAGa,CAAC,CAAC;WACzC,CAAC;IACJ,IAAA;IACF,EAAA;IAEA,EAAA,IAAIslB,UAAU,GAAGH,UAAU,CAAC,CAAC,CAAC;IAC9B,EAAA,KAAK,MAAMI,SAAS,IAAIJ,UAAU,EAAE;IAClC,IAAA,IAAII,SAAS,CAACF,OAAO,GAAGC,UAAU,CAACD,OAAO,EAAE;IAC1CC,MAAAA,UAAU,GAAGC,SAAS;IACxB,IAAA;IACF,EAAA;MAEA,OAAOD,UAAU,CAACjiB,KAAK;IACzB;;ICjEA;;;;;;;;IAQM,SAAUmiB,UAAUA,CACxBje,KAAU,EACV7I,OAAA,GAA6B,EAAE,EAAA;IAE/B,EAAA,IAAI6I,KAAK,CAACpI,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE;MAEjC,MAAM;IAAEsmB,IAAAA,cAAc,GAAG,CAAC;IAAEd,IAAAA,gBAAgB,GAAG;IAAE,GAAE,GAAGjmB,OAAO;IAE7D,EAAA,MAAMgnB,WAAW,GAAGne,KAAK,CAACoe,QAAQ,CAAC,CAACzkB,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACwC,CAAC,GAAGvC,CAAC,CAACuC,CAAC,CAAC;IAEvD,EAAA,IAAIkiB,YAAY,GAAGF,WAAW,CAAC,CAAC,CAAC;IACjC,EAAA,IAAIG,YAAY,GAAQ,CAACD,YAAY,CAAC;IACtC,EAAA,MAAMhB,MAAM,GAAU,CAACiB,YAAY,CAAC;IAEpC,EAAA,KAAK,IAAI7lB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG0lB,WAAW,CAACvmB,MAAM,EAAEa,CAAC,EAAE,EAAE;IAC3C,IAAA,MAAMyI,IAAI,GAAGid,WAAW,CAAC1lB,CAAC,CAAC;QAC3B,IACE,CAACyI,IAAI,CAAC/E,CAAC,GAAGkiB,YAAY,CAACliB,CAAC,KAAK,CAAC+E,IAAI,CAACd,KAAK,GAAGie,YAAY,CAACje,KAAK,IAAI,CAAC,CAAC,IACnE8d,cAAc,EACd;IACAI,MAAAA,YAAY,CAACzf,IAAI,CAACqC,IAAI,CAAC;IACzB,IAAA,CAAC,MAAM;UACLod,YAAY,GAAG,CAACpd,IAAI,CAAC;IACrBmc,MAAAA,MAAM,CAACxe,IAAI,CAACyf,YAAY,CAAC;IAC3B,IAAA;IACAD,IAAAA,YAAY,GAAGnd,IAAI;IACrB,EAAA;MAEA,IAAIkc,gBAAgB,KAAKzlB,SAAS,EAAE;QAClC,OAAO0lB,MAAM,CAACkB,OAAO,CAAEpB,KAAK,IAC1BA,KAAK,CAACvlB,MAAM,GAAGwlB,gBAAgB,GAC3BF,UAAU,CAACC,KAAK,EAAEC,gBAAgB,CAAC,GACnC,CAACD,KAAK,CAAC,CACZ;IACH,EAAA;IAEA,EAAA,OAAOE,MAAM;IACf;;ICjBA;;;;;;;;;;IAUM,SAAUmB,qBAAqBA,CACnCvd,IAAY,EACZwd,QAAa,EACbtnB,OAAA,GAAgC,EAAE,EAAA;MAKlC,MAAM;IACJunB,IAAAA,MAAM,GAAG,EAAE;IACXpZ,IAAAA,KAAK,GAAG;IAAE1B,MAAAA,IAAI,EAAE;SAAY;QAC5BwZ,gBAAgB;QAChBc,cAAc;IACdS,IAAAA,YAAY,GAAG,CAAC;QAChBvZ,UAAU;IACV+W,IAAAA,YAAY,GAAG;IACbvY,MAAAA,IAAI,EAAE,IAAI;IACVzM,MAAAA,OAAO,EAAE;IACP+b,QAAAA,OAAO,EAAE;;;IAEZ,GACF,GAAG/b,OAAO;IAEX;IACA;IACA,EAAA,MAAMkmB,MAAM,GAAGY,UAAU,CAACQ,QAAQ,EAAE;QAClCP,cAAc;IACdd,IAAAA;OACD,CAAC;MACF,MAAMwB,IAAI,GAAuB,EAAE;MACnC,MAAMC,OAAO,GAAsC,EAAE;IACrD,EAAA,KAAK,MAAMC,SAAS,IAAIzB,MAAM,EAAE;IAC9B,IAAA,MAAM0B,KAAK,GAAGrK,IAAI,CAACC,GAAG,EAAE;IACxB,IAAA,MAAM3U,KAAK,GAAG6c,eAAe,CAACiC,SAAS,EAAE;IAAExZ,MAAAA;IAAK,KAAE,CAAC;IAEnD,IAAA,MAAM0Z,SAAS,GAAGhf,KAAK,CAAC,CAAC,CAAC;QAC1B,MAAMif,QAAQ,GAAGjf,KAAK,CAACzC,EAAE,CAAC,EAAE,CAA2B;QAEvD,MAAM;UACJnB,IAAI,GAAG4iB,SAAS,CAAC7iB,CAAC,GAAG6iB,SAAS,CAAC5e,KAAK,GAAGue,YAAY;UACnDtiB,EAAE,GAAG4iB,QAAQ,CAAC9iB,CAAC,GAAG8iB,QAAQ,CAAC7e,KAAK,GAAGue;IAAY,KAChD,GAAGD,MAAM;QACV,MAAM;UAAEnkB,SAAS;IAAEC,MAAAA;IAAO,KAAE,GAAG0B,eAAe,CAAC+E,IAAI,CAAC9E,CAAC,EAAE;UAAEC,IAAI;IAAEC,MAAAA;IAAE,KAAE,CAAC;IAEpE,IAAA,MAAMF,CAAC,GACL8E,IAAI,CAAC9E,CAAC,YAAY/D,YAAY,GAC1B6I,IAAI,CAAC9E,CAAC,CAAC+iB,QAAQ,CAAC3kB,SAAS,EAAEC,OAAO,CAAC,GACnCyG,IAAI,CAAC9E,CAAC,CAACzB,KAAK,CAACH,SAAS,EAAEC,OAAO,CAAC;IACtC,IAAA,MAAM8D,CAAC,GACL2C,IAAI,CAAC3C,CAAC,YAAYlG,YAAY,GAC1B6I,IAAI,CAAC3C,CAAC,CAAC4gB,QAAQ,CAAC3kB,SAAS,EAAEC,OAAO,CAAC,GACnCyG,IAAI,CAAC3C,CAAC,CAAC5D,KAAK,CAACH,SAAS,EAAEC,OAAO,CAAC;IAEtC,IAAA,MAAM+I,GAAG,GAAG;IACV4b,MAAAA,KAAK,EAAE;YAAE/iB,IAAI;IAAEC,QAAAA;WAAI;IACnB+I,MAAAA,UAAU,EAAE;YAAE+W,YAAY;IAAE/W,QAAAA;WAAY;UACxCga,SAAS,EAAEN,SAAS,CAAClnB,MAAM;IAC3BynB,MAAAA,IAAI,EAAE3K,IAAI,CAACC,GAAG,EAAE,GAAGoK;IACpB,KAAA;IAED,IAAA,IAAI5iB,CAAC,CAACvE,MAAM,GAAG,CAAC,EAAE;UAChB,MAAM;YACJwa,UAAU;YACVD,KAAK;IACLnS,QAAAA,KAAK,EAAEsf;WACR,GAAG9Q,QAAQ,CAAC;YAAErS,CAAC;IAAEmC,QAAAA;WAAG,EAAE0B,KAAK,EAAE;YAC5BsF,KAAK;YACLF,UAAU;IACV+W,QAAAA;WACD,CAAC;IAEF,MAAA,KAAK,IAAI1jB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGuH,KAAK,CAACpI,MAAM,EAAEa,CAAC,EAAE,EAAE;YACrComB,OAAO,CAAChgB,IAAI,CAAC;cACX,GAAGygB,cAAc,CAAC7mB,CAAC,CAAC;cACpB2H,KAAK,EAAE2M,UAAU,CAAC/M,KAAK,CAACvH,CAAC,CAAC,CAAC6M,KAAK,CAAC,CAACtB,WAAW,CAC3Csb,cAAc,CAAC7mB,CAAC,CAAC,CAAC6M,KAAK,CAACzB,IAAI;aAED,CAAC;IAClC,MAAA;UACA+a,IAAI,CAAC/f,IAAI,CAAC;IACR,QAAA,GAAG0E,GAAG;YACN6O,UAAU;YACVD,KAAK;IACL3E,QAAAA,OAAO,EAAE;WACV,CAAC;IACJ,IAAA,CAAC,MAAM;IACLqR,MAAAA,OAAO,CAAChgB,IAAI,CAAC,GAAImB,KAA2C,CAAC;UAC7D4e,IAAI,CAAC/f,IAAI,CAAC;IACR,QAAA,GAAG0E,GAAG;IACN6O,QAAAA,UAAU,EAAE,CAAC;IACb5E,QAAAA,OAAO,EAAE;WACV,CAAC;IACJ,IAAA;IACF,EAAA;MAEA,OAAO;QAAEoR,IAAI;IAAEU,IAAAA,cAAc,EAAET;OAAS;IAC1C;;ICnGA;;;;;;;;IAQM,SAAUU,aAAaA,CAC3Bte,IAAY,EACZwd,QAAa,EACbtnB,OAAA,GAAgC,EAAE,EAAA;MAElC,OAAOqnB,qBAAqB,CAACvd,IAAI,EAAEwd,QAAQ,EAAEtnB,OAAO,CAAC,CAACmoB,cAAc;IACtE;;IClEA;;;;;;;IAOM,SAAUE,aAAaA,CAC3Bxf,KAAU,EACV7I,OAAA,GAA4B,EAAE,EAAA;MAE9B,MAAM;QAAE2lB,MAAM,GAAGC,eAAe,CAAC/c,KAAK;IAAC,GAAE,GAAG7I,OAAO;IACnD,EAAA,KAAK,MAAM+J,IAAI,IAAI4b,MAAM,EAAE;IACzB,IAAA,IAAI,EAAE,IAAI,IAAI5b,IAAI,CAAC,EAAE;IACnBA,MAAAA,IAAI,CAACb,EAAE,GAAGC,MAAM,CAACC,UAAU,EAAE;IAC/B,IAAA;IACF,EAAA;IAEA,EAAA,OAAOuc,MAAmC;IAC5C;;ICmBA;;;;;;IAMM,SAAU2C,cAAcA,CAC5BhB,QAAgC,EAChCtnB,OAAA,GAAiC,EAAE,EAAA;MAEnC,MAAM;IACJmO,IAAAA,KAAK,GAAG;IAAE1B,MAAAA,IAAI,EAAE;SAAY;IAC5BuY,IAAAA,YAAY,GAAG;IAAEvY,MAAAA,IAAI,EAAE,IAAI;IAAEzM,MAAAA,OAAO,EAAE;IAAE+b,QAAAA,OAAO,EAAE;IAAE;SAAI;IACvDwM,IAAAA,UAAU,GAAG,IAAI;IACjBC,IAAAA,UAAU,GAAG;IAAM,GACpB,GAAGxoB,OAAO;MAEX,IAAI2G,GAAG,GAAG,CAAC;MACX,IAAI8hB,IAAI,GAAG,CAAC;MACZ,IAAIxmB,KAAK,GAAG,CAAC;MACb,MAAMymB,UAAU,GAA2B,EAAE;IAE7C,EAAA,IAAIpB,QAAQ,CAAC7mB,MAAM,GAAG,CAAC,EAAE;QACvB,OAAO4nB,aAAa,CAClB3C,eAAe,CAAC4B,QAAQ,CAACpO,GAAG,CAACyP,4BAA4B,CAAC,EAAE;IAAExa,MAAAA;IAAK,KAAE,CAAC,CACvE;IACH,EAAA;IAEA,EAAA,IAAIya,MAAM,GAAG/nB,IAAI,CAAC6D,GAAG,CAAC4iB,QAAQ,CAAC,CAAC,CAAC,CAAC5e,GAAG,CAAC;IACtC,EAAA,KAAK,IAAIpH,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgmB,QAAQ,CAAC7mB,MAAM,EAAEa,CAAC,EAAE,EAAE;IACxC,IAAA,MAAMunB,MAAM,GAAGhoB,IAAI,CAAC6D,GAAG,CAAC4iB,QAAQ,CAAChmB,CAAC,CAAC,CAACoH,GAAG,CAAC;IACxC,IAAA,IAAImgB,MAAM,GAAGD,MAAM,EAAEA,MAAM,GAAGC,MAAM;IACtC,EAAA;MAEA,MAAMnO,QAAQ,GAAuB,EAAE;IACvC,EAAA,KAAK,MAAM3Q,IAAI,IAAIud,QAAQ,EAAE;IAC3B,IAAA,IAAIzmB,IAAI,CAAC6D,GAAG,CAACqF,IAAI,CAACrB,GAAG,CAAC,IAAI8f,UAAU,GAAGI,MAAM,EAAE;IAC7CF,MAAAA,UAAU,CAAChhB,IAAI,CAACqC,IAAI,CAAC;IACvB,IAAA,CAAC,MAAM;IACL2Q,MAAAA,QAAQ,CAAChT,IAAI,CAACihB,4BAA4B,CAAC5e,IAAI,CAAC,CAAC;IACnD,IAAA;IACF,EAAA;IAEA;IACA;MACA2e,UAAU,CAAChhB,IAAI,CAAC;QAAE1C,CAAC,EAAE5E,MAAM,CAAC0oB,SAAS;IAAE3hB,IAAAA,CAAC,EAAE;IAAC,GAAE,CAAC;IAC9C,EAAA,IAAIsf,UAAU,GAAiC;QAC7CzhB,CAAC,EAAE,CAAC0jB,UAAU,CAAC,CAAC,CAAC,CAAC1jB,CAAC,CAAC;IACpBmC,IAAAA,CAAC,EAAE,CAACuhB,UAAU,CAAC,CAAC,CAAC,CAACvhB,CAAC;IACpB,GAAA;IACD,EAAA,IAAI4hB,OAAO,GAAa,CAAC,CAAC,CAAC;IAC3B,EAAA,KAAK,IAAIznB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGonB,UAAU,CAACjoB,MAAM,EAAEa,CAAC,EAAE,EAAE;QAC1C,IAAIT,IAAI,CAAC6D,GAAG,CAACgkB,UAAU,CAACpnB,CAAC,GAAG,CAAC,CAAC,CAAC0D,CAAC,GAAG0jB,UAAU,CAACpnB,CAAC,CAAC,CAAC0D,CAAC,CAAC,GAAGujB,UAAU,EAAE;UAChE9B,UAAU,CAACzhB,CAAC,CAAC0C,IAAI,CAACghB,UAAU,CAACpnB,CAAC,CAAC,CAAC0D,CAAC,CAAC;UAClCyhB,UAAU,CAACtf,CAAC,CAACO,IAAI,CAACghB,UAAU,CAACpnB,CAAC,CAAC,CAAC6F,CAAC,CAAC;UAClC,IAAIuhB,UAAU,CAACpnB,CAAC,CAAC,CAAC6F,CAAC,GAAGR,GAAG,EAAE;IACzBA,QAAAA,GAAG,GAAG+hB,UAAU,CAACpnB,CAAC,CAAC,CAAC6F,CAAC;IACrBshB,QAAAA,IAAI,GAAGnnB,CAAC;IACV,MAAA;IACAynB,MAAAA,OAAO,CAACrhB,IAAI,CAACpG,CAAC,CAAC;IACfW,MAAAA,KAAK,EAAE;IACT,IAAA,CAAC,MAAM;UACL,IAAIA,KAAK,GAAG,CAAC,EAAE;YACb,MAAM+mB,YAAY,GAAGnoB,IAAI,CAAC6D,GAAG,CAC1B+hB,UAAU,CAACzhB,CAAC,CAACoB,EAAE,CAAC,EAAE,CAAY,GAAGqgB,UAAU,CAACzhB,CAAC,CAAC,CAAC,CAAC,CAClD;YACD,MAAM;cAAEyiB,IAAI;IAAEU,UAAAA;IAAc,SAAE,GAAGd,qBAAqB,CACpDZ,UAAU,EACV,CACE;IACEvd,UAAAA,EAAE,EAAEC,MAAM,CAACC,UAAU,EAAE;IACvBpE,UAAAA,CAAC,EAAE0jB,UAAU,CAACD,IAAI,CAAC,CAACzjB,CAAC;IACrBmC,UAAAA,CAAC,EAAER,GAAG;IACNsC,UAAAA,KAAK,EAAE+f,YAAY;IACnB/a,UAAAA,UAAU,EAAE;IACVhF,YAAAA,KAAK,EAAE;kBAAEtC,GAAG,EAAEqiB,YAAY,GAAG,CAAC;kBAAEtiB,GAAG,EAAEsiB,YAAY,GAAG;IAAG;;IAE1D,SAAA,CACF,EACD;IAAE7a,UAAAA,KAAK,EAAE;IAAE1B,YAAAA,IAAI,EAAE;eAAe;IAAEuY,UAAAA;IAAY,SAAE,CACjD;IACDre,QAAAA,GAAG,GAAG,CAAC;IACP8hB,QAAAA,IAAI,GAAG,CAAC;IACR,QAAA,MAAMrc,GAAG,GAAGqb,IAAI,CAACwB,IAAI,CAAEtnB,CAAC,IAAKA,CAAC,CAAC0U,OAAO,KAAK,yBAAyB,CAAC;YACrE,IAAIjK,GAAG,EAAE4O,KAAK,KAAKxa,SAAS,IAAI4L,GAAG,CAAC4O,KAAK,GAAG,GAAG,EAAE;IAC/CN,UAAAA,QAAQ,CAAChT,IAAI,CAACygB,cAAc,CAAC,CAAC,CAAC,CAAC;IAClC,QAAA,CAAC,MAAM;IACLe,UAAAA,aAAa,CAACR,UAAU,EAAEK,OAAO,EAAErO,QAAQ,CAAC;IAC9C,QAAA;IACF,MAAA,CAAC,MAAM;IACLwO,QAAAA,aAAa,CAACR,UAAU,EAAEK,OAAO,EAAErO,QAAQ,CAAC;IAC9C,MAAA;IAEA+L,MAAAA,UAAU,GAAG;YAAEzhB,CAAC,EAAE,CAAC0jB,UAAU,CAACpnB,CAAC,CAAC,CAAC0D,CAAC,CAAC;IAAEmC,QAAAA,CAAC,EAAE,CAACuhB,UAAU,CAACpnB,CAAC,CAAC,CAAC6F,CAAC;WAAG;UAC3D4hB,OAAO,GAAG,CAACznB,CAAC,CAAC;IACbqF,MAAAA,GAAG,GAAG+hB,UAAU,CAACpnB,CAAC,CAAC,CAAC6F,CAAC;IACrBshB,MAAAA,IAAI,GAAGnnB,CAAC;IACRW,MAAAA,KAAK,GAAG,CAAC;IACX,IAAA;IACF,EAAA;IACAyY,EAAAA,QAAQ,CAAClP,IAAI,CAAC,CAAChJ,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACwC,CAAC,GAAGvC,CAAC,CAACuC,CAAC,CAAC;MAElC,OAAOqjB,aAAa,CAAC3N,QAAQ,EAAE;IAAEiL,IAAAA,MAAM,EAAEjL;IAAQ,GAAE,CAAC;IACtD;IAEA,SAASwO,aAAaA,CACpBR,UAAkC,EAClCK,OAAiB,EACjBlgB,KAAyB,EAAA;IAEzB,EAAA,KAAK,MAAMlE,KAAK,IAAIokB,OAAO,EAAE;QAC3BlgB,KAAK,CAACnB,IAAI,CAACihB,4BAA4B,CAACD,UAAU,CAAC/jB,KAAK,CAAC,CAAC,CAAC;IAC7D,EAAA;IACF;IACA,SAASgkB,4BAA4BA,CAAC5e,IAA0B,EAAA;MAC9D,MAAM;QAAEb,EAAE;QAAEiF,KAAK;QAAEnJ,CAAC;QAAEmC,CAAC;IAAE8B,IAAAA;IAAK,GAAE,GAAGc,IAAI;IAEvC,EAAA,MAAM4Q,OAAO,GAAG;QACd3V,CAAC;QACDmC,CAAC;QACD8B,KAAK;IACLkF,IAAAA;IACmB,GAAA;IAErB,EAAA,IAAIjF,EAAE,EAAEyR,OAAO,CAACzR,EAAE,GAAGA,EAAE;IAEvB,EAAA,OAAOyR,OAAO;IAChB;;ICnIA;;;;;;;;;IASM,SAAUwO,YAAYA,CAC1B7B,QAAa,EACbtnB,OAAA,GAA+B,EAAE,EAAA;MAEjC,MAAM;IAAEoO,IAAAA,MAAM,GAAG,CAAC;IAAEgb,IAAAA,OAAO,GAAG;IAAK,GAAE,GAAGppB,OAAO;IAE/C,EAAA,MAAM6I,KAAK,GAAGwgB,QAAQ,CAAC/B,QAAQ,EAAElZ,MAAM,CAAC;MAExC,IAAI,CAACgb,OAAO,EAAE;IACZ,IAAA,KAAK,IAAI9nB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGuH,KAAK,CAACpI,MAAM,GAAG,CAAC,EAAEa,CAAC,EAAE,EAAE;IACzC,MAAA,MAAMyI,IAAI,GAAGlB,KAAK,CAACvH,CAAC,CAAC;IACrB,MAAA,MAAMgoB,QAAQ,GAAGzgB,KAAK,CAACvH,CAAC,GAAG,CAAC,CAAC;UAC7B,IAAIyI,IAAI,CAAC7E,EAAE,CAACF,CAAC,GAAGskB,QAAQ,CAACrkB,IAAI,CAACD,CAAC,EAAE;IAC/B;IACA+E,QAAAA,IAAI,CAAC7E,EAAE,CAACF,CAAC,GACN+E,IAAI,CAACd,KAAK,IAAIqgB,QAAQ,CAACrgB,KAAK,GAAGc,IAAI,CAACd,KAAK,CAAC,IAAKqgB,QAAQ,CAACtkB,CAAC,GAAG+E,IAAI,CAAC/E,CAAC,CAAC,GACpE+E,IAAI,CAAC/E,CAAC;YACRskB,QAAQ,CAACrkB,IAAI,CAACD,CAAC,GAAG+E,IAAI,CAAC7E,EAAE,CAACF,CAAC;IAC7B,MAAA;IACF,IAAA;IACF,EAAA;IAEA,EAAA,KAAK,MAAM+E,IAAI,IAAIlB,KAAK,EAAE;IACxBkB,IAAAA,IAAI,CAACd,KAAK,GAAGc,IAAI,CAAC7E,EAAE,CAACF,CAAC,GAAG+E,IAAI,CAAC9E,IAAI,CAACD,CAAC;QACpC,IAAI+E,IAAI,CAACoE,KAAK,EAAE;UACd,MAAM;YAAEA,KAAK;IAAElF,QAAAA;IAAK,OAAE,GAAGc,IAAI;IAC7B,MAAA,IAAIoE,KAAK,CAACzB,IAAI,KAAKlM,SAAS,EAAE;IAC5B,QAAA,MAAMyV,QAAQ,GAAGL,UAAU,CAACzH,KAAK,CAAC;YAClCA,KAAK,CAACzB,IAAI,GAAGuJ,QAAQ,CAAClJ,WAAW,CAAC9D,KAAK,CAAC;IAC1C,MAAA;IACF,IAAA;IACF,EAAA;IAEA,EAAA,OAAOJ,KAAK;IACd;IAEA,SAASwgB,QAAQA,CACfxgB,KAAU,EACVuF,MAAc,EAAA;IAEd,EAAA,OAAOvF,KAAK,CAACqQ,GAAG,CAAEnP,IAAI,IAAI;QACxB,MAAM;UAAEb,EAAE;UAAEiF,KAAK;UAAEnJ,CAAC;UAAEmC,CAAC;UAAExC,KAAK;IAAE0E,MAAAA;IAAgB,KAAE,GAAGU,IAAI;IACzD,IAAA,MAAMwf,KAAK,GAAGvkB,CAAC,GAAG,CAACA,CAAC,GAAGqE,gBAAgB,CAACpE,IAAI,CAACD,CAAC,IAAIoJ,MAAM;IACxD,IAAA,MAAMob,GAAG,GAAGxkB,CAAC,GAAG,CAACqE,gBAAgB,CAACnE,EAAE,CAACF,CAAC,GAAGA,CAAC,IAAIoJ,MAAM;IAEpD,IAAA,IAAIrH,MAAM,GAAG;UACX/B,CAAC;UACDmC,CAAC;UACDxC,KAAK;UACLsE,KAAK,EAAEugB,GAAG,GAAGD,KAAK;IAClBtkB,MAAAA,IAAI,EAAE;IAAED,QAAAA,CAAC,EAAEukB;WAAO;IAClBrkB,MAAAA,EAAE,EAAE;IAAEF,QAAAA,CAAC,EAAEwkB;IAAG;IACK,KAAA;IAEnB,IAAA,IAAItgB,EAAE,EAAE;IACNnC,MAAAA,MAAM,GAAG;IAAE,QAAA,GAAGA,MAAM;IAAEmC,QAAAA;WAAI;IAC5B,IAAA;IAEA,IAAA,IAAIiF,KAAK,EAAE;IACTpH,MAAAA,MAAM,GAAG;IAAE,QAAA,GAAGA,MAAM;IAAEoH,QAAAA;WAAO;IAC/B,IAAA;IAEA,IAAA,OAAOpH,MAA0B;IACnC,EAAA,CAAC,CAAC;IACJ;;IC3FA;;;;;;IAMM,SAAU0iB,QAAQA,CACtB5gB,KAAU,EACV7I,OAAA,GAA8B,EAAE,EAAA;MAEhC,MAAM;IAAEmO,IAAAA,KAAK,GAAG;IAAE1B,MAAAA,IAAI,EAAE;SAAY;QAAEkZ,MAAM,GAAGC,eAAe,CAAC/c,KAAK;IAAC,GAAE,GACrE7I,OAAO;IACT,EAAA,MAAM0pB,aAAa,GAAG9T,UAAU,CAACzH,KAAK,CAAC;IACvC,EAAA,OAAOwX,MAAM,CAACzM,GAAG,CAAEnP,IAAI,KAAM;IAC3B,IAAA,GAAGA,IAAI;IACPoE,IAAAA,KAAK,EAAE;IAAE,MAAA,GAAGA,KAAK;IAAEzB,MAAAA,IAAI,EAAEgd,aAAa,CAAC3c,WAAW,CAAChD,IAAI,CAACd,KAAK;IAAC;IAC/D,GAAA,CAAC,CAAC;IACL;;;;;;;;;;;;;;","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56]}