matsci-parse 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../lib/core/structure/operations/canonicalize.ts","../lib/core/structure/operations/hashStructure.ts","../lib/core/structure/operations/sites/appendSite.ts","../lib/core/structure/operations/sites/insertSite.ts","../lib/core/structure/operations/sites/removeSite.ts","../lib/core/structure/operations/sites/replaceSite.ts","../lib/core/matrix/matrix.ts","../lib/core/lattice/lattice.ts","../lib/core/matrix/operations/vector/dot.ts","../lib/core/matrix/operations/vector/norm.ts","../lib/core/lattice/angles.ts","../lib/core/matrix/operations/inverse/inverse3x3.ts","../lib/core/lattice/inverse.ts","../lib/core/lattice/lengths.ts","../lib/core/matrix/operations/transpose.ts","../lib/core/matrix/operations/mul.ts","../lib/core/lattice/metricTensor.ts","../lib/core/lattice/parameters.ts","../lib/core/lattice/reciprocalLattice.ts","../lib/core/lattice/reciprocalLatticeCrystallographic.ts","../lib/core/matrix/operations/determinant.ts","../lib/core/lattice/volume.ts","../lib/core/lattice/create/fromParameters.ts","../lib/core/lattice/create/cubic.ts","../lib/core/lattice/create/hexagonal.ts","../lib/core/lattice/create/monoclinic.ts","../lib/core/lattice/create/orthorhombic.ts","../lib/core/lattice/create/rhombohedral.ts","../lib/core/lattice/create/tetragonal.ts","../lib/core/structure/operations/symmetry/spglib.ts","../lib/core/structure/operations/supercell.ts","../lib/core/site/site.ts","../lib/core/site/cartesian.ts","../lib/core/site/fractional.ts","../lib/core/site/distance.ts","../lib/core/site/wrap.ts","../lib/core/species/species.ts","../lib/core/io/cif.ts","../lib/core/io/poscar.ts","../lib/core/io/structuredata.ts","../lib/core/io/xsf.ts","../lib/core/io/xyz.ts","../lib/core/io/optimade.ts","../lib/core/io/json.ts","../lib/core/units/converter.ts","../lib/core/units/length.ts","../lib/core/units/energy.ts","../lib/core/units/angle.ts"],"sourcesContent":["import { Structure } from \"../../structure/structure\";\n\nconst EPS = 1e-12;\n\nfunction wrap(x: number): number {\n const v = x - Math.floor(x);\n return Math.abs(v) < EPS ? 0 : v;\n}\n\nfunction clean(x: number): number {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function canonicalize(structure: Structure): Structure {\n return {\n ...structure,\n sites: structure.sites.map((site) => ({\n ...site,\n frac: new Float64Array([\n wrap(clean(site.frac[0])),\n wrap(clean(site.frac[1])),\n wrap(clean(site.frac[2])),\n ]),\n })),\n };\n}\n","import { Structure } from \"../structure\";\nimport { canonicalize } from \"./canonicalize\";\nimport { Vec3 } from \"@/main\";\n\nfunction toFixedArray(v: Vec3, precision = 8): string {\n return Array.from(v)\n .map((x) => x.toFixed(precision))\n .join(\",\");\n}\n\nfunction fnv1a(str: string): number {\n let hash = 2166136261;\n\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash *= 16777619;\n }\n\n return hash >>> 0;\n}\n\nexport function hashStructure(structure: Structure): number {\n const s = canonicalize(structure);\n\n const lattice = s.lattice.basis.data;\n const latticeKey = toFixedArray(lattice);\n\n const sitesKey = s.sites\n .map((site) => {\n return site.species + \":\" + toFixedArray(site.frac);\n })\n .sort()\n .join(\"|\");\n\n const key = latticeKey + \"::\" + sitesKey;\n\n return fnv1a(key);\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function appendSite(structure: Structure, site: Site): Structure {\n return {\n ...structure,\n sites: [...structure.sites, site],\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function insertSite(\n structure: Structure,\n index: number,\n site: Site,\n): Structure {\n return {\n ...structure,\n sites: [\n ...structure.sites.slice(0, index),\n site,\n ...structure.sites.slice(index),\n ],\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function removeSite(structure: Structure, index: number): Structure {\n return {\n ...structure,\n sites: structure.sites.filter((_, i) => i !== index),\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function replaceSite(\n structure: Structure,\n index: number,\n site: Site,\n): Structure {\n return {\n ...structure,\n sites: structure.sites.map((s, i) => (i === index ? site : s)),\n };\n}\n","export interface Matrix {\n readonly rows: number;\n readonly cols: number;\n readonly data: Float64Array;\n}\n\nexport function createMatrix(\n rows: number,\n cols: number,\n data?: Iterable<number>,\n): Matrix {\n const size = rows * cols;\n\n const buffer = data ? Float64Array.from(data) : new Float64Array(size);\n\n if (buffer.length !== size) {\n throw new Error(`Expected ${size} values, got ${buffer.length}`);\n }\n\n return {\n rows,\n cols,\n data: buffer,\n };\n}\n\nexport function identity(size: number): Matrix {\n const data = new Float64Array(size * size);\n\n for (let i = 0; i < size; i++) {\n data[i * size + i] = 1;\n }\n\n return {\n rows: size,\n cols: size,\n data,\n };\n}\n\nexport function clone(matrix: Matrix): Matrix {\n return {\n rows: matrix.rows,\n cols: matrix.cols,\n data: new Float64Array(matrix.data),\n };\n}\n\nexport function index(cols: number, row: number, col: number): number {\n return row * cols + col;\n}\n","import { createMatrix, Matrix } from \"../matrix/matrix\";\n\nconst EPS = 1e-12;\n\nfunction clean(x: number): number {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function createLattice(data: number[] | Float64Array | Matrix): Lattice {\n const values =\n data instanceof Float64Array ? data : \"data\" in data ? data.data : data;\n\n if (values.length !== 9) {\n throw new Error(\"Lattice requires 9 values (3x3)\");\n }\n\n const cleaned = new Float64Array(9);\n\n for (let i = 0; i < 9; i++) {\n cleaned[i] = clean(values[i]);\n }\n\n return {\n basis: createMatrix(3, 3, cleaned),\n };\n}\n","import { Vector } from \"../../vector\";\n\nexport function dot(a: Vector, b: Vector): number {\n if (a.length !== b.length) {\n throw new Error(\"Dot product requires same-length vectors\");\n }\n\n let sum = 0;\n\n for (let i = 0; i < a.length; i++) {\n sum += a[i] * b[i];\n }\n\n return sum;\n}\n","import { Vector } from \"../../vector\";\n\nconst EPS = 1e-12;\n\nexport function norm(v: Vector): number {\n let sum = 0;\n\n for (let i = 0; i < v.length; i++) {\n const x = v[i];\n sum += x * x;\n }\n\n return Math.sqrt(sum);\n}\n","import { dot } from \"../matrix/operations/vector/dot\";\nimport { norm } from \"../matrix/operations/vector/norm\";\nimport { Lattice } from \"./lattice\";\n\nimport { Vector } from \"../matrix/vector\";\n\nfunction angle(u: Vector, v: Vector) {\n const denom = norm(u) * norm(v);\n if (denom === 0) throw new Error(\"Zero-length lattice vector\");\n\n const c = dot(u, v) / denom;\n const clamped = Math.max(-1, Math.min(1, c));\n\n return Math.acos(clamped);\n}\n\nexport function angles(lattice: Lattice): [number, number, number] {\n const m = lattice.basis.data;\n\n const a: Vector = new Float64Array([m[0], m[1], m[2]]);\n const b: Vector = new Float64Array([m[3], m[4], m[5]]);\n const c: Vector = new Float64Array([m[6], m[7], m[8]]);\n\n const alpha = angle(b, c);\n const beta = angle(a, c);\n const gamma = angle(a, b);\n\n return [alpha, beta, gamma];\n}\n","import { Matrix, createMatrix } from \"../../matrix\";\n\nexport function inverse3x3(m: Matrix): Matrix {\n if (m.rows !== 3 || m.cols !== 3) {\n throw new Error(\"Expected 3x3 matrix\");\n }\n\n const a00 = m.data[0],\n a01 = m.data[1],\n a02 = m.data[2];\n const a10 = m.data[3],\n a11 = m.data[4],\n a12 = m.data[5];\n const a20 = m.data[6],\n a21 = m.data[7],\n a22 = m.data[8];\n\n const c00 = a11 * a22 - a12 * a21;\n const c01 = a12 * a20 - a10 * a22;\n const c02 = a10 * a21 - a11 * a20;\n\n const c10 = a02 * a21 - a01 * a22;\n const c11 = a00 * a22 - a02 * a20;\n const c12 = a01 * a20 - a00 * a21;\n\n const c20 = a01 * a12 - a02 * a11;\n const c21 = a02 * a10 - a00 * a12;\n const c22 = a00 * a11 - a01 * a10;\n\n const det = a00 * c00 + a01 * c01 + a02 * c02;\n\n if (det === 0) {\n throw new Error(\"Singular matrix\");\n }\n\n const invDet = 1 / det;\n\n const out = createMatrix(3, 3);\n\n out.data[0] = c00 * invDet;\n out.data[1] = c10 * invDet;\n out.data[2] = c20 * invDet;\n\n out.data[3] = c01 * invDet;\n out.data[4] = c11 * invDet;\n out.data[5] = c21 * invDet;\n\n out.data[6] = c02 * invDet;\n out.data[7] = c12 * invDet;\n out.data[8] = c22 * invDet;\n\n return out;\n}\n","import { Lattice } from \"./lattice\";\nimport { inverse3x3 } from \"../matrix/operations/inverse/inverse3x3\";\nimport { Matrix } from \"../matrix/matrix\";\n\nexport function inverse(lattice: Lattice): Matrix {\n return inverse3x3(lattice.basis);\n}\n","import { norm } from \"../matrix/operations/vector/norm\";\nimport { Lattice } from \"./lattice\";\nexport function lengths(lattice: Lattice): [number, number, number] {\n const m = lattice.basis.data;\n\n const a: Float64Array = new Float64Array([m[0], m[1], m[2]]);\n const b: Float64Array = new Float64Array([m[3], m[4], m[5]]);\n const c: Float64Array = new Float64Array([m[6], m[7], m[8]]);\n\n return [norm(a), norm(b), norm(c)];\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nexport function transpose(matrix: Matrix): Matrix {\n const out = createMatrix(matrix.cols, matrix.rows);\n\n for (let row = 0; row < matrix.rows; row++) {\n for (let col = 0; col < matrix.cols; col++) {\n out.data[index(out.cols, col, row)] =\n matrix.data[index(matrix.cols, row, col)];\n }\n }\n\n return out;\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nexport function mul(a: Matrix, b: Matrix): Matrix {\n if (a.cols !== b.rows) {\n throw new Error(\"Invalid matrix multiplication dimensions\");\n }\n\n const out = createMatrix(a.rows, b.cols);\n\n const aRows = a.rows;\n const aCols = a.cols;\n const bCols = b.cols;\n\n for (let row = 0; row < aRows; row++) {\n for (let col = 0; col < bCols; col++) {\n let sum = 0;\n\n for (let k = 0; k < aCols; k++) {\n sum += a.data[index(a.cols, row, k)] * b.data[index(b.cols, k, col)];\n }\n\n out.data[index(out.cols, row, col)] = sum;\n }\n }\n\n return out;\n}\n","import { transpose } from \"../matrix/operations/transpose\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { Lattice } from \"./lattice\";\nimport { Matrix } from \"../matrix/matrix\";\n\nexport function metricTensor(lattice: Lattice): Matrix {\n const A = lattice.basis;\n\n const AT = transpose(A);\n return mul(AT, A);\n}\n","import { lengths } from \"./lengths\";\nimport { angles } from \"./angles\";\nimport { Lattice } from \"./lattice\";\n\nconst RAD2DEG = 180 / Math.PI;\n\nexport function parameters(\n lattice: Lattice,\n): [number, number, number, number, number, number] {\n const [a, b, c] = lengths(lattice);\n const [alpha, beta, gamma] = angles(lattice);\n\n return [a, b, c, alpha * RAD2DEG, beta * RAD2DEG, gamma * RAD2DEG];\n}\n","import { Lattice } from \"./lattice\";\nimport { inverse } from \"./inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\nimport { createMatrix } from \"../matrix/matrix\";\nimport { createLattice } from \"./lattice\";\n\nconst TWO_PI = 2 * Math.PI;\n\nexport function reciprocalLattice(lattice: Lattice): Lattice {\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n const data = invT.data.map((v) => v * TWO_PI);\n\n return createLattice(data);\n}\n","import { Lattice, createLattice } from \"./lattice\";\nimport { inverse } from \"./inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\n\nexport function reciprocalLatticeCrystallographic(lattice: Lattice): Lattice {\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n return createLattice(invT.data);\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nfunction minor(matrix: Matrix, skipRow: number, skipCol: number): Matrix {\n const out = createMatrix(matrix.rows - 1, matrix.cols - 1);\n\n let ptr = 0;\n\n for (let row = 0; row < matrix.rows; row++) {\n if (row === skipRow) continue;\n\n for (let col = 0; col < matrix.cols; col++) {\n if (col === skipCol) continue;\n\n out.data[ptr++] = matrix.data[index(matrix.cols, row, col)];\n }\n }\n\n return out;\n}\n\nexport function determinant(matrix: Matrix): number {\n if (matrix.rows !== matrix.cols) {\n throw new Error(\"Determinant requires a square matrix\");\n }\n\n const n = matrix.rows;\n\n // fast path for BZ / geometry\n if (n === 3) {\n const m = matrix.data;\n\n return (\n m[0] * (m[4] * m[8] - m[5] * m[7]) -\n m[1] * (m[3] * m[8] - m[5] * m[6]) +\n m[2] * (m[3] * m[7] - m[4] * m[6])\n );\n }\n\n if (n === 1) {\n return matrix.data[0];\n }\n\n if (n === 2) {\n return matrix.data[0] * matrix.data[3] - matrix.data[1] * matrix.data[2];\n }\n\n let det = 0;\n\n for (let col = 0; col < n; col++) {\n const sign = col % 2 === 0 ? 1 : -1;\n\n det += sign * matrix.data[col] * determinant(minor(matrix, 0, col));\n }\n\n return det;\n}\n","import { determinant } from \"../matrix/operations/determinant\";\nimport { Lattice } from \"./lattice\";\n\nexport function volume(lattice: Lattice): number {\n return Math.abs(determinant(lattice.basis));\n}\n","import { createLattice } from \"../lattice\";\n\nconst DEG2RAD = Math.PI / 180;\nconst EPS = 1e-12;\n\nfunction clean(x: number) {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function fromParameters(\n a: number,\n b: number,\n c: number,\n alpha: number,\n beta: number,\n gamma: number,\n) {\n const alphaR = alpha * DEG2RAD;\n const betaR = beta * DEG2RAD;\n const gammaR = gamma * DEG2RAD;\n\n const cosA = Math.cos(alphaR);\n const cosB = Math.cos(betaR);\n const cosG = Math.cos(gammaR);\n const sinG = Math.sin(gammaR);\n\n // lattice vectors\n const v1 = [a, 0, 0];\n\n const v2 = [b * cosG, b * sinG, 0];\n\n // guard against degenerate gamma\n if (Math.abs(sinG) < EPS) {\n throw new Error(\"Invalid lattice: gamma too close to 0 or 180 degrees\");\n }\n\n const cx = c * cosB;\n\n const cy = (c * (cosA - cosB * cosG)) / sinG;\n\n const czSquared = c * c - cx * cx - cy * cy;\n\n const cz = Math.sqrt(Math.max(0, czSquared));\n\n return createLattice([\n clean(v1[0]),\n clean(v1[1]),\n clean(v1[2]),\n clean(v2[0]),\n clean(v2[1]),\n clean(v2[2]),\n clean(cx),\n clean(cy),\n clean(cz),\n ]);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function cubic(a: number) {\n return fromParameters(a, a, a, 90, 90, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function hexagonal(a: number, c: number) {\n return fromParameters(a, a, c, 90, 90, 120);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function monoclinic(a: number, b: number, c: number, beta: number) {\n return fromParameters(a, b, c, 90, beta, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function orthorhombic(a: number, b: number, c: number) {\n return fromParameters(a, b, c, 90, 90, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function rhombohedral(a: number, alpha: number) {\n return fromParameters(a, a, a, alpha, alpha, alpha);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function tetragonal(a: number, c: number) {\n return fromParameters(a, a, c, 90, 90, 90);\n}\n","import init, { analyze_cell, type MoyoDataset } from \"@spglib/moyo-wasm\";\n\nimport { createLattice } from \"@/core/lattice\";\nimport { Structure } from \"../../structure\";\n\nlet ready: Promise<void> | null = null;\n\nexport function initMoyo() {\n if (!ready) {\n ready = (async () => {\n // In Node.js (tests), load from filesystem\n if (typeof process !== \"undefined\" && process.versions?.node) {\n try {\n const { readFileSync } = await import(\"fs\");\n const { join } = await import(\"path\");\n const wasmPath = join(\n process.cwd(),\n \"node_modules/@spglib/moyo-wasm/moyo_wasm_bg.wasm\",\n );\n const wasmBuffer = readFileSync(wasmPath);\n await init(wasmBuffer);\n } catch (e) {\n console.error(\"Failed to load WASM in Node:\", e);\n throw e;\n }\n } else {\n // In browser, use dynamic import to get the URL\n const wasmUrl = new URL(\n \"@spglib/moyo-wasm/moyo_wasm_bg.wasm\",\n import.meta.url,\n ).toString();\n\n await init(wasmUrl);\n }\n })();\n }\n return ready;\n}\n\nexport async function getSymmetry(\n structure: Structure,\n tolerance = 1e-4,\n setting = \"Standard\",\n): Promise<{\n primitive: Structure;\n conventional: Structure;\n calculationResults: any;\n}> {\n await initMoyo();\n\n // -----------------------------\n // 1. Build reversible mapping\n // -----------------------------\n const symbolToId = new Map<string, number>();\n const idToSymbol = new Map<number, string>();\n\n let counter = 0;\n\n const positions: number[][] = [];\n const numbers: number[] = [];\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n if (!symbolToId.has(symbol)) {\n symbolToId.set(symbol, counter);\n idToSymbol.set(counter, symbol);\n counter++;\n }\n\n positions.push(Array.from(site.frac));\n numbers.push(symbolToId.get(symbol)!);\n }\n\n // -----------------------------\n // 2. Build Moyo input\n // -----------------------------\n const moyoInput = {\n lattice: {\n basis: Array.from(structure.lattice.basis.data),\n },\n positions,\n numbers,\n };\n\n // -----------------------------\n // 3. Run symmetry engine\n // -----------------------------\n const results = await analyze_cell(\n JSON.stringify(moyoInput),\n tolerance,\n setting,\n );\n\n // -----------------------------\n // 4. Convert Moyo cell → Structure\n // -----------------------------\n function build(cell: {\n lattice: { basis: number[] };\n positions: number[][];\n numbers: number[];\n }): Structure {\n const { lattice, positions, numbers } = cell;\n\n const species = [...new Set(numbers)].map((n: number) => ({\n symbol: idToSymbol.get(n)!,\n }));\n\n const sites = positions.map((pos: number[], i: number) => ({\n species: {\n symbol: idToSymbol.get(numbers[i])!,\n },\n frac: new Float64Array(pos),\n }));\n\n return {\n lattice: createLattice(lattice.basis),\n species,\n sites,\n };\n }\n\n // -----------------------------\n // 5. Return both structures\n // -----------------------------\n return {\n primitive: build(results.prim_std_cell),\n conventional: build(results.std_cell),\n calculationResults: results,\n };\n}\n","import { createLattice } from \"@/core/lattice/lattice\";\nimport type { Structure } from \"../structure\";\nimport type { Site } from \"@/core/site/site\";\n\ntype SupercellSize = number | [number, number, number];\n\nexport function supercell(\n structure: Structure,\n size: SupercellSize,\n): Structure {\n const [nx, ny, nz] = typeof size === \"number\" ? [size, size, size] : size;\n\n if (\n nx < 1 ||\n ny < 1 ||\n nz < 1 ||\n !Number.isInteger(nx) ||\n !Number.isInteger(ny) ||\n !Number.isInteger(nz)\n ) {\n throw new Error(\"Supercell dimensions must be positive integers\");\n }\n\n const m = structure.lattice.basis.data;\n\n // row-major scaling\n const newBasis = [\n m[0] * nx,\n m[1] * nx,\n m[2] * nx,\n\n m[3] * ny,\n m[4] * ny,\n m[5] * ny,\n\n m[6] * nz,\n m[7] * nz,\n m[8] * nz,\n ];\n\n const sites: Site[] = [];\n\n for (const site of structure.sites) {\n const [x, y, z] = site.frac;\n\n for (let i = 0; i < nx; i++) {\n for (let j = 0; j < ny; j++) {\n for (let k = 0; k < nz; k++) {\n sites.push({\n species: site.species,\n\n frac: new Float64Array([(x + i) / nx, (y + j) / ny, (z + k) / nz]),\n });\n }\n }\n }\n }\n\n return {\n lattice: createLattice(newBasis),\n sites,\n };\n}\n","import { Species } from \"../species/species\";\n\nexport type SiteProperties = Record<string, any>;\n\nexport type Vec3 = [number, number, number] | Float64Array | number[];\n\nexport type Site<P extends SiteProperties = SiteProperties> = {\n species: Species;\n frac: Vec3;\n properties?: P;\n};\n\nexport function createSite<P extends SiteProperties>(\n species: Species,\n frac: Vec3,\n properties?: P,\n): Site<P> {\n return {\n species,\n frac,\n properties,\n };\n}\n","import { mul } from \"../matrix/operations/mul\";\nimport { transpose } from \"../matrix/operations/transpose\";\n\nimport { Site } from \"./site\";\nimport { Lattice } from \"../lattice/lattice\";\nimport { Vector } from \"../matrix/vector\";\n\nexport function cartesian(lattice: Lattice, site: Site): Vector {\n const [x, y, z] = site.frac;\n\n const frac = {\n rows: 3,\n cols: 1,\n data: new Float64Array([x, y, z]),\n };\n\n const basisT = transpose(lattice.basis);\n const result = mul(basisT, frac);\n\n return new Float64Array([result.data[0], result.data[1], result.data[2]]);\n}\n","import { inverse } from \"../lattice/inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { Vector } from \"../matrix/vector\";\nimport { Lattice } from \"../lattice/lattice\";\n\nexport function fractional(lattice: Lattice, cart: Vector): Vector {\n const vec = {\n rows: 3,\n cols: 1,\n data: cart,\n };\n\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n const result = mul(invT, vec);\n\n return new Float64Array([result.data[0], result.data[1], result.data[2]]);\n}\n","import { Lattice } from \"../lattice/lattice\";\nimport { Site } from \"./site\";\nimport { cartesian } from \"./cartesian\";\n\nimport { norm } from \"../matrix/operations/vector/norm\";\n\nexport function distance(lattice: Lattice, a: Site, b: Site): number {\n const dFrac: [number, number, number] = [\n b.frac[0] - a.frac[0],\n b.frac[1] - a.frac[1],\n b.frac[2] - a.frac[2],\n ];\n\n for (let i = 0; i < 3; i++) {\n dFrac[i] -= Math.round(dFrac[i]);\n }\n\n const displaced: Site = {\n species: a.species,\n frac: dFrac,\n };\n\n const dCart = cartesian(lattice, displaced);\n\n return norm(dCart);\n}\n","import { Site, SiteProperties } from \"./site\";\n\nfunction wrapValue(x: number): number {\n return ((x % 1) + 1) % 1;\n}\n\nexport function wrap<T extends SiteProperties>(site: Site<T>): Site<T> {\n return {\n ...site,\n frac: [\n wrapValue(site.frac[0]),\n wrapValue(site.frac[1]),\n wrapValue(site.frac[2]),\n ],\n };\n}\n","export type Species<P extends Record<string, any> = Record<string, any>> = {\n symbol: string;\n properties?: P;\n};\n\nexport function createSpecies<P extends Record<string, any>>(\n symbol: string,\n properties?: P,\n): Species<P> {\n return { symbol, properties };\n}\n","import { fromParameters } from \"../lattice/create/fromParameters\";\nimport { parameters } from \"../lattice/parameters\";\nimport { Structure } from \"../structure/structure\";\n\nfunction cleanValue(value: string): number {\n // remove uncertainty notation:\n // 5.432(1) -> 5.432\n return Number(value.replace(/\\(.+\\)/, \"\"));\n}\n\nfunction tokenize(line: string): string[] {\n return line.match(/'[^']*'|\"[^\"]*\"|\\S+/g) ?? [];\n}\n\nfunction warnUnsupportedSymmetry(spaceGroup: string) {\n console.warn(\n `Space group \"${spaceGroup}\" detected. ` +\n `Symmetry operations are not currently applied; ` +\n `only asymmetric-unit sites will be parsed.`,\n );\n}\n\n/**\n * Parses a crystal structure from CIF (Crystallographic Information File) format.\n *\n * Extracts lattice parameters, atomic positions, and species information from a CIF file.\n * Assumes the file contains a single crystal structure block.\n *\n * @param text - The CIF file content as a string\n * @returns A Structure object parsed from the CIF data\n * @throws Error if required CIF fields are missing\n *\n * @remarks\n * - Currently reads only the asymmetric unit (symmetry operations are NOT applied)\n * - Warnings are issued if space group symmetry information is detected but not used\n * - Uncertainty values in CIF are stripped (e.g., 5.432(1) → 5.432)\n * - Only the first data block is processed\n * - Supports quoted values and multiple formatting styles\n *\n * @example\n * ```typescript\n * const cifText = `\n * data_structure\n * _cell_length_a 4.05\n * _cell_length_b 4.05\n * _cell_length_c 4.05\n * _cell_angle_alpha 90\n * _cell_angle_beta 90\n * _cell_angle_gamma 90\n * _atom_site_label Al1\n * _atom_site_fract_x 0\n * _atom_site_fract_y 0\n * _atom_site_fract_z 0\n * `;\n * const structure = fromCIF(cifText);\n * ```\n */\nexport function fromCIF(text: string): Structure {\n const lines = text\n .split(\"\\n\")\n .map((x) => x.trim())\n .filter(Boolean);\n\n let a = 0;\n let b = 0;\n let c = 0;\n\n let alpha = 0;\n let beta = 0;\n let gamma = 0;\n\n let spaceGroup = \"P1\";\n\n let atomHeaders: string[] = [];\n const atomRows: string[][] = [];\n\n let inLoop = false;\n let currentHeaders: string[] = [];\n let collectingAtoms = false;\n\n for (const line of lines) {\n if (line.startsWith(\"_symmetry_space_group_name_H-M\")) {\n const tokens = tokenize(line);\n spaceGroup = tokens.at(-1)?.replace(/['\"]/g, \"\") ?? \"P1\";\n } else if (line.startsWith(\"_space_group_name_H-M_alt\")) {\n const tokens = tokenize(line);\n spaceGroup = tokens.at(-1)?.replace(/['\"]/g, \"\") ?? \"P1\";\n } else if (line.startsWith(\"_cell_length_a\")) {\n a = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_length_b\")) {\n b = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_length_c\")) {\n c = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_alpha\")) {\n alpha = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_beta\")) {\n beta = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_gamma\")) {\n gamma = cleanValue(tokenize(line)[1]);\n } else if (line === \"loop_\") {\n inLoop = true;\n currentHeaders = [];\n collectingAtoms = false;\n continue;\n }\n\n if (inLoop && line.startsWith(\"_\")) {\n currentHeaders.push(line);\n\n if (line.includes(\"_atom_site_\")) {\n collectingAtoms = true;\n }\n\n continue;\n }\n\n if (inLoop && collectingAtoms) {\n if (atomHeaders.length === 0) {\n atomHeaders = [...currentHeaders];\n }\n\n atomRows.push(tokenize(line));\n }\n }\n\n const isP1 = /^P\\s*1$/i.test(spaceGroup);\n\n if (!isP1) {\n warnUnsupportedSymmetry(spaceGroup);\n }\n\n const lattice = fromParameters(a, b, c, alpha, beta, gamma);\n\n const ix = atomHeaders.findIndex((x) => x.includes(\"fract_x\"));\n\n const iy = atomHeaders.findIndex((x) => x.includes(\"fract_y\"));\n\n const iz = atomHeaders.findIndex((x) => x.includes(\"fract_z\"));\n\n const ispecies = atomHeaders.findIndex((x) => x.includes(\"type_symbol\"));\n\n if (ix < 0 || iy < 0 || iz < 0 || ispecies < 0) {\n throw new Error(\"Missing required atom site columns\");\n }\n\n const sites = atomRows.map((row) => ({\n species: {\n symbol: row[ispecies],\n },\n\n frac: new Float64Array([\n cleanValue(row[ix]),\n cleanValue(row[iy]),\n cleanValue(row[iz]),\n ]),\n }));\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toCIF(structure: Structure, precision = 6): string {\n const p = parameters(structure.lattice);\n\n const lines: string[] = [];\n\n lines.push(\"data_matsci-parse\");\n lines.push(\"\");\n\n lines.push(\"_symmetry_space_group_name_H-M 'P 1'\");\n lines.push(\"_symmetry_Int_Tables_number 1\");\n\n lines.push(\"\");\n\n lines.push(`_cell_length_a ${p[0].toFixed(precision)}`);\n\n lines.push(`_cell_length_b ${p[1].toFixed(precision)}`);\n\n lines.push(`_cell_length_c ${p[2].toFixed(precision)}`);\n\n lines.push(`_cell_angle_alpha ${p[3].toFixed(precision)}`);\n\n lines.push(`_cell_angle_beta ${p[4].toFixed(precision)}`);\n\n lines.push(`_cell_angle_gamma ${p[5].toFixed(precision)}`);\n\n lines.push(\"\");\n\n lines.push(\"loop_\");\n lines.push(\"_atom_site_label\");\n lines.push(\"_atom_site_type_symbol\");\n lines.push(\"_atom_site_fract_x\");\n lines.push(\"_atom_site_fract_y\");\n lines.push(\"_atom_site_fract_z\");\n\n for (let i = 0; i < structure.sites.length; i++) {\n const site = structure.sites[i];\n\n lines.push(\n `${site.species.symbol}${i + 1} ` +\n `${site.species.symbol} ` +\n `${site.frac[0].toFixed(precision)} ` +\n `${site.frac[1].toFixed(precision)} ` +\n `${site.frac[2].toFixed(precision)}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice } from \"../lattice/lattice\";\nimport { inverse } from \"../lattice/inverse\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { createMatrix } from \"../matrix/matrix\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\nimport { fractional } from \"../site/fractional\";\n\nimport { cartesian } from \"../site\";\n\nfunction isSelective(line: string): boolean {\n return line.toLowerCase().startsWith(\"selective\");\n}\n\nfunction isCartesian(line: string): boolean {\n const l = line.trim().toLowerCase();\n return l.startsWith(\"c\") || l.startsWith(\"k\");\n}\n\n// TODO: Currently nukes the selective dynamics flag from the input file.\n// It would be good to restore this.\n// TODO: would be good to ensure that the title is also optionally\n// maintained.\n/**\n * Parses a crystal structure from POSCAR (VASP) format.\n *\n * Reads lattice vectors, atomic positions, and species from VASP's POSCAR/CONTCAR format.\n * Supports both Cartesian and fractional coordinates.\n *\n * @param text - The POSCAR file content as a string\n * @returns A Structure object parsed from the POSCAR data\n * @throws Error if required POSCAR fields are missing or malformed\n *\n * @remarks\n * - Line 1: Comment/title line (ignored)\n * - Line 2: Scaling factor\n * - Lines 3-5: Lattice vectors (in Ångströms or scaled units)\n * - Line 6: Element symbols\n * - Line 7: Number of atoms per element\n * - Line 8+: Atomic positions (Cartesian or fractional)\n * - Selective dynamics flags are currently stripped\n * - Structure title is not preserved in the output\n *\n * @example\n * ```typescript\n * const poscarText = `Cubic structure\n * 1.0\n * 4.05 0 0\n * 0 4.05 0\n * 0 0 4.05\n * Al\n * 2\n * Fractional\n * 0 0 0\n * 0.5 0.5 0.5`;\n * const structure = fromPOSCAR(poscarText);\n * ```\n */\nexport function fromPOSCAR(text: string): Structure {\n const lines = text.split(\"\\n\").map((x) => x.trim());\n\n let cursor = 0;\n\n // comment/title\n cursor++;\n\n // scale factor\n const scale = Number(lines[cursor++]);\n\n // lattice vectors (row-major)\n const latticeData: number[] = [];\n\n for (let i = 0; i < 3; i++) {\n const v = lines[cursor++].split(/\\s+/).map(Number);\n\n if (v.length !== 3) {\n throw new Error(\"Invalid POSCAR lattice\");\n }\n\n latticeData.push(v[0] * scale, v[1] * scale, v[2] * scale);\n }\n\n const lattice = createLattice(latticeData);\n\n // VASP5 species names\n const symbols = lines[cursor++].split(/\\s+/);\n\n // atom counts\n const counts = lines[cursor++].split(/\\s+/).map(Number);\n\n if (symbols.length !== counts.length) {\n throw new Error(\"Species/count mismatch\");\n }\n\n // optional selective dynamics\n if (isSelective(lines[cursor])) {\n cursor++;\n }\n\n // direct is true unless cartesian is.\n let direct = true;\n direct = !isCartesian(lines[cursor]);\n\n cursor++;\n\n const sites: Site[] = [];\n\n let speciesIndex = 0;\n let remaining = counts[0];\n\n const latticeInv = !direct ? inverse(lattice) : null;\n\n const totalAtoms = counts.reduce((a, b) => a + b, 0);\n\n for (let i = 0; i < totalAtoms; i++) {\n const tokens = lines[cursor++].split(/\\s+/);\n\n const coords = tokens.slice(0, 3).map(Number);\n\n const frac = direct\n ? new Float64Array(coords)\n : fractional(lattice, new Float64Array(coords));\n\n sites.push({\n species: {\n symbol: symbols[speciesIndex],\n },\n frac,\n });\n\n remaining--;\n\n if (remaining === 0 && speciesIndex < counts.length - 1) {\n speciesIndex++;\n remaining = counts[speciesIndex];\n }\n }\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toPOSCAR(\n structure: Structure,\n options?: {\n title?: string;\n scale?: number;\n direct?: boolean;\n },\n): string {\n const title = options?.title ?? \"Generated by matsci-parse\";\n const scale = options?.scale ?? 1.0;\n const direct = options?.direct ?? true;\n\n const lines: string[] = [];\n\n lines.push(title);\n lines.push(String(scale));\n\n // lattice\n const m = structure.lattice.basis.data;\n\n lines.push(`${m[0]} ${m[1]} ${m[2]}`);\n lines.push(`${m[3]} ${m[4]} ${m[5]}`);\n lines.push(`${m[6]} ${m[7]} ${m[8]}`);\n\n // preserve order of first appearance\n const grouped = new Map<string, typeof structure.sites>();\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n if (!grouped.has(symbol)) {\n grouped.set(symbol, []);\n }\n\n grouped.get(symbol)!.push(site);\n }\n\n const species = [...grouped.keys()];\n const sites = [...grouped.values()].flat();\n\n lines.push(species.join(\" \"));\n lines.push(species.map((s) => grouped.get(s)!.length).join(\" \"));\n\n lines.push(direct ? \"Direct\" : \"Cartesian\");\n\n for (const site of sites) {\n const coords = direct ? site.frac : cartesian(structure.lattice, site);\n\n lines.push(`${coords[0]} ${coords[1]} ${coords[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { Structure } from \"../structure/structure\";\nimport { createLattice } from \"../lattice/lattice\";\n\nimport { cartesian } from \"../site/cartesian\";\nimport { fractional } from \"../site/fractional\";\n\nexport interface AiiDASite {\n position: [number, number, number];\n kind_name: string[];\n}\n\nexport interface StructureData {\n cell: [\n [number, number, number],\n [number, number, number],\n [number, number, number],\n ];\n kinds: [];\n sites: AiiDASite[];\n}\n\nexport function fromStructureData(data: StructureData): Structure {\n const lattice = createLattice([\n ...data.cell[0],\n ...data.cell[1],\n ...data.cell[2],\n ]);\n\n const kindMap = new Map(data.kinds.map((kind: any) => [kind.name, kind]));\n\n const sites = data.sites.map((site: any) => {\n const kind = kindMap.get(site.kind_name);\n\n if (!kind) {\n throw new Error(`Unknown kind \"${site.kind_name}\"`);\n }\n\n return {\n species: {\n symbol: kind.symbols[0],\n },\n\n frac: fractional(lattice, new Float64Array(site.position)),\n };\n });\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toStructureData(structure: Structure) {\n const m = structure.lattice.basis.data;\n\n const symbols = [...new Set(structure.sites.map((s) => s.species.symbol))];\n\n const kinds = symbols.map((symbol) => ({\n name: symbol,\n symbols: [symbol],\n }));\n\n return {\n cell: [\n [m[0], m[1], m[2]],\n [m[3], m[4], m[5]],\n [m[6], m[7], m[8]],\n ],\n\n kinds,\n\n sites: structure.sites.map((site) => ({\n kind_name: site.species.symbol,\n\n position: Array.from(cartesian(structure.lattice, site)),\n })),\n\n pbc1: true,\n pbc2: true,\n pbc3: true,\n };\n}\n","import { createLattice } from \"../lattice/lattice\";\nimport { fractional } from \"../site/fractional\";\nimport { cartesian } from \"../site/cartesian\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\n\nfunction findSection(lines: string[], section: string): number {\n const idx = lines.findIndex((line) => line.trim().toUpperCase() === section);\n\n if (idx === -1) {\n throw new Error(`Missing ${section}`);\n }\n\n return idx;\n}\n\n// TODO: support atomic numbers instead of symbols in primvec.\n\n/**\n * Parses a crystal structure from XSF (XCrySDen Structure File) format.\n *\n * Reads lattice vectors and atomic positions from XSF format.\n * Supports both PRIMVEC (primitive) and CONVVEC (conventional) cells.\n *\n * @param text - The XSF file content as a string\n * @returns A Structure object parsed from the XSF data\n * @throws Error if required sections (PRIMVEC, ATOMS) are missing\n *\n * @remarks\n * - XSF format is human-readable and widely used in visualization software\n * - PRIMVEC section defines the lattice vectors\n * - ATOMS section lists atomic positions and species\n * - Atomic numbers are currently not supported (symbols required)\n * - CONVVEC (conventional cell) is not currently used\n *\n * @example\n * ```typescript\n * const xsfText = `\n * PRIMVEC\n * 4.05 0.00 0.00\n * 0.00 4.05 0.00\n * 0.00 0.00 4.05\n * PRIMCOORD\n * 2 1\n * Al 0.00 0.00 0.00 0 0 0\n * Al 2.025 2.025 2.025 0 0 0\n * `;\n * const structure = fromXSF(xsfText);\n * ```\n */\nexport function fromXSF(text: string): Structure {\n const lines = text\n .split(\"\\n\")\n .map((x) => x.trim())\n .filter(Boolean);\n\n const vecStart = findSection(lines, \"PRIMVEC\");\n\n const lattice = createLattice([\n ...lines[vecStart + 1].split(/\\s+/).map(Number),\n ...lines[vecStart + 2].split(/\\s+/).map(Number),\n ...lines[vecStart + 3].split(/\\s+/).map(Number),\n ]);\n\n const coordStart = findSection(lines, \"PRIMCOORD\");\n\n const [nAtoms] = lines[coordStart + 1].split(/\\s+/).map(Number);\n\n const sites: Site[] = [];\n\n for (let i = 0; i < nAtoms; i++) {\n const tokens = lines[coordStart + 2 + i].split(/\\s+/);\n\n const symbol = tokens[0];\n\n const x = Number(tokens[1]);\n const y = Number(tokens[2]);\n const z = Number(tokens[3]);\n\n const frac = fractional(lattice, new Float64Array([x, y, z]));\n\n sites.push({\n species: { symbol },\n frac,\n });\n }\n\n return {\n lattice,\n sites,\n };\n}\n\nfunction formatVec(v: number[]): string {\n return `${v[0]} ${v[1]} ${v[2]}`;\n}\n\nfunction formatLattice(lattice: Structure[\"lattice\"]): string[] {\n const m = lattice.basis.data;\n\n return [\n formatVec([m[0], m[1], m[2]]),\n formatVec([m[3], m[4], m[5]]),\n formatVec([m[6], m[7], m[8]]),\n ];\n}\n\nexport function toXSF(structure: Structure): string {\n const lines: string[] = [];\n\n lines.push(\"CRYSTAL\");\n lines.push(\"PRIMVEC\");\n\n const latticeLines = formatLattice(structure.lattice);\n lines.push(...latticeLines);\n\n lines.push(\"\");\n lines.push(\"PRIMCOORD\");\n lines.push(`${structure.sites.length} 1`);\n\n for (const site of structure.sites) {\n const c = cartesian(structure.lattice, site);\n\n lines.push(`${site.species.symbol} ${c[0]} ${c[1]} ${c[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice, Lattice } from \"../lattice/lattice\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\n\ntype ExtendedXYZInfo = Record<string, string>;\n\nfunction parseHeader(comment: string): ExtendedXYZInfo {\n const info: ExtendedXYZInfo = {};\n const kvRegex = /(\\w+)=(\".*?\"|\\S+)/g;\n\n for (const match of comment.matchAll(kvRegex)) {\n let value = match[2];\n if (value.startsWith('\"')) value = value.slice(1, -1);\n info[match[1]] = value;\n }\n\n return info;\n}\n\nfunction parseLattice(info: ExtendedXYZInfo) {\n if (!info.Lattice) {\n throw new Error(\"Extended XYZ must contain Lattice\");\n }\n\n const v = info.Lattice.split(/\\s+/).map(Number);\n if (v.length !== 9) throw new Error(\"Invalid Lattice\");\n\n return createLattice([v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8]]);\n}\n\n/**\n * Parses a crystal structure from extended XYZ format.\n *\n * Reads atomic structure from XYZ format with extended headers containing\n * lattice information (Extended XYZ format used by ASE and other tools).\n *\n * @param text - The XYZ file content as a string\n * @returns A Structure object parsed from the XYZ data\n * @throws Error if lattice information or required fields are missing\n *\n * @remarks\n * - First line: number of atoms\n * - Second line: properties header in key=value format (must include \"Lattice\")\n * - Remaining lines: atomic species and Cartesian positions\n * - Lattice must be specified in extended header as 9 space-separated values\n * - Standard XYZ format (without lattice) is not supported\n *\n * @example\n * ```typescript\n * const xyzText = `2\n * Lattice=\"4.05 0 0 0 4.05 0 0 0 4.05\" Properties=species:S:1:pos:R:3\n * Al 0.0 0.0 0.0\n * Al 2.025 2.025 2.025`;\n * const structure = fromXYZ(xyzText);\n * ```\n */\nexport function fromXYZ(text: string) {\n const lines = text.trim().split(\"\\n\");\n\n const n = Number(lines[0]);\n const comment = lines[1];\n\n const info = parseHeader(comment);\n const lattice = parseLattice(info);\n\n const sites: Site[] = [];\n\n for (let i = 0; i < n; i++) {\n const [symbol, x, y, z] = lines[2 + i].split(/\\s+/);\n\n sites.push({\n species: { symbol },\n frac: new Float64Array([+x, +y, +z]),\n });\n }\n\n return { lattice, sites };\n}\n\nfunction formatLattice(lattice: Lattice): string {\n const m = lattice.basis.data;\n\n // row-major flattening assumption (consistent with your matrix code)\n return `${m[0]} ${m[1]} ${m[2]} ${m[3]} ${m[4]} ${m[5]} ${m[6]} ${m[7]} ${m[8]}`;\n}\n\n/**\n * Serializes a structure to extended XYZ format.\n *\n * Converts a Structure to extended XYZ format suitable for visualization\n * and exchange with other materials science tools (ASE, OVITO, etc.).\n *\n * @param structure - The structure to serialize\n * @returns The structure as an extended XYZ formatted string\n *\n * @remarks\n * - Line 1: Number of atoms\n * - Line 2: Header with lattice information in extended XYZ format\n * - Remaining lines: Atomic species and fractional coordinates\n * - Lattice is specified as 9 space-separated values in row-major order\n * - The output uses fractional coordinates as given in the structure\n *\n * @example\n * ```typescript\n * const structure = { lattice: cubic(4.05), sites: [...] };\n * const xyzString = toXYZ(structure);\n * // Output can be written to file and opened in visualization software\n * ```\n */\nexport function toXYZ(structure: Structure): string {\n const sites = structure.sites;\n\n const lines: string[] = [];\n\n lines.push(String(sites.length));\n\n const latticeStr = formatLattice(structure.lattice);\n\n lines.push(`Lattice=\"${latticeStr}\"`);\n\n for (const site of sites) {\n const f = site.frac;\n\n lines.push(`${site.species.symbol} ${f[0]} ${f[1]} ${f[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice } from \"../lattice\";\n\nimport { fractional, cartesian } from \"../site\";\nimport { Structure } from \"../structure\";\n\nexport function fromOptimade(data: any): Structure {\n const lattice = createLattice([\n ...data.attributes.lattice_vectors[0],\n ...data.attributes.lattice_vectors[1],\n ...data.attributes.lattice_vectors[2],\n ]);\n\n const positions = data.attributes.cartesian_site_positions;\n const species = data.attributes.species_at_sites;\n\n const sites = positions.map((position: number[], i: number) => ({\n species: {\n symbol: species[i],\n },\n\n frac: fractional(lattice, new Float64Array(position)),\n }));\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toOptimade(structure: Structure) {\n const m = structure.lattice.basis.data;\n\n const species_at_sites = structure.sites.map((site) => site.species.symbol);\n\n const elements = [...new Set(species_at_sites)].sort();\n\n return {\n attributes: {\n lattice_vectors: [\n [m[0], m[1], m[2]],\n [m[3], m[4], m[5]],\n [m[6], m[7], m[8]],\n ],\n\n species_at_sites,\n\n cartesian_site_positions: structure.sites.map((site) =>\n Array.from(cartesian(structure.lattice, site)),\n ),\n\n dimension_types: [1, 1, 1],\n\n nsites: structure.sites.length,\n\n nelements: elements.length,\n\n elements,\n },\n };\n}\n","import { Structure } from \"../structure/structure\";\nimport { createLattice } from \"../lattice/lattice\";\n\n/**\n * Serializes a structure to JSON format.\n *\n * Converts a Structure to a plain JavaScript object suitable for JSON stringification.\n *\n * @param structure - The structure to serialize\n * @returns An object with `lattice` (flattened array) and `sites` (with species and fractional coordinates)\n *\n * @remarks\n * - Lattice is serialized as a flat array [a1x, a1y, a1z, ...]\n * - Fractional coordinates are converted from Float64Array to regular arrays\n * - Use with JSON.stringify() for string serialization\n *\n * @example\n * ```typescript\n * const structure = { lattice: cubic(4), sites: [...] };\n * const json = toJSON(structure);\n * const jsonString = JSON.stringify(json);\n * ```\n */\nexport function toJSON(structure: Structure) {\n return {\n lattice: structure.lattice.basis.data,\n sites: structure.sites.map((s) => ({\n species: s.species,\n frac: Array.from(s.frac),\n })),\n };\n}\n\n/**\n * Deserializes a structure from JSON format.\n *\n * Reconstructs a Structure from a JSON object (typically parsed from JSON string).\n *\n * @param data - An object with `lattice` (9-element array) and `sites` array\n * @returns A new Structure object\n *\n * @remarks\n * - Lattice array must have exactly 9 elements\n * - Fractional coordinates are converted to Float64Array\n * - Inverse operation of toJSON()\n * - No validation is performed on the input data\n *\n * @example\n * ```typescript\n * const jsonData = {\n * lattice: [4, 0, 0, 0, 4, 0, 0, 0, 4],\n * sites: [{ species: 'Al', frac: [0, 0, 0] }]\n * };\n * const structure = fromJSON(jsonData);\n * ```\n */\nexport function fromJSON(data: any): Structure {\n return {\n lattice: createLattice(data.lattice),\n sites: data.sites.map((s: any) => ({\n species: s.species,\n frac: new Float64Array(s.frac),\n })),\n };\n}\n","export function convertMeasurement<T extends string>(\n value: number,\n from: T,\n to: T,\n conversions: Record<T, number>,\n aliases?: Record<string, T>,\n): number {\n const resolve = (u: string) => (aliases?.[u] ?? u) as T;\n\n const fromUnit = resolve(from);\n const toUnit = resolve(to);\n\n if (fromUnit === toUnit) return value;\n\n const valueInBase = value * conversions[fromUnit];\n return valueInBase / conversions[toUnit];\n}\n\nexport function convertMeasurementArray<T extends string>(\n arr: number[],\n from: T,\n to: T,\n conversions: Record<T, number>,\n aliases?: Record<string, T>,\n): number[] {\n return arr.map((v) => convertMeasurement(v, from, to, conversions, aliases));\n}\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type LengthUnits =\n | \"angstrom\"\n | \"bohr\"\n | \"nm\"\n | \"pm\"\n | \"cm\"\n | \"m\"\n | \"um\"\n | \"fm\";\n\nconst LengthConversions: Record<LengthUnits, number> = {\n angstrom: 1,\n bohr: 0.529177,\n nm: 10,\n pm: 0.01,\n um: 1e4,\n cm: 1e8,\n m: 1e10,\n fm: 1e-5,\n};\n\nconst LengthAliases: Record<string, LengthUnits> = {\n Å: \"angstrom\",\n μm: \"um\",\n};\n\nexport const LengthUnitSystem = {\n conversions: LengthConversions,\n aliases: LengthAliases,\n\n convert(value: number, from: LengthUnits | string, to: LengthUnits | string) {\n return convertMeasurement(\n value,\n from as LengthUnits,\n to as LengthUnits,\n LengthConversions,\n LengthAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: LengthUnits | string,\n to: LengthUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as LengthUnits,\n to as LengthUnits,\n LengthConversions,\n LengthAliases,\n );\n },\n};\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type EnergyUnits = \"eV\" | \"Hartree\" | \"kJ/mol\" | \"kcal/mol\";\n\nconst EnergyConversions: Record<EnergyUnits, number> = {\n eV: 1,\n Hartree: 27.2114,\n \"kJ/mol\": 0.0103643,\n \"kcal/mol\": 0.0433641,\n};\n\nconst EnergyAliases: Record<string, EnergyUnits> = {\n Ha: \"Hartree\",\n ev: \"eV\",\n electronvolt: \"eV\",\n};\n\nexport const EnergyUnitSystem = {\n conversions: EnergyConversions,\n aliases: EnergyAliases,\n\n convert(value: number, from: EnergyUnits | string, to: EnergyUnits | string) {\n return convertMeasurement(\n value,\n from as EnergyUnits,\n to as EnergyUnits,\n EnergyConversions,\n EnergyAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: EnergyUnits | string,\n to: EnergyUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as EnergyUnits,\n to as EnergyUnits,\n EnergyConversions,\n EnergyAliases,\n );\n },\n};\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type AngleUnits = \"rad\" | \"deg\" | \"grad\";\n\nconst AngleConversions: Record<AngleUnits, number> = {\n rad: 1,\n deg: Math.PI / 180,\n grad: Math.PI / 200,\n};\n\nconst AngleAliases: Record<string, AngleUnits> = {\n \"°\": \"deg\",\n deg: \"deg\",\n rad: \"rad\",\n gon: \"grad\",\n};\n\nexport const AngleUnitSystem = {\n conversions: AngleConversions,\n aliases: AngleAliases,\n\n convert(value: number, from: AngleUnits | string, to: AngleUnits | string) {\n return convertMeasurement(\n value,\n from as AngleUnits,\n to as AngleUnits,\n AngleConversions,\n AngleAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: AngleUnits | string,\n to: AngleUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as AngleUnits,\n to as AngleUnits,\n AngleConversions,\n AngleAliases,\n );\n },\n};\n"],"names":["EPS","wrap","x","v","clean","canonicalize","structure","site","toFixedArray","precision","fnv1a","str","hash","i","hashStructure","s","lattice","latticeKey","sitesKey","key","appendSite","insertSite","index","removeSite","_","replaceSite","createMatrix","rows","cols","data","size","buffer","row","col","createLattice","values","cleaned","dot","a","b","sum","norm","angle","u","denom","c","clamped","angles","m","alpha","beta","gamma","inverse3x3","a00","a01","a02","a10","a11","a12","a20","a21","a22","c00","c01","c02","c10","c11","c12","c20","c21","c22","det","invDet","out","inverse","lengths","transpose","matrix","mul","aRows","aCols","bCols","k","metricTensor","AT","RAD2DEG","parameters","TWO_PI","reciprocalLattice","inv","reciprocalLatticeCrystallographic","invT","minor","skipRow","skipCol","ptr","determinant","n","sign","volume","DEG2RAD","fromParameters","alphaR","betaR","gammaR","cosA","cosB","cosG","sinG","v1","v2","cx","cy","czSquared","cz","cubic","hexagonal","monoclinic","orthorhombic","rhombohedral","tetragonal","ready","initMoyo","readFileSync","join","wasmPath","wasmBuffer","init","e","wasmUrl","getSymmetry","tolerance","setting","symbolToId","idToSymbol","counter","positions","numbers","symbol","moyoInput","results","analyze_cell","build","cell","species","sites","pos","supercell","nx","ny","nz","newBasis","y","z","j","createSite","frac","properties","cartesian","basisT","result","fractional","cart","vec","distance","dFrac","displaced","dCart","wrapValue","createSpecies","cleanValue","value","tokenize","line","warnUnsupportedSymmetry","spaceGroup","fromCIF","text","lines","atomHeaders","atomRows","inLoop","currentHeaders","collectingAtoms","ix","iy","iz","ispecies","toCIF","p","isSelective","isCartesian","l","fromPOSCAR","cursor","scale","latticeData","symbols","counts","direct","speciesIndex","remaining","totalAtoms","coords","toPOSCAR","options","title","grouped","fromStructureData","kindMap","kind","toStructureData","kinds","findSection","section","idx","fromXSF","vecStart","coordStart","nAtoms","tokens","formatVec","formatLattice","toXSF","latticeLines","parseHeader","comment","info","kvRegex","match","parseLattice","fromXYZ","toXYZ","latticeStr","f","fromOptimade","position","toOptimade","species_at_sites","elements","toJSON","fromJSON","convertMeasurement","from","to","conversions","aliases","resolve","fromUnit","toUnit","convertMeasurementArray","arr","LengthConversions","LengthAliases","LengthUnitSystem","EnergyConversions","EnergyAliases","EnergyUnitSystem","AngleConversions","AngleAliases","AngleUnitSystem"],"mappings":";AAEA,MAAMA,KAAM;AAEZ,SAASC,EAAKC,GAAmB;AAC/B,QAAMC,IAAID,IAAI,KAAK,MAAMA,CAAC;AAC1B,SAAO,KAAK,IAAIC,CAAC,IAAIH,KAAM,IAAIG;AACjC;AAEA,SAASC,EAAMF,GAAmB;AAChC,SAAO,KAAK,IAAIA,CAAC,IAAIF,KAAM,IAAIE;AACjC;AAEO,SAASG,GAAaC,GAAiC;AAC5D,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,OAAOA,EAAU,MAAM,IAAI,CAACC,OAAU;AAAA,MACpC,GAAGA;AAAA,MACH,MAAM,IAAI,aAAa;AAAA,QACrBN,EAAKG,EAAMG,EAAK,KAAK,CAAC,CAAC,CAAC;AAAA,QACxBN,EAAKG,EAAMG,EAAK,KAAK,CAAC,CAAC,CAAC;AAAA,QACxBN,EAAKG,EAAMG,EAAK,KAAK,CAAC,CAAC,CAAC;AAAA,MAAA,CACzB;AAAA,IAAA,EACD;AAAA,EAAA;AAEN;ACrBA,SAASC,EAAaL,GAASM,IAAY,GAAW;AACpD,SAAO,MAAM,KAAKN,CAAC,EAChB,IAAI,CAACD,MAAMA,EAAE,QAAQO,CAAS,CAAC,EAC/B,KAAK,GAAG;AACb;AAEA,SAASC,GAAMC,GAAqB;AAClC,MAAIC,IAAO;AAEX,WAASC,IAAI,GAAGA,IAAIF,EAAI,QAAQE;AAC9B,IAAAD,KAAQD,EAAI,WAAWE,CAAC,GACxBD,KAAQ;AAGV,SAAOA,MAAS;AAClB;AAEO,SAASE,GAAcR,GAA8B;AAC1D,QAAMS,IAAIV,GAAaC,CAAS,GAE1BU,IAAUD,EAAE,QAAQ,MAAM,MAC1BE,IAAaT,EAAaQ,CAAO,GAEjCE,IAAWH,EAAE,MAChB,IAAI,CAACR,MACGA,EAAK,UAAU,MAAMC,EAAaD,EAAK,IAAI,CACnD,EACA,OACA,KAAK,GAAG,GAELY,IAAMF,IAAa,OAAOC;AAEhC,SAAOR,GAAMS,CAAG;AAClB;AClCO,SAASC,GAAWd,GAAsBC,GAAuB;AACtE,SAAO;AAAA,IACL,GAAGD;AAAA,IACH,OAAO,CAAC,GAAGA,EAAU,OAAOC,CAAI;AAAA,EAAA;AAEpC;ACLO,SAASc,GACdf,GACAgB,GACAf,GACW;AACX,SAAO;AAAA,IACL,GAAGD;AAAA,IACH,OAAO;AAAA,MACL,GAAGA,EAAU,MAAM,MAAM,GAAGgB,CAAK;AAAA,MACjCf;AAAA,MACA,GAAGD,EAAU,MAAM,MAAMgB,CAAK;AAAA,IAAA;AAAA,EAChC;AAEJ;ACbO,SAASC,GAAWjB,GAAsBgB,GAA0B;AACzE,SAAO;AAAA,IACL,GAAGhB;AAAA,IACH,OAAOA,EAAU,MAAM,OAAO,CAACkB,GAAGX,MAAMA,MAAMS,CAAK;AAAA,EAAA;AAEvD;ACLO,SAASG,GACdnB,GACAgB,GACAf,GACW;AACX,SAAO;AAAA,IACL,GAAGD;AAAA,IACH,OAAOA,EAAU,MAAM,IAAI,CAACS,GAAGF,MAAOA,MAAMS,IAAQf,IAAOQ,CAAE;AAAA,EAAA;AAEjE;ACNO,SAASW,EACdC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAOH,IAAOC,GAEdG,IAASF,IAAO,aAAa,KAAKA,CAAI,IAAI,IAAI,aAAaC,CAAI;AAErE,MAAIC,EAAO,WAAWD;AACpB,UAAM,IAAI,MAAM,YAAYA,CAAI,gBAAgBC,EAAO,MAAM,EAAE;AAGjE,SAAO;AAAA,IACL,MAAAJ;AAAA,IACA,MAAAC;AAAA,IACA,MAAMG;AAAA,EAAA;AAEV;AAwBO,SAAST,EAAMM,GAAcI,GAAaC,GAAqB;AACpE,SAAOD,IAAMJ,IAAOK;AACtB;AChDA,MAAMjC,KAAM;AAEZ,SAASI,GAAMF,GAAmB;AAChC,SAAO,KAAK,IAAIA,CAAC,IAAIF,KAAM,IAAIE;AACjC;AAEO,SAASgC,EAAcL,GAAiD;AAC7E,QAAMM,IACJN,aAAgB,eAAeA,IAAO,UAAUA,IAAOA,EAAK,OAAOA;AAErE,MAAIM,EAAO,WAAW;AACpB,UAAM,IAAI,MAAM,iCAAiC;AAGnD,QAAMC,IAAU,IAAI,aAAa,CAAC;AAElC,WAASvB,IAAI,GAAGA,IAAI,GAAGA;AACrB,IAAAuB,EAAQvB,CAAC,IAAIT,GAAM+B,EAAOtB,CAAC,CAAC;AAG9B,SAAO;AAAA,IACL,OAAOa,EAAa,GAAG,GAAGU,CAAO;AAAA,EAAA;AAErC;ACvBO,SAASC,GAAIC,GAAWC,GAAmB;AAChD,MAAID,EAAE,WAAWC,EAAE;AACjB,UAAM,IAAI,MAAM,0CAA0C;AAG5D,MAAIC,IAAM;AAEV,WAAS3B,IAAI,GAAGA,IAAIyB,EAAE,QAAQzB;AAC5B,IAAA2B,KAAOF,EAAEzB,CAAC,IAAI0B,EAAE1B,CAAC;AAGnB,SAAO2B;AACT;ACVO,SAASC,EAAKtC,GAAmB;AACtC,MAAIqC,IAAM;AAEV,WAAS3B,IAAI,GAAGA,IAAIV,EAAE,QAAQU,KAAK;AACjC,UAAMX,IAAIC,EAAEU,CAAC;AACb,IAAA2B,KAAOtC,IAAIA;AAAA,EACb;AAEA,SAAO,KAAK,KAAKsC,CAAG;AACtB;ACPA,SAASE,EAAMC,GAAWxC,GAAW;AACnC,QAAMyC,IAAQH,EAAKE,CAAC,IAAIF,EAAKtC,CAAC;AAC9B,MAAIyC,MAAU,EAAG,OAAM,IAAI,MAAM,4BAA4B;AAE7D,QAAMC,IAAIR,GAAIM,GAAGxC,CAAC,IAAIyC,GAChBE,IAAU,KAAK,IAAI,IAAI,KAAK,IAAI,GAAGD,CAAC,CAAC;AAE3C,SAAO,KAAK,KAAKC,CAAO;AAC1B;AAEO,SAASC,GAAO/B,GAA4C;AACjE,QAAMgC,IAAIhC,EAAQ,MAAM,MAElBsB,IAAY,IAAI,aAAa,CAACU,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GAC/CT,IAAY,IAAI,aAAa,CAACS,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GAC/CH,IAAY,IAAI,aAAa,CAACG,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GAE/CC,IAAQP,EAAMH,GAAGM,CAAC,GAClBK,IAAOR,EAAMJ,GAAGO,CAAC,GACjBM,IAAQT,EAAMJ,GAAGC,CAAC;AAExB,SAAO,CAACU,GAAOC,GAAMC,CAAK;AAC5B;AC1BO,SAASC,GAAWJ,GAAmB;AAC5C,MAAIA,EAAE,SAAS,KAAKA,EAAE,SAAS;AAC7B,UAAM,IAAI,MAAM,qBAAqB;AAGvC,QAAMK,IAAML,EAAE,KAAK,CAAC,GAClBM,IAAMN,EAAE,KAAK,CAAC,GACdO,IAAMP,EAAE,KAAK,CAAC,GACVQ,IAAMR,EAAE,KAAK,CAAC,GAClBS,IAAMT,EAAE,KAAK,CAAC,GACdU,IAAMV,EAAE,KAAK,CAAC,GACVW,IAAMX,EAAE,KAAK,CAAC,GAClBY,IAAMZ,EAAE,KAAK,CAAC,GACda,IAAMb,EAAE,KAAK,CAAC,GAEVc,IAAML,IAAMI,IAAMH,IAAME,GACxBG,IAAML,IAAMC,IAAMH,IAAMK,GACxBG,IAAMR,IAAMI,IAAMH,IAAME,GAExBM,IAAMV,IAAMK,IAAMN,IAAMO,GACxBK,IAAMb,IAAMQ,IAAMN,IAAMI,GACxBQ,IAAMb,IAAMK,IAAMN,IAAMO,GAExBQ,IAAMd,IAAMI,IAAMH,IAAME,GACxBY,IAAMd,IAAMC,IAAMH,IAAMK,GACxBY,IAAMjB,IAAMI,IAAMH,IAAME,GAExBe,IAAMlB,IAAMS,IAAMR,IAAMS,IAAMR,IAAMS;AAE1C,MAAIO,MAAQ;AACV,UAAM,IAAI,MAAM,iBAAiB;AAGnC,QAAMC,IAAS,IAAID,GAEbE,IAAM/C,EAAa,GAAG,CAAC;AAE7B,SAAA+C,EAAI,KAAK,CAAC,IAAIX,IAAMU,GACpBC,EAAI,KAAK,CAAC,IAAIR,IAAMO,GACpBC,EAAI,KAAK,CAAC,IAAIL,IAAMI,GAEpBC,EAAI,KAAK,CAAC,IAAIV,IAAMS,GACpBC,EAAI,KAAK,CAAC,IAAIP,IAAMM,GACpBC,EAAI,KAAK,CAAC,IAAIJ,IAAMG,GAEpBC,EAAI,KAAK,CAAC,IAAIT,IAAMQ,GACpBC,EAAI,KAAK,CAAC,IAAIN,IAAMK,GACpBC,EAAI,KAAK,CAAC,IAAIH,IAAME,GAEbC;AACT;AChDO,SAASC,EAAQ1D,GAA0B;AAChD,SAAOoC,GAAWpC,EAAQ,KAAK;AACjC;ACJO,SAAS2D,GAAQ3D,GAA4C;AAClE,QAAMgC,IAAIhC,EAAQ,MAAM,MAElBsB,IAAkB,IAAI,aAAa,CAACU,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GACrDT,IAAkB,IAAI,aAAa,CAACS,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GACrDH,IAAkB,IAAI,aAAa,CAACG,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAE3D,SAAO,CAACP,EAAKH,CAAC,GAAGG,EAAKF,CAAC,GAAGE,EAAKI,CAAC,CAAC;AACnC;ACRO,SAAS+B,EAAUC,GAAwB;AAChD,QAAMJ,IAAM/C,EAAamD,EAAO,MAAMA,EAAO,IAAI;AAEjD,WAAS7C,IAAM,GAAGA,IAAM6C,EAAO,MAAM7C;AACnC,aAASC,IAAM,GAAGA,IAAM4C,EAAO,MAAM5C;AACnC,MAAAwC,EAAI,KAAKnD,EAAMmD,EAAI,MAAMxC,GAAKD,CAAG,CAAC,IAChC6C,EAAO,KAAKvD,EAAMuD,EAAO,MAAM7C,GAAKC,CAAG,CAAC;AAI9C,SAAOwC;AACT;ACXO,SAASK,EAAIxC,GAAWC,GAAmB;AAChD,MAAID,EAAE,SAASC,EAAE;AACf,UAAM,IAAI,MAAM,0CAA0C;AAG5D,QAAMkC,IAAM/C,EAAaY,EAAE,MAAMC,EAAE,IAAI,GAEjCwC,IAAQzC,EAAE,MACV0C,IAAQ1C,EAAE,MACV2C,IAAQ1C,EAAE;AAEhB,WAASP,IAAM,GAAGA,IAAM+C,GAAO/C;AAC7B,aAASC,IAAM,GAAGA,IAAMgD,GAAOhD,KAAO;AACpC,UAAIO,IAAM;AAEV,eAAS0C,IAAI,GAAGA,IAAIF,GAAOE;AACzB,QAAA1C,KAAOF,EAAE,KAAKhB,EAAMgB,EAAE,MAAMN,GAAKkD,CAAC,CAAC,IAAI3C,EAAE,KAAKjB,EAAMiB,EAAE,MAAM2C,GAAGjD,CAAG,CAAC;AAGrE,MAAAwC,EAAI,KAAKnD,EAAMmD,EAAI,MAAMzC,GAAKC,CAAG,CAAC,IAAIO;AAAA,IACxC;AAGF,SAAOiC;AACT;ACrBO,SAASU,GAAanE,GAA0B;AACrD,QAAM,IAAIA,EAAQ,OAEZoE,IAAKR,EAAU,CAAC;AACtB,SAAOE,EAAIM,GAAI,CAAC;AAClB;ACNA,MAAMC,IAAU,MAAM,KAAK;AAEpB,SAASC,GACdtE,GACkD;AAClD,QAAM,CAACsB,GAAGC,GAAGM,CAAC,IAAI8B,GAAQ3D,CAAO,GAC3B,CAACiC,GAAOC,GAAMC,CAAK,IAAIJ,GAAO/B,CAAO;AAE3C,SAAO,CAACsB,GAAGC,GAAGM,GAAGI,IAAQoC,GAASnC,IAAOmC,GAASlC,IAAQkC,CAAO;AACnE;ACPA,MAAME,KAAS,IAAI,KAAK;AAEjB,SAASC,GAAkBxE,GAA2B;AAC3D,QAAMyE,IAAMf,EAAQ1D,CAAO,GAGrBa,IAFO+C,EAAUa,CAAG,EAER,KAAK,IAAI,CAACtF,MAAMA,IAAIoF,EAAM;AAE5C,SAAOrD,EAAcL,CAAI;AAC3B;ACXO,SAAS6D,GAAkC1E,GAA2B;AAC3E,QAAMyE,IAAMf,EAAQ1D,CAAO,GACrB2E,IAAOf,EAAUa,CAAG;AAE1B,SAAOvD,EAAcyD,EAAK,IAAI;AAChC;ACPA,SAASC,GAAMf,GAAgBgB,GAAiBC,GAAyB;AACvE,QAAMrB,IAAM/C,EAAamD,EAAO,OAAO,GAAGA,EAAO,OAAO,CAAC;AAEzD,MAAIkB,IAAM;AAEV,WAAS/D,IAAM,GAAGA,IAAM6C,EAAO,MAAM7C;AACnC,QAAIA,MAAQ6D;AAEZ,eAAS5D,IAAM,GAAGA,IAAM4C,EAAO,MAAM5C;AACnC,QAAIA,MAAQ6D,MAEZrB,EAAI,KAAKsB,GAAK,IAAIlB,EAAO,KAAKvD,EAAMuD,EAAO,MAAM7C,GAAKC,CAAG,CAAC;AAI9D,SAAOwC;AACT;AAEO,SAASuB,GAAYnB,GAAwB;AAClD,MAAIA,EAAO,SAASA,EAAO;AACzB,UAAM,IAAI,MAAM,sCAAsC;AAGxD,QAAMoB,IAAIpB,EAAO;AAGjB,MAAIoB,MAAM,GAAG;AACX,UAAMjD,IAAI6B,EAAO;AAEjB,WACE7B,EAAE,CAAC,KAAKA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,KAChCA,EAAE,CAAC,KAAKA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,KAChCA,EAAE,CAAC,KAAKA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC;AAAA,EAEpC;AAEA,MAAIiD,MAAM;AACR,WAAOpB,EAAO,KAAK,CAAC;AAGtB,MAAIoB,MAAM;AACR,WAAOpB,EAAO,KAAK,CAAC,IAAIA,EAAO,KAAK,CAAC,IAAIA,EAAO,KAAK,CAAC,IAAIA,EAAO,KAAK,CAAC;AAGzE,MAAIN,IAAM;AAEV,WAAStC,IAAM,GAAGA,IAAMgE,GAAGhE,KAAO;AAChC,UAAMiE,IAAOjE,IAAM,MAAM,IAAI,IAAI;AAEjC,IAAAsC,KAAO2B,IAAOrB,EAAO,KAAK5C,CAAG,IAAI+D,GAAYJ,GAAMf,GAAQ,GAAG5C,CAAG,CAAC;AAAA,EACpE;AAEA,SAAOsC;AACT;ACpDO,SAAS4B,GAAOnF,GAA0B;AAC/C,SAAO,KAAK,IAAIgF,GAAYhF,EAAQ,KAAK,CAAC;AAC5C;ACHA,MAAMoF,IAAU,KAAK,KAAK,KACpBpG,KAAM;AAEZ,SAASI,EAAMF,GAAW;AACxB,SAAO,KAAK,IAAIA,CAAC,IAAIF,KAAM,IAAIE;AACjC;AAEO,SAASmG,EACd/D,GACAC,GACAM,GACAI,GACAC,GACAC,GACA;AACA,QAAMmD,IAASrD,IAAQmD,GACjBG,IAAQrD,IAAOkD,GACfI,IAASrD,IAAQiD,GAEjBK,IAAO,KAAK,IAAIH,CAAM,GACtBI,IAAO,KAAK,IAAIH,CAAK,GACrBI,IAAO,KAAK,IAAIH,CAAM,GACtBI,IAAO,KAAK,IAAIJ,CAAM,GAGtBK,IAAK,CAACvE,GAAG,GAAG,CAAC,GAEbwE,IAAK,CAACvE,IAAIoE,GAAMpE,IAAIqE,GAAM,CAAC;AAGjC,MAAI,KAAK,IAAIA,CAAI,IAAI5G;AACnB,UAAM,IAAI,MAAM,sDAAsD;AAGxE,QAAM+G,IAAKlE,IAAI6D,GAETM,IAAMnE,KAAK4D,IAAOC,IAAOC,KAASC,GAElCK,IAAYpE,IAAIA,IAAIkE,IAAKA,IAAKC,IAAKA,GAEnCE,IAAK,KAAK,KAAK,KAAK,IAAI,GAAGD,CAAS,CAAC;AAE3C,SAAO/E,EAAc;AAAA,IACnB9B,EAAMyG,EAAG,CAAC,CAAC;AAAA,IACXzG,EAAMyG,EAAG,CAAC,CAAC;AAAA,IACXzG,EAAMyG,EAAG,CAAC,CAAC;AAAA,IACXzG,EAAM0G,EAAG,CAAC,CAAC;AAAA,IACX1G,EAAM0G,EAAG,CAAC,CAAC;AAAA,IACX1G,EAAM0G,EAAG,CAAC,CAAC;AAAA,IACX1G,EAAM2G,CAAE;AAAA,IACR3G,EAAM4G,CAAE;AAAA,IACR5G,EAAM8G,CAAE;AAAA,EAAA,CACT;AACH;ACrDO,SAASC,GAAM7E,GAAW;AAC/B,SAAO+D,EAAe/D,GAAGA,GAAGA,GAAG,IAAI,IAAI,EAAE;AAC3C;ACFO,SAAS8E,GAAU9E,GAAWO,GAAW;AAC9C,SAAOwD,EAAe/D,GAAGA,GAAGO,GAAG,IAAI,IAAI,GAAG;AAC5C;ACFO,SAASwE,GAAW/E,GAAWC,GAAWM,GAAWK,GAAc;AACxE,SAAOmD,EAAe/D,GAAGC,GAAGM,GAAG,IAAIK,GAAM,EAAE;AAC7C;ACFO,SAASoE,GAAahF,GAAWC,GAAWM,GAAW;AAC5D,SAAOwD,EAAe/D,GAAGC,GAAGM,GAAG,IAAI,IAAI,EAAE;AAC3C;ACFO,SAAS0E,GAAajF,GAAWW,GAAe;AACrD,SAAOoD,EAAe/D,GAAGA,GAAGA,GAAGW,GAAOA,GAAOA,CAAK;AACpD;ACFO,SAASuE,GAAWlF,GAAWO,GAAW;AAC/C,SAAOwD,EAAe/D,GAAGA,GAAGO,GAAG,IAAI,IAAI,EAAE;AAC3C;ACCA,IAAI4E,IAA8B;AAE3B,SAASC,KAAW;AACzB,SAAKD,MACHA,KAAS,YAAY;AAEnB,QAAI,OAAO,UAAY,OAAe,QAAQ,UAAU;AACtD,UAAI;AACF,cAAM,EAAE,cAAAE,EAAA,IAAiB,MAAM,OAAO,uCAAI,GACpC,EAAE,MAAAC,EAAA,IAAS,MAAM,OAAO,uCAAM,GAC9BC,IAAWD;AAAA,UACf,QAAQ,IAAA;AAAA,UACR;AAAA,QAAA,GAEIE,IAAaH,EAAaE,CAAQ;AACxC,cAAME,EAAKD,CAAU;AAAA,MACvB,SAASE,GAAG;AACV,sBAAQ,MAAM,gCAAgCA,CAAC,GACzCA;AAAA,MACR;AAAA,SACK;AAEL,YAAMC,IAAU,kvtrBAGd,SAAA;AAEF,YAAMF,EAAKE,CAAO;AAAA,IACpB;AAAA,EACF,GAAA,IAEKR;AACT;AAEA,eAAsBS,GACpB5H,GACA6H,IAAY,MACZC,IAAU,YAKT;AACD,QAAMV,GAAA;AAKN,QAAMW,wBAAiB,IAAA,GACjBC,wBAAiB,IAAA;AAEvB,MAAIC,IAAU;AAEd,QAAMC,IAAwB,CAAA,GACxBC,IAAoB,CAAA;AAE1B,aAAWlI,KAAQD,EAAU,OAAO;AAClC,UAAMoI,IAASnI,EAAK,QAAQ;AAE5B,IAAK8H,EAAW,IAAIK,CAAM,MACxBL,EAAW,IAAIK,GAAQH,CAAO,GAC9BD,EAAW,IAAIC,GAASG,CAAM,GAC9BH,MAGFC,EAAU,KAAK,MAAM,KAAKjI,EAAK,IAAI,CAAC,GACpCkI,EAAQ,KAAKJ,EAAW,IAAIK,CAAM,CAAE;AAAA,EACtC;AAKA,QAAMC,IAAY;AAAA,IAChB,SAAS;AAAA,MACP,OAAO,MAAM,KAAKrI,EAAU,QAAQ,MAAM,IAAI;AAAA,IAAA;AAAA,IAEhD,WAAAkI;AAAA,IACA,SAAAC;AAAA,EAAA,GAMIG,IAAU,MAAMC;AAAA,IACpB,KAAK,UAAUF,CAAS;AAAA,IACxBR;AAAA,IACAC;AAAA,EAAA;AAMF,WAASU,EAAMC,GAID;AACZ,UAAM,EAAE,SAAA/H,GAAS,WAAAwH,GAAW,SAAAC,MAAYM,GAElCC,IAAU,CAAC,GAAG,IAAI,IAAIP,CAAO,CAAC,EAAE,IAAI,CAACxC,OAAe;AAAA,MACxD,QAAQqC,EAAW,IAAIrC,CAAC;AAAA,IAAA,EACxB,GAEIgD,IAAQT,EAAU,IAAI,CAACU,GAAerI,OAAe;AAAA,MACzD,SAAS;AAAA,QACP,QAAQyH,EAAW,IAAIG,EAAQ5H,CAAC,CAAC;AAAA,MAAA;AAAA,MAEnC,MAAM,IAAI,aAAaqI,CAAG;AAAA,IAAA,EAC1B;AAEF,WAAO;AAAA,MACL,SAAShH,EAAclB,EAAQ,KAAK;AAAA,MACpC,SAAAgI;AAAA,MACA,OAAAC;AAAA,IAAA;AAAA,EAEJ;AAKA,SAAO;AAAA,IACL,WAAWH,EAAMF,EAAQ,aAAa;AAAA,IACtC,cAAcE,EAAMF,EAAQ,QAAQ;AAAA,IACpC,oBAAoBA;AAAA,EAAA;AAExB;AC5HO,SAASO,GACd7I,GACAwB,GACW;AACX,QAAM,CAACsH,GAAIC,GAAIC,CAAE,IAAI,OAAOxH,KAAS,WAAW,CAACA,GAAMA,GAAMA,CAAI,IAAIA;AAErE,MACEsH,IAAK,KACLC,IAAK,KACLC,IAAK,KACL,CAAC,OAAO,UAAUF,CAAE,KACpB,CAAC,OAAO,UAAUC,CAAE,KACpB,CAAC,OAAO,UAAUC,CAAE;AAEpB,UAAM,IAAI,MAAM,gDAAgD;AAGlE,QAAMtG,IAAI1C,EAAU,QAAQ,MAAM,MAG5BiJ,IAAW;AAAA,IACfvG,EAAE,CAAC,IAAIoG;AAAA,IACPpG,EAAE,CAAC,IAAIoG;AAAA,IACPpG,EAAE,CAAC,IAAIoG;AAAA,IAEPpG,EAAE,CAAC,IAAIqG;AAAA,IACPrG,EAAE,CAAC,IAAIqG;AAAA,IACPrG,EAAE,CAAC,IAAIqG;AAAA,IAEPrG,EAAE,CAAC,IAAIsG;AAAA,IACPtG,EAAE,CAAC,IAAIsG;AAAA,IACPtG,EAAE,CAAC,IAAIsG;AAAA,EAAA,GAGHL,IAAgB,CAAA;AAEtB,aAAW1I,KAAQD,EAAU,OAAO;AAClC,UAAM,CAACJ,GAAGsJ,GAAGC,CAAC,IAAIlJ,EAAK;AAEvB,aAASM,IAAI,GAAGA,IAAIuI,GAAIvI;AACtB,eAAS6I,IAAI,GAAGA,IAAIL,GAAIK;AACtB,iBAASxE,IAAI,GAAGA,IAAIoE,GAAIpE;AACtB,UAAA+D,EAAM,KAAK;AAAA,YACT,SAAS1I,EAAK;AAAA,YAEd,MAAM,IAAI,aAAa,EAAEL,IAAIW,KAAKuI,IAAKI,IAAIE,KAAKL,IAAKI,IAAIvE,KAAKoE,CAAE,CAAC;AAAA,UAAA,CAClE;AAAA,EAIT;AAEA,SAAO;AAAA,IACL,SAASpH,EAAcqH,CAAQ;AAAA,IAC/B,OAAAN;AAAA,EAAA;AAEJ;AClDO,SAASU,GACdX,GACAY,GACAC,GACS;AACT,SAAO;AAAA,IACL,SAAAb;AAAA,IACA,MAAAY;AAAA,IACA,YAAAC;AAAA,EAAA;AAEJ;ACfO,SAASC,EAAU9I,GAAkBT,GAAoB;AAC9D,QAAM,CAACL,GAAGsJ,GAAGC,CAAC,IAAIlJ,EAAK,MAEjBqJ,IAAO;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,IAAI,aAAa,CAAC1J,GAAGsJ,GAAGC,CAAC,CAAC;AAAA,EAAA,GAG5BM,IAASnF,EAAU5D,EAAQ,KAAK,GAChCgJ,IAASlF,EAAIiF,GAAQH,CAAI;AAE/B,SAAO,IAAI,aAAa,CAACI,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,CAAC,CAAC;AAC1E;ACdO,SAASC,EAAWjJ,GAAkBkJ,GAAsB;AACjE,QAAMC,IAAM;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAMD;AAAA,EAAA,GAGFzE,IAAMf,EAAQ1D,CAAO,GACrB2E,IAAOf,EAAUa,CAAG,GAEpBuE,IAASlF,EAAIa,GAAMwE,CAAG;AAE5B,SAAO,IAAI,aAAa,CAACH,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,CAAC,CAAC;AAC1E;ACbO,SAASI,GAASpJ,GAAkBsB,GAASC,GAAiB;AACnE,QAAM8H,IAAkC;AAAA,IACtC9H,EAAE,KAAK,CAAC,IAAID,EAAE,KAAK,CAAC;AAAA,IACpBC,EAAE,KAAK,CAAC,IAAID,EAAE,KAAK,CAAC;AAAA,IACpBC,EAAE,KAAK,CAAC,IAAID,EAAE,KAAK,CAAC;AAAA,EAAA;AAGtB,WAASzB,IAAI,GAAGA,IAAI,GAAGA;AACrB,IAAAwJ,EAAMxJ,CAAC,KAAK,KAAK,MAAMwJ,EAAMxJ,CAAC,CAAC;AAGjC,QAAMyJ,IAAkB;AAAA,IACtB,SAAShI,EAAE;AAAA,IACX,MAAM+H;AAAA,EAAA,GAGFE,IAAQT,EAAU9I,GAASsJ,CAAS;AAE1C,SAAO7H,EAAK8H,CAAK;AACnB;ACvBA,SAASC,EAAUtK,GAAmB;AACpC,UAASA,IAAI,IAAK,KAAK;AACzB;AAEO,SAASD,GAA+BM,GAAwB;AACrE,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,MAAM;AAAA,MACJiK,EAAUjK,EAAK,KAAK,CAAC,CAAC;AAAA,MACtBiK,EAAUjK,EAAK,KAAK,CAAC,CAAC;AAAA,MACtBiK,EAAUjK,EAAK,KAAK,CAAC,CAAC;AAAA,IAAA;AAAA,EACxB;AAEJ;ACVO,SAASkK,GACd/B,GACAmB,GACY;AACZ,SAAO,EAAE,QAAAnB,GAAQ,YAAAmB,EAAA;AACnB;ACNA,SAASa,EAAWC,GAAuB;AAGzC,SAAO,OAAOA,EAAM,QAAQ,UAAU,EAAE,CAAC;AAC3C;AAEA,SAASC,EAASC,GAAwB;AACxC,SAAOA,EAAK,MAAM,sBAAsB,KAAK,CAAA;AAC/C;AAEA,SAASC,GAAwBC,GAAoB;AACnD,UAAQ;AAAA,IACN,gBAAgBA,CAAU;AAAA,EAAA;AAI9B;AAqCO,SAASC,GAAQC,GAAyB;AAC/C,QAAMC,IAAQD,EACX,MAAM;AAAA,CAAI,EACV,IAAI,CAAC/K,MAAMA,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO;AAEjB,MAAIoC,IAAI,GACJC,IAAI,GACJM,IAAI,GAEJI,IAAQ,GACRC,IAAO,GACPC,IAAQ,GAER4H,IAAa,MAEbI,IAAwB,CAAA;AAC5B,QAAMC,IAAuB,CAAA;AAE7B,MAAIC,IAAS,IACTC,IAA2B,CAAA,GAC3BC,IAAkB;AAEtB,aAAWV,KAAQK,GAAO;AACxB,QAAIL,EAAK,WAAW,gCAAgC;AAElD,MAAAE,IADeH,EAASC,CAAI,EACR,GAAG,EAAE,GAAG,QAAQ,SAAS,EAAE,KAAK;AAAA,aAC3CA,EAAK,WAAW,2BAA2B;AAEpD,MAAAE,IADeH,EAASC,CAAI,EACR,GAAG,EAAE,GAAG,QAAQ,SAAS,EAAE,KAAK;AAAA,aAC3CA,EAAK,WAAW,gBAAgB;AACzC,MAAAvI,IAAIoI,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aACvBA,EAAK,WAAW,gBAAgB;AACzC,MAAAtI,IAAImI,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aACvBA,EAAK,WAAW,gBAAgB;AACzC,MAAAhI,IAAI6H,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aACvBA,EAAK,WAAW,mBAAmB;AAC5C,MAAA5H,IAAQyH,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aAC3BA,EAAK,WAAW,kBAAkB;AAC3C,MAAA3H,IAAOwH,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aAC1BA,EAAK,WAAW,mBAAmB;AAC5C,MAAA1H,IAAQuH,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aAC3BA,MAAS,SAAS;AAC3B,MAAAQ,IAAS,IACTC,IAAiB,CAAA,GACjBC,IAAkB;AAClB;AAAA,IACF;AAEA,QAAIF,KAAUR,EAAK,WAAW,GAAG,GAAG;AAClC,MAAAS,EAAe,KAAKT,CAAI,GAEpBA,EAAK,SAAS,aAAa,MAC7BU,IAAkB;AAGpB;AAAA,IACF;AAEA,IAAIF,KAAUE,MACRJ,EAAY,WAAW,MACzBA,IAAc,CAAC,GAAGG,CAAc,IAGlCF,EAAS,KAAKR,EAASC,CAAI,CAAC;AAAA,EAEhC;AAIA,EAFa,WAAW,KAAKE,CAAU,KAGrCD,GAAwBC,CAAU;AAGpC,QAAM/J,IAAUqF,EAAe/D,GAAGC,GAAGM,GAAGI,GAAOC,GAAMC,CAAK,GAEpDqI,IAAKL,EAAY,UAAU,CAACjL,MAAMA,EAAE,SAAS,SAAS,CAAC,GAEvDuL,IAAKN,EAAY,UAAU,CAACjL,MAAMA,EAAE,SAAS,SAAS,CAAC,GAEvDwL,IAAKP,EAAY,UAAU,CAACjL,MAAMA,EAAE,SAAS,SAAS,CAAC,GAEvDyL,IAAWR,EAAY,UAAU,CAACjL,MAAMA,EAAE,SAAS,aAAa,CAAC;AAEvE,MAAIsL,IAAK,KAAKC,IAAK,KAAKC,IAAK,KAAKC,IAAW;AAC3C,UAAM,IAAI,MAAM,oCAAoC;AAGtD,QAAM1C,IAAQmC,EAAS,IAAI,CAACpJ,OAAS;AAAA,IACnC,SAAS;AAAA,MACP,QAAQA,EAAI2J,CAAQ;AAAA,IAAA;AAAA,IAGtB,MAAM,IAAI,aAAa;AAAA,MACrBjB,EAAW1I,EAAIwJ,CAAE,CAAC;AAAA,MAClBd,EAAW1I,EAAIyJ,CAAE,CAAC;AAAA,MAClBf,EAAW1I,EAAI0J,CAAE,CAAC;AAAA,IAAA,CACnB;AAAA,EAAA,EACD;AAEF,SAAO;AAAA,IACL,SAAA1K;AAAA,IACA,OAAAiI;AAAA,EAAA;AAEJ;AAEO,SAAS2C,GAAMtL,GAAsBG,IAAY,GAAW;AACjE,QAAMoL,IAAIvG,GAAWhF,EAAU,OAAO,GAEhC4K,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK,mBAAmB,GAC9BA,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,sCAAsC,GACjDA,EAAM,KAAK,+BAA+B,GAE1CA,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,kBAAkBW,EAAE,CAAC,EAAE,QAAQpL,CAAS,CAAC,EAAE,GAEtDyK,EAAM,KAAK,kBAAkBW,EAAE,CAAC,EAAE,QAAQpL,CAAS,CAAC,EAAE,GAEtDyK,EAAM,KAAK,kBAAkBW,EAAE,CAAC,EAAE,QAAQpL,CAAS,CAAC,EAAE,GAEtDyK,EAAM,KAAK,qBAAqBW,EAAE,CAAC,EAAE,QAAQpL,CAAS,CAAC,EAAE,GAEzDyK,EAAM,KAAK,oBAAoBW,EAAE,CAAC,EAAE,QAAQpL,CAAS,CAAC,EAAE,GAExDyK,EAAM,KAAK,qBAAqBW,EAAE,CAAC,EAAE,QAAQpL,CAAS,CAAC,EAAE,GAEzDyK,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,OAAO,GAClBA,EAAM,KAAK,kBAAkB,GAC7BA,EAAM,KAAK,wBAAwB,GACnCA,EAAM,KAAK,oBAAoB,GAC/BA,EAAM,KAAK,oBAAoB,GAC/BA,EAAM,KAAK,oBAAoB;AAE/B,WAASrK,IAAI,GAAGA,IAAIP,EAAU,MAAM,QAAQO,KAAK;AAC/C,UAAMN,IAAOD,EAAU,MAAMO,CAAC;AAE9B,IAAAqK,EAAM;AAAA,MACJ,GAAG3K,EAAK,QAAQ,MAAM,GAAGM,IAAI,CAAC,IACzBN,EAAK,QAAQ,MAAM,IACnBA,EAAK,KAAK,CAAC,EAAE,QAAQE,CAAS,CAAC,IAC/BF,EAAK,KAAK,CAAC,EAAE,QAAQE,CAAS,CAAC,IAC/BF,EAAK,KAAK,CAAC,EAAE,QAAQE,CAAS,CAAC;AAAA,IAAA;AAAA,EAExC;AAEA,SAAOyK,EAAM,KAAK;AAAA,CAAI;AACxB;ACxMA,SAASY,GAAYjB,GAAuB;AAC1C,SAAOA,EAAK,cAAc,WAAW,WAAW;AAClD;AAEA,SAASkB,GAAYlB,GAAuB;AAC1C,QAAMmB,IAAInB,EAAK,KAAA,EAAO,YAAA;AACtB,SAAOmB,EAAE,WAAW,GAAG,KAAKA,EAAE,WAAW,GAAG;AAC9C;AAyCO,SAASC,GAAWhB,GAAyB;AAClD,QAAMC,IAAQD,EAAK,MAAM;AAAA,CAAI,EAAE,IAAI,CAAC/K,MAAMA,EAAE,MAAM;AAElD,MAAIgM,IAAS;AAGb,EAAAA;AAGA,QAAMC,IAAQ,OAAOjB,EAAMgB,GAAQ,CAAC,GAG9BE,IAAwB,CAAA;AAE9B,WAASvL,IAAI,GAAGA,IAAI,GAAGA,KAAK;AAC1B,UAAMV,IAAI+K,EAAMgB,GAAQ,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAEjD,QAAI/L,EAAE,WAAW;AACf,YAAM,IAAI,MAAM,wBAAwB;AAG1C,IAAAiM,EAAY,KAAKjM,EAAE,CAAC,IAAIgM,GAAOhM,EAAE,CAAC,IAAIgM,GAAOhM,EAAE,CAAC,IAAIgM,CAAK;AAAA,EAC3D;AAEA,QAAMnL,IAAUkB,EAAckK,CAAW,GAGnCC,IAAUnB,EAAMgB,GAAQ,EAAE,MAAM,KAAK,GAGrCI,IAASpB,EAAMgB,GAAQ,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAEtD,MAAIG,EAAQ,WAAWC,EAAO;AAC5B,UAAM,IAAI,MAAM,wBAAwB;AAI1C,EAAIR,GAAYZ,EAAMgB,CAAM,CAAC,KAC3BA;AAIF,MAAIK,IAAS;AACb,EAAAA,IAAS,CAACR,GAAYb,EAAMgB,CAAM,CAAC,GAEnCA;AAEA,QAAMjD,IAAgB,CAAA;AAEtB,MAAIuD,IAAe,GACfC,IAAYH,EAAO,CAAC;AAEL,EAACC,KAAS7H,EAAQ1D,CAAO;AAE5C,QAAM0L,IAAaJ,EAAO,OAAO,CAAChK,GAAGC,MAAMD,IAAIC,GAAG,CAAC;AAEnD,WAAS1B,IAAI,GAAGA,IAAI6L,GAAY7L,KAAK;AAGnC,UAAM8L,IAFSzB,EAAMgB,GAAQ,EAAE,MAAM,KAAK,EAEpB,MAAM,GAAG,CAAC,EAAE,IAAI,MAAM,GAEtCtC,IAAO2C,IACT,IAAI,aAAaI,CAAM,IACvB1C,EAAWjJ,GAAS,IAAI,aAAa2L,CAAM,CAAC;AAEhD,IAAA1D,EAAM,KAAK;AAAA,MACT,SAAS;AAAA,QACP,QAAQoD,EAAQG,CAAY;AAAA,MAAA;AAAA,MAE9B,MAAA5C;AAAA,IAAA,CACD,GAED6C,KAEIA,MAAc,KAAKD,IAAeF,EAAO,SAAS,MACpDE,KACAC,IAAYH,EAAOE,CAAY;AAAA,EAEnC;AAEA,SAAO;AAAA,IACL,SAAAxL;AAAA,IACA,OAAAiI;AAAA,EAAA;AAEJ;AAEO,SAAS2D,GACdtM,GACAuM,GAKQ;AACR,QAAMC,IAAQD,GAAS,SAAS,6BAC1BV,IAAQU,GAAS,SAAS,GAC1BN,IAASM,GAAS,UAAU,IAE5B3B,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK4B,CAAK,GAChB5B,EAAM,KAAK,OAAOiB,CAAK,CAAC;AAGxB,QAAMnJ,IAAI1C,EAAU,QAAQ,MAAM;AAElC,EAAA4K,EAAM,KAAK,GAAGlI,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,GACpCkI,EAAM,KAAK,GAAGlI,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,GACpCkI,EAAM,KAAK,GAAGlI,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE;AAGpC,QAAM+J,wBAAc,IAAA;AAEpB,aAAWxM,KAAQD,EAAU,OAAO;AAClC,UAAMoI,IAASnI,EAAK,QAAQ;AAE5B,IAAKwM,EAAQ,IAAIrE,CAAM,KACrBqE,EAAQ,IAAIrE,GAAQ,EAAE,GAGxBqE,EAAQ,IAAIrE,CAAM,EAAG,KAAKnI,CAAI;AAAA,EAChC;AAEA,QAAMyI,IAAU,CAAC,GAAG+D,EAAQ,MAAM,GAC5B9D,IAAQ,CAAC,GAAG8D,EAAQ,OAAA,CAAQ,EAAE,KAAA;AAEpC,EAAA7B,EAAM,KAAKlC,EAAQ,KAAK,GAAG,CAAC,GAC5BkC,EAAM,KAAKlC,EAAQ,IAAI,CAACjI,MAAMgM,EAAQ,IAAIhM,CAAC,EAAG,MAAM,EAAE,KAAK,GAAG,CAAC,GAE/DmK,EAAM,KAAKqB,IAAS,WAAW,WAAW;AAE1C,aAAWhM,KAAQ0I,GAAO;AACxB,UAAM0D,IAASJ,IAAShM,EAAK,OAAOuJ,EAAUxJ,EAAU,SAASC,CAAI;AAErE,IAAA2K,EAAM,KAAK,GAAGyB,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,EAAE;AAAA,EACrD;AAEA,SAAOzB,EAAM,KAAK;AAAA,CAAI;AACxB;AC/KO,SAAS8B,GAAkBnL,GAAgC;AAChE,QAAMb,IAAUkB,EAAc;AAAA,IAC5B,GAAGL,EAAK,KAAK,CAAC;AAAA,IACd,GAAGA,EAAK,KAAK,CAAC;AAAA,IACd,GAAGA,EAAK,KAAK,CAAC;AAAA,EAAA,CACf,GAEKoL,IAAU,IAAI,IAAIpL,EAAK,MAAM,IAAI,CAACqL,MAAc,CAACA,EAAK,MAAMA,CAAI,CAAC,CAAC,GAElEjE,IAAQpH,EAAK,MAAM,IAAI,CAACtB,MAAc;AAC1C,UAAM2M,IAAOD,EAAQ,IAAI1M,EAAK,SAAS;AAEvC,QAAI,CAAC2M;AACH,YAAM,IAAI,MAAM,iBAAiB3M,EAAK,SAAS,GAAG;AAGpD,WAAO;AAAA,MACL,SAAS;AAAA,QACP,QAAQ2M,EAAK,QAAQ,CAAC;AAAA,MAAA;AAAA,MAGxB,MAAMjD,EAAWjJ,GAAS,IAAI,aAAaT,EAAK,QAAQ,CAAC;AAAA,IAAA;AAAA,EAE7D,CAAC;AAED,SAAO;AAAA,IACL,SAAAS;AAAA,IACA,OAAAiI;AAAA,EAAA;AAEJ;AAEO,SAASkE,GAAgB7M,GAAsB;AACpD,QAAM0C,IAAI1C,EAAU,QAAQ,MAAM,MAI5B8M,IAFU,CAAC,GAAG,IAAI,IAAI9M,EAAU,MAAM,IAAI,CAACS,MAAMA,EAAE,QAAQ,MAAM,CAAC,CAAC,EAEnD,IAAI,CAAC2H,OAAY;AAAA,IACrC,MAAMA;AAAA,IACN,SAAS,CAACA,CAAM;AAAA,EAAA,EAChB;AAEF,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,CAAC1F,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,MACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,MACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,IAAA;AAAA,IAGnB,OAAAoK;AAAA,IAEA,OAAO9M,EAAU,MAAM,IAAI,CAACC,OAAU;AAAA,MACpC,WAAWA,EAAK,QAAQ;AAAA,MAExB,UAAU,MAAM,KAAKuJ,EAAUxJ,EAAU,SAASC,CAAI,CAAC;AAAA,IAAA,EACvD;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAEV;AC3EA,SAAS8M,EAAYnC,GAAiBoC,GAAyB;AAC7D,QAAMC,IAAMrC,EAAM,UAAU,CAACL,MAASA,EAAK,KAAA,EAAO,YAAA,MAAkByC,CAAO;AAE3E,MAAIC,MAAQ;AACV,UAAM,IAAI,MAAM,WAAWD,CAAO,EAAE;AAGtC,SAAOC;AACT;AAoCO,SAASC,GAAQvC,GAAyB;AAC/C,QAAMC,IAAQD,EACX,MAAM;AAAA,CAAI,EACV,IAAI,CAAC/K,MAAMA,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO,GAEXuN,IAAWJ,EAAYnC,GAAO,SAAS,GAEvClK,IAAUkB,EAAc;AAAA,IAC5B,GAAGgJ,EAAMuC,IAAW,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAAA,IAC9C,GAAGvC,EAAMuC,IAAW,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAAA,IAC9C,GAAGvC,EAAMuC,IAAW,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAAA,EAAA,CAC/C,GAEKC,IAAaL,EAAYnC,GAAO,WAAW,GAE3C,CAACyC,CAAM,IAAIzC,EAAMwC,IAAa,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM,GAExDzE,IAAgB,CAAA;AAEtB,WAASpI,IAAI,GAAGA,IAAI8M,GAAQ9M,KAAK;AAC/B,UAAM+M,IAAS1C,EAAMwC,IAAa,IAAI7M,CAAC,EAAE,MAAM,KAAK,GAE9C6H,IAASkF,EAAO,CAAC,GAEjB1N,IAAI,OAAO0N,EAAO,CAAC,CAAC,GACpBpE,IAAI,OAAOoE,EAAO,CAAC,CAAC,GACpBnE,IAAI,OAAOmE,EAAO,CAAC,CAAC,GAEpBhE,IAAOK,EAAWjJ,GAAS,IAAI,aAAa,CAACd,GAAGsJ,GAAGC,CAAC,CAAC,CAAC;AAE5D,IAAAR,EAAM,KAAK;AAAA,MACT,SAAS,EAAE,QAAAP,EAAA;AAAA,MACX,MAAAkB;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO;AAAA,IACL,SAAA5I;AAAA,IACA,OAAAiI;AAAA,EAAA;AAEJ;AAEA,SAAS4E,EAAU1N,GAAqB;AACtC,SAAO,GAAGA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC;AAChC;AAEA,SAAS2N,GAAc9M,GAAyC;AAC9D,QAAMgC,IAAIhC,EAAQ,MAAM;AAExB,SAAO;AAAA,IACL6M,EAAU,CAAC7K,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAAA,IAC5B6K,EAAU,CAAC7K,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAAA,IAC5B6K,EAAU,CAAC7K,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAAA,EAAA;AAEhC;AAEO,SAAS+K,GAAMzN,GAA8B;AAClD,QAAM4K,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK,SAAS,GACpBA,EAAM,KAAK,SAAS;AAEpB,QAAM8C,IAAeF,GAAcxN,EAAU,OAAO;AACpD,EAAA4K,EAAM,KAAK,GAAG8C,CAAY,GAE1B9C,EAAM,KAAK,EAAE,GACbA,EAAM,KAAK,WAAW,GACtBA,EAAM,KAAK,GAAG5K,EAAU,MAAM,MAAM,IAAI;AAExC,aAAWC,KAAQD,EAAU,OAAO;AAClC,UAAMuC,IAAIiH,EAAUxJ,EAAU,SAASC,CAAI;AAE3C,IAAA2K,EAAM,KAAK,GAAG3K,EAAK,QAAQ,MAAM,IAAIsC,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE;AAAA,EAC7D;AAEA,SAAOqI,EAAM,KAAK;AAAA,CAAI;AACxB;ACzHA,SAAS+C,GAAYC,GAAkC;AACrD,QAAMC,IAAwB,CAAA,GACxBC,IAAU;AAEhB,aAAWC,KAASH,EAAQ,SAASE,CAAO,GAAG;AAC7C,QAAIzD,IAAQ0D,EAAM,CAAC;AACnB,IAAI1D,EAAM,WAAW,GAAG,UAAWA,EAAM,MAAM,GAAG,EAAE,IACpDwD,EAAKE,EAAM,CAAC,CAAC,IAAI1D;AAAA,EACnB;AAEA,SAAOwD;AACT;AAEA,SAASG,GAAaH,GAAuB;AAC3C,MAAI,CAACA,EAAK;AACR,UAAM,IAAI,MAAM,mCAAmC;AAGrD,QAAMhO,IAAIgO,EAAK,QAAQ,MAAM,KAAK,EAAE,IAAI,MAAM;AAC9C,MAAIhO,EAAE,WAAW,EAAG,OAAM,IAAI,MAAM,iBAAiB;AAErD,SAAO+B,EAAc,CAAC/B,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAC7E;AA4BO,SAASoO,GAAQtD,GAAc;AACpC,QAAMC,IAAQD,EAAK,KAAA,EAAO,MAAM;AAAA,CAAI,GAE9BhF,IAAI,OAAOiF,EAAM,CAAC,CAAC,GACnBgD,IAAUhD,EAAM,CAAC,GAEjBiD,IAAOF,GAAYC,CAAO,GAC1BlN,IAAUsN,GAAaH,CAAI,GAE3BlF,IAAgB,CAAA;AAEtB,WAASpI,IAAI,GAAGA,IAAIoF,GAAGpF,KAAK;AAC1B,UAAM,CAAC6H,GAAQxI,GAAGsJ,GAAGC,CAAC,IAAIyB,EAAM,IAAIrK,CAAC,EAAE,MAAM,KAAK;AAElD,IAAAoI,EAAM,KAAK;AAAA,MACT,SAAS,EAAE,QAAAP,EAAA;AAAA,MACX,MAAM,IAAI,aAAa,CAAC,CAACxI,GAAG,CAACsJ,GAAG,CAACC,CAAC,CAAC;AAAA,IAAA,CACpC;AAAA,EACH;AAEA,SAAO,EAAE,SAAAzI,GAAS,OAAAiI,EAAA;AACpB;AAEA,SAAS6E,GAAc9M,GAA0B;AAC/C,QAAMgC,IAAIhC,EAAQ,MAAM;AAGxB,SAAO,GAAGgC,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC;AAChF;AAyBO,SAASwL,GAAMlO,GAA8B;AAClD,QAAM2I,IAAQ3I,EAAU,OAElB4K,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK,OAAOjC,EAAM,MAAM,CAAC;AAE/B,QAAMwF,IAAaX,GAAcxN,EAAU,OAAO;AAElD,EAAA4K,EAAM,KAAK,YAAYuD,CAAU,GAAG;AAEpC,aAAWlO,KAAQ0I,GAAO;AACxB,UAAMyF,IAAInO,EAAK;AAEf,IAAA2K,EAAM,KAAK,GAAG3K,EAAK,QAAQ,MAAM,IAAImO,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE;AAAA,EAC7D;AAEA,SAAOxD,EAAM,KAAK;AAAA,CAAI;AACxB;AC1HO,SAASyD,GAAa9M,GAAsB;AACjD,QAAMb,IAAUkB,EAAc;AAAA,IAC5B,GAAGL,EAAK,WAAW,gBAAgB,CAAC;AAAA,IACpC,GAAGA,EAAK,WAAW,gBAAgB,CAAC;AAAA,IACpC,GAAGA,EAAK,WAAW,gBAAgB,CAAC;AAAA,EAAA,CACrC,GAEK2G,IAAY3G,EAAK,WAAW,0BAC5BmH,IAAUnH,EAAK,WAAW,kBAE1BoH,IAAQT,EAAU,IAAI,CAACoG,GAAoB/N,OAAe;AAAA,IAC9D,SAAS;AAAA,MACP,QAAQmI,EAAQnI,CAAC;AAAA,IAAA;AAAA,IAGnB,MAAMoJ,EAAWjJ,GAAS,IAAI,aAAa4N,CAAQ,CAAC;AAAA,EAAA,EACpD;AAEF,SAAO;AAAA,IACL,SAAA5N;AAAA,IACA,OAAAiI;AAAA,EAAA;AAEJ;AAEO,SAAS4F,GAAWvO,GAAsB;AAC/C,QAAM0C,IAAI1C,EAAU,QAAQ,MAAM,MAE5BwO,IAAmBxO,EAAU,MAAM,IAAI,CAACC,MAASA,EAAK,QAAQ,MAAM,GAEpEwO,IAAW,CAAC,GAAG,IAAI,IAAID,CAAgB,CAAC,EAAE,KAAA;AAEhD,SAAO;AAAA,IACL,YAAY;AAAA,MACV,iBAAiB;AAAA,QACf,CAAC9L,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,QACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,QACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,MAAA;AAAA,MAGnB,kBAAA8L;AAAA,MAEA,0BAA0BxO,EAAU,MAAM;AAAA,QAAI,CAACC,MAC7C,MAAM,KAAKuJ,EAAUxJ,EAAU,SAASC,CAAI,CAAC;AAAA,MAAA;AAAA,MAG/C,iBAAiB,CAAC,GAAG,GAAG,CAAC;AAAA,MAEzB,QAAQD,EAAU,MAAM;AAAA,MAExB,WAAWyO,EAAS;AAAA,MAEpB,UAAAA;AAAA,IAAA;AAAA,EACF;AAEJ;ACpCO,SAASC,GAAO1O,GAAsB;AAC3C,SAAO;AAAA,IACL,SAASA,EAAU,QAAQ,MAAM;AAAA,IACjC,OAAOA,EAAU,MAAM,IAAI,CAACS,OAAO;AAAA,MACjC,SAASA,EAAE;AAAA,MACX,MAAM,MAAM,KAAKA,EAAE,IAAI;AAAA,IAAA,EACvB;AAAA,EAAA;AAEN;AAyBO,SAASkO,GAASpN,GAAsB;AAC7C,SAAO;AAAA,IACL,SAASK,EAAcL,EAAK,OAAO;AAAA,IACnC,OAAOA,EAAK,MAAM,IAAI,CAACd,OAAY;AAAA,MACjC,SAASA,EAAE;AAAA,MACX,MAAM,IAAI,aAAaA,EAAE,IAAI;AAAA,IAAA,EAC7B;AAAA,EAAA;AAEN;AChEO,SAASmO,EACdvE,GACAwE,GACAC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAU,CAAC5M,MAAe2M,IAAU3M,CAAC,KAAKA,GAE1C6M,IAAWD,EAAQJ,CAAI,GACvBM,IAASF,EAAQH,CAAE;AAEzB,SAAII,MAAaC,IAAe9E,IAEZA,IAAQ0E,EAAYG,CAAQ,IAC3BH,EAAYI,CAAM;AACzC;AAEO,SAASC,EACdC,GACAR,GACAC,GACAC,GACAC,GACU;AACV,SAAOK,EAAI,IAAI,CAACxP,MAAM+O,EAAmB/O,GAAGgP,GAAMC,GAAIC,GAAaC,CAAO,CAAC;AAC7E;ACdA,MAAMM,IAAiD;AAAA,EACrD,UAAU;AAAA,EACV,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,IAAI;AACN,GAEMC,IAA6C;AAAA,EACjD,GAAG;AAAA,EACH,IAAI;AACN,GAEaC,KAAmB;AAAA,EAC9B,aAAaF;AAAA,EACb,SAASC;AAAA,EAET,QAAQlF,GAAewE,GAA4BC,GAA0B;AAC3E,WAAOF;AAAA,MACLvE;AAAA,MACAwE;AAAA,MACAC;AAAA,MACAQ;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aACEF,GACAR,GACAC,GACA;AACA,WAAOM;AAAA,MACLC;AAAA,MACAR;AAAA,MACAC;AAAA,MACAQ;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AACF,GCnDME,IAAiD;AAAA,EACrD,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AACd,GAEMC,IAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,cAAc;AAChB,GAEaC,KAAmB;AAAA,EAC9B,aAAaF;AAAA,EACb,SAASC;AAAA,EAET,QAAQrF,GAAewE,GAA4BC,GAA0B;AAC3E,WAAOF;AAAA,MACLvE;AAAA,MACAwE;AAAA,MACAC;AAAA,MACAW;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aACEL,GACAR,GACAC,GACA;AACA,WAAOM;AAAA,MACLC;AAAA,MACAR;AAAA,MACAC;AAAA,MACAW;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AACF,GCxCME,IAA+C;AAAA,EACnD,KAAK;AAAA,EACL,KAAK,KAAK,KAAK;AAAA,EACf,MAAM,KAAK,KAAK;AAClB,GAEMC,IAA2C;AAAA,EAC/C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP,GAEaC,KAAkB;AAAA,EAC7B,aAAaF;AAAA,EACb,SAASC;AAAA,EAET,QAAQxF,GAAewE,GAA2BC,GAAyB;AACzE,WAAOF;AAAA,MACLvE;AAAA,MACAwE;AAAA,MACAC;AAAA,MACAc;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aACER,GACAR,GACAC,GACA;AACA,WAAOM;AAAA,MACLC;AAAA,MACAR;AAAA,MACAC;AAAA,MACAc;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AACF;"}
1
+ {"version":3,"file":"index.js","sources":["../lib/core/structure/operations/canonicalize.ts","../lib/core/structure/operations/hashStructure.ts","../lib/core/structure/operations/sites/appendSite.ts","../lib/core/structure/operations/sites/insertSite.ts","../lib/core/structure/operations/sites/removeSite.ts","../lib/core/structure/operations/sites/replaceSite.ts","../lib/core/matrix/matrix.ts","../lib/core/lattice/lattice.ts","../lib/core/matrix/operations/vector/dot.ts","../lib/core/matrix/operations/vector/norm.ts","../lib/core/lattice/angles.ts","../lib/core/matrix/operations/inverse/inverse3x3.ts","../lib/core/lattice/inverse.ts","../lib/core/lattice/lengths.ts","../lib/core/matrix/operations/transpose.ts","../lib/core/matrix/operations/mul.ts","../lib/core/lattice/metricTensor.ts","../lib/core/lattice/parameters.ts","../lib/core/lattice/reciprocalLattice.ts","../lib/core/lattice/reciprocalLatticeCrystallographic.ts","../lib/core/lattice/create/fromParameters.ts","../lib/core/lattice/create/cubic.ts","../lib/core/lattice/create/hexagonal.ts","../lib/core/lattice/create/monoclinic.ts","../lib/core/lattice/create/orthorhombic.ts","../lib/core/lattice/create/rhombohedral.ts","../lib/core/lattice/create/tetragonal.ts","../lib/core/structure/operations/symmetry/spglib.ts","../lib/core/structure/operations/supercell.ts","../lib/core/matrix/operations/determinant.ts","../lib/core/lattice/volume.ts","../lib/core/structure/properties/volume.ts","../lib/core/structure/properties/formula.ts","../lib/core/data/periodictable/atomicData.ts","../lib/core/structure/properties/cellMass.ts","../lib/core/structure/properties/density.ts","../lib/core/site/site.ts","../lib/core/site/cartesian.ts","../lib/core/site/fractional.ts","../lib/core/site/distance.ts","../lib/core/site/wrap.ts","../lib/core/species/species.ts","../lib/core/io/cif.ts","../lib/core/io/poscar.ts","../lib/core/io/structuredata.ts","../lib/core/io/xsf.ts","../lib/core/io/xyz.ts","../lib/core/io/optimade.ts","../lib/core/io/json.ts","../lib/core/units/converter.ts","../lib/core/units/length.ts","../lib/core/units/energy.ts","../lib/core/units/angle.ts"],"sourcesContent":["import { Structure } from \"../../structure/structure\";\n\nconst EPS = 1e-12;\n\nfunction wrap(x: number): number {\n const v = x - Math.floor(x);\n return Math.abs(v) < EPS ? 0 : v;\n}\n\nfunction clean(x: number): number {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function canonicalize(structure: Structure): Structure {\n return {\n ...structure,\n sites: structure.sites.map((site) => ({\n ...site,\n frac: new Float64Array([\n wrap(clean(site.frac[0])),\n wrap(clean(site.frac[1])),\n wrap(clean(site.frac[2])),\n ]),\n })),\n };\n}\n","import { Structure } from \"../structure\";\nimport { canonicalize } from \"./canonicalize\";\nimport { Vec3 } from \"@/main\";\n\nfunction toFixedArray(v: Vec3, precision = 8): string {\n return Array.from(v)\n .map((x) => x.toFixed(precision))\n .join(\",\");\n}\n\nfunction fnv1a(str: string): number {\n let hash = 2166136261;\n\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash *= 16777619;\n }\n\n return hash >>> 0;\n}\n\nexport function hashStructure(structure: Structure): number {\n const s = canonicalize(structure);\n\n const lattice = s.lattice.basis.data;\n const latticeKey = toFixedArray(lattice);\n\n const sitesKey = s.sites\n .map((site) => {\n return site.species + \":\" + toFixedArray(site.frac);\n })\n .sort()\n .join(\"|\");\n\n const key = latticeKey + \"::\" + sitesKey;\n\n return fnv1a(key);\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function appendSite(structure: Structure, site: Site): Structure {\n return {\n ...structure,\n sites: [...structure.sites, site],\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function insertSite(\n structure: Structure,\n index: number,\n site: Site,\n): Structure {\n return {\n ...structure,\n sites: [\n ...structure.sites.slice(0, index),\n site,\n ...structure.sites.slice(index),\n ],\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function removeSite(structure: Structure, index: number): Structure {\n return {\n ...structure,\n sites: structure.sites.filter((_, i) => i !== index),\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function replaceSite(\n structure: Structure,\n index: number,\n site: Site,\n): Structure {\n return {\n ...structure,\n sites: structure.sites.map((s, i) => (i === index ? site : s)),\n };\n}\n","export interface Matrix {\n readonly rows: number;\n readonly cols: number;\n readonly data: Float64Array;\n}\n\nexport function createMatrix(\n rows: number,\n cols: number,\n data?: Iterable<number>,\n): Matrix {\n const size = rows * cols;\n\n const buffer = data ? Float64Array.from(data) : new Float64Array(size);\n\n if (buffer.length !== size) {\n throw new Error(`Expected ${size} values, got ${buffer.length}`);\n }\n\n return {\n rows,\n cols,\n data: buffer,\n };\n}\n\nexport function identity(size: number): Matrix {\n const data = new Float64Array(size * size);\n\n for (let i = 0; i < size; i++) {\n data[i * size + i] = 1;\n }\n\n return {\n rows: size,\n cols: size,\n data,\n };\n}\n\nexport function clone(matrix: Matrix): Matrix {\n return {\n rows: matrix.rows,\n cols: matrix.cols,\n data: new Float64Array(matrix.data),\n };\n}\n\nexport function index(cols: number, row: number, col: number): number {\n return row * cols + col;\n}\n","import { createMatrix, Matrix } from \"../matrix/matrix\";\n\nconst EPS = 1e-12;\n\nfunction clean(x: number): number {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function createLattice(data: number[] | Float64Array | Matrix): Lattice {\n const values =\n data instanceof Float64Array ? data : \"data\" in data ? data.data : data;\n\n if (values.length !== 9) {\n throw new Error(\"Lattice requires 9 values (3x3)\");\n }\n\n const cleaned = new Float64Array(9);\n\n for (let i = 0; i < 9; i++) {\n cleaned[i] = clean(values[i]);\n }\n\n return {\n basis: createMatrix(3, 3, cleaned),\n };\n}\n","import { Vector } from \"../../vector\";\n\nexport function dot(a: Vector, b: Vector): number {\n if (a.length !== b.length) {\n throw new Error(\"Dot product requires same-length vectors\");\n }\n\n let sum = 0;\n\n for (let i = 0; i < a.length; i++) {\n sum += a[i] * b[i];\n }\n\n return sum;\n}\n","import { Vector } from \"../../vector\";\n\nconst EPS = 1e-12;\n\nexport function norm(v: Vector): number {\n let sum = 0;\n\n for (let i = 0; i < v.length; i++) {\n const x = v[i];\n sum += x * x;\n }\n\n return Math.sqrt(sum);\n}\n","import { dot } from \"../matrix/operations/vector/dot\";\nimport { norm } from \"../matrix/operations/vector/norm\";\nimport { Lattice } from \"./lattice\";\n\nimport { Vector } from \"../matrix/vector\";\n\nfunction angle(u: Vector, v: Vector) {\n const denom = norm(u) * norm(v);\n if (denom === 0) throw new Error(\"Zero-length lattice vector\");\n\n const c = dot(u, v) / denom;\n const clamped = Math.max(-1, Math.min(1, c));\n\n return Math.acos(clamped);\n}\n\nexport function angles(lattice: Lattice): [number, number, number] {\n const m = lattice.basis.data;\n\n const a: Vector = new Float64Array([m[0], m[1], m[2]]);\n const b: Vector = new Float64Array([m[3], m[4], m[5]]);\n const c: Vector = new Float64Array([m[6], m[7], m[8]]);\n\n const alpha = angle(b, c);\n const beta = angle(a, c);\n const gamma = angle(a, b);\n\n return [alpha, beta, gamma];\n}\n","import { Matrix, createMatrix } from \"../../matrix\";\n\nexport function inverse3x3(m: Matrix): Matrix {\n if (m.rows !== 3 || m.cols !== 3) {\n throw new Error(\"Expected 3x3 matrix\");\n }\n\n const a00 = m.data[0],\n a01 = m.data[1],\n a02 = m.data[2];\n const a10 = m.data[3],\n a11 = m.data[4],\n a12 = m.data[5];\n const a20 = m.data[6],\n a21 = m.data[7],\n a22 = m.data[8];\n\n const c00 = a11 * a22 - a12 * a21;\n const c01 = a12 * a20 - a10 * a22;\n const c02 = a10 * a21 - a11 * a20;\n\n const c10 = a02 * a21 - a01 * a22;\n const c11 = a00 * a22 - a02 * a20;\n const c12 = a01 * a20 - a00 * a21;\n\n const c20 = a01 * a12 - a02 * a11;\n const c21 = a02 * a10 - a00 * a12;\n const c22 = a00 * a11 - a01 * a10;\n\n const det = a00 * c00 + a01 * c01 + a02 * c02;\n\n if (det === 0) {\n throw new Error(\"Singular matrix\");\n }\n\n const invDet = 1 / det;\n\n const out = createMatrix(3, 3);\n\n out.data[0] = c00 * invDet;\n out.data[1] = c10 * invDet;\n out.data[2] = c20 * invDet;\n\n out.data[3] = c01 * invDet;\n out.data[4] = c11 * invDet;\n out.data[5] = c21 * invDet;\n\n out.data[6] = c02 * invDet;\n out.data[7] = c12 * invDet;\n out.data[8] = c22 * invDet;\n\n return out;\n}\n","import { Lattice } from \"./lattice\";\nimport { inverse3x3 } from \"../matrix/operations/inverse/inverse3x3\";\nimport { Matrix } from \"../matrix/matrix\";\n\nexport function inverse(lattice: Lattice): Matrix {\n return inverse3x3(lattice.basis);\n}\n","import { norm } from \"../matrix/operations/vector/norm\";\nimport { Lattice } from \"./lattice\";\nexport function lengths(lattice: Lattice): [number, number, number] {\n const m = lattice.basis.data;\n\n const a: Float64Array = new Float64Array([m[0], m[1], m[2]]);\n const b: Float64Array = new Float64Array([m[3], m[4], m[5]]);\n const c: Float64Array = new Float64Array([m[6], m[7], m[8]]);\n\n return [norm(a), norm(b), norm(c)];\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nexport function transpose(matrix: Matrix): Matrix {\n const out = createMatrix(matrix.cols, matrix.rows);\n\n for (let row = 0; row < matrix.rows; row++) {\n for (let col = 0; col < matrix.cols; col++) {\n out.data[index(out.cols, col, row)] =\n matrix.data[index(matrix.cols, row, col)];\n }\n }\n\n return out;\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nexport function mul(a: Matrix, b: Matrix): Matrix {\n if (a.cols !== b.rows) {\n throw new Error(\"Invalid matrix multiplication dimensions\");\n }\n\n const out = createMatrix(a.rows, b.cols);\n\n const aRows = a.rows;\n const aCols = a.cols;\n const bCols = b.cols;\n\n for (let row = 0; row < aRows; row++) {\n for (let col = 0; col < bCols; col++) {\n let sum = 0;\n\n for (let k = 0; k < aCols; k++) {\n sum += a.data[index(a.cols, row, k)] * b.data[index(b.cols, k, col)];\n }\n\n out.data[index(out.cols, row, col)] = sum;\n }\n }\n\n return out;\n}\n","import { transpose } from \"../matrix/operations/transpose\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { Lattice } from \"./lattice\";\nimport { Matrix } from \"../matrix/matrix\";\n\nexport function metricTensor(lattice: Lattice): Matrix {\n const A = lattice.basis;\n\n const AT = transpose(A);\n return mul(AT, A);\n}\n","import { lengths } from \"./lengths\";\nimport { angles } from \"./angles\";\nimport { Lattice } from \"./lattice\";\n\nconst RAD2DEG = 180 / Math.PI;\n\nexport function parameters(\n lattice: Lattice,\n): [number, number, number, number, number, number] {\n const [a, b, c] = lengths(lattice);\n const [alpha, beta, gamma] = angles(lattice);\n\n return [a, b, c, alpha * RAD2DEG, beta * RAD2DEG, gamma * RAD2DEG];\n}\n","import { Lattice } from \"./lattice\";\nimport { inverse } from \"./inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\nimport { createMatrix } from \"../matrix/matrix\";\nimport { createLattice } from \"./lattice\";\n\nconst TWO_PI = 2 * Math.PI;\n\nexport function reciprocalLattice(lattice: Lattice): Lattice {\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n const data = invT.data.map((v) => v * TWO_PI);\n\n return createLattice(data);\n}\n","import { Lattice, createLattice } from \"./lattice\";\nimport { inverse } from \"./inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\n\nexport function reciprocalLatticeCrystallographic(lattice: Lattice): Lattice {\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n return createLattice(invT.data);\n}\n","import { createLattice } from \"../lattice\";\n\nconst DEG2RAD = Math.PI / 180;\nconst EPS = 1e-12;\n\nfunction clean(x: number) {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function fromParameters(\n a: number,\n b: number,\n c: number,\n alpha: number,\n beta: number,\n gamma: number,\n) {\n const alphaR = alpha * DEG2RAD;\n const betaR = beta * DEG2RAD;\n const gammaR = gamma * DEG2RAD;\n\n const cosA = Math.cos(alphaR);\n const cosB = Math.cos(betaR);\n const cosG = Math.cos(gammaR);\n const sinG = Math.sin(gammaR);\n\n // lattice vectors\n const v1 = [a, 0, 0];\n\n const v2 = [b * cosG, b * sinG, 0];\n\n // guard against degenerate gamma\n if (Math.abs(sinG) < EPS) {\n throw new Error(\"Invalid lattice: gamma too close to 0 or 180 degrees\");\n }\n\n const cx = c * cosB;\n\n const cy = (c * (cosA - cosB * cosG)) / sinG;\n\n const czSquared = c * c - cx * cx - cy * cy;\n\n const cz = Math.sqrt(Math.max(0, czSquared));\n\n return createLattice([\n clean(v1[0]),\n clean(v1[1]),\n clean(v1[2]),\n clean(v2[0]),\n clean(v2[1]),\n clean(v2[2]),\n clean(cx),\n clean(cy),\n clean(cz),\n ]);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function cubic(a: number) {\n return fromParameters(a, a, a, 90, 90, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function hexagonal(a: number, c: number) {\n return fromParameters(a, a, c, 90, 90, 120);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function monoclinic(a: number, b: number, c: number, beta: number) {\n return fromParameters(a, b, c, 90, beta, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function orthorhombic(a: number, b: number, c: number) {\n return fromParameters(a, b, c, 90, 90, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function rhombohedral(a: number, alpha: number) {\n return fromParameters(a, a, a, alpha, alpha, alpha);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function tetragonal(a: number, c: number) {\n return fromParameters(a, a, c, 90, 90, 90);\n}\n","import init, { analyze_cell, type MoyoDataset } from \"@spglib/moyo-wasm\";\n\nimport { createLattice } from \"@/core/lattice\";\nimport { Structure } from \"../../structure\";\n\nlet ready: Promise<void> | null = null;\n\nexport function initMoyo() {\n if (!ready) {\n ready = (async () => {\n // In Node.js (tests), load from filesystem\n if (typeof process !== \"undefined\" && process.versions?.node) {\n try {\n const { readFileSync } = await import(\"fs\");\n const { join } = await import(\"path\");\n const wasmPath = join(\n process.cwd(),\n \"node_modules/@spglib/moyo-wasm/moyo_wasm_bg.wasm\",\n );\n const wasmBuffer = readFileSync(wasmPath);\n await init(wasmBuffer);\n } catch (e) {\n console.error(\"Failed to load WASM in Node:\", e);\n throw e;\n }\n } else {\n // In browser, use dynamic import to get the URL\n const wasmUrl = new URL(\n \"@spglib/moyo-wasm/moyo_wasm_bg.wasm\",\n import.meta.url,\n ).toString();\n\n await init(wasmUrl);\n }\n })();\n }\n return ready;\n}\n\nexport async function getSymmetry(\n structure: Structure,\n tolerance = 1e-4,\n setting = \"Standard\",\n): Promise<{\n primitive: Structure;\n conventional: Structure;\n calculationResults: any;\n}> {\n await initMoyo();\n\n // -----------------------------\n // 1. Build reversible mapping\n // -----------------------------\n const symbolToId = new Map<string, number>();\n const idToSymbol = new Map<number, string>();\n\n let counter = 0;\n\n const positions: number[][] = [];\n const numbers: number[] = [];\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n if (!symbolToId.has(symbol)) {\n symbolToId.set(symbol, counter);\n idToSymbol.set(counter, symbol);\n counter++;\n }\n\n positions.push(Array.from(site.frac));\n numbers.push(symbolToId.get(symbol)!);\n }\n\n // -----------------------------\n // 2. Build Moyo input\n // -----------------------------\n const moyoInput = {\n lattice: {\n basis: Array.from(structure.lattice.basis.data),\n },\n positions,\n numbers,\n };\n\n // -----------------------------\n // 3. Run symmetry engine\n // -----------------------------\n const results = await analyze_cell(\n JSON.stringify(moyoInput),\n tolerance,\n setting,\n );\n\n // -----------------------------\n // 4. Convert Moyo cell → Structure\n // -----------------------------\n function build(cell: {\n lattice: { basis: number[] };\n positions: number[][];\n numbers: number[];\n }): Structure {\n const { lattice, positions, numbers } = cell;\n\n const species = [...new Set(numbers)].map((n: number) => ({\n symbol: idToSymbol.get(n)!,\n }));\n\n const sites = positions.map((pos: number[], i: number) => ({\n species: {\n symbol: idToSymbol.get(numbers[i])!,\n },\n frac: new Float64Array(pos),\n }));\n\n return {\n lattice: createLattice(lattice.basis),\n species,\n sites,\n };\n }\n\n // -----------------------------\n // 5. Return both structures\n // -----------------------------\n return {\n primitive: build(results.prim_std_cell),\n conventional: build(results.std_cell),\n calculationResults: results,\n };\n}\n","import { createLattice } from \"@/core/lattice/lattice\";\nimport type { Structure } from \"../structure\";\nimport type { Site } from \"@/core/site/site\";\n\ntype SupercellSize = number | [number, number, number];\n\nexport function supercell(\n structure: Structure,\n size: SupercellSize,\n): Structure {\n const [nx, ny, nz] = typeof size === \"number\" ? [size, size, size] : size;\n\n if (\n nx < 1 ||\n ny < 1 ||\n nz < 1 ||\n !Number.isInteger(nx) ||\n !Number.isInteger(ny) ||\n !Number.isInteger(nz)\n ) {\n throw new Error(\"Supercell dimensions must be positive integers\");\n }\n\n const m = structure.lattice.basis.data;\n\n // row-major scaling\n const newBasis = [\n m[0] * nx,\n m[1] * nx,\n m[2] * nx,\n\n m[3] * ny,\n m[4] * ny,\n m[5] * ny,\n\n m[6] * nz,\n m[7] * nz,\n m[8] * nz,\n ];\n\n const sites: Site[] = [];\n\n for (const site of structure.sites) {\n const [x, y, z] = site.frac;\n\n for (let i = 0; i < nx; i++) {\n for (let j = 0; j < ny; j++) {\n for (let k = 0; k < nz; k++) {\n sites.push({\n species: site.species,\n\n frac: new Float64Array([(x + i) / nx, (y + j) / ny, (z + k) / nz]),\n });\n }\n }\n }\n }\n\n return {\n lattice: createLattice(newBasis),\n sites,\n };\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nfunction minor(matrix: Matrix, skipRow: number, skipCol: number): Matrix {\n const out = createMatrix(matrix.rows - 1, matrix.cols - 1);\n\n let ptr = 0;\n\n for (let row = 0; row < matrix.rows; row++) {\n if (row === skipRow) continue;\n\n for (let col = 0; col < matrix.cols; col++) {\n if (col === skipCol) continue;\n\n out.data[ptr++] = matrix.data[index(matrix.cols, row, col)];\n }\n }\n\n return out;\n}\n\nexport function determinant(matrix: Matrix): number {\n if (matrix.rows !== matrix.cols) {\n throw new Error(\"Determinant requires a square matrix\");\n }\n\n const n = matrix.rows;\n\n // fast path for BZ / geometry\n if (n === 3) {\n const m = matrix.data;\n\n return (\n m[0] * (m[4] * m[8] - m[5] * m[7]) -\n m[1] * (m[3] * m[8] - m[5] * m[6]) +\n m[2] * (m[3] * m[7] - m[4] * m[6])\n );\n }\n\n if (n === 1) {\n return matrix.data[0];\n }\n\n if (n === 2) {\n return matrix.data[0] * matrix.data[3] - matrix.data[1] * matrix.data[2];\n }\n\n let det = 0;\n\n for (let col = 0; col < n; col++) {\n const sign = col % 2 === 0 ? 1 : -1;\n\n det += sign * matrix.data[col] * determinant(minor(matrix, 0, col));\n }\n\n return det;\n}\n","import { determinant } from \"../matrix/operations/determinant\";\nimport { Lattice } from \"./lattice\";\n\nexport function volume(lattice: Lattice): number {\n return Math.abs(determinant(lattice.basis));\n}\n","import { Structure } from \"../structure\";\nimport { volume as latticeVolume } from \"../../lattice/volume\";\n\nexport function volume(structure: Structure): number {\n return latticeVolume(structure.lattice);\n}\n","import { Structure } from \"../structure\";\n\nfunction gcd(a: number, b: number): number {\n while (b !== 0) {\n [a, b] = [b, a % b];\n }\n\n return Math.abs(a);\n}\n\nexport function composition(structure: Structure): Record<string, number> {\n const out: Record<string, number> = {};\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n out[symbol] ??= 0;\n out[symbol]++;\n }\n\n return out;\n}\n\nfunction compositionGCD(comp: Record<string, number>): number {\n const values = Object.values(comp);\n\n return values.reduce((a, b) => gcd(a, b));\n}\n\nfunction hillOrder(elements: string[]): string[] {\n if (!elements.includes(\"C\")) {\n return [...elements].sort();\n }\n\n const rest = elements.filter((e) => e !== \"C\" && e !== \"H\").sort();\n\n return [\"C\", ...(elements.includes(\"H\") ? [\"H\"] : []), ...rest];\n}\n\nfunction formulaFromComposition(\n comp: Record<string, number>,\n ordering: (elements: string[]) => string[],\n): string {\n const elements = ordering(Object.keys(comp));\n\n return elements\n .map((el) => {\n const count = comp[el];\n\n return count === 1 ? el : `${el}${count}`;\n })\n .join(\"\");\n}\n\nfunction reducedComposition(\n comp: Record<string, number>,\n): Record<string, number> {\n const factor = compositionGCD(comp);\n\n const out: Record<string, number> = {};\n\n for (const [element, count] of Object.entries(comp)) {\n out[element] = count / factor;\n }\n\n return out;\n}\n\nexport function hillFormula(structure: Structure): string {\n return formulaFromComposition(composition(structure), hillOrder);\n}\n\nexport function reducedFormula(structure: Structure): string {\n return formulaFromComposition(\n reducedComposition(composition(structure)),\n hillOrder,\n );\n}\n","export interface ElementInfo {\n atomicNumber: number;\n symbol: string;\n name: string;\n mass: number;\n [key: string]: unknown;\n}\n\nexport const PeriodicTable: Record<number, ElementInfo> = {\n 1: { atomicNumber: 1, symbol: \"H\", name: \"Hydrogen\", mass: 1.008 },\n 2: { atomicNumber: 2, symbol: \"He\", name: \"Helium\", mass: 4.0026 },\n 3: { atomicNumber: 3, symbol: \"Li\", name: \"Lithium\", mass: 6.94 },\n 4: { atomicNumber: 4, symbol: \"Be\", name: \"Beryllium\", mass: 9.0122 },\n 5: { atomicNumber: 5, symbol: \"B\", name: \"Boron\", mass: 10.81 },\n 6: { atomicNumber: 6, symbol: \"C\", name: \"Carbon\", mass: 12.011 },\n 7: { atomicNumber: 7, symbol: \"N\", name: \"Nitrogen\", mass: 14.007 },\n 8: { atomicNumber: 8, symbol: \"O\", name: \"Oxygen\", mass: 15.999 },\n 9: { atomicNumber: 9, symbol: \"F\", name: \"Fluorine\", mass: 18.998 },\n 10: { atomicNumber: 10, symbol: \"Ne\", name: \"Neon\", mass: 20.18 },\n 11: { atomicNumber: 11, symbol: \"Na\", name: \"Sodium\", mass: 22.99 },\n 12: { atomicNumber: 12, symbol: \"Mg\", name: \"Magnesium\", mass: 24.305 },\n 13: { atomicNumber: 13, symbol: \"Al\", name: \"Aluminum\", mass: 26.982 },\n 14: { atomicNumber: 14, symbol: \"Si\", name: \"Silicon\", mass: 28.085 },\n 15: { atomicNumber: 15, symbol: \"P\", name: \"Phosphorus\", mass: 30.974 },\n 16: { atomicNumber: 16, symbol: \"S\", name: \"Sulfur\", mass: 32.06 },\n 17: { atomicNumber: 17, symbol: \"Cl\", name: \"Chlorine\", mass: 35.45 },\n 18: { atomicNumber: 18, symbol: \"Ar\", name: \"Argon\", mass: 39.948 },\n 19: { atomicNumber: 19, symbol: \"K\", name: \"Potassium\", mass: 39.098 },\n 20: { atomicNumber: 20, symbol: \"Ca\", name: \"Calcium\", mass: 40.078 },\n 21: { atomicNumber: 21, symbol: \"Sc\", name: \"Scandium\", mass: 44.956 },\n 22: { atomicNumber: 22, symbol: \"Ti\", name: \"Titanium\", mass: 47.867 },\n 23: { atomicNumber: 23, symbol: \"V\", name: \"Vanadium\", mass: 50.942 },\n 24: { atomicNumber: 24, symbol: \"Cr\", name: \"Chromium\", mass: 51.996 },\n 25: { atomicNumber: 25, symbol: \"Mn\", name: \"Manganese\", mass: 54.938 },\n 26: { atomicNumber: 26, symbol: \"Fe\", name: \"Iron\", mass: 55.845 },\n 27: { atomicNumber: 27, symbol: \"Co\", name: \"Cobalt\", mass: 58.933 },\n 28: { atomicNumber: 28, symbol: \"Ni\", name: \"Nickel\", mass: 58.693 },\n 29: { atomicNumber: 29, symbol: \"Cu\", name: \"Copper\", mass: 63.546 },\n 30: { atomicNumber: 30, symbol: \"Zn\", name: \"Zinc\", mass: 65.38 },\n 31: { atomicNumber: 31, symbol: \"Ga\", name: \"Gallium\", mass: 69.723 },\n 32: { atomicNumber: 32, symbol: \"Ge\", name: \"Germanium\", mass: 72.63 },\n 33: { atomicNumber: 33, symbol: \"As\", name: \"Arsenic\", mass: 74.922 },\n 34: { atomicNumber: 34, symbol: \"Se\", name: \"Selenium\", mass: 78.971 },\n 35: { atomicNumber: 35, symbol: \"Br\", name: \"Bromine\", mass: 79.904 },\n 36: { atomicNumber: 36, symbol: \"Kr\", name: \"Krypton\", mass: 83.798 },\n 37: { atomicNumber: 37, symbol: \"Rb\", name: \"Rubidium\", mass: 85.468 },\n 38: { atomicNumber: 38, symbol: \"Sr\", name: \"Strontium\", mass: 87.62 },\n 39: { atomicNumber: 39, symbol: \"Y\", name: \"Yttrium\", mass: 88.906 },\n 40: { atomicNumber: 40, symbol: \"Zr\", name: \"Zirconium\", mass: 91.224 },\n 41: { atomicNumber: 41, symbol: \"Nb\", name: \"Niobium\", mass: 92.906 },\n 42: { atomicNumber: 42, symbol: \"Mo\", name: \"Molybdenum\", mass: 95.95 },\n 43: { atomicNumber: 43, symbol: \"Tc\", name: \"Technetium\", mass: 98 },\n 44: { atomicNumber: 44, symbol: \"Ru\", name: \"Ruthenium\", mass: 101.07 },\n 45: { atomicNumber: 45, symbol: \"Rh\", name: \"Rhodium\", mass: 102.91 },\n 46: { atomicNumber: 46, symbol: \"Pd\", name: \"Palladium\", mass: 106.42 },\n 47: { atomicNumber: 47, symbol: \"Ag\", name: \"Silver\", mass: 107.868 },\n 48: { atomicNumber: 48, symbol: \"Cd\", name: \"Cadmium\", mass: 112.414 },\n 49: { atomicNumber: 49, symbol: \"In\", name: \"Indium\", mass: 114.818 },\n 50: { atomicNumber: 50, symbol: \"Sn\", name: \"Tin\", mass: 118.71 },\n 51: { atomicNumber: 51, symbol: \"Sb\", name: \"Antimony\", mass: 121.76 },\n 52: { atomicNumber: 52, symbol: \"Te\", name: \"Tellurium\", mass: 127.6 },\n 53: { atomicNumber: 53, symbol: \"I\", name: \"Iodine\", mass: 126.904 },\n 54: { atomicNumber: 54, symbol: \"Xe\", name: \"Xenon\", mass: 131.293 },\n 55: { atomicNumber: 55, symbol: \"Cs\", name: \"Cesium\", mass: 132.905 },\n 56: { atomicNumber: 56, symbol: \"Ba\", name: \"Barium\", mass: 137.33 },\n 57: { atomicNumber: 57, symbol: \"La\", name: \"Lanthanum\", mass: 138.905 },\n 58: { atomicNumber: 58, symbol: \"Ce\", name: \"Cerium\", mass: 140.12 },\n 59: { atomicNumber: 59, symbol: \"Pr\", name: \"Praseodymium\", mass: 140.91 },\n 60: { atomicNumber: 60, symbol: \"Nd\", name: \"Neodymium\", mass: 144.24 },\n 61: { atomicNumber: 61, symbol: \"Pm\", name: \"Promethium\", mass: 145 },\n 62: { atomicNumber: 62, symbol: \"Sm\", name: \"Samarium\", mass: 150.36 },\n 63: { atomicNumber: 63, symbol: \"Eu\", name: \"Europium\", mass: 151.964 },\n 64: { atomicNumber: 64, symbol: \"Gd\", name: \"Gadolinium\", mass: 157.25 },\n 65: { atomicNumber: 65, symbol: \"Tb\", name: \"Terbium\", mass: 158.93 },\n 66: { atomicNumber: 66, symbol: \"Dy\", name: \"Dysprosium\", mass: 162.5 },\n 67: { atomicNumber: 67, symbol: \"Ho\", name: \"Holmium\", mass: 164.93 },\n 68: { atomicNumber: 68, symbol: \"Er\", name: \"Erbium\", mass: 167.26 },\n 69: { atomicNumber: 69, symbol: \"Tm\", name: \"Thulium\", mass: 168.93 },\n 70: { atomicNumber: 70, symbol: \"Yb\", name: \"Ytterbium\", mass: 173.05 },\n 71: { atomicNumber: 71, symbol: \"Lu\", name: \"Lutetium\", mass: 174.97 },\n 72: { atomicNumber: 72, symbol: \"Hf\", name: \"Hafnium\", mass: 178.49 },\n 73: { atomicNumber: 73, symbol: \"Ta\", name: \"Tantalum\", mass: 180.95 },\n 74: { atomicNumber: 74, symbol: \"W\", name: \"Tungsten\", mass: 183.84 },\n 75: { atomicNumber: 75, symbol: \"Re\", name: \"Rhenium\", mass: 186.207 },\n 76: { atomicNumber: 76, symbol: \"Os\", name: \"Osmium\", mass: 190.23 },\n 77: { atomicNumber: 77, symbol: \"Ir\", name: \"Iridium\", mass: 192.217 },\n 78: { atomicNumber: 78, symbol: \"Pt\", name: \"Platinum\", mass: 195.084 },\n 79: { atomicNumber: 79, symbol: \"Au\", name: \"Gold\", mass: 196.967 },\n 80: { atomicNumber: 80, symbol: \"Hg\", name: \"Mercury\", mass: 200.592 },\n 81: { atomicNumber: 81, symbol: \"Tl\", name: \"Thallium\", mass: 204.38 },\n 82: { atomicNumber: 82, symbol: \"Pb\", name: \"Lead\", mass: 207.2 },\n 83: { atomicNumber: 83, symbol: \"Bi\", name: \"Bismuth\", mass: 208.98 },\n 84: { atomicNumber: 84, symbol: \"Po\", name: \"Polonium\", mass: 209 },\n 85: { atomicNumber: 85, symbol: \"At\", name: \"Astatine\", mass: 210 },\n 86: { atomicNumber: 86, symbol: \"Rn\", name: \"Radon\", mass: 222 },\n 87: { atomicNumber: 87, symbol: \"Fr\", name: \"Francium\", mass: 223 },\n 88: { atomicNumber: 88, symbol: \"Ra\", name: \"Radium\", mass: 226 },\n 89: { atomicNumber: 89, symbol: \"Ac\", name: \"Actinium\", mass: 227 },\n 90: { atomicNumber: 90, symbol: \"Th\", name: \"Thorium\", mass: 232.04 },\n 91: { atomicNumber: 91, symbol: \"Pa\", name: \"Protactinium\", mass: 231.04 },\n 92: { atomicNumber: 92, symbol: \"U\", name: \"Uranium\", mass: 238.03 },\n 93: { atomicNumber: 93, symbol: \"Np\", name: \"Neptunium\", mass: 237 },\n 94: { atomicNumber: 94, symbol: \"Pu\", name: \"Plutonium\", mass: 244 },\n 95: { atomicNumber: 95, symbol: \"Am\", name: \"Americium\", mass: 243 },\n 96: { atomicNumber: 96, symbol: \"Cm\", name: \"Curium\", mass: 247 },\n 97: { atomicNumber: 97, symbol: \"Bk\", name: \"Berkelium\", mass: 247 },\n 98: { atomicNumber: 98, symbol: \"Cf\", name: \"Californium\", mass: 251 },\n 99: { atomicNumber: 99, symbol: \"Es\", name: \"Einsteinium\", mass: 252 },\n 100: { atomicNumber: 100, symbol: \"Fm\", name: \"Fermium\", mass: 257 },\n 101: { atomicNumber: 101, symbol: \"Md\", name: \"Mendelevium\", mass: 258 },\n 102: { atomicNumber: 102, symbol: \"No\", name: \"Nobelium\", mass: 259 },\n 103: { atomicNumber: 103, symbol: \"Lr\", name: \"Lawrencium\", mass: 262 },\n 104: { atomicNumber: 104, symbol: \"Rf\", name: \"Rutherfordium\", mass: 267 },\n 105: { atomicNumber: 105, symbol: \"Db\", name: \"Dubnium\", mass: 270 },\n 106: { atomicNumber: 106, symbol: \"Sg\", name: \"Seaborgium\", mass: 269 },\n 107: { atomicNumber: 107, symbol: \"Bh\", name: \"Bohrium\", mass: 270 },\n 108: { atomicNumber: 108, symbol: \"Hs\", name: \"Hassium\", mass: 277 },\n 109: { atomicNumber: 109, symbol: \"Mt\", name: \"Meitnerium\", mass: 278 },\n 110: { atomicNumber: 110, symbol: \"Ds\", name: \"Darmstadtium\", mass: 281 },\n 111: { atomicNumber: 111, symbol: \"Rg\", name: \"Roentgenium\", mass: 282 },\n 112: { atomicNumber: 112, symbol: \"Cn\", name: \"Copernicium\", mass: 285 },\n 113: { atomicNumber: 113, symbol: \"Nh\", name: \"Nihonium\", mass: 286 },\n 114: { atomicNumber: 114, symbol: \"Fl\", name: \"Flerovium\", mass: 289 },\n 115: { atomicNumber: 115, symbol: \"Mc\", name: \"Moscovium\", mass: 289 },\n 116: { atomicNumber: 116, symbol: \"Lv\", name: \"Livermorium\", mass: 293 },\n 117: { atomicNumber: 117, symbol: \"Ts\", name: \"Tennessine\", mass: 294 },\n 118: { atomicNumber: 118, symbol: \"Og\", name: \"Oganesson\", mass: 294 },\n};\n\nexport const elementBySymbol = Object.values(PeriodicTable).reduce(\n (acc, el) => {\n acc[el.symbol] = el;\n return acc;\n },\n {} as Record<string, ElementInfo>,\n);\n\nexport function getElement(symbol: string): ElementInfo | undefined {\n return elementBySymbol[symbol];\n}\n\n/**\n * Symbol → atomic number lookup (fast + safe)\n */\nexport const SymbolToAtomicNumber = new Map<string, number>(\n Object.values(PeriodicTable).map((el) => [el.symbol, el.atomicNumber]),\n);\n\nexport const AtomicNumberToSymbol = new Map<number, string>(\n Object.values(PeriodicTable).map((el) => [el.atomicNumber, el.symbol]),\n);\n","import { Structure } from \"../structure\";\nimport { Site } from \"../../site/site\";\nimport { getElement } from \"@/core/data/periodictable/atomicData\";\n\nfunction siteMass(site: Site): number {\n const siteMass = site.properties?.mass;\n\n if (typeof siteMass === \"number\") {\n return siteMass;\n }\n\n const speciesMass = site.species.properties?.mass;\n\n if (typeof speciesMass === \"number\") {\n return speciesMass;\n }\n\n const element = getElement(site.species.symbol);\n\n if (!element) {\n throw new Error(`Unknown element: ${site.species.symbol}`);\n }\n\n return element.mass;\n}\n\nexport function cellMass(structure: Structure): number {\n let mass = 0;\n\n for (const site of structure.sites) {\n mass += siteMass(site);\n }\n\n return mass;\n}\n","import { Structure } from \"../structure\";\nimport { volume } from \"./volume\";\nimport { cellMass } from \"./cellMass\";\n\n// in units amu / Ang^3'd\nexport function density(structure: Structure): number {\n return cellMass(structure) / volume(structure);\n}\n","import { Species } from \"../species/species\";\n\nexport type SiteProperties = Record<string, any>;\n\nexport type Vec3 = [number, number, number] | Float64Array | number[];\n\nexport type Site<P extends SiteProperties = SiteProperties> = {\n species: Species;\n frac: Vec3;\n properties?: P;\n};\n\nexport function createSite<P extends SiteProperties>(\n species: Species,\n frac: Vec3,\n properties?: P,\n): Site<P> {\n return {\n species,\n frac,\n properties,\n };\n}\n","import { mul } from \"../matrix/operations/mul\";\nimport { transpose } from \"../matrix/operations/transpose\";\n\nimport { Site } from \"./site\";\nimport { Lattice } from \"../lattice/lattice\";\nimport { Vector } from \"../matrix/vector\";\n\nexport function cartesian(lattice: Lattice, site: Site): Vector {\n const [x, y, z] = site.frac;\n\n const frac = {\n rows: 3,\n cols: 1,\n data: new Float64Array([x, y, z]),\n };\n\n const basisT = transpose(lattice.basis);\n const result = mul(basisT, frac);\n\n return new Float64Array([result.data[0], result.data[1], result.data[2]]);\n}\n","import { inverse } from \"../lattice/inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { Vector } from \"../matrix/vector\";\nimport { Lattice } from \"../lattice/lattice\";\n\nexport function fractional(lattice: Lattice, cart: Vector): Vector {\n const vec = {\n rows: 3,\n cols: 1,\n data: cart,\n };\n\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n const result = mul(invT, vec);\n\n return new Float64Array([result.data[0], result.data[1], result.data[2]]);\n}\n","import { Lattice } from \"../lattice/lattice\";\nimport { Site } from \"./site\";\nimport { cartesian } from \"./cartesian\";\n\nimport { norm } from \"../matrix/operations/vector/norm\";\n\nexport function distance(lattice: Lattice, a: Site, b: Site): number {\n const dFrac: [number, number, number] = [\n b.frac[0] - a.frac[0],\n b.frac[1] - a.frac[1],\n b.frac[2] - a.frac[2],\n ];\n\n for (let i = 0; i < 3; i++) {\n dFrac[i] -= Math.round(dFrac[i]);\n }\n\n const displaced: Site = {\n species: a.species,\n frac: dFrac,\n };\n\n const dCart = cartesian(lattice, displaced);\n\n return norm(dCart);\n}\n","import { Site, SiteProperties } from \"./site\";\n\nfunction wrapValue(x: number): number {\n return ((x % 1) + 1) % 1;\n}\n\nexport function wrap<T extends SiteProperties>(site: Site<T>): Site<T> {\n return {\n ...site,\n frac: [\n wrapValue(site.frac[0]),\n wrapValue(site.frac[1]),\n wrapValue(site.frac[2]),\n ],\n };\n}\n","export type Species<P extends Record<string, any> = Record<string, any>> = {\n symbol: string;\n properties?: P;\n};\n\nexport function createSpecies<P extends Record<string, any>>(\n symbol: string,\n properties?: P,\n): Species<P> {\n return { symbol, properties };\n}\n","import { fromParameters } from \"../lattice/create/fromParameters\";\nimport { parameters } from \"../lattice/parameters\";\nimport { Structure } from \"../structure/structure\";\n\nfunction cleanValue(value: string): number {\n // remove uncertainty notation:\n // 5.432(1) -> 5.432\n return Number(value.replace(/\\(.+\\)/, \"\"));\n}\n\nfunction tokenize(line: string): string[] {\n return line.match(/'[^']*'|\"[^\"]*\"|\\S+/g) ?? [];\n}\n\nfunction warnUnsupportedSymmetry(spaceGroup: string) {\n console.warn(\n `Space group \"${spaceGroup}\" detected. ` +\n `Symmetry operations are not currently applied; ` +\n `only asymmetric-unit sites will be parsed.`,\n );\n}\n\nexport function fromCIF(text: string): Structure {\n const lines = text\n .split(\"\\n\")\n .map((x) => x.trim())\n .filter(Boolean);\n\n let a = 0;\n let b = 0;\n let c = 0;\n\n let alpha = 0;\n let beta = 0;\n let gamma = 0;\n\n let spaceGroup = \"P1\";\n\n let atomHeaders: string[] = [];\n const atomRows: string[][] = [];\n\n let inLoop = false;\n let currentHeaders: string[] = [];\n let collectingAtoms = false;\n\n for (const line of lines) {\n if (line.startsWith(\"_symmetry_space_group_name_H-M\")) {\n const tokens = tokenize(line);\n spaceGroup = tokens.at(-1)?.replace(/['\"]/g, \"\") ?? \"P1\";\n } else if (line.startsWith(\"_space_group_name_H-M_alt\")) {\n const tokens = tokenize(line);\n spaceGroup = tokens.at(-1)?.replace(/['\"]/g, \"\") ?? \"P1\";\n } else if (line.startsWith(\"_cell_length_a\")) {\n a = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_length_b\")) {\n b = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_length_c\")) {\n c = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_alpha\")) {\n alpha = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_beta\")) {\n beta = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_gamma\")) {\n gamma = cleanValue(tokenize(line)[1]);\n } else if (line === \"loop_\") {\n inLoop = true;\n currentHeaders = [];\n collectingAtoms = false;\n continue;\n }\n\n if (inLoop && line.startsWith(\"_\")) {\n currentHeaders.push(line);\n\n if (line.includes(\"_atom_site_\")) {\n collectingAtoms = true;\n }\n\n continue;\n }\n\n if (inLoop && collectingAtoms) {\n if (atomHeaders.length === 0) {\n atomHeaders = [...currentHeaders];\n }\n\n atomRows.push(tokenize(line));\n }\n }\n\n const isP1 = /^P\\s*1$/i.test(spaceGroup);\n\n if (!isP1) {\n warnUnsupportedSymmetry(spaceGroup);\n }\n\n const lattice = fromParameters(a, b, c, alpha, beta, gamma);\n\n const ix = atomHeaders.findIndex((x) => x.includes(\"fract_x\"));\n\n const iy = atomHeaders.findIndex((x) => x.includes(\"fract_y\"));\n\n const iz = atomHeaders.findIndex((x) => x.includes(\"fract_z\"));\n\n const ispecies = atomHeaders.findIndex((x) => x.includes(\"type_symbol\"));\n\n if (ix < 0 || iy < 0 || iz < 0 || ispecies < 0) {\n throw new Error(\"Missing required atom site columns\");\n }\n\n const sites = atomRows.map((row) => ({\n species: {\n symbol: row[ispecies],\n },\n\n frac: new Float64Array([\n cleanValue(row[ix]),\n cleanValue(row[iy]),\n cleanValue(row[iz]),\n ]),\n }));\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toCIF(structure: Structure, precision = 6): string {\n const p = parameters(structure.lattice);\n\n const lines: string[] = [];\n\n lines.push(\"data_matsci-parse\");\n lines.push(\"\");\n\n lines.push(\"_symmetry_space_group_name_H-M 'P 1'\");\n lines.push(\"_symmetry_Int_Tables_number 1\");\n\n lines.push(\"\");\n\n lines.push(`_cell_length_a ${p[0].toFixed(precision)}`);\n\n lines.push(`_cell_length_b ${p[1].toFixed(precision)}`);\n\n lines.push(`_cell_length_c ${p[2].toFixed(precision)}`);\n\n lines.push(`_cell_angle_alpha ${p[3].toFixed(precision)}`);\n\n lines.push(`_cell_angle_beta ${p[4].toFixed(precision)}`);\n\n lines.push(`_cell_angle_gamma ${p[5].toFixed(precision)}`);\n\n lines.push(\"\");\n\n lines.push(\"loop_\");\n lines.push(\"_atom_site_label\");\n lines.push(\"_atom_site_type_symbol\");\n lines.push(\"_atom_site_fract_x\");\n lines.push(\"_atom_site_fract_y\");\n lines.push(\"_atom_site_fract_z\");\n\n for (let i = 0; i < structure.sites.length; i++) {\n const site = structure.sites[i];\n\n lines.push(\n `${site.species.symbol}${i + 1} ` +\n `${site.species.symbol} ` +\n `${site.frac[0].toFixed(precision)} ` +\n `${site.frac[1].toFixed(precision)} ` +\n `${site.frac[2].toFixed(precision)}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice } from \"../lattice/lattice\";\nimport { inverse } from \"../lattice/inverse\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { createMatrix } from \"../matrix/matrix\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\nimport { fractional } from \"../site/fractional\";\n\nimport { cartesian } from \"../site\";\n\nfunction isSelective(line: string): boolean {\n return line.toLowerCase().startsWith(\"selective\");\n}\n\nfunction isCartesian(line: string): boolean {\n const l = line.trim().toLowerCase();\n return l.startsWith(\"c\") || l.startsWith(\"k\");\n}\n\n// TODO: Currently nukes the selective dynamics flag from the input file.\n// It would be good to restore this.\n// TODO: would be good to ensure that the title is also optionally\n// maintained.\n/**\n * Parses a crystal structure from POSCAR (VASP) format.\n *\n * Reads lattice vectors, atomic positions, and species from VASP's POSCAR/CONTCAR format.\n * Supports both Cartesian and fractional coordinates.\n *\n * @param text - The POSCAR file content as a string\n * @returns A Structure object parsed from the POSCAR data\n * @throws Error if required POSCAR fields are missing or malformed\n *\n * @remarks\n * - Line 1: Comment/title line (ignored)\n * - Line 2: Scaling factor\n * - Lines 3-5: Lattice vectors (in Ångströms or scaled units)\n * - Line 6: Element symbols\n * - Line 7: Number of atoms per element\n * - Line 8+: Atomic positions (Cartesian or fractional)\n * - Selective dynamics flags are currently stripped\n * - Structure title is not preserved in the output\n *\n * @example\n * ```typescript\n * const poscarText = `Cubic structure\n * 1.0\n * 4.05 0 0\n * 0 4.05 0\n * 0 0 4.05\n * Al\n * 2\n * Fractional\n * 0 0 0\n * 0.5 0.5 0.5`;\n * const structure = fromPOSCAR(poscarText);\n * ```\n */\nexport function fromPOSCAR(text: string): Structure {\n const lines = text.split(\"\\n\").map((x) => x.trim());\n\n let cursor = 0;\n\n // comment/title\n cursor++;\n\n // scale factor\n const scale = Number(lines[cursor++]);\n\n // lattice vectors (row-major)\n const latticeData: number[] = [];\n\n for (let i = 0; i < 3; i++) {\n const v = lines[cursor++].split(/\\s+/).map(Number);\n\n if (v.length !== 3) {\n throw new Error(\"Invalid POSCAR lattice\");\n }\n\n latticeData.push(v[0] * scale, v[1] * scale, v[2] * scale);\n }\n\n const lattice = createLattice(latticeData);\n\n // VASP5 species names\n const symbols = lines[cursor++].split(/\\s+/);\n\n // atom counts\n const counts = lines[cursor++].split(/\\s+/).map(Number);\n\n if (symbols.length !== counts.length) {\n throw new Error(\"Species/count mismatch\");\n }\n\n // optional selective dynamics\n if (isSelective(lines[cursor])) {\n cursor++;\n }\n\n // direct is true unless cartesian is.\n let direct = true;\n direct = !isCartesian(lines[cursor]);\n\n cursor++;\n\n const sites: Site[] = [];\n\n let speciesIndex = 0;\n let remaining = counts[0];\n\n const latticeInv = !direct ? inverse(lattice) : null;\n\n const totalAtoms = counts.reduce((a, b) => a + b, 0);\n\n for (let i = 0; i < totalAtoms; i++) {\n const tokens = lines[cursor++].split(/\\s+/);\n\n const coords = tokens.slice(0, 3).map(Number);\n\n const frac = direct\n ? new Float64Array(coords)\n : fractional(lattice, new Float64Array(coords));\n\n sites.push({\n species: {\n symbol: symbols[speciesIndex],\n },\n frac,\n });\n\n remaining--;\n\n if (remaining === 0 && speciesIndex < counts.length - 1) {\n speciesIndex++;\n remaining = counts[speciesIndex];\n }\n }\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toPOSCAR(\n structure: Structure,\n options?: {\n title?: string;\n scale?: number;\n direct?: boolean;\n },\n): string {\n const title = options?.title ?? \"Generated by matsci-parse\";\n const scale = options?.scale ?? 1.0;\n const direct = options?.direct ?? true;\n\n const lines: string[] = [];\n\n lines.push(title);\n lines.push(String(scale));\n\n // lattice\n const m = structure.lattice.basis.data;\n\n lines.push(`${m[0]} ${m[1]} ${m[2]}`);\n lines.push(`${m[3]} ${m[4]} ${m[5]}`);\n lines.push(`${m[6]} ${m[7]} ${m[8]}`);\n\n // preserve order of first appearance\n const grouped = new Map<string, typeof structure.sites>();\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n if (!grouped.has(symbol)) {\n grouped.set(symbol, []);\n }\n\n grouped.get(symbol)!.push(site);\n }\n\n const species = [...grouped.keys()];\n const sites = [...grouped.values()].flat();\n\n lines.push(species.join(\" \"));\n lines.push(species.map((s) => grouped.get(s)!.length).join(\" \"));\n\n lines.push(direct ? \"Direct\" : \"Cartesian\");\n\n for (const site of sites) {\n const coords = direct ? site.frac : cartesian(structure.lattice, site);\n\n lines.push(`${coords[0]} ${coords[1]} ${coords[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { Structure } from \"../structure/structure\";\nimport { createLattice } from \"../lattice/lattice\";\n\nimport { cartesian } from \"../site/cartesian\";\nimport { fractional } from \"../site/fractional\";\n\nexport interface AiiDASite {\n position: [number, number, number];\n kind_name: string[];\n}\n\nexport interface StructureData {\n cell: [\n [number, number, number],\n [number, number, number],\n [number, number, number],\n ];\n kinds: [];\n sites: AiiDASite[];\n}\n\nexport function fromStructureData(data: StructureData): Structure {\n const lattice = createLattice([\n ...data.cell[0],\n ...data.cell[1],\n ...data.cell[2],\n ]);\n\n const kindMap = new Map(data.kinds.map((kind: any) => [kind.name, kind]));\n\n const sites = data.sites.map((site: any) => {\n const kind = kindMap.get(site.kind_name);\n\n if (!kind) {\n throw new Error(`Unknown kind \"${site.kind_name}\"`);\n }\n\n return {\n species: {\n symbol: kind.symbols[0],\n },\n\n frac: fractional(lattice, new Float64Array(site.position)),\n };\n });\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toStructureData(structure: Structure) {\n const m = structure.lattice.basis.data;\n\n const symbols = [...new Set(structure.sites.map((s) => s.species.symbol))];\n\n const kinds = symbols.map((symbol) => ({\n name: symbol,\n symbols: [symbol],\n }));\n\n return {\n cell: [\n [m[0], m[1], m[2]],\n [m[3], m[4], m[5]],\n [m[6], m[7], m[8]],\n ],\n\n kinds,\n\n sites: structure.sites.map((site) => ({\n kind_name: site.species.symbol,\n\n position: Array.from(cartesian(structure.lattice, site)),\n })),\n\n pbc1: true,\n pbc2: true,\n pbc3: true,\n };\n}\n","import { createLattice } from \"../lattice/lattice\";\nimport { fractional } from \"../site/fractional\";\nimport { cartesian } from \"../site/cartesian\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\n\nfunction findSection(lines: string[], section: string): number {\n const idx = lines.findIndex((line) => line.trim().toUpperCase() === section);\n\n if (idx === -1) {\n throw new Error(`Missing ${section}`);\n }\n\n return idx;\n}\n\n// TODO: support atomic numbers instead of symbols in primvec.\n\n/**\n * Parses a crystal structure from XSF (XCrySDen Structure File) format.\n *\n * Reads lattice vectors and atomic positions from XSF format.\n * Supports both PRIMVEC (primitive) and CONVVEC (conventional) cells.\n *\n * @param text - The XSF file content as a string\n * @returns A Structure object parsed from the XSF data\n * @throws Error if required sections (PRIMVEC, ATOMS) are missing\n *\n * @remarks\n * - XSF format is human-readable and widely used in visualization software\n * - PRIMVEC section defines the lattice vectors\n * - ATOMS section lists atomic positions and species\n * - Atomic numbers are currently not supported (symbols required)\n * - CONVVEC (conventional cell) is not currently used\n *\n * @example\n * ```typescript\n * const xsfText = `\n * PRIMVEC\n * 4.05 0.00 0.00\n * 0.00 4.05 0.00\n * 0.00 0.00 4.05\n * PRIMCOORD\n * 2 1\n * Al 0.00 0.00 0.00 0 0 0\n * Al 2.025 2.025 2.025 0 0 0\n * `;\n * const structure = fromXSF(xsfText);\n * ```\n */\nexport function fromXSF(text: string): Structure {\n const lines = text\n .split(\"\\n\")\n .map((x) => x.trim())\n .filter(Boolean);\n\n const vecStart = findSection(lines, \"PRIMVEC\");\n\n const lattice = createLattice([\n ...lines[vecStart + 1].split(/\\s+/).map(Number),\n ...lines[vecStart + 2].split(/\\s+/).map(Number),\n ...lines[vecStart + 3].split(/\\s+/).map(Number),\n ]);\n\n const coordStart = findSection(lines, \"PRIMCOORD\");\n\n const [nAtoms] = lines[coordStart + 1].split(/\\s+/).map(Number);\n\n const sites: Site[] = [];\n\n for (let i = 0; i < nAtoms; i++) {\n const tokens = lines[coordStart + 2 + i].split(/\\s+/);\n\n const symbol = tokens[0];\n\n const x = Number(tokens[1]);\n const y = Number(tokens[2]);\n const z = Number(tokens[3]);\n\n const frac = fractional(lattice, new Float64Array([x, y, z]));\n\n sites.push({\n species: { symbol },\n frac,\n });\n }\n\n return {\n lattice,\n sites,\n };\n}\n\nfunction formatVec(v: number[]): string {\n return `${v[0]} ${v[1]} ${v[2]}`;\n}\n\nfunction formatLattice(lattice: Structure[\"lattice\"]): string[] {\n const m = lattice.basis.data;\n\n return [\n formatVec([m[0], m[1], m[2]]),\n formatVec([m[3], m[4], m[5]]),\n formatVec([m[6], m[7], m[8]]),\n ];\n}\n\nexport function toXSF(structure: Structure): string {\n const lines: string[] = [];\n\n lines.push(\"CRYSTAL\");\n lines.push(\"PRIMVEC\");\n\n const latticeLines = formatLattice(structure.lattice);\n lines.push(...latticeLines);\n\n lines.push(\"\");\n lines.push(\"PRIMCOORD\");\n lines.push(`${structure.sites.length} 1`);\n\n for (const site of structure.sites) {\n const c = cartesian(structure.lattice, site);\n\n lines.push(`${site.species.symbol} ${c[0]} ${c[1]} ${c[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice, Lattice } from \"../lattice/lattice\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\n\ntype ExtendedXYZInfo = Record<string, string>;\n\nfunction parseHeader(comment: string): ExtendedXYZInfo {\n const info: ExtendedXYZInfo = {};\n const kvRegex = /(\\w+)=(\".*?\"|\\S+)/g;\n\n for (const match of comment.matchAll(kvRegex)) {\n let value = match[2];\n if (value.startsWith('\"')) value = value.slice(1, -1);\n info[match[1]] = value;\n }\n\n return info;\n}\n\nfunction parseLattice(info: ExtendedXYZInfo) {\n if (!info.Lattice) {\n throw new Error(\"Extended XYZ must contain Lattice\");\n }\n\n const v = info.Lattice.split(/\\s+/).map(Number);\n if (v.length !== 9) throw new Error(\"Invalid Lattice\");\n\n return createLattice([v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8]]);\n}\n\n/**\n * Parses a crystal structure from extended XYZ format.\n *\n * Reads atomic structure from XYZ format with extended headers containing\n * lattice information (Extended XYZ format used by ASE and other tools).\n *\n * @param text - The XYZ file content as a string\n * @returns A Structure object parsed from the XYZ data\n * @throws Error if lattice information or required fields are missing\n *\n * @remarks\n * - First line: number of atoms\n * - Second line: properties header in key=value format (must include \"Lattice\")\n * - Remaining lines: atomic species and Cartesian positions\n * - Lattice must be specified in extended header as 9 space-separated values\n * - Standard XYZ format (without lattice) is not supported\n *\n * @example\n * ```typescript\n * const xyzText = `2\n * Lattice=\"4.05 0 0 0 4.05 0 0 0 4.05\" Properties=species:S:1:pos:R:3\n * Al 0.0 0.0 0.0\n * Al 2.025 2.025 2.025`;\n * const structure = fromXYZ(xyzText);\n * ```\n */\nexport function fromXYZ(text: string) {\n const lines = text.trim().split(\"\\n\");\n\n const n = Number(lines[0]);\n const comment = lines[1];\n\n const info = parseHeader(comment);\n const lattice = parseLattice(info);\n\n const sites: Site[] = [];\n\n for (let i = 0; i < n; i++) {\n const [symbol, x, y, z] = lines[2 + i].split(/\\s+/);\n\n sites.push({\n species: { symbol },\n frac: new Float64Array([+x, +y, +z]),\n });\n }\n\n return { lattice, sites };\n}\n\nfunction formatLattice(lattice: Lattice): string {\n const m = lattice.basis.data;\n\n // row-major flattening assumption (consistent with your matrix code)\n return `${m[0]} ${m[1]} ${m[2]} ${m[3]} ${m[4]} ${m[5]} ${m[6]} ${m[7]} ${m[8]}`;\n}\n\n/**\n * Serializes a structure to extended XYZ format.\n *\n * Converts a Structure to extended XYZ format suitable for visualization\n * and exchange with other materials science tools (ASE, OVITO, etc.).\n *\n * @param structure - The structure to serialize\n * @returns The structure as an extended XYZ formatted string\n *\n * @remarks\n * - Line 1: Number of atoms\n * - Line 2: Header with lattice information in extended XYZ format\n * - Remaining lines: Atomic species and fractional coordinates\n * - Lattice is specified as 9 space-separated values in row-major order\n * - The output uses fractional coordinates as given in the structure\n *\n * @example\n * ```typescript\n * const structure = { lattice: cubic(4.05), sites: [...] };\n * const xyzString = toXYZ(structure);\n * // Output can be written to file and opened in visualization software\n * ```\n */\nexport function toXYZ(structure: Structure): string {\n const sites = structure.sites;\n\n const lines: string[] = [];\n\n lines.push(String(sites.length));\n\n const latticeStr = formatLattice(structure.lattice);\n\n lines.push(`Lattice=\"${latticeStr}\"`);\n\n for (const site of sites) {\n const f = site.frac;\n\n lines.push(`${site.species.symbol} ${f[0]} ${f[1]} ${f[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice } from \"../lattice\";\n\nimport { fractional, cartesian } from \"../site\";\nimport { Structure } from \"../structure\";\n\nexport function fromOptimade(data: any): Structure {\n const lattice = createLattice([\n ...data.attributes.lattice_vectors[0],\n ...data.attributes.lattice_vectors[1],\n ...data.attributes.lattice_vectors[2],\n ]);\n\n const positions = data.attributes.cartesian_site_positions;\n const species = data.attributes.species_at_sites;\n\n const sites = positions.map((position: number[], i: number) => ({\n species: {\n symbol: species[i],\n },\n\n frac: fractional(lattice, new Float64Array(position)),\n }));\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toOptimade(structure: Structure) {\n const m = structure.lattice.basis.data;\n\n const species_at_sites = structure.sites.map((site) => site.species.symbol);\n\n const elements = [...new Set(species_at_sites)].sort();\n\n return {\n attributes: {\n lattice_vectors: [\n [m[0], m[1], m[2]],\n [m[3], m[4], m[5]],\n [m[6], m[7], m[8]],\n ],\n\n species_at_sites,\n\n cartesian_site_positions: structure.sites.map((site) =>\n Array.from(cartesian(structure.lattice, site)),\n ),\n\n dimension_types: [1, 1, 1],\n\n nsites: structure.sites.length,\n\n nelements: elements.length,\n\n elements,\n },\n };\n}\n","import { Structure } from \"../structure/structure\";\nimport { createLattice } from \"../lattice/lattice\";\n\n/**\n * Serializes a structure to JSON format.\n *\n * Converts a Structure to a plain JavaScript object suitable for JSON stringification.\n *\n * @param structure - The structure to serialize\n * @returns An object with `lattice` (flattened array) and `sites` (with species and fractional coordinates)\n *\n * @remarks\n * - Lattice is serialized as a flat array [a1x, a1y, a1z, ...]\n * - Fractional coordinates are converted from Float64Array to regular arrays\n * - Use with JSON.stringify() for string serialization\n *\n * @example\n * ```typescript\n * const structure = { lattice: cubic(4), sites: [...] };\n * const json = toJSON(structure);\n * const jsonString = JSON.stringify(json);\n * ```\n */\nexport function toJSON(structure: Structure) {\n return {\n lattice: structure.lattice.basis.data,\n sites: structure.sites.map((s) => ({\n species: s.species,\n frac: Array.from(s.frac),\n })),\n };\n}\n\n/**\n * Deserializes a structure from JSON format.\n *\n * Reconstructs a Structure from a JSON object (typically parsed from JSON string).\n *\n * @param data - An object with `lattice` (9-element array) and `sites` array\n * @returns A new Structure object\n *\n * @remarks\n * - Lattice array must have exactly 9 elements\n * - Fractional coordinates are converted to Float64Array\n * - Inverse operation of toJSON()\n * - No validation is performed on the input data\n *\n * @example\n * ```typescript\n * const jsonData = {\n * lattice: [4, 0, 0, 0, 4, 0, 0, 0, 4],\n * sites: [{ species: 'Al', frac: [0, 0, 0] }]\n * };\n * const structure = fromJSON(jsonData);\n * ```\n */\nexport function fromJSON(data: any): Structure {\n return {\n lattice: createLattice(data.lattice),\n sites: data.sites.map((s: any) => ({\n species: s.species,\n frac: new Float64Array(s.frac),\n })),\n };\n}\n","export function convertMeasurement<T extends string>(\n value: number,\n from: T,\n to: T,\n conversions: Record<T, number>,\n aliases?: Record<string, T>,\n): number {\n const resolve = (u: string) => (aliases?.[u] ?? u) as T;\n\n const fromUnit = resolve(from);\n const toUnit = resolve(to);\n\n if (fromUnit === toUnit) return value;\n\n const valueInBase = value * conversions[fromUnit];\n return valueInBase / conversions[toUnit];\n}\n\nexport function convertMeasurementArray<T extends string>(\n arr: number[],\n from: T,\n to: T,\n conversions: Record<T, number>,\n aliases?: Record<string, T>,\n): number[] {\n return arr.map((v) => convertMeasurement(v, from, to, conversions, aliases));\n}\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type LengthUnits =\n | \"angstrom\"\n | \"bohr\"\n | \"nm\"\n | \"pm\"\n | \"cm\"\n | \"m\"\n | \"um\"\n | \"fm\";\n\nconst LengthConversions: Record<LengthUnits, number> = {\n angstrom: 1,\n bohr: 0.529177,\n nm: 10,\n pm: 0.01,\n um: 1e4,\n cm: 1e8,\n m: 1e10,\n fm: 1e-5,\n};\n\nconst LengthAliases: Record<string, LengthUnits> = {\n Å: \"angstrom\",\n μm: \"um\",\n};\n\nexport const LengthUnitSystem = {\n conversions: LengthConversions,\n aliases: LengthAliases,\n\n convert(value: number, from: LengthUnits | string, to: LengthUnits | string) {\n return convertMeasurement(\n value,\n from as LengthUnits,\n to as LengthUnits,\n LengthConversions,\n LengthAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: LengthUnits | string,\n to: LengthUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as LengthUnits,\n to as LengthUnits,\n LengthConversions,\n LengthAliases,\n );\n },\n};\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type EnergyUnits = \"eV\" | \"Hartree\" | \"kJ/mol\" | \"kcal/mol\";\n\nconst EnergyConversions: Record<EnergyUnits, number> = {\n eV: 1,\n Hartree: 27.2114,\n \"kJ/mol\": 0.0103643,\n \"kcal/mol\": 0.0433641,\n};\n\nconst EnergyAliases: Record<string, EnergyUnits> = {\n Ha: \"Hartree\",\n ev: \"eV\",\n electronvolt: \"eV\",\n};\n\nexport const EnergyUnitSystem = {\n conversions: EnergyConversions,\n aliases: EnergyAliases,\n\n convert(value: number, from: EnergyUnits | string, to: EnergyUnits | string) {\n return convertMeasurement(\n value,\n from as EnergyUnits,\n to as EnergyUnits,\n EnergyConversions,\n EnergyAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: EnergyUnits | string,\n to: EnergyUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as EnergyUnits,\n to as EnergyUnits,\n EnergyConversions,\n EnergyAliases,\n );\n },\n};\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type AngleUnits = \"rad\" | \"deg\" | \"grad\";\n\nconst AngleConversions: Record<AngleUnits, number> = {\n rad: 1,\n deg: Math.PI / 180,\n grad: Math.PI / 200,\n};\n\nconst AngleAliases: Record<string, AngleUnits> = {\n \"°\": \"deg\",\n deg: \"deg\",\n rad: \"rad\",\n gon: \"grad\",\n};\n\nexport const AngleUnitSystem = {\n conversions: AngleConversions,\n aliases: AngleAliases,\n\n convert(value: number, from: AngleUnits | string, to: AngleUnits | string) {\n return convertMeasurement(\n value,\n from as AngleUnits,\n to as AngleUnits,\n AngleConversions,\n AngleAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: AngleUnits | string,\n to: AngleUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as AngleUnits,\n to as AngleUnits,\n AngleConversions,\n AngleAliases,\n );\n },\n};\n"],"names":["EPS","wrap","x","v","clean","canonicalize","structure","site","toFixedArray","precision","fnv1a","str","hash","i","hashStructure","s","lattice","latticeKey","sitesKey","key","appendSite","insertSite","index","removeSite","_","replaceSite","createMatrix","rows","cols","data","size","buffer","row","col","createLattice","values","cleaned","dot","a","b","sum","norm","angle","u","denom","c","clamped","angles","m","alpha","beta","gamma","inverse3x3","a00","a01","a02","a10","a11","a12","a20","a21","a22","c00","c01","c02","c10","c11","c12","c20","c21","c22","det","invDet","out","inverse","lengths","transpose","matrix","mul","aRows","aCols","bCols","k","metricTensor","A","AT","RAD2DEG","parameters","TWO_PI","reciprocalLattice","inv","reciprocalLatticeCrystallographic","invT","DEG2RAD","fromParameters","alphaR","betaR","gammaR","cosA","cosB","cosG","sinG","v1","v2","cx","cy","czSquared","cz","cubic","hexagonal","monoclinic","orthorhombic","rhombohedral","tetragonal","ready","initMoyo","readFileSync","join","wasmPath","wasmBuffer","init","e","wasmUrl","getSymmetry","tolerance","setting","symbolToId","idToSymbol","counter","positions","numbers","symbol","moyoInput","results","analyze_cell","build","cell","species","n","sites","pos","supercell","nx","ny","nz","newBasis","y","z","j","minor","skipRow","skipCol","ptr","determinant","sign","volume","latticeVolume","gcd","composition","compositionGCD","comp","hillOrder","elements","rest","formulaFromComposition","ordering","el","count","reducedComposition","factor","element","hillFormula","reducedFormula","PeriodicTable","elementBySymbol","acc","getElement","SymbolToAtomicNumber","AtomicNumberToSymbol","siteMass","speciesMass","cellMass","mass","density","createSite","frac","properties","cartesian","basisT","result","fractional","cart","vec","distance","dFrac","displaced","dCart","wrapValue","createSpecies","cleanValue","value","tokenize","line","warnUnsupportedSymmetry","spaceGroup","fromCIF","text","lines","atomHeaders","atomRows","inLoop","currentHeaders","collectingAtoms","ix","iy","iz","ispecies","toCIF","p","isSelective","isCartesian","l","fromPOSCAR","cursor","scale","latticeData","symbols","counts","direct","speciesIndex","remaining","totalAtoms","coords","toPOSCAR","options","title","grouped","fromStructureData","kindMap","kind","toStructureData","kinds","findSection","section","idx","fromXSF","vecStart","coordStart","nAtoms","tokens","formatVec","formatLattice","toXSF","latticeLines","parseHeader","comment","info","kvRegex","match","parseLattice","fromXYZ","toXYZ","latticeStr","f","fromOptimade","position","toOptimade","species_at_sites","toJSON","fromJSON","convertMeasurement","from","to","conversions","aliases","resolve","fromUnit","toUnit","convertMeasurementArray","arr","LengthConversions","LengthAliases","LengthUnitSystem","EnergyConversions","EnergyAliases","EnergyUnitSystem","AngleConversions","AngleAliases","AngleUnitSystem"],"mappings":"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"}