From 3b967f722af20e027a57d075c0f027a580733819 Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Mon, 18 May 2026 16:08:54 -0700 Subject: [PATCH 01/15] refactoring transformers to allow ancmobc2_visualizer to take ancombc results --- q2_composition/_ancombc2.py | 14 +- .../_ancombc2_visualizer/package-lock.json | 139 +++++++++++++++++- .../_ancombc2_visualizer/package.json | 9 +- .../_ancombc2_visualizer/src/App.svelte | 2 - q2_composition/_transformer.py | 108 +++++++++++++- q2_composition/plugin_setup.py | 3 +- 6 files changed, 252 insertions(+), 23 deletions(-) diff --git a/q2_composition/_ancombc2.py b/q2_composition/_ancombc2.py index f4f3fc8..4725509 100644 --- a/q2_composition/_ancombc2.py +++ b/q2_composition/_ancombc2.py @@ -26,8 +26,12 @@ import qiime2 from qiime2.metadata import NumericMetadataColumn, CategoricalMetadataColumn from qiime2.plugin.util import transform +from typing import Union + +from q2_composition._format import ( + ANCOMBC2OutputDirFmt, ANCOMBC2SliceMapping, DataLoafPackageDirFmt +) -from q2_composition._format import ANCOMBC2OutputDirFmt, ANCOMBC2SliceMapping r_base = importr('base') r_stats = importr('stats') @@ -850,10 +854,9 @@ def _rename(column: str) -> str: return structural_zeros_df.rename(lambda c: _rename(c), axis='columns') - def ancombc2_visualizer( output_dir: str, - data: ANCOMBC2OutputDirFmt, + data: Union[ANCOMBC2OutputDirFmt, DataLoafPackageDirFmt], taxonomy: pd.DataFrame = None ): ''' @@ -884,7 +887,10 @@ def ancombc2_visualizer( if taxonomy is not None: # subset taxonomy to only features present in the ancombc2 slices slice_map = transform(data=data, to_type=ANCOMBC2SliceMapping) - slice_feature_ids = slice_map['lfc']['taxon'].unique() + try: + slice_feature_ids = slice_map['lfc']['taxon'].unique() + except KeyError: + slice_feature_ids = slice_map['lfc']['id'].unique() taxonomy = taxonomy[taxonomy.index.isin(slice_feature_ids)] if len(taxonomy) == 0: diff --git a/q2_composition/_ancombc2_visualizer/package-lock.json b/q2_composition/_ancombc2_visualizer/package-lock.json index f2f32dd..e3c5ec0 100644 --- a/q2_composition/_ancombc2_visualizer/package-lock.json +++ b/q2_composition/_ancombc2_visualizer/package-lock.json @@ -8,7 +8,8 @@ "name": "diverging-barplot", "version": "0.0.0", "dependencies": { - "d3": "^7.9.0" + "d3": "^7.9.0", + "ts-node": "^10.9.2" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.0.3", @@ -24,6 +25,26 @@ "vitest": "^2.1.8" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", @@ -492,7 +513,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -502,7 +522,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -1174,6 +1193,26 @@ "vite": "^5.2.0 || ^6" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, "node_modules/@tsconfig/svelte": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz", @@ -1483,7 +1522,6 @@ "version": "22.12.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.20.0" @@ -1586,7 +1624,6 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1595,6 +1632,22 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", @@ -1697,6 +1750,11 @@ "node": ">= 10" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, "node_modules/d3": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", @@ -2161,6 +2219,14 @@ "dev": true, "license": "MIT" }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", @@ -2601,6 +2667,11 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -2948,12 +3019,52 @@ "node": ">=14.0.0" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/typescript": { "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2966,9 +3077,13 @@ "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true, "license": "MIT" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, "node_modules/vite": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", @@ -4176,6 +4291,14 @@ "node": ">=8" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/zimmerframe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", diff --git a/q2_composition/_ancombc2_visualizer/package.json b/q2_composition/_ancombc2_visualizer/package.json index 1d3103d..fdc86d0 100644 --- a/q2_composition/_ancombc2_visualizer/package.json +++ b/q2_composition/_ancombc2_visualizer/package.json @@ -12,18 +12,19 @@ }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@tailwindcss/vite": "^4.1.4", "@tsconfig/svelte": "^5.0.4", "@types/d3": "^7.4.3", "@types/node": "^22.10.5", "svelte": "^5.53.0", "svelte-check": "^4.1.1", + "tailwindcss": "^4.1.4", "typescript": "~5.6.2", "vite": "^6.4.1", - "vitest": "^2.1.8", - "@tailwindcss/vite": "^4.1.4", - "tailwindcss": "^4.1.4" + "vitest": "^2.1.8" }, "dependencies": { - "d3": "^7.9.0" + "d3": "^7.9.0", + "ts-node": "^10.9.2" } } diff --git a/q2_composition/_ancombc2_visualizer/src/App.svelte b/q2_composition/_ancombc2_visualizer/src/App.svelte index d14cd27..8099442 100644 --- a/q2_composition/_ancombc2_visualizer/src/App.svelte +++ b/q2_composition/_ancombc2_visualizer/src/App.svelte @@ -12,9 +12,7 @@ const fetchPromise = fetch(taxonomyPath); const taxonomyPromise = fetchPromise.then((response) => { - console.log("response", response); if (response.ok) { - console.log("parsing taxonomy"); return parseTaxonomy(taxonomyPath); } else { return Promise.resolve(null); diff --git a/q2_composition/_transformer.py b/q2_composition/_transformer.py index 70cb2ac..9c1b796 100644 --- a/q2_composition/_transformer.py +++ b/q2_composition/_transformer.py @@ -7,6 +7,7 @@ # ---------------------------------------------------------------------------- import json +import os import pandas as pd @@ -41,9 +42,17 @@ def _12(format: DataLoafPackageDirFmt) -> ANCOMBC2SliceMapping: slices = ANCOMBC2SliceMapping() slices.intercepts = intercepts - + + name_map = { + 'lfc': 'lfc', + 'se': 'se', + 'p_val': 'p', + 'q_val': 'q', + 'w': 'W', + } for (slice_path, slice_df) in format.data_slices.iter_views(pd.DataFrame): - slice_name = slice_path.name.split('_slice')[0] + slice_name = name_map[slice_path.name.split('_slice')[0]] + slice_df = slice_df.rename(columns={'id': 'taxon'}) slices[slice_name] = slice_df return slices @@ -59,8 +68,34 @@ def _2(slices: ANCOMBC2SliceMapping) -> ANCOMBC2OutputDirFmt: for slice_name, slice_df in slices.items(): format_slice = format.__getattribute__(slice_name) format_slice.write_data(slice_df, pd.DataFrame) - - return format + + extra_files = ['diff', 'passed_ss'] + if not any(file in slices.keys() for file in extra_files): + header = { + "doctype": { + "name": "table.jsonl", + "format": "application/x-json-lines", + "version": "1.0" + }, + "direction": "row", + "style": "key:value", + "fields": [ + {"name": "taxon", "type": "string", "missing": False}, + {"name": "(Intercept)", "type": "number", "missing": False} + ], + "index": [], + "title": "", + "description": "", + "extra": {} + } + + for file in extra_files: + output_path = os.path.join(format.path, file + '.jsonl') + with open(output_path, 'w') as f: + f.write(json.dumps(header, separators=(',', ':')) + "\n") + + + return format @plugin.register_transformer @@ -94,3 +129,68 @@ def _3(format: ANCOMBC2OutputDirFmt) -> ANCOMBC2SliceMapping: slices.intercepts = list(intercepts) return slices + +@plugin.register_transformer +def _5(format:DataLoafPackageDirFmt) -> ANCOMBC2OutputDirFmt: + slice_format = _12(format) + ancombc2_format = _2(slice_format) + return ancombc2_format + + +# @plugin.register_transformer +# def _4(format: DataLoafPackageDirFmt) -> ANCOMBC2OutputDirFmt: +# ANCOMBC2_output = ANCOMBC2OutputDirFmt() + +# header = { +# "doctype": { +# "name": "table.jsonl", +# "format": "application/x-json-lines", +# "version": "1.0" +# }, +# "direction": "row", +# "style": "key:value", +# "fields": [ +# {"name": "taxon", "type": "string", "missing": False}, +# {"name": "(Intercept)", "type": "number", "missing": False} +# ], +# "index": [], +# "title": "", +# "description": "", +# "extra": {} +# } + +# for file in os.listdir(format.path): +# if not file.endswith('.csv'): +# continue + +# input_path = os.path.join(format.path, file) +# file_name = str(file).replace('_slice.csv', '') +# file_name = file_name.replace('_val', '') +# if file_name == 'w': +# file_name = file_name.upper() +# file_name = file_name + '.jsonl' +# output_path = os.path.join(ANCOMBC2_output.path, file_name) + +# df = pd.read_csv(input_path) +# json_file = df.to_json(output_path) + +# json_file = json.load(open(output_path)) +# n = len(json_file["id"]) + +# with open(output_path, "w") as f: +# f.write(json.dumps(header, separators=(',', ':')) + "\n") + +# for i in range(n): +# row = { +# "taxon": json_file["id"][str(i)], +# "(Intercept)": json_file["(Intercept)"][str(i)] +# } +# f.write(json.dumps(row) + "\n") + +# extra_files = ['diff.jsonl', 'passed_ss.jsonl'] +# for file in extra_files: +# output_path = os.path.join(ANCOMBC2_output.path, file) +# with open(output_path, 'w') as f: +# f.write(json.dumps(header, separators=(',', ':')) + "\n") + +# return ANCOMBC2_output diff --git a/q2_composition/plugin_setup.py b/q2_composition/plugin_setup.py index 538d4fc..86111e9 100644 --- a/q2_composition/plugin_setup.py +++ b/q2_composition/plugin_setup.py @@ -6,6 +6,7 @@ # The full license is in the file LICENSE, distributed with this software. # ---------------------------------------------------------------------------- +import qiime2 import importlib import numpy as np @@ -293,7 +294,7 @@ plugin.visualizers.register_function( function=q2_composition.ancombc2_visualizer, inputs={ - 'data': FeatureData[ANCOMBC2Output], + 'data': FeatureData[DifferentialAbundance | ANCOMBC2Output], 'taxonomy': FeatureData[Taxonomy], }, parameters={}, From 5eed7deb093e2513a78dfd65283874c3752457c6 Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Mon, 18 May 2026 16:14:23 -0700 Subject: [PATCH 02/15] lint --- q2_composition/_ancombc2.py | 1 + q2_composition/_transformer.py | 73 ++++------------------------------ q2_composition/plugin_setup.py | 1 - 3 files changed, 8 insertions(+), 67 deletions(-) diff --git a/q2_composition/_ancombc2.py b/q2_composition/_ancombc2.py index 4725509..8a34ab6 100644 --- a/q2_composition/_ancombc2.py +++ b/q2_composition/_ancombc2.py @@ -854,6 +854,7 @@ def _rename(column: str) -> str: return structural_zeros_df.rename(lambda c: _rename(c), axis='columns') + def ancombc2_visualizer( output_dir: str, data: Union[ANCOMBC2OutputDirFmt, DataLoafPackageDirFmt], diff --git a/q2_composition/_transformer.py b/q2_composition/_transformer.py index 9c1b796..c60c3f7 100644 --- a/q2_composition/_transformer.py +++ b/q2_composition/_transformer.py @@ -42,7 +42,7 @@ def _12(format: DataLoafPackageDirFmt) -> ANCOMBC2SliceMapping: slices = ANCOMBC2SliceMapping() slices.intercepts = intercepts - + name_map = { 'lfc': 'lfc', 'se': 'se', @@ -68,7 +68,7 @@ def _2(slices: ANCOMBC2SliceMapping) -> ANCOMBC2OutputDirFmt: for slice_name, slice_df in slices.items(): format_slice = format.__getattribute__(slice_name) format_slice.write_data(slice_df, pd.DataFrame) - + extra_files = ['diff', 'passed_ss'] if not any(file in slices.keys() for file in extra_files): header = { @@ -88,13 +88,12 @@ def _2(slices: ANCOMBC2SliceMapping) -> ANCOMBC2OutputDirFmt: "description": "", "extra": {} } - + for file in extra_files: output_path = os.path.join(format.path, file + '.jsonl') with open(output_path, 'w') as f: - f.write(json.dumps(header, separators=(',', ':')) + "\n") - - + f.write(json.dumps(header, separators=(',', ':')) + "\n") + return format @@ -130,67 +129,9 @@ def _3(format: ANCOMBC2OutputDirFmt) -> ANCOMBC2SliceMapping: return slices + @plugin.register_transformer -def _5(format:DataLoafPackageDirFmt) -> ANCOMBC2OutputDirFmt: +def _5(format: DataLoafPackageDirFmt) -> ANCOMBC2OutputDirFmt: slice_format = _12(format) ancombc2_format = _2(slice_format) return ancombc2_format - - -# @plugin.register_transformer -# def _4(format: DataLoafPackageDirFmt) -> ANCOMBC2OutputDirFmt: -# ANCOMBC2_output = ANCOMBC2OutputDirFmt() - -# header = { -# "doctype": { -# "name": "table.jsonl", -# "format": "application/x-json-lines", -# "version": "1.0" -# }, -# "direction": "row", -# "style": "key:value", -# "fields": [ -# {"name": "taxon", "type": "string", "missing": False}, -# {"name": "(Intercept)", "type": "number", "missing": False} -# ], -# "index": [], -# "title": "", -# "description": "", -# "extra": {} -# } - -# for file in os.listdir(format.path): -# if not file.endswith('.csv'): -# continue - -# input_path = os.path.join(format.path, file) -# file_name = str(file).replace('_slice.csv', '') -# file_name = file_name.replace('_val', '') -# if file_name == 'w': -# file_name = file_name.upper() -# file_name = file_name + '.jsonl' -# output_path = os.path.join(ANCOMBC2_output.path, file_name) - -# df = pd.read_csv(input_path) -# json_file = df.to_json(output_path) - -# json_file = json.load(open(output_path)) -# n = len(json_file["id"]) - -# with open(output_path, "w") as f: -# f.write(json.dumps(header, separators=(',', ':')) + "\n") - -# for i in range(n): -# row = { -# "taxon": json_file["id"][str(i)], -# "(Intercept)": json_file["(Intercept)"][str(i)] -# } -# f.write(json.dumps(row) + "\n") - -# extra_files = ['diff.jsonl', 'passed_ss.jsonl'] -# for file in extra_files: -# output_path = os.path.join(ANCOMBC2_output.path, file) -# with open(output_path, 'w') as f: -# f.write(json.dumps(header, separators=(',', ':')) + "\n") - -# return ANCOMBC2_output diff --git a/q2_composition/plugin_setup.py b/q2_composition/plugin_setup.py index 86111e9..e374399 100644 --- a/q2_composition/plugin_setup.py +++ b/q2_composition/plugin_setup.py @@ -6,7 +6,6 @@ # The full license is in the file LICENSE, distributed with this software. # ---------------------------------------------------------------------------- -import qiime2 import importlib import numpy as np From a295c33a7c3579782a13ab6153270a6d5ea134b8 Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Tue, 19 May 2026 10:45:56 -0700 Subject: [PATCH 03/15] Small fix --- q2_composition/_transformer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/q2_composition/_transformer.py b/q2_composition/_transformer.py index c60c3f7..2aae9f8 100644 --- a/q2_composition/_transformer.py +++ b/q2_composition/_transformer.py @@ -94,7 +94,7 @@ def _2(slices: ANCOMBC2SliceMapping) -> ANCOMBC2OutputDirFmt: with open(output_path, 'w') as f: f.write(json.dumps(header, separators=(',', ':')) + "\n") - return format + return format @plugin.register_transformer From f56c159b7bfcaabfe1170e8c4d64b58b1a3a19eb Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Tue, 19 May 2026 14:16:24 -0700 Subject: [PATCH 04/15] Delating original da-barplot renaming amcombc-viz to da-barplot --- Makefile | 10 +- q2_composition/__init__.py | 6 +- q2_composition/_ancombc2.py | 5 +- q2_composition/_da_barplot/.gitignore | 26 + .../_da_barplot/.vscode/extensions.json | 3 + q2_composition/_da_barplot/index.html | 14 + q2_composition/_da_barplot/package-lock.json | 4187 +++++++++++++++++ q2_composition/_da_barplot/package.json | 29 + q2_composition/_da_barplot/src/App.svelte | 63 + q2_composition/_da_barplot/src/app.css | 12 + .../_da_barplot/src/lib/Barplot.svelte | 47 + .../src/lib/BarplotControls.svelte | 82 + .../_da_barplot/src/lib/BarplotFilters.svelte | 157 + .../src/lib/ControlContainer.svelte | 8 + .../_da_barplot/src/lib/SelectedTaxon.svelte | 147 + .../_da_barplot/src/lib/Taxonomy.svelte | 37 + .../_da_barplot/src/lib/TaxonomyFilter.svelte | 99 + .../src/lib/TaxonomyFilterList.svelte | 137 + q2_composition/_da_barplot/src/main.ts | 9 + .../_da_barplot/src/util/features.svelte.ts | 309 ++ q2_composition/_da_barplot/src/util/parse.ts | 148 + q2_composition/_da_barplot/src/util/plot.ts | 526 +++ .../_da_barplot/src/util/taxonomy.svelte.ts | 729 +++ q2_composition/_da_barplot/src/vite-env.d.ts | 2 + q2_composition/_da_barplot/svelte.config.js | 7 + .../tests/data/output-format/W.jsonl | 9 + .../tests/data/output-format/diff.jsonl | 9 + .../tests/data/output-format/lfc.jsonl | 9 + .../tests/data/output-format/p.jsonl | 9 + .../tests/data/output-format/passed_ss.jsonl | 9 + .../tests/data/output-format/q.jsonl | 9 + .../tests/data/output-format/se.jsonl | 9 + .../data/output-format/structural-zeros.jsonl | 771 +++ .../_da_barplot/tests/data/taxonomy-fake.tsv | 8 + .../_da_barplot/tests/data/taxonomy.tsv | 771 +++ .../_da_barplot/tests/featureRecord.test.ts | 93 + .../_da_barplot/tests/parse.test.ts | 168 + .../_da_barplot/tests/taxonomy.test.ts | 52 + q2_composition/_da_barplot/tsconfig.app.json | 20 + q2_composition/_da_barplot/tsconfig.json | 7 + q2_composition/_da_barplot/tsconfig.node.json | 24 + q2_composition/_da_barplot/vite.config.ts | 9 + q2_composition/_diff_abundance_plots.py | 242 - q2_composition/plugin_setup.py | 61 +- q2_composition/tests/test_ancombc2.py | 12 +- .../tests/test_diff_abundance_plot.py | 564 --- 46 files changed, 8787 insertions(+), 877 deletions(-) create mode 100644 q2_composition/_da_barplot/.gitignore create mode 100644 q2_composition/_da_barplot/.vscode/extensions.json create mode 100644 q2_composition/_da_barplot/index.html create mode 100644 q2_composition/_da_barplot/package-lock.json create mode 100644 q2_composition/_da_barplot/package.json create mode 100644 q2_composition/_da_barplot/src/App.svelte create mode 100644 q2_composition/_da_barplot/src/app.css create mode 100644 q2_composition/_da_barplot/src/lib/Barplot.svelte create mode 100644 q2_composition/_da_barplot/src/lib/BarplotControls.svelte create mode 100644 q2_composition/_da_barplot/src/lib/BarplotFilters.svelte create mode 100644 q2_composition/_da_barplot/src/lib/ControlContainer.svelte create mode 100644 q2_composition/_da_barplot/src/lib/SelectedTaxon.svelte create mode 100644 q2_composition/_da_barplot/src/lib/Taxonomy.svelte create mode 100644 q2_composition/_da_barplot/src/lib/TaxonomyFilter.svelte create mode 100644 q2_composition/_da_barplot/src/lib/TaxonomyFilterList.svelte create mode 100644 q2_composition/_da_barplot/src/main.ts create mode 100644 q2_composition/_da_barplot/src/util/features.svelte.ts create mode 100644 q2_composition/_da_barplot/src/util/parse.ts create mode 100644 q2_composition/_da_barplot/src/util/plot.ts create mode 100644 q2_composition/_da_barplot/src/util/taxonomy.svelte.ts create mode 100644 q2_composition/_da_barplot/src/vite-env.d.ts create mode 100644 q2_composition/_da_barplot/svelte.config.js create mode 100644 q2_composition/_da_barplot/tests/data/output-format/W.jsonl create mode 100644 q2_composition/_da_barplot/tests/data/output-format/diff.jsonl create mode 100644 q2_composition/_da_barplot/tests/data/output-format/lfc.jsonl create mode 100644 q2_composition/_da_barplot/tests/data/output-format/p.jsonl create mode 100644 q2_composition/_da_barplot/tests/data/output-format/passed_ss.jsonl create mode 100644 q2_composition/_da_barplot/tests/data/output-format/q.jsonl create mode 100644 q2_composition/_da_barplot/tests/data/output-format/se.jsonl create mode 100644 q2_composition/_da_barplot/tests/data/output-format/structural-zeros.jsonl create mode 100644 q2_composition/_da_barplot/tests/data/taxonomy-fake.tsv create mode 100644 q2_composition/_da_barplot/tests/data/taxonomy.tsv create mode 100644 q2_composition/_da_barplot/tests/featureRecord.test.ts create mode 100644 q2_composition/_da_barplot/tests/parse.test.ts create mode 100644 q2_composition/_da_barplot/tests/taxonomy.test.ts create mode 100644 q2_composition/_da_barplot/tsconfig.app.json create mode 100644 q2_composition/_da_barplot/tsconfig.json create mode 100644 q2_composition/_da_barplot/tsconfig.node.json create mode 100644 q2_composition/_da_barplot/vite.config.ts delete mode 100644 q2_composition/_diff_abundance_plots.py delete mode 100644 q2_composition/tests/test_diff_abundance_plot.py diff --git a/Makefile b/Makefile index 3b72a15..961755c 100644 --- a/Makefile +++ b/Makefile @@ -21,14 +21,14 @@ dev: all pip install -e . clean: distclean - rm -rf q2_composition/_ancombc2_visualizer/node_modules + rm -rf q2_composition/_da_barplot/node_modules distclean: - rm -rf q2_composition/_ancombc2_visualizer/dist/ + rm -rf q2_composition/_da_barplot/dist/ -q2_composition/_ancombc2_visualizer/dist: - cd q2_composition/_ancombc2_visualizer/ && \ +q2_composition/_da_barplot/dist: + cd q2_composition/_da_barplot/ && \ npm install && \ npm run build -ancombc2-visualizer: q2_composition/_ancombc2_visualizer/dist +ancombc2-visualizer: q2_composition/_da_barplot/dist diff --git a/q2_composition/__init__.py b/q2_composition/__init__.py index d7653aa..c22a93a 100644 --- a/q2_composition/__init__.py +++ b/q2_composition/__init__.py @@ -15,9 +15,8 @@ from ._impute import add_pseudocount from ._ancom import ancom from ._ancombc import ancombc -from ._ancombc2 import ancombc2, ancombc2_visualizer +from ._ancombc2 import ancombc2, da_barplot from ._dataloaf_tabulate import tabulate -from ._diff_abundance_plots import da_barplot try: from ._version import __version__ @@ -27,6 +26,5 @@ __all__ = [ 'FrictionlessCSVFileFormat', 'DataPackageSchemaFileFormat', 'DataLoafPackageDirFmt', 'DifferentialAbundance', 'add_pseudocount', - 'ancom', 'ancombc', 'ancombc2', 'ancombc2_visualizer', 'tabulate', - 'da_barplot' + 'ancom', 'ancombc', 'ancombc2', 'tabulate', 'da_barplot' ] diff --git a/q2_composition/_ancombc2.py b/q2_composition/_ancombc2.py index 8a34ab6..5e2978d 100644 --- a/q2_composition/_ancombc2.py +++ b/q2_composition/_ancombc2.py @@ -32,7 +32,6 @@ ANCOMBC2OutputDirFmt, ANCOMBC2SliceMapping, DataLoafPackageDirFmt ) - r_base = importr('base') r_stats = importr('stats') r_phyloseq = importr('phyloseq') @@ -855,7 +854,7 @@ def _rename(column: str) -> str: return structural_zeros_df.rename(lambda c: _rename(c), axis='columns') -def ancombc2_visualizer( +def da_barplot( output_dir: str, data: Union[ANCOMBC2OutputDirFmt, DataLoafPackageDirFmt], taxonomy: pd.DataFrame = None @@ -881,7 +880,7 @@ def ancombc2_visualizer( dist_dir = ( importlib.resources.files('q2_composition') / - '_ancombc2_visualizer' / 'dist' + '_da_barplot' / 'dist' ) shutil.copytree(Path(str(dist_dir)), output_dir, dirs_exist_ok=True) diff --git a/q2_composition/_da_barplot/.gitignore b/q2_composition/_da_barplot/.gitignore new file mode 100644 index 0000000..775bbdd --- /dev/null +++ b/q2_composition/_da_barplot/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +!lib/ diff --git a/q2_composition/_da_barplot/.vscode/extensions.json b/q2_composition/_da_barplot/.vscode/extensions.json new file mode 100644 index 0000000..bdef820 --- /dev/null +++ b/q2_composition/_da_barplot/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["svelte.svelte-vscode"] +} diff --git a/q2_composition/_da_barplot/index.html b/q2_composition/_da_barplot/index.html new file mode 100644 index 0000000..f9207c1 --- /dev/null +++ b/q2_composition/_da_barplot/index.html @@ -0,0 +1,14 @@ + + + + + + + ANCOMBC2 Visualizer + + + +
+ + + diff --git a/q2_composition/_da_barplot/package-lock.json b/q2_composition/_da_barplot/package-lock.json new file mode 100644 index 0000000..f2f32dd --- /dev/null +++ b/q2_composition/_da_barplot/package-lock.json @@ -0,0 +1,4187 @@ +{ + "name": "diverging-barplot", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "diverging-barplot", + "version": "0.0.0", + "dependencies": { + "d3": "^7.9.0" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@tailwindcss/vite": "^4.1.4", + "@tsconfig/svelte": "^5.0.4", + "@types/d3": "^7.4.3", + "@types/node": "^22.10.5", + "svelte": "^5.53.0", + "svelte-check": "^4.1.1", + "tailwindcss": "^4.1.4", + "typescript": "~5.6.2", + "vite": "^6.4.1", + "vitest": "^2.1.8" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", + "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", + "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", + "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", + "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", + "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", + "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", + "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", + "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", + "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", + "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", + "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", + "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", + "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", + "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", + "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", + "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", + "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", + "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", + "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", + "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", + "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.0.3.tgz", + "integrity": "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.0", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.15", + "vitefu": "^1.0.4" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.7" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.4.tgz", + "integrity": "sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==", + "dev": true, + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.4" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.4.tgz", + "integrity": "sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.4", + "@tailwindcss/oxide-darwin-arm64": "4.1.4", + "@tailwindcss/oxide-darwin-x64": "4.1.4", + "@tailwindcss/oxide-freebsd-x64": "4.1.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.4", + "@tailwindcss/oxide-linux-x64-musl": "4.1.4", + "@tailwindcss/oxide-wasm32-wasi": "4.1.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.4" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.4.tgz", + "integrity": "sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.4.tgz", + "integrity": "sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.4.tgz", + "integrity": "sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.4.tgz", + "integrity": "sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.4.tgz", + "integrity": "sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.4.tgz", + "integrity": "sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.4.tgz", + "integrity": "sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.4.tgz", + "integrity": "sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.4.tgz", + "integrity": "sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.4.tgz", + "integrity": "sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@emnapi/wasi-threads": "^1.0.1", + "@napi-rs/wasm-runtime": "^0.2.8", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.8", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.0", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.4.tgz", + "integrity": "sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.4.tgz", + "integrity": "sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.4.tgz", + "integrity": "sha512-4UQeMrONbvrsXKXXp/uxmdEN5JIJ9RkH7YVzs6AMxC/KC1+Np7WZBaNIco7TEjlkthqxZbt8pU/ipD+hKjm80A==", + "dev": true, + "dependencies": { + "@tailwindcss/node": "4.1.4", + "@tailwindcss/oxide": "4.1.4", + "tailwindcss": "4.1.4" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, + "node_modules/@tsconfig/svelte": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz", + "integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/expect": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.8", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.8", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.8", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz", + "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.3.tgz", + "integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/readdirp": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", + "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.50.1", + "@rollup/rollup-android-arm64": "4.50.1", + "@rollup/rollup-darwin-arm64": "4.50.1", + "@rollup/rollup-darwin-x64": "4.50.1", + "@rollup/rollup-freebsd-arm64": "4.50.1", + "@rollup/rollup-freebsd-x64": "4.50.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", + "@rollup/rollup-linux-arm-musleabihf": "4.50.1", + "@rollup/rollup-linux-arm64-gnu": "4.50.1", + "@rollup/rollup-linux-arm64-musl": "4.50.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", + "@rollup/rollup-linux-ppc64-gnu": "4.50.1", + "@rollup/rollup-linux-riscv64-gnu": "4.50.1", + "@rollup/rollup-linux-riscv64-musl": "4.50.1", + "@rollup/rollup-linux-s390x-gnu": "4.50.1", + "@rollup/rollup-linux-x64-gnu": "4.50.1", + "@rollup/rollup-linux-x64-musl": "4.50.1", + "@rollup/rollup-openharmony-arm64": "4.50.1", + "@rollup/rollup-win32-arm64-msvc": "4.50.1", + "@rollup/rollup-win32-ia32-msvc": "4.50.1", + "@rollup/rollup-win32-x64-msvc": "4.50.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/svelte": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.0.tgz", + "integrity": "sha512-7dhHkSamGS2vtoBmIW2hRab+gl5Z60alEHZB4910ePqqJNxAWnDAxsofVmlZ2tREmWyHNE+A1nCKwICAquoD2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.6.3", + "esm-env": "^1.2.1", + "esrap": "^2.2.2", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.4.tgz", + "integrity": "sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz", + "integrity": "sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vite-node/node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.5.tgz", + "integrity": "sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.8", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/zimmerframe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", + "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/q2_composition/_da_barplot/package.json b/q2_composition/_da_barplot/package.json new file mode 100644 index 0000000..1d3103d --- /dev/null +++ b/q2_composition/_da_barplot/package.json @@ -0,0 +1,29 @@ +{ + "name": "diverging-barplot", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json", + "test": "vitest" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@tsconfig/svelte": "^5.0.4", + "@types/d3": "^7.4.3", + "@types/node": "^22.10.5", + "svelte": "^5.53.0", + "svelte-check": "^4.1.1", + "typescript": "~5.6.2", + "vite": "^6.4.1", + "vitest": "^2.1.8", + "@tailwindcss/vite": "^4.1.4", + "tailwindcss": "^4.1.4" + }, + "dependencies": { + "d3": "^7.9.0" + } +} diff --git a/q2_composition/_da_barplot/src/App.svelte b/q2_composition/_da_barplot/src/App.svelte new file mode 100644 index 0000000..d14cd27 --- /dev/null +++ b/q2_composition/_da_barplot/src/App.svelte @@ -0,0 +1,63 @@ + + +
+ {#await featuresPromise} +

Parsing slices...

+ {:then features} + + {:catch error} +

An error occurred: {error.message}

+ {/await} + + {#await taxonomyPromise} +

Parsing taxonomy...

+ {:then rootTaxon} + {#if rootTaxon} + + {/if} + {:catch error} +

An error occurred: {error.message}

+ {/await} +
diff --git a/q2_composition/_da_barplot/src/app.css b/q2_composition/_da_barplot/src/app.css new file mode 100644 index 0000000..592a0a2 --- /dev/null +++ b/q2_composition/_da_barplot/src/app.css @@ -0,0 +1,12 @@ +@import "tailwindcss"; + +button { + @apply px-4 py-1 bg-purple-500 text-white rounded cursor-pointer; +} +button:hover { + @apply bg-purple-600; +} + +button:active { + @apply bg-purple-700; +} \ No newline at end of file diff --git a/q2_composition/_da_barplot/src/lib/Barplot.svelte b/q2_composition/_da_barplot/src/lib/Barplot.svelte new file mode 100644 index 0000000..57ca1d6 --- /dev/null +++ b/q2_composition/_da_barplot/src/lib/Barplot.svelte @@ -0,0 +1,47 @@ + + +
+
+ {#if features.viewVariableLevel != ""} +

+ Reference Level: {referenceLevel} +

+ {/if} + +
+ +
+ + diff --git a/q2_composition/_da_barplot/src/lib/BarplotControls.svelte b/q2_composition/_da_barplot/src/lib/BarplotControls.svelte new file mode 100644 index 0000000..7bcdbf1 --- /dev/null +++ b/q2_composition/_da_barplot/src/lib/BarplotControls.svelte @@ -0,0 +1,82 @@ + + + +
+
+ + +
+
+ + +
+
+

Bar Thickness:

+ + +
+
+
diff --git a/q2_composition/_da_barplot/src/lib/BarplotFilters.svelte b/q2_composition/_da_barplot/src/lib/BarplotFilters.svelte new file mode 100644 index 0000000..755f026 --- /dev/null +++ b/q2_composition/_da_barplot/src/lib/BarplotFilters.svelte @@ -0,0 +1,157 @@ + + + +
+
+ + +
+
+ + +
+
+ + +
+ + + + {#if errorMessage} +

{errorMessage}

+ {/if} +
+
+ +{#if filters.length} +
+ {#each filters as filter} +
+

+ {filter.slice} + {getSymbol(filter.relationship)} + {filter.value} +

+ + +
+ {/each} +
+{/if} + + diff --git a/q2_composition/_da_barplot/src/lib/ControlContainer.svelte b/q2_composition/_da_barplot/src/lib/ControlContainer.svelte new file mode 100644 index 0000000..e50f5cf --- /dev/null +++ b/q2_composition/_da_barplot/src/lib/ControlContainer.svelte @@ -0,0 +1,8 @@ + + +
+

{title}

+
{@render children()}
+
diff --git a/q2_composition/_da_barplot/src/lib/SelectedTaxon.svelte b/q2_composition/_da_barplot/src/lib/SelectedTaxon.svelte new file mode 100644 index 0000000..861b2b2 --- /dev/null +++ b/q2_composition/_da_barplot/src/lib/SelectedTaxon.svelte @@ -0,0 +1,147 @@ + + + +
+ + +
+ {#if searchError != ""} +
+

{searchError}

+
+ {/if} +
+ + +
+
+ {#if taxonomyPlot?.selectedTaxon == undefined} + {#if searchError == ""} +

Click on a taxon name for more information.

+ {/if} + {:else} +

Name: {name}

+

+ Features classified to taxon: + {featureCount} ({featurePercent}%) +

+

+ Features classified to subtree: + {subtreeCount} ({subtreePercent}%) +

+ {/if} +
+ + diff --git a/q2_composition/_da_barplot/src/lib/Taxonomy.svelte b/q2_composition/_da_barplot/src/lib/Taxonomy.svelte new file mode 100644 index 0000000..2ee9f09 --- /dev/null +++ b/q2_composition/_da_barplot/src/lib/Taxonomy.svelte @@ -0,0 +1,37 @@ + + +
+
+ +
+ +
+ + diff --git a/q2_composition/_da_barplot/src/lib/TaxonomyFilter.svelte b/q2_composition/_da_barplot/src/lib/TaxonomyFilter.svelte new file mode 100644 index 0000000..d8a5806 --- /dev/null +++ b/q2_composition/_da_barplot/src/lib/TaxonomyFilter.svelte @@ -0,0 +1,99 @@ + + + +
+
+ + +
+
+ + +
+ +
+ + {#if errorMessage != ""} +
+

{errorMessage}

+
+ {/if} +
+ + diff --git a/q2_composition/_da_barplot/src/lib/TaxonomyFilterList.svelte b/q2_composition/_da_barplot/src/lib/TaxonomyFilterList.svelte new file mode 100644 index 0000000..96f072b --- /dev/null +++ b/q2_composition/_da_barplot/src/lib/TaxonomyFilterList.svelte @@ -0,0 +1,137 @@ + + + +
+ + +
+
+ + +
+
+ + +
+
+ {#each taxonomyFilters?.filters as filter} +
+ {#if filter.type == "feature-count"} +

features {"<"} {filter.value}

+ + {:else if filter.type == "individual"} +

+ individual filter of + {filter.node.getNonAnonymousTaxonString()} +

+ + {/if} +
+ {/each} +
+
diff --git a/q2_composition/_da_barplot/src/main.ts b/q2_composition/_da_barplot/src/main.ts new file mode 100644 index 0000000..664a057 --- /dev/null +++ b/q2_composition/_da_barplot/src/main.ts @@ -0,0 +1,9 @@ +import { mount } from 'svelte' +import './app.css' +import App from './App.svelte' + +const app = mount(App, { + target: document.getElementById('app')!, +}) + +export default app diff --git a/q2_composition/_da_barplot/src/util/features.svelte.ts b/q2_composition/_da_barplot/src/util/features.svelte.ts new file mode 100644 index 0000000..b5b85a5 --- /dev/null +++ b/q2_composition/_da_barplot/src/util/features.svelte.ts @@ -0,0 +1,309 @@ +import { TaxonomyNode } from "./taxonomy.svelte"; + +export type VariableRecord = { + name: string; + lfc?: number; + p?: number; + q?: number; + se?: number; + level?: string; + reference?: string; +} & Record; + +export class FeatureRecord { + featureId: string; + classification?: string; + shortClassification?: string; + variables: Map = new Map(); + + constructor(featureId: string, taxonomyNode?: TaxonomyNode) { + this.featureId = featureId; + + this.classification = taxonomyNode?.getFullTaxonString(); + if (taxonomyNode) { + const nonAnonymousName = taxonomyNode.getNonAnonymousTaxonString(); + this.shortClassification = `(${featureId.slice(0, 6)}) ${nonAnonymousName}`; + } + } + + /** + * Returns the variable with `variableName` and `level` or undefined if + * none is found. + */ + getVariable( + variableName: string, + level: string | undefined = undefined, + ): VariableRecord | undefined { + if (level) { + return this.variables.get(`${variableName}::${level}`); + } + + return this.variables.get(variableName); + } + + /** + * Creates a VariableRecord from primitives. + */ + createVariable( + variableName: string, + slice: string, + value: number, + level: string | undefined = undefined, + reference: string | undefined = undefined, + ): VariableRecord { + let variable = { + name: variableName, + [slice]: value, + }; + if (level && reference) { + variable.level = level; + variable.reference = reference; + } + + return variable; + } + + /** + * Adds a new variable to the set of feature variables. If a matching + * variable is already present then updates that variable with the any new + * slice properties from `variable`. + */ + addVariable(variable: VariableRecord): undefined { + let matchingVariable = this.getVariable(variable.name, variable.level); + + let newVariable: VariableRecord; + if (!matchingVariable) { + newVariable = variable; + } else { + newVariable = { + ...matchingVariable, + ...variable, + }; + } + + if (newVariable.level) { + this.variables.set( + `${newVariable.name}::${newVariable.level}`, + newVariable, + ); + } else { + this.variables.set(newVariable.name, newVariable); + } + } + + /** + * Returns the slice value for some variable. Errors if the variable or + * slice is not found. + */ + getVariableSlice( + variableName: string, + slice: string, + level: string | undefined = undefined, + ): number { + const variable = this.getVariable(variableName, level); + + if (!variable) { + throw new Error(`The ${variable} variable was not found.`); + } + if (!Object.hasOwn(variable, slice)) { + throw new Error(`The ${variable} variable has no ${slice} slice.`); + } + + return variable[slice] as number; + } +} + +export type ViewRecord = { + featureId: string; + lfc: number; + se: number; + p: number; + q: number; + classification: string; + shortClassification: string; +}; + +type Filter = { + (record: FeatureRecord): boolean; + slice: string; + relationship: string; + value: number; +}; + +export class FeatureRecords { + records: FeatureRecord[] = []; + + rootTaxon: TaxonomyNode | null = null; + hideFiltered: boolean = false; + showOnlyKept: boolean = false; + + view: ViewRecord[] = []; + viewVariable: string = $state(""); + viewVariableLevel: string = $state(""); + + filters: Filter[] = []; + + /** + * Returns an arbitrary variable record, useful for initializing the + * barplot. + */ + getInitialVariable(): VariableRecord { + return this.getAllVariables()[0]; + } + + /* + * Return the feature with id `featureId`, or undefined if not found. + */ + getFeature(featureId: string): FeatureRecord | undefined { + return this.records.find((r) => r.featureId == featureId); + } + + /** + * Adds a new feature. If a matching feature is already present then + * merges that feature's variables with those from `feature`. + */ + addFeature(feature: FeatureRecord): undefined { + let matchingFeature = this.getFeature(feature.featureId); + + if (!matchingFeature) { + this.records.push(feature); + } else { + Array.from(feature.variables.values()).forEach((v) => + matchingFeature.addVariable(v), + ); + } + } + + /** + * Adds a user-specified filter to the set of filters applied to the + * data. The filter function is annotated with each of this functions + * arguments for display in the UI. + */ + addFilter(slice: string, relationship: string, value: number) { + const filter = (record: FeatureRecord) => { + const variableValue = record.getVariableSlice( + this.viewVariable, + slice, + this.viewVariableLevel, + ); + + if (relationship == "gt") return variableValue > value; + if (relationship == "lt") return variableValue < value; + if (relationship == 'gtabsval') return Math.abs(variableValue) > value; + if (relationship == 'ltabsval') return Math.abs(variableValue) < value; + + throw new Error(`Unexpected relationship ${relationship}.`); + }; + + // annotate function with its defining characteristics + filter.slice = slice; + filter.relationship = relationship; + filter.value = value; + + this.filters.push(filter); + } + + /** + * Removes a filter by index. + */ + removeFilter(slice: string, relationship: string, value: number) { + this.filters = this.filters.filter((f) => { + return !( + f.slice == slice && + f.relationship == relationship && + f.value == value + ); + }); + } + + /** + * Returns all variable records in the feature dataset. Accessing only the + * first feature record is sufficient because all features have the same + * set of variable records. Removes the intercept variable record. + */ + getAllVariables(): VariableRecord[] { + const variables = Array.from(this.records[0].variables.values()); + return variables.filter((v) => v.name != "(Intercept)"); + } + + /** + */ + getVariablesWithName(variableName: string): VariableRecord[] { + const variables = this.getAllVariables(); + return variables.filter((v) => v.name == variableName); + } + + /** + * Renders the `view` by applying all existing filters, sorting features + * by decreasing lfc value, and extracting the slice values for the current + * `viewVariable`. + */ + render() { + let filtered: FeatureRecord[] = []; + + // apply taxonomyFilters if present + if (this.hideFiltered || this.showOnlyKept) { + for (let record of this.records) { + const node = this.rootTaxon.findTaxonById(record.featureId); + if (node == null) { + throw new Error( + `Could not find taxon with id ${record.featureId}`, + ); + } + + if (this.hideFiltered && !node.filtered) { + filtered.push(record); + } else if (this.showOnlyKept && node.hierarchyNode.keep) { + filtered.push(record); + } + } + } else { + filtered = this.records; + } + + // apply slice filters + for (let f of Object.values(this.filters)) { + filtered = filtered.filter(f); + } + + // map to view records by only selecting from variable of interest + let viewRecords: ViewRecord[] = filtered.map((record) => { + const variable = record.getVariable( + this.viewVariable, + this.viewVariableLevel, + ); + + if (!variable) { + throw new Error( + `Could not find variable ${this.viewVariable}.`, + ); + } + + let classification = record.classification; + if (classification == null) classification = "N/A"; + + return { + featureId: record.featureId, + lfc: variable.lfc!, + se: variable.se!, + p: variable.p!, + q: variable.q!, + classification, + shortClassification: record.shortClassification, + }; + }); + + // filter null lfc values + viewRecords = viewRecords.filter((r) => r.lfc != null); + + // sort view records by decreasing lfc + viewRecords = viewRecords.sort((r1, r2) => r2.lfc - r1.lfc); + + // update state + this.view = viewRecords; + } +} + +// global state +let features = new FeatureRecords(); +export default features; diff --git a/q2_composition/_da_barplot/src/util/parse.ts b/q2_composition/_da_barplot/src/util/parse.ts new file mode 100644 index 0000000..cfbc06b --- /dev/null +++ b/q2_composition/_da_barplot/src/util/parse.ts @@ -0,0 +1,148 @@ +import { text } from "d3-fetch"; + +import { + FeatureRecords, + FeatureRecord, + type VariableRecord, +} from "./features.svelte"; + +import { TaxonomyNode } from "./taxonomy.svelte"; + +type JSONLHeaderField = { + name: string; + type: string | null; + missing: boolean; + title: string; + description: string; + extra: Record; +}; +type JSONLHeader = { + doctype: object; + direction: string; + style: string; + fields: JSONLHeaderField[]; +}; +type JSONLFeatureRecord = { + taxon: string; +} & Record; + +/** + * Parses slice data from the ANCOMBC2 output format that resides inside of the + * visualization artifact. Side-effects `featureRecords` by adding/updating + * parsed features. + */ +export async function parseAllSlices( + slicesDir: string, + featureRecords: FeatureRecords, + rootTaxon: TaxonomyNode | null = null, +): Promise { + const slices = ["lfc", "p", "q", "se"]; + for (let slice of slices) { + const sliceFilepath = `${slicesDir}/${slice}.jsonl`; + await parseSlice(sliceFilepath, featureRecords, rootTaxon); + } + + return Promise.resolve(); +} + +/** + * Parses a JSONL slice into `FeatureRecord`s and adds them to `featureRecords`. + */ +export async function parseSlice( + sliceFilepath: string, + featureRecords: FeatureRecords, + rootTaxon: TaxonomyNode | null, +): Promise { + // open file, convert to json + const textData: string = await text(sliceFilepath); + const jsonRecords: any = textData + .split("\n") + .filter((line) => line.trim() != "") + .map((line) => JSON.parse(line)); + + // parse header and check if empty + if (jsonRecords.length < 1) { + const msg = `The ${sliceFilepath} slice is empty.`; + throw new Error(msg); + } else if (jsonRecords.length === 1) { + const msg = `The ${sliceFilepath} slice has a header but no records.`; + throw new Error(msg); + } + const header: JSONLHeader = jsonRecords.shift()!; + + // parse each remaining line into a feature record + const jsonFeatureRecords: JSONLFeatureRecord[] = jsonRecords; + const sliceName = sliceFilepath.split("/").pop()!.replace(".jsonl", ""); + + jsonFeatureRecords.forEach((record) => { + const feature = parseJSONLFeatureRecord( + record, + header, + sliceName, + rootTaxon, + ); + featureRecords.addFeature(feature); + }); +} + +/** + * Parses a feature record line from a JSONL slice into a `FeatureRecord` + * object. + */ +export function parseJSONLFeatureRecord( + jsonRecord: JSONLFeatureRecord, + header: JSONLHeader, + slice: string, + rootTaxon: TaxonomyNode | null, +): FeatureRecord { + const taxonNode = rootTaxon?.findTaxonById(jsonRecord.taxon); + + const featureRecord = new FeatureRecord(jsonRecord.taxon, taxonNode); + + for (let column of Object.keys(jsonRecord)) { + if (column == "taxon") continue; + + const value = jsonRecord[column]; + + const headerField = getColumnField(column, header); + + let variable: VariableRecord; + if (headerField.extra.reference) { + variable = featureRecord.createVariable( + headerField.extra.variable, + slice, + value, + headerField.extra.level, + headerField.extra.reference, + ); + } else { + variable = featureRecord.createVariable(column, slice, value); + } + + featureRecord.addVariable(variable); + } + + return featureRecord; +} + +/** + * Retrieves the header field entry for the `column` column. + */ +export function getColumnField( + column: string, + header: JSONLHeader, +): JSONLHeaderField { + const columnFields: JSONLHeaderField[] = header.fields.filter((field) => { + return field.name === column; + }); + + if (columnFields.length > 1) { + const msg = `Duplicate name '${column}' found in JSONL header.`; + throw new Error(msg); + } else if (!columnFields.length) { + const msg = `Column ${column} not found in JSONL header.`; + throw new Error(msg); + } + + return columnFields.shift()!; +} diff --git a/q2_composition/_da_barplot/src/util/plot.ts b/q2_composition/_da_barplot/src/util/plot.ts new file mode 100644 index 0000000..ef3a2e5 --- /dev/null +++ b/q2_composition/_da_barplot/src/util/plot.ts @@ -0,0 +1,526 @@ +import * as d3 from "d3"; +import { type ViewRecord } from "./features.svelte"; + +type PlotDimensions = { + svgWidth: number; + svgHeight: number; + margin: number; + plotWidth: number; + plotHeight: number; + barHeight: number; + barPadding: number; +}; + +export class DivergingBarplot { + data: ViewRecord[] = []; + dimensions: PlotDimensions = {}; + xScale: d3.ScaleLinear = d3.scaleLinear(); + yScale: d3.ScaleBand = d3.scaleBand(); + xAxis: d3.Selection = d3.selection(); + yAxis: d3.Selection = d3.selection(); + + /** + */ + init(data: ViewRecord[]) { + this.data = data; + this.dimensions = this.createDimensions(); + this.xScale = this.createXScale(); + this.yScale = this.createYScale(); + this.xAxis = this.createXAxis(); + this.yAxis = this.createYAxis(); + } + + /** + */ + createDimensions(): PlotDimensions { + const svg = d3.select("svg"); + let svgWidth: number; + if (!svg.empty()) { + svgWidth = svg.node()!.getBoundingClientRect().width; + } else { + throw new Error(`Svg element not found.`); + } + + const numFeatures = this.data.length; + + const barHeight = 20; + const barPadding = 1.25; + + const plotHeight = numFeatures * barHeight * barPadding; + + const margin = 120; + const plotWidth = svgWidth - 2 * margin; + + return { + svgWidth: svgWidth, + svgHeight: plotHeight + 2 * margin, + margin, + plotWidth, + plotHeight, + barHeight, + barPadding, + }; + } + + /** + * Updates the plotted data and redraws the plot if the data is non-empty, + * otherwise hides the plot. + */ + updateData(data: ViewRecord[]) { + this.data = data; + if (data.length > 0) { + this.showPlot(); + this.drawPlot(true); + } else { + this.hidePlot(); + } + } + + /** + */ + updatePlotHeight() { + this.dimensions.plotHeight = + this.data.length * + this.dimensions.barHeight * + this.dimensions.barPadding; + this.dimensions.svgHeight = + this.dimensions.plotHeight + 2 * this.dimensions.margin; + } + + /** + */ + increaseBarThickness() { + this.dimensions.barHeight *= 1.1; + this.drawPlot(true); + } + + /** + */ + decreaseBarThickness() { + this.dimensions.barHeight *= 0.9; + this.drawPlot(true); + } + + /** + */ + getXDomain(): [number, number] { + // get min and max lfc +- se values + const lfc_minus_se = this.data.map((f) => f.lfc - f.se); + const lfc_plus_se = this.data.map((f) => f.lfc + f.se); + + let [min, max] = d3.extent([...lfc_minus_se, ...lfc_plus_se]); + + if (min == undefined || max == undefined) { + throw new Error("Unable to find min/max of feature lfcs."); + } + + // calculate scale range + const scaleMargin = 0.25; + if (min < 0) { + min = (1 + scaleMargin) * min; + } else { + min = -scaleMargin * max; + } + + if (max > 0) { + max = (1 + scaleMargin) * max; + } else { + max = -scaleMargin * min; + } + + return [min, max]; + } + + /** + */ + getXRange() { + return [ + this.dimensions.margin, + this.dimensions.margin + this.dimensions.plotWidth, + ]; + } + + /** + */ + createXScale(): d3.ScaleLinear { + const domain = this.getXDomain(); + const range = this.getXRange(); + const scale = d3.scaleLinear().domain(domain).range(range); + + return scale; + } + + /** + */ + getYDomain(): string[] { + return d3.range(0, this.data.length).map((i) => String(i)); + } + + /** + */ + getYRange() { + return [ + this.dimensions.margin, + this.dimensions.margin + this.dimensions.plotHeight, + ]; + } + + /** + */ + createYScale(): d3.ScaleBand { + const domain = this.getYDomain(); + const range = this.getYRange(); + const scale = d3.scaleBand().domain(domain).range(range); + + return scale; + } + + /** + */ + getXAxisTranslation() { + const translation = this.dimensions.margin + this.dimensions.plotHeight; + return `translate(0, ${translation})`; + } + + /** + */ + getYAxisTranslation() { + return `translate(${this.xScale(0)}, 0)`; + } + + /** + */ + createXAxis(): d3.Selection { + let axis = d3 + .select("svg") + .append("g") + .attr("class", "x-axis") + .attr("transform", this.getXAxisTranslation()) + .call(d3.axisBottom(this.xScale)); + + axis.selectAll("text").attr("font-size", "14px"); + + axis.append("text") + .text("LFC (Log Fold Change)") + .attr("fill", "black") + .attr("font-size", "18px") + .attr("id", "xaxis-label") + .attr("x", "50%") + .attr("y", 60); + + return axis; + } + + /** + */ + createYAxis(): d3.Selection { + let axis = d3 + .select("svg") + .append("g") + .attr("class", "y-axis") + .attr("transform", this.getYAxisTranslation()) + .call( + d3 + .axisLeft(this.yScale) + .tickSize(0) + .tickFormat("" as any), + ); + + return axis; + } + + /** + */ + addHoverHandlers() { + // event handlers + const handleMouseover = (e: any, d: any) => { + const tooltipData = [ + `feature ID: ${d.featureId}`, + `classification: ${d.classification}`, + `lfc: ${d.lfc}`, + `se: ${d.se}`, + `p-value: ${d.p}`, + `q-value: ${d.q}`, + ]; + + d3.select(".tooltip") + .style("display", "unset") + .style("left", `${e.clientX + 25}px`) + .style("top", `${e.clientY - 10}px`) + .selectAll("p") + .data(tooltipData) + .join("p") + .text((d, i) => tooltipData[i]) + .style("margin", "2px") + .style("box-shadow", "none"); + + d3.select(".tooltip") + .transition() + .duration(200) + .style("opacity", 1); + }; + + const handleMousemove = (e: any, d: any) => { + d3.select(".tooltip") + .style("left", `${e.clientX + 25}px`) + .style("top", `${e.clientY - 10}px`); + }; + + const handleMouseout = (e: any, d: any) => { + d3.select(".tooltip") + .transition() + .duration(200) + .style("opacity", 0) + .end() + .then(() => { + d3.select(".tooltip").style("display", "none"); + }); + }; + + // create tooltip + d3.select("body") + .selectAll(".tooltip") + .data([1]) + .join("div") + .attr("class", "tooltip") + .style("background-color", "#f0edef") + .style("padding", "10px") + .style("border-radius", "10px") + .style("position", "absolute") + .style("box-shadow", "1px 1px 2px gray") + .style("display", "none") + .style("opacity", 0); + + // register event handlers + d3.select("svg") + .selectAll("rect, .error-bar") + .on("mouseover", handleMouseover) + .on("mousemove", handleMousemove) + .on("mouseout", handleMouseout); + } + + /** + */ + drawErrorBar(path: d3.Path, d: ViewRecord, i: number): d3.Path { + // calculate error bar layout + const startX = this.xScale(d.lfc)!; + const startY = + this.yScale(i.toString())! + this.dimensions.barHeight / 2; + + const errorBarRight = this.xScale(d.lfc + d.se); + const errorBarLeft = startX - (errorBarRight - startX); + const errorBarTop = startY + 0.25 * this.dimensions.barHeight; + const errorBarBottom = startY - 0.25 * this.dimensions.barHeight; + + // draw error bar + path.moveTo(errorBarRight, errorBarTop); + path.lineTo(errorBarRight, errorBarBottom); + path.moveTo(errorBarRight, startY); + path.lineTo(errorBarLeft, startY); + path.moveTo(errorBarLeft, errorBarTop); + path.lineTo(errorBarLeft, errorBarBottom); + + return path; + } + + /** + */ + drawPlot(transition: boolean) { + const sizeSvg = () => { + let svg = d3 + .select("svg") + .attr("width", this.dimensions.svgWidth) + .attr("height", this.dimensions.svgHeight); + }; + + if (!transition) { + sizeSvg(); + } + + if (transition) { + // update plot height + this.updatePlotHeight(); + + // update scales + const xDomain = this.getXDomain(); + const xRange = this.getXRange(); + const yDomain = this.getYDomain(); + const yRange = this.getYRange(); + + this.xScale.domain(xDomain).range(xRange); + this.yScale.domain(yDomain).range(yRange); + + // resize svg + sizeSvg(); + + // transition axes + this.xAxis + .transition() + .duration(500) + .attr("transform", this.getXAxisTranslation()) + .call(d3.axisBottom(this.xScale)); + + this.xAxis.selectAll("text").attr("font-size", "14px"); + this.xAxis.select("#xaxis-label").attr("font-size", "18px"); + + this.yAxis + .transition() + .duration(500) + .attr("transform", this.getYAxisTranslation()) + .call( + d3 + .axisLeft(this.yScale) + .tickSize(0) + .tickFormat("" as any), + ); + } + + // draw bars + let barSelection = d3 + .select("svg") + .selectAll("rect") + .data(this.data) + .join("rect"); + + const drawBars = (selection: any) => { + selection + .attr("x", (d) => + d.lfc > 0 ? this.xScale(0) : this.xScale(d.lfc), + ) + .attr("y", (d, i) => this.yScale(String(i))) + .attr("width", (d) => + Math.abs(this.xScale(d.lfc) - this.xScale(0)), + ) + .attr("height", this.dimensions.barHeight) + .attr("fill", (d) => (d.lfc > 0 ? "green" : "red")); + }; + + if (transition) { + barSelection.transition().duration(400).call(drawBars.bind(this)); + } else { + barSelection.call(drawBars.bind(this)); + } + + // draw error bars + let errorBarSelection = d3 + .select("svg") + .selectAll(".error-bar") + .data(this.data) + .join("path") + .attr("class", "error-bar"); + + const drawErrorBars = (selection: any) => { + selection + .attr("d", (d, i) => + this.drawErrorBar(d3.path(), d, i).toString(), + ) + .attr("stroke", "black") + .attr("stroke-width", "2px"); + }; + + if (transition) { + errorBarSelection + .transition() + .duration(400) + .call(drawErrorBars.bind(this)); + } else { + errorBarSelection.call(drawErrorBars.bind(this)); + } + + // draw labels + let labelSelection = d3 + .select("svg") + .selectAll(".label") + .data(this.data) + .join("text") + .attr("class", "label"); + + const drawLabels = (selection: any) => { + selection + .text((d) => { + let classification = d.shortClassification + ? d.shortClassification + : d.featureId; + + if (classification.length > 30) { + classification = classification.slice(0, 25) + "(...)"; + } + + return classification; + }) + .attr("x", (d) => { + if (d.lfc > 0) { + return Math.min( + this.xScale(d.lfc - d.se), + this.xScale(0), + ); + } + return Math.max(this.xScale(d.lfc + d.se), this.xScale(0)); + }) + .attr( + "y", + (d, i) => + this.yScale(String(i)) + this.yScale.bandwidth() / 2, + ) + .attr("text-anchor", (d) => (d.lfc > 0 ? "end" : "start")) + .attr("dx", (d) => (d.lfc > 0 ? -8 : 8)) + .attr("dy", "1px") + .attr("font-size", "12px") + .attr("fill", "#474747"); + }; + + if (transition) { + labelSelection + .transition() + .duration(400) + .call(drawLabels.bind(this)); + } else { + labelSelection.call(drawLabels.bind(this)); + } + + // attach hover event listeners + this.addHoverHandlers(); + } + + /** + */ + hidePlot() { + // gray-out the plot + d3.select("svg") + .append("rect") + .attr("class", "hider") + .attr("width", this.dimensions.svgWidth) + .attr("height", this.dimensions.svgHeight) + .attr("fill", "gray") + .attr("opacity", 0.9); + + // add error message + d3.select("svg") + .append("rect") + .attr("class", "hider-text-box") + .attr("x", 0.3 * this.dimensions.svgWidth) + .attr("y", 0.4 * this.dimensions.svgHeight) + .attr("width", 0.4 * this.dimensions.svgWidth) + .attr("height", 0.2 * this.dimensions.svgHeight) + .attr("fill", "white"); + + d3.select("svg") + .append("text") + .attr("class", "hider-text") + .text("Oops! All features were filtered.") + .attr("x", this.dimensions.svgWidth / 2) + .attr("y", this.dimensions.svgHeight / 2) + .attr("dominant-baseline", "middle") + .attr("text-anchor", "middle") + .attr("font-size", "18px"); + } + + /** + */ + showPlot() { + d3.selectAll(".hider, .hider-text, .hider-text-box").remove(); + } +} + +const plot = new DivergingBarplot(); +export default plot; diff --git a/q2_composition/_da_barplot/src/util/taxonomy.svelte.ts b/q2_composition/_da_barplot/src/util/taxonomy.svelte.ts new file mode 100644 index 0000000..d362f6d --- /dev/null +++ b/q2_composition/_da_barplot/src/util/taxonomy.svelte.ts @@ -0,0 +1,729 @@ +import { tsv } from "d3-fetch"; +import * as d3 from "d3"; + +type PlotDimensions = { + margin: number; + nodeWidth: number; + nodeHeight: number; + boxHeight: number; + boxWidth: number; +}; + +export class TaxonomyPlot { + dimensions: PlotDimensions; + root: d3.HierarchyNode; + treeLayout: d3.TreeLayout; + link: d3.Link; + + selectedTaxon: TaxonomyNode | null = $state(null); + hideFiltered: boolean = false; + + constructor(root: d3.HierarchyNode) { + this.root = root; + this.initTree(this.root); + + this.dimensions = this.getDimensions(); + this.treeLayout = this.createTreeLayout(); + this.link = this.createLinkGenerator(); + + this.initSvg(); + } + + initTree(root: d3.HierarchyNode) { + root.descendants().forEach((node, i) => { + node._children = node.children; + node.id = i; + node.children = null; + node.expand = false; + node.keep = false; + node.match = false; + }); + } + + getSvgDimensions() { + const svg = d3.select("#taxonomy-svg-container svg"); + + if (svg.empty()) { + throw new Error("No svg element found."); + } + + const svgRect = (svg.node() as any).getBoundingClientRect(); + + return { width: svgRect.width, height: svgRect.height }; + } + + getDimensions() { + const margin = 25; + + const { width: svgWidth, height: svgHeight } = this.getSvgDimensions(); + + const taxonomyDepth = this.root.height; + const nodeWidth = 225; + const nodeHeight = 30; + + const dimensions: PlotDimensions = { + margin: margin, + nodeHeight: nodeHeight, + nodeWidth: nodeWidth, + boxWidth: 0.8 * nodeWidth, + boxHeight: 0.8 * nodeHeight, + }; + + return dimensions; + } + + createTreeLayout(): d3.TreeLayout { + const treeLayout = d3 + .tree() + .nodeSize([this.dimensions.nodeHeight, this.dimensions.nodeWidth]); + + return treeLayout; + } + + createLinkGenerator(): d3.Link { + return d3 + .linkHorizontal() + .x((d) => d.y) + .y((d) => d.x); + } + + initSvg() { + const svg = d3.select("#taxonomy-svg-container svg"); + + // create groups for nodes and links + const zoomContainer = svg.append("g"); + zoomContainer.append("g").attr("class", "link-group"); + zoomContainer.append("g").attr("class", "node-group"); + + // set svg view box + const { width: svgWidth, height: svgHeight } = this.getSvgDimensions(); + + svg.attr("viewBox", [ + -this.dimensions.margin, + -svgHeight / 2, + svgWidth, + svgHeight, + ]); + + // make svg zoomable & pannable + const zoom = d3 + .zoom() + .scaleExtent([0.4, 2]) + .on("zoom", (event) => { + zoomContainer.attr("transform", event.transform); + }); + + svg.call(zoom).on("dblclick.zoom", null); + } + + addSelectHandlers() { + d3.selectAll(".taxonomy-node").on("click", (event, d) => { + this.selectedTaxon = d.data; + }); + } + + addExpandHandlers() { + d3.selectAll(".expand-button").on("click", (event, d) => { + d.expand = !d.expand; + this.render(d); + + event.stopPropagation(); + }); + } + + addKeepHandlers() { + d3.selectAll(".keep-button").on("click", (event, d) => { + d.keep = !d.keep; + + const fillColor = d.keep ? "orange" : "lightgray"; + d3.select(event.currentTarget) + .select("rect") + .attr("fill", fillColor); + + this.render(d); + + event.stopPropagation(); + }); + } + + drawButton( + selection: d3.Selection, + type: "expand" | "keep", + ) { + let xTranslation; + let className; + let letter; + if (type == "expand") { + xTranslation = this.dimensions.boxWidth - this.dimensions.boxHeight; + className = "expand-button"; + letter = "E"; + } else if (type == "keep") { + xTranslation = + this.dimensions.boxWidth - 2 * this.dimensions.boxHeight; + className = "keep-button"; + letter = "K"; + } else { + throw new Error("Unrecognized button type."); + } + + const button = selection + .append("g") + .attr("class", className) + .attr("transform", `translate(${xTranslation}, 2)`); + + button + .append("rect") + .attr("width", this.dimensions.boxHeight - 4) + .attr("height", this.dimensions.boxHeight - 4) + .attr("fill", "lightgray"); + + if (type == "keep") { + button + .selectAll("rect") + .attr("fill", (d) => (d.keep ? "orange" : "lightgray")); + } + + button + .append("text") + .text(letter) + .attr("x", this.dimensions.boxHeight / 2 - 2) + .attr("y", this.dimensions.boxHeight / 2 - 2) + .attr("dominant-baseline", "middle") + .attr("text-anchor", "middle") + .attr("font-size", 14) + .attr("dy", 2); + } + + drawNodes( + nodes: d3.HierarchyNode[], + source: d3.HierarchyNode, + ) { + const updateSelection = d3 + .select(".node-group") + .selectAll(".taxonomy-node") + .data(nodes, (d) => d.id); + + // create entering node groups + const enterSelection = updateSelection + .enter() + .append("g") + .attr("class", "taxonomy-node") + .attr("cursor", "pointer") + .attr("transform", (d) => `translate(${source.y0}, ${source.x0})`) + .attr("stroke-opacity", 1) + .attr("fill-opacity", 1); + + // taxon names + enterSelection + .append("text") + .text((d) => { + if (d.data.name.length > 18) { + return d.data.name.slice(0, 15) + "..."; + } + return d.data.name; + }) + .attr("dx", 10) + .attr("y", this.dimensions.boxHeight / 2) + .attr("dominant-baseline", "middle") + .attr("stroke-linejoin", "round") + .attr("stroke-width", 5) + .attr("stroke", "white") + .attr("paint-order", "stroke") + .attr("font-weight", "bold") + .attr("font-size", 13); + + // draw taxon boxes + enterSelection + .append("rect") + .attr("class", "taxon-box") + .attr("height", this.dimensions.boxHeight) + .attr("width", this.dimensions.boxWidth) + .attr("fill", (d) => { + if (d.data.searchMatch) return "green"; + if (d.data.filtered) return "red"; + return "white"; + }) + .attr("stroke", "gray") + .attr("stroke-width", 2) + .attr("rx", 2) + .attr("ry", 2) + .attr("stroke-opacity", 1) + .attr("fill-opacity", (d) => { + if (d.data.searchMatch || d.data.filtered) { + return 0.2; + } + return 0; + }); + + // left circle + enterSelection + .append("circle") + .attr("cx", 0) + .attr("cy", this.dimensions.boxHeight / 2) + .attr("r", 3) + .attr("fill", "#555"); + + // right circle; visible only if node has children + enterSelection + .append("circle") + .attr("class", "right-circle") + .attr("cx", this.dimensions.boxWidth) + .attr("cy", this.dimensions.boxHeight / 2) + .attr("r", (d) => { + let kept = d._children; + if (this.hideFiltered) { + kept = d._children?.filter((n) => !n.data.filtered); + } + if (kept && kept.length > 0) { + return 3; + } + return 0; + }) + .attr("fill", "#555"); + + updateSelection.selectAll(".right-circle").attr("r", (d) => { + let kept = d._children; + if (this.hideFiltered) { + kept = d._children?.filter((n) => !n.data.filtered); + } + if (kept && kept.length > 0) { + return 3; + } + return 0; + }); + + // color search matches + updateSelection + .selectAll(".taxon-box") + .attr("fill", (d) => { + if (d.data.searchMatch) return "green"; + if (d.data.filtered) return "red"; + return "white"; + }) + .attr("fill-opacity", (d) => { + if (d.data.searchMatch || d.data.filtered) { + return 0.2; + } + return 0; + }); + + this.drawButton(enterSelection, "expand"); + this.drawButton(enterSelection, "keep"); + + // add click event handlers + this.addSelectHandlers(); + this.addExpandHandlers(); + this.addKeepHandlers(); + + // color buttons + updateSelection + .merge(enterSelection) + .selectAll(".expand-button") + .select("rect") + .attr("fill", (d) => { + if (d.children && d.children.length == d._children.length) { + return "lightblue"; + } else { + return "lightgray"; + } + }); + + updateSelection + .merge(enterSelection) + .selectAll(".keep-button") + .select("rect") + .attr("fill", (d) => (d.keep ? "orange" : "lightgray")); + + // transition all nodes to their new positions + updateSelection + .merge(enterSelection) + .transition() + .duration(200) + .attr("transform", (d) => `translate(${d.y}, ${d.x})`) + .attr("fill-opacity", 1) + .attr("stroke-opacity", 1); + + // transition exiting nodes to parents' new positions + updateSelection + .exit() + .transition() + .duration(200) + .remove() + .attr("transform", (d) => `translate(${source.y}, ${source.x})`) + .attr("fill-opacity", 0) + .attr("stroke-opacity", 0); + } + + drawLinks( + links: d3.HierarchyLink[], + source: d3.HierarchyNode, + ) { + const updateSelection = d3 + .select(".link-group") + .selectAll(".taxonomy-link") + .data(links, (d) => d.target.id); + + // create entering link paths + const enterSelection = updateSelection + .enter() + .append("path") + .attr("class", "taxonomy-link") + .attr("fill", "none") + .attr("stroke", "#555") + .attr("stroke-opacity", 0.5) + .attr("stroke-width", 1.5) + .attr("d", (d) => { + const parentOld = { x: source.x0, y: source.y0 }; + return this.link({ source: parentOld, target: parentOld }); + }); + + // transition all links to their new shapes + updateSelection + .merge(enterSelection) + .transition() + .duration(200) + .attr("d", (d) => { + const sourceX = d.source.x! + this.dimensions.boxHeight / 2; + const targetX = d.target.x! + this.dimensions.boxHeight / 2; + + const sourceY = d.source.y! + this.dimensions.boxWidth; + const targetY = d.target.y!; + + const positions = { + source: { x: sourceX, y: sourceY }, + target: { x: targetX, y: targetY }, + }; + return this.link(positions); + }); + + // transition exiting links to parent's new position + updateSelection + .exit() + .transition() + .duration(200) + .remove() + .attr("d", (d) => { + const parentNew = { x: source.x, y: source.y }; + return this.link({ source: parentNew, target: parentNew }); + }); + } + + assignChildren(node: d3.HierarchyNode): boolean { + let keptDescendant = node.keep || node.data.searchMatch; + + if (this.hideFiltered && node.data.filtered) { + return false; + } + + // leaf + if (!node._children) { + return keptDescendant; + } + + node.children = []; + for (let child of node._children) { + if (this.assignChildren(child)) { + node.children.push(child); + keptDescendant = true; + } + } + + if (node.expand) { + node.children = node._children; + if (this.hideFiltered) { + node.children = node.children.filter((n) => !n.data.filtered); + } + } + + if (node.children!.length == 0) { + node.children = undefined; + } + + return keptDescendant; + } + + render(source: d3.HierarchyNode) { + // update visible children + this.assignChildren(this.root); + + // gather all expanded nodes and links + const nodes = this.root.descendants().reverse(); + const links = this.root.links(); + + // assign coordinates to nodes + this.treeLayout(this.root); + + // const transition = this.resizeSvg(); + this.drawLinks(links, source); + this.drawNodes(nodes, source); + + // store the current positions for the next render + this.root.eachBefore((node) => { + node.x0 = node.x; + node.y0 = node.y; + }); + } +} + +export class TaxonomyNode { + name: string; + parent: TaxonomyNode | null; + children: TaxonomyNode[]; + featureIDs: string[]; + hierarchyNode: d3.HierarchyNode | null; + searchMatch: boolean = false; + filtered: boolean = false; + + constructor(name: string, parent: TaxonomyNode | null) { + this.name = name; + this.parent = parent; + this.children = []; + this.featureIDs = []; + this.hierarchyNode = null; + } + + getChild(name: string): TaxonomyNode | null { + let matchingChildren = this.children.filter((child) => { + return child.name == name; + }); + + if (matchingChildren.length > 1) { + throw new Error("More than one matching child found."); + } + if (matchingChildren.length == 0) { + return null; + } + + return matchingChildren[0]; + } + + getRoot(): TaxonomyNode { + let currentNode: TaxonomyNode = this; + while (currentNode.parent != null) { + currentNode = currentNode.parent; + } + + return currentNode; + } + + getDescendants(): TaxonomyNode[] { + const descendants: TaxonomyNode[] = [this]; + for (let child of this.children) { + descendants.push(...child.getDescendants()); + } + + return descendants; + } + + findTaxa(name: string): TaxonomyNode[] { + const root = this.getRoot(); + const descendants = root.getDescendants(); + + const matches = descendants.filter((descendant) => { + const index = descendant.name + .toLowerCase() + .indexOf(name.toLowerCase()); + + return index != -1 && !descendant.filtered; + }); + + return matches; + } + + findTaxonById(id: string): TaxonomyNode | null { + const descendants = this.getRoot().getDescendants(); + const matches = descendants.filter((descendant) => { + return descendant.featureIDs.indexOf(id) != -1; + }); + + if (matches.length == 0) { + return null; + } else if (matches.length == 1) { + return matches[0]; + } else { + throw new Error( + "More than one taxonomy node with the same feature ID.", + ); + } + } + + getAncestors(): TaxonomyNode[] { + const ancestors = []; + let currentNode: TaxonomyNode = this; + while (currentNode.parent != null) { + ancestors.push(currentNode); + currentNode = currentNode.parent; + } + + return ancestors; + } + + getFullTaxonString(): string { + const ancestorNames = this.getAncestors() + .reverse() + .map((a) => a.name); + + return ancestorNames.join(";"); + } + + /** + * Gets the shortest taxonomy string that contains a non-anonymous level + * label. + * + * Examples: + * (...);f__family;g__genus;s__ => g__genus;s__ + * (...);o__order;f__family;g__;s__ => f__family;g__;s__ + * (...);g__genus;s__species => s__species + */ + getNonAnonymousTaxonString(): string { + if (this.parent == null) return "root"; + + const ancestorNames = this.getAncestors() + .reverse() + .map((a) => a.name); + + let lastNonAnonymousIndex = null; + for (const [index, ancestorName] of ancestorNames.entries()) { + if (ancestorName.slice(-2) != "__") { + lastNonAnonymousIndex = index; + } + } + if (lastNonAnonymousIndex == null) lastNonAnonymousIndex = 0; + + return ancestorNames.slice(lastNonAnonymousIndex).join(";"); + } + + getFeatureCount(): number { + return this.featureIDs.length; + } + + getSubtreeFeatureCount(): number { + let subtreeCount = this.getFeatureCount(); + + for (let child of this.children) { + subtreeCount += child.getSubtreeFeatureCount(); + } + + return subtreeCount; + } + + getTreeFeatureCount(): number { + return this.getRoot().getSubtreeFeatureCount(); + } + + clearSearchMatches() { + this.getRoot() + .getDescendants() + .forEach((n) => { + n.searchMatch = false; + }); + } +} + +export class TaxonomyFilters { + filters: ((node: TaxonomyNode) => boolean)[] = $state([]); + taxonomyRoot: TaxonomyNode; + + constructor(taxonomyRoot: TaxonomyNode) { + this.filters = []; + this.taxonomyRoot = taxonomyRoot; + } + + addFeatureCountFilter(featureCount: number) { + const filter = (node: TaxonomyNode) => { + return node.getSubtreeFeatureCount() < featureCount; + }; + + filter.type = "feature-count"; + filter.value = featureCount; + + this.filters = [...this.filters, filter]; + } + + removeFeatureCountFilter(value: number) { + this.filters = this.filters.filter((f) => { + if (f.type != "feature-count") return true; + + return !(f.value == value); + }); + } + + addIndividualFilter(filterNode: TaxonomyNode) { + const filter = (node: TaxonomyNode) => { + return node == filterNode; + }; + + filter.type = "individual"; + filter.node = filterNode; + + this.filters = [...this.filters, filter]; + } + + removeIndividualFilter(filterNode: TaxonomyNode) { + this.filters = this.filters.filter((f) => { + if (f.type != "individual") return true; + + return !(f.node == filterNode); + }); + } + + applyFilters() { + const nodes = this.taxonomyRoot.getDescendants(); + + nodes.forEach((node) => (node.filtered = false)); + + nodes.forEach((node) => { + for (let filter of this.filters) { + node.filtered = filter(node); + if (node.filtered) return; + } + }); + } +} + +/** + * Parses a taxonomy.tsv file into a d3.hierarchy. + */ +export async function parseTaxonomy( + taxonomyFilepath: string, +): Promise> { + const taxonomyRecords = await tsv(taxonomyFilepath); + + const root = new TaxonomyNode("root", null); + + for (let taxonRecord of taxonomyRecords) { + const levelNames = taxonRecord["Taxon"] + .split(";") + .filter((n) => n != ""); + const featureId = taxonRecord["Feature ID"]; + + let parentNode = root; + for (let [levelIndex, levelName] of levelNames.entries()) { + const currentNode = new TaxonomyNode(levelName, parentNode); + + // if this is the last level then it has a feature ID + if (levelIndex == levelNames.length - 1) { + currentNode.featureIDs.push(featureId); + } + + // merge with matching child if one exists + const matchingChild = parentNode.getChild(levelName); + if (matchingChild) { + matchingChild.featureIDs.push(...currentNode.featureIDs); + parentNode = matchingChild; + } else { + parentNode.children.push(currentNode); + parentNode = currentNode; + } + } + } + + const hierarchyRoot = d3.hierarchy(root); + + // create back references from TaxonomyNodes to d3 nodes + hierarchyRoot.eachBefore((node) => { + node.data.hierarchyNode = node; + }); + + return hierarchyRoot; +} diff --git a/q2_composition/_da_barplot/src/vite-env.d.ts b/q2_composition/_da_barplot/src/vite-env.d.ts new file mode 100644 index 0000000..4078e74 --- /dev/null +++ b/q2_composition/_da_barplot/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/q2_composition/_da_barplot/svelte.config.js b/q2_composition/_da_barplot/svelte.config.js new file mode 100644 index 0000000..b0683fd --- /dev/null +++ b/q2_composition/_da_barplot/svelte.config.js @@ -0,0 +1,7 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' + +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +} diff --git a/q2_composition/_da_barplot/tests/data/output-format/W.jsonl b/q2_composition/_da_barplot/tests/data/output-format/W.jsonl new file mode 100644 index 0000000..b2b60e3 --- /dev/null +++ b/q2_composition/_da_barplot/tests/data/output-format/W.jsonl @@ -0,0 +1,9 @@ +{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} +{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":-1235411664.1230688095,"body-site::left palm":15.5292100831,"body-site::right palm":10.7105143567,"body-site::tongue":8.3444601801,"year":90816.4971581012} +{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":-861683502.712356925,"body-site::left palm":12.8611438894,"body-site::right palm":20.1786232328,"body-site::tongue":-1.1898355664,"year":83819.0848453717} +{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":-961414485.8867735863,"body-site::left palm":16.4795912965,"body-site::right palm":8.1245010178,"body-site::tongue":-6.2934466966,"year":60330.7200633827} +{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":-625235541.3033596277,"body-site::left palm":6.403687463,"body-site::right palm":-7.4625854074,"body-site::tongue":-31.4808951948,"year":57525.0512022309} +{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":-668967508.3477175236,"body-site::left palm":8.9335789656,"body-site::right palm":8.1319547063,"body-site::tongue":-3.7156614085,"year":50694.0094878902} +{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":-604964203.058027029,"body-site::left palm":7.1165557658,"body-site::right palm":15.0396253547,"body-site::tongue":-5.8999027765,"year":52435.7146843889} +{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":-565497775.4869476557,"body-site::left palm":9.8580413537,"body-site::right palm":8.676120271,"body-site::tongue":-2.8743821139,"year":47264.5415720465} +{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":-412024.2829955241,"body-site::left palm":17.9672217594,"body-site::right palm":21.8192771315,"body-site::tongue":-3.4455303863,"year":null} diff --git a/q2_composition/_da_barplot/tests/data/output-format/diff.jsonl b/q2_composition/_da_barplot/tests/data/output-format/diff.jsonl new file mode 100644 index 0000000..3381cca --- /dev/null +++ b/q2_composition/_da_barplot/tests/data/output-format/diff.jsonl @@ -0,0 +1,9 @@ +{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} +{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} +{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":true} +{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} +{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} +{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} +{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} +{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} +{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":false} diff --git a/q2_composition/_da_barplot/tests/data/output-format/lfc.jsonl b/q2_composition/_da_barplot/tests/data/output-format/lfc.jsonl new file mode 100644 index 0000000..99fab10 --- /dev/null +++ b/q2_composition/_da_barplot/tests/data/output-format/lfc.jsonl @@ -0,0 +1,9 @@ +{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} +{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":-381187.7596056733,"body-site::left palm":99.9213043999,"body-site::right palm":75.1103468794,"body-site::tongue":37.6196966908,"year":189.6871124062} +{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":-363784.8371233153,"body-site::left palm":113.4173262332,"body-site::right palm":130.8411801231,"body-site::tongue":-7.817212847,"year":181.01108921} +{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":-275242.5772360777,"body-site::left palm":98.2119684127,"body-site::right palm":69.6255589629,"body-site::tongue":-31.5738984682,"year":136.9430983631} +{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":-227115.1882186811,"body-site::left palm":48.6007069953,"body-site::right palm":-32.7277940736,"body-site::tongue":-135.9171411395,"year":112.9844146537} +{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":-312280.1775272848,"body-site::left palm":86.9453579935,"body-site::right palm":88.2926908605,"body-site::tongue":-42.8747204223,"year":155.3791414063} +{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":-253102.4472176514,"body-site::left palm":62.1326028539,"body-site::right palm":100.5600775815,"body-site::tongue":-56.6271362907,"year":125.9261668175} +{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":-313151.4841887562,"body-site::left palm":113.9514973012,"body-site::right palm":94.7169124597,"body-site::tongue":-34.179869551,"year":155.8080157617} +{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":-130.7117681704,"body-site::left palm":119.0321247894,"body-site::right palm":84.6142672425,"body-site::tongue":-13.2813695394,"year":null} diff --git a/q2_composition/_da_barplot/tests/data/output-format/p.jsonl b/q2_composition/_da_barplot/tests/data/output-format/p.jsonl new file mode 100644 index 0000000..79fe01e --- /dev/null +++ b/q2_composition/_da_barplot/tests/data/output-format/p.jsonl @@ -0,0 +1,9 @@ +{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} +{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":2.064070103e-70,"body-site::left palm":0.0000002944,"body-site::right palm":0.0000050731,"body-site::tongue":0.0000321986,"year":2.420471904e-37} +{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":6.459829583e-94,"body-site::left palm":0.0000000569,"body-site::right palm":0.0000000005,"body-site::tongue":0.2591582754,"year":8.755371043e-50} +{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":2.310737191e-44,"body-site::left palm":0.0000150172,"body-site::right palm":0.0004584471,"body-site::tongue":0.001489409,"year":2.374714022e-23} +{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":4.795885034e-68,"body-site::left palm":0.0002083127,"body-site::right palm":0.0000717806,"body-site::tongue":0.0000000011,"year":9.340323274e-36} +{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":5.110191021e-149,"body-site::left palm":0.0000000492,"body-site::right palm":0.000000194,"body-site::tongue":0.001582484,"year":7.525025925e-75} +{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":3.162424539e-92,"body-site::left palm":0.0000195101,"body-site::right palm":0.0000000111,"body-site::tongue":0.000103132,"year":1.524570474e-47} +{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":2.079293839e-171,"body-site::left palm":0.0000000025,"body-site::right palm":0.0000000219,"body-site::tongue":0.0090756756,"year":8.989184521e-86} +{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":2.081900652e-22,"body-site::left palm":0.0000564042,"body-site::right palm":0.0000261055,"body-site::tongue":0.0261610926,"year":1.0} diff --git a/q2_composition/_da_barplot/tests/data/output-format/passed_ss.jsonl b/q2_composition/_da_barplot/tests/data/output-format/passed_ss.jsonl new file mode 100644 index 0000000..be48034 --- /dev/null +++ b/q2_composition/_da_barplot/tests/data/output-format/passed_ss.jsonl @@ -0,0 +1,9 @@ +{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} +{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} +{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} +{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} +{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} +{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":true} +{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":true} +{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":true} +{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":false} diff --git a/q2_composition/_da_barplot/tests/data/output-format/q.jsonl b/q2_composition/_da_barplot/tests/data/output-format/q.jsonl new file mode 100644 index 0000000..2cf55c0 --- /dev/null +++ b/q2_composition/_da_barplot/tests/data/output-format/q.jsonl @@ -0,0 +1,9 @@ +{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} +{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":8.256280413e-70,"body-site::left palm":0.0000014722,"body-site::right palm":0.0000202926,"body-site::tongue":0.00022539,"year":9.681887616e-37} +{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":3.87589775e-93,"body-site::left palm":0.0000003442,"body-site::right palm":0.0000000039,"body-site::tongue":0.2591582754,"year":5.253222626e-49} +{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":4.621474383e-44,"body-site::left palm":0.0000600688,"body-site::right palm":0.0004584471,"body-site::tongue":0.0074470448,"year":4.749428044e-23} +{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":1.43876551e-67,"body-site::left palm":0.0002083127,"body-site::right palm":0.0001435613,"body-site::tongue":0.000000009,"year":2.802096982e-35} +{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":3.577133715e-148,"body-site::left palm":0.0000003442,"body-site::right palm":0.0000009699,"body-site::tongue":0.0074470448,"year":5.267518147e-74} +{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":1.58121227e-91,"body-site::left palm":0.0000600688,"body-site::right palm":0.0000000776,"body-site::tongue":0.0006187922,"year":7.622852369e-47} +{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":1.663435072e-170,"body-site::left palm":0.0000000199,"body-site::right palm":0.0000001314,"body-site::tongue":0.0272270269,"year":7.191347617e-85} +{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":2.081900652e-22,"body-site::left palm":0.0001128084,"body-site::right palm":0.0000783166,"body-site::tongue":0.0523221852,"year":1.0} diff --git a/q2_composition/_da_barplot/tests/data/output-format/se.jsonl b/q2_composition/_da_barplot/tests/data/output-format/se.jsonl new file mode 100644 index 0000000..2bc7fc3 --- /dev/null +++ b/q2_composition/_da_barplot/tests/data/output-format/se.jsonl @@ -0,0 +1,9 @@ +{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} +{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":0.0003085512,"body-site::left palm":6.4344099839,"body-site::right palm":7.0127674898,"body-site::tongue":4.5083439646,"year":0.0020886856} +{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":0.0004221792,"body-site::left palm":8.8186033224,"body-site::right palm":6.484148032,"body-site::tongue":6.5699942647,"year":0.002159545} +{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":0.0002862892,"body-site::left palm":5.9596119009,"body-site::right palm":8.569825865,"body-site::tongue":5.01694858,"year":0.0022698734} +{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":0.0003632474,"body-site::left palm":7.5894876626,"body-site::right palm":4.3855838542,"body-site::tongue":4.3174484175,"year":0.0019640906} +{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":0.0004668092,"body-site::left palm":9.7324217235,"body-site::right palm":10.8574990945,"body-site::tongue":11.5389201837,"year":0.0030650395} +{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":0.0004183759,"body-site::left palm":8.7307125663,"body-site::right palm":6.6863419274,"body-site::tongue":9.5979778711,"year":0.0024015343} +{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":0.0005537625,"body-site::left palm":11.5592431815,"body-site::right palm":10.9169662823,"body-site::tongue":11.8912058998,"year":0.0032965096} +{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":0.0003172429,"body-site::left palm":6.6249599623,"body-site::right palm":3.8779592345,"body-site::tongue":3.8546662053,"year":null} diff --git a/q2_composition/_da_barplot/tests/data/output-format/structural-zeros.jsonl b/q2_composition/_da_barplot/tests/data/output-format/structural-zeros.jsonl new file mode 100644 index 0000000..79a81b4 --- /dev/null +++ b/q2_composition/_da_barplot/tests/data/output-format/structural-zeros.jsonl @@ -0,0 +1,771 @@ +{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::gut","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"gut","reference":"gut"}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}}],"index":[],"title":"","description":"","extra":{}} +{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"d29fe3c70564fc0f69f2c03e0d1e5561","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"868528ca947bc57b69ffdf83e6b73bae","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"154709e160e8cada6bfb21115acc80f5","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"1d2e5f3444ca750c85302ceee2473331","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"0305a4993ecf2d8ef4149fdfc7592603","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"cb2fe0146e2fbcb101050edb996a0ee2","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"997056ba80681bbbdd5d09aa591eadc0","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"3c9c437f27aca05f8db167cd080ff1ec","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"9079bfebcce01d4b5c758067b1208c31","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"bfbed36e63b69fec4627424163d20118","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"90d32ffe026535b392c0bad850f213c4","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ab4ef4399912b0507d8d1187e874684d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"d86ef5d6394f5dbeb945f39aa25e7426","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a049763053c277b16c2a318f41eb23b4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"699071a4a7ce68918e4cd93a61275ecd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"cdd14cce4ec44b3235923652b71e947e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"7e598ad34909a3fb8ff1623f1ede11a6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"e8e6b7fc969005938de8ac7ffb94f17c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"535696cecf56f03d3401d7d6dbe66d7b","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9f718b8f66b79c3de80546ca9a54539c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"f352c1f1efecf483511c2270aabd0ae6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"fd86856409fe6433d719558a30910515","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"44ff26d8105cf822417b4b0c4eb27c02","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ad41fe8f8be5b01c96549309937e3b14","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"909755d7142ea53c7f61c97c3586f26c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"fcd4f95c05b868060121ff709085bf21","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ab6b063ed43d8cb3008e157a0a305c47","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"57b34afdff2e84fb9b0befd219edcb38","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"047b7fb62a5e9d2711e639ae1cb1519a","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"0160e14a78b18b903618f11bc732746e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"d2613a43f4ed1dda8a673e7fb251ebef","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e31b5affbe5e23b79a8619589f3b6620","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"7dd9c9124ec3f118a6cef1f0d422c011","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"67e23140639733766b7e127f50221289","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"01e0b7ac306895be84179f2715af269b","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"500d6b485cef4c52aad211d6d6e6dbc7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1685b25b43eb070cd7655de8c2d8c0a4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"db793caa585e078770021a7979ae8ea2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ee0fb26fca3afb05e0b288d6fcab899e","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d1d750ce3b00503c204516d27ca0d3b0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"ebe0e9790089ad4f40151cb4a3231a8f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"b685f8246fb6fad0fd91574c444b8f51","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"636c27859c1ac0a7994ca8ed145d03fe","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f35ce9c514e1398308f5f84ed50b260f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"79e9e337b10e2d298bb1b3bde946782d","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0a69950e803a5d9e7166c450e44f43cf","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e5c80b4a23b96b2fa35b6da6cac2bf73","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9118606a87ac19f8d041da20f16f3236","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d8e8459398f3f096775f4298666880a7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"fba3d9b3872ff9021d66434323fb9565","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"ae27459b7f5465815b1f565d792083ce","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"4fdf8dcd9451f5742982d716fa9f0536","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"4ea5683e2c2a183c11c45dc8fbd0c67c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"469e4ff2129066178b74b112829fc03c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6edca9464612efff71d8f97299f01663","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"41fedaa9200e2933821f84ecdc0b0772","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"41735c13fb7f63db49b10fba5d959ce3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"54d098d009b89779530eaf43a1bb136a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"76174505aef45f134d8068d5ad2c42aa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b8afb7bb30b7a9170b7c6dcd40251d54","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"4c4606a3dbb4f5b8bb1ad1db6dfc5617","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3ef461f213bfc675ddf0b1bfeef2dc52","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"1f50ac250618ced095a2a5c34bae7651","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"b3d4d129c955517b446df657236ba5a2","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"fc15824cd9e9c29e1319d32843452b54","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f8f937eeee7762f446a0e87292f98eb6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"b2866fdca13681232057e3e85a1978cf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"052128d7d424728578efe7852b0afd0d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"fc5b641a0b0408d99ddfb2a5ba64da59","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2514cdaab96a1a42cf15506f2ecf6439","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"e0472171de6fa02a1f58e392ad3d000e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e063d1c3c9daf7390e5475e48d9b01c5","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"958bc15b660bce0b894665d13f910f5b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1b448e00c078f81e49a61933072345d2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2e55763e77234a7bfc3a311067a0c7e1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"162ed46308ef9dd1600fb0fe7c90b186","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9af77e369d2ba4b3bb6e0e808ed84d91","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e77bac543df42865af751a32a2942fdb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"5ada68b9a081358e1a7d5f1d351e656a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"f8a71161ac98c5ceafcc75e57ace7230","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"26b8b1509edf09c438db1634308c3c90","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"3ae3e825c5e3862af6c17798e2b40a37","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"26133b4163fdcd22d86f4e04e74154f1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"29a92aecac56c855cbfc0debf9bda0c8","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e737a3a864791ec52f1398d83786f4f2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"880968796af86b3d6270c228fe8e7026","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"81351ef6b4d49a3a6b2fc24745d70305","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c4aad64f84f51ff331b986a67af4ed3d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"79dcabe7f92f8cf2723b796dcd2f239f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"7a5d5e6f85da7ca91daa2d803e8f9279","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"401d7866836c54f3cd18bd0fc814885e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"75258a676bcd7e73c2437d6a2012d490","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"839fafb762395fab1ba257442ec29e7f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6b82e6cb771d45d6c925405b66299d7f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5c82bad13c4ebd2ed1bd23a8c2e37fc5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"f59a4d48a03cc224462bf83e4d4ab126","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"eecc4a4317225eb579540e82ab785716","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a895b66cac813ac67ce1c908259b646f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"acfe4c003905a7074aeaf385b78ad9e0","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"684721318896ed01048f3502333c214d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2ff525a1e58c54525e7f2d68a6c0b23e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"d781fa7e866ac295ce9a56bd97912983","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"0b925631436d3775231b60f9d0011cae","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a5551fc60aa8bbaab737487552ea2a75","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"a4c08e2c3a34038ea877b16d01736837","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4075a90811bf9c19f02f5aa2ece6da37","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4980b85712efeef1fc4563a9a949fe2e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f91c81859bf6eede55eef9c915dd8bab","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5601f094afc823d75ccb34440645a99e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"21a0198d0a83a8f3ec0e401067138940","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"56c98126dde3abb2d263088db55e12c8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a659784c026bd9c8cde94da36aa656d7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"f16a387e898dbae6432b2ed0241120bd","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3125abe90c7ae91aec06eb104d71845f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b383ade799e9c83c649cec37705a251d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3bf2fc236887eda11c969b84d30f9fbf","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3cdd97ba69a504117de24626ba790e96","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4132561a08d25757e4bee9f73ec4a70a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"30faafef155964edd9db9374f36c45bf","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"9d3ec96491b522546acbdfa3b21b6071","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"fb4f7d9d3f91ac2f22a542fbd13019c1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b0f7e29de400c6b517b39230dc1b4365","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"393e6e2cbe258ed27a4ca0a2ee0d2cdc","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"1d17561d16d803f652b0d6bdd671c1cc","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3982159c2603cacc4bc4893003bda323","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b1e22f094d8c64fb56dbacf680dab8c9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"b92e89d105e0a6e09e5984879c4c7809","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a5df9a825c3d8eeb228a6781c3db134c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ff3df50eea7490dd794148649c480fd3","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3a1c2d5547ddb7f76306a042f8bef6a4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8da02c7114ba0d9ee40312926e037a8f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"87899779aec8d38dfaf48d895cfe8021","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d46bfd723f625e317606ae28580eba3e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"145f11599b92ad3a4c93896b0edf8c0c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"846cbaf603b77be035fe0cb61d14a23c","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e8fb2b3d01d369dbb5d3764548193ae9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"7eedfc5c8d0d6b8852fabb20d52a8c5d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c4f955168102011d272b685aa772c10a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"513de43781dc4c2831eb83b23940d66b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"13692c41b4bf5d577c28c278caafcddb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1d284bea12006c939c03d622ce2abd5e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"24443b70088636edf08f0c9572d7faf4","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"185df2b73b4805164470dfaea2d05223","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2f4c5e75c0e4cdfcbddbe93ef1f410a3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1b963d0d7457ac133aed9497f03b5a64","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"bb370945a6777f712cfd963c55f2ff54","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ed950935b660fb10449d5f229dc13fb9","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"59fefb91cc66ef6930b0201e4bf24cbb","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"1f0a072da4906270a684a389c1586582","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"aa668eb01ca9dcc59aeb1454b600c8c8","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"724c43ad3632cb8c5c6230c874551bd2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"44543d9c6bb193c64d38c9bdb6790eec","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"d3e265209c342d15d93a910e38ad9be2","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"626b8ee112be0ec208bb16445611d001","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9590aed21545774c71a124f2b5200691","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3a69cb2f27ac76a05405efbb5088d249","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"475741f076c42d2c75d2d63c14fe4d3f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"8cd2a871fab61bdea4ef23a295c371cf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"84755bc954af6d3b39bb4c369e5992e7","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5437cb1c86c72638cbbc12896f88d1b1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"848587c4a03949500c5815bd6edb7b6e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"cba5f5b1153235425628bd77a28257c7","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"063fa4f5a6fa894f7f8243468324ac5e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"49232f27012731b0a65805c0919e2bbc","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"4b8228f4d7d3809aa6827e8d9e11a9ae","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"c99439f78b73ffcf55858ae828aac608","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2fa276cce32e900f0f68d30e460b8f61","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4ce1be9cea00a1eb7f960600e1ff3cfa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1b75626f6834620dc2c729a1a81f497a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f023384b8f989d014dd2ead7f10db307","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"344b020d867e3210563eaf40b0c557ef","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"dd7e1e45831871f719cc3cd68f568e7c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"16564bc936c839c893f951bab613a30b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"24523c45ca39b6c81a01ce286c0c092b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b5bf6383b53e0add0d6589b73949462a","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"51ddb685cfb1775931489ebbd3eef6ca","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c5b61a414bdb4305544bb4f941e0bfc9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"24dfe6a7325e4f2be7dbd522ef613e42","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"465e9cab9abce306c1e0f7459b325c33","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3e2c7eb0316409806267a8d9845b0b13","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"136e9f5aa470119165e59d202fdb318c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"b8b19c4f0719a5d5b965a0f50f05827c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"4a5387c4bc61f2d8f3d9d2de983ba556","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"77a517253ff10afeb78a37bc13d649a0","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"07b2b1c3771f46d82c90b20a79fb3d04","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"30a88dc67e6a522087c3dfc8019550a6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"91d0b3b7c0329b9a164b6e04a181f1d6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"14d168c89e381de6fc3091837a557e48","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9616cf56be891f816aa7abc6a13c9e8f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"fea5c05e9b8245c5ca46f6673f59e0bf","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"32875774cffdc8c820f91d8e86f9a0e6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"67f9c74eeea5a4609bd1d2fab66ad3cc","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ca96b8fd01aa6c508305bacac37da6c2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"43a9c44adeac51fd3ab95081da56d02d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"0bd7addf1b999f01ad58fec8412b8931","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2e202c4e4e803dbc6d54c9e3117afedd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c18826df5af5da174f580164c805a38a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ae881162d813e498f40bf33b8e42d54a","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"fc1f49989e78fa71bc6404ff2a148576","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"62bf37c50994a06e6c8c93355ad1caa0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4b13979d719e78a50cb0eac34d72dec1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"38aff035451e491e5905508b9a173fb6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0c4b17f88dae47697d3bceb3663f47ce","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"dd222108ed685d6a936d2011ea220998","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"7cdabbffaaa6cc6d9f478d91f312a8ee","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"f99678fdc17d27a97c79faac3f2980a4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"126d3c82f184c4d9058cab124f287968","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"823698689031b0b9c2c5152f92ffc70f","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"9e1c6b703a4312cce306c7757688a351","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"1edc5497d3daf6d914427d32b71daa52","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9f1913b781d2cde1c8a4c57b7dc2ab83","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"96a7dbb0e2c57e289c05b82e2db880be","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"201b6484b6abe3d4c587464be6cbd574","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3b65e1db6742cc44493248fff266f564","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"7dd981802694dec3ecdb61ee53805956","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ecf9eb9fa3970ff27a221e626395c75d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e7a3af060bcc6686986ddfdf5536fac8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"10710d3d706451c3536228e4b7d146db","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1c7d1f74c2c43b872972f974eb196915","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"55937e5781c91185e27a91216008e4ca","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"dab4d3e6078cfc510502a47c98e82081","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d8f7f446987e67092b6256c10b1ee69e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0dcaf9358eddf685864afb883cdf2363","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"9b0549bb6e63f681bf133d2c7996055d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"a0b0961c7ba318abff3e5a93f09f495e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"868a4fe285b85fa1b8eb40071d5397be","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"7f99061140cbf6c9081a204380efd8e1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"b00d44992702bd3743d7f353638d42f9","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"4fccea69a702bcb90cc0147c0fff2995","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"aadef7fba5a0754fb631409c11fb331f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ed75725613954c459019eec50b431f9f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c04b03fdea7f81c8c52fc540c50a24a4","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"6fea19332b7fb980e2124d0339c596c2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9acad60e1ad588fb9250aab68dee645d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"bfdc8d2e7693336b4f3781920d3fa253","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"cfe4948493ea1b183b006512be10924a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"80b20e907aa4fcf2309796bc303d151d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"919764896275058362e55f0849d2b38b","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"9da7a39de7e82006cc9533681adf765a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f3194c2eb241f821239009ca55dbb30c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2ca928ad9749bb9726c35d6528fefec1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"50e96bbd1a8267119529843a1acb43a5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5a02c9985adcd7543dff8c846cff62a5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"54a5af5112600a1faf06be268f95616e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b428acd97e6af974db1b053a2bc2b5c8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"53729ba7429e5bd2fe96229b14452bdc","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"3add7df323955b22d1cea664ef38165d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"7f4909ae8d31a3995fa2c200c690a21f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"7ee56e891d069e18c3c8eb866924a26c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8b111e12f8f73205bac732c7479a97e8","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"66a605fcdaa020dbdd6136f241ea79d9","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"a1b971c01ce0b220275c218adbe717c1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e73fc2655e1cca4a2b1c419da3630c72","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"39b5567d2d979a9172c02435a5ede59d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5df503c1ddf8f3f4ac9e49e983e3d7fd","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e22afe3cb91239d19aeb01ba79015173","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5decdad9c550489629ce441d32a69a1c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c57b70d65a63c4bf9f12c179c2416839","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ebd1dcd162acede67bb633c42c7b2ac2","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e2c355360209f0b71b70b85ed0f9532d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"da247df6fe91b74bf38d3ecc1c05b4b0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"41cb0c62655aa8da8968a06cde0f14a1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2de266b1ffa8e9ec6383c98096caf8f0","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"88b4862756df007aa0c6bc2ba049708b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6be3ad080a12e28c46c9ca4f94710ac7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"3b74a95b189e134bb34c191b7693455d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ba0941f03086680ee946a10dfe90cf12","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6be678de197b54f9a04f6c984b91ef22","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"01b99cb344ed2530f7d80897ffe257a9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0be23adca941c1335eb04db17dc66e98","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"28560cffcd31045fa07dd88557b43e05","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1a4ff0ff25ff4e919711422c2f605519","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"101968ec709b68fcd964a68ff226dcd1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"bb173654871d294466912ef22f685faa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"58d6cee566e26e231916ccc2093ae053","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"30273eb317696f87e7b6fd37ada4bb8f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"498ae808db957a63e20e836e1bf77f54","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c9f68eb27669d95f1e365fc085b51ee6","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f9bc8716f02b0a22f03b1a686895aae1","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"7fee9350277038eef98dee70b4190563","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"34e40677eda6fb724e9323b0835d5ab0","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"956d0a6f5a8e1d2fbb39df909cc14894","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"0f2a155a57fe6d0bf34767080706b3e1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"95f07780b7e9b8b504c2563e63950663","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"0f55566622d8244073432b2e67b24baa","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"7f2aa6f3481a4039dcc8d1b8be32beb7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"f094a383692eb30761eb3d5c93240236","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ecbf086d6ccbe5e8c2a69d0afb144662","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c9a1082e87563e01347729352358bbcf","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"48eda83fda558aea8fdd32b9c8dfff98","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"7a20f7055ca2c7462cfa6a7aef16ec28","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ce0a68ef210192a51f60ec3eb8e3e92e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"955d8fcbb35e8bc04c8df0c6aae34d34","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4ab53e40e06f3a9b0b9b2669d8a52f65","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3f448350064694e647b284259bdebb91","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1c40ac02c49ea9e03881b0f183373417","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"1a5ff65c7f309159df626f810d96ae8b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"816b94bcd935ca38afe71fd1e3c5356c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5fb5ace22c46fefb30969da7bb0dcb74","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"fe98555e63f547c33b3987391cd34d5d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"5042942b77f5b924b8f8c11de37a3626","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8659c05e82a2d1399cbc3fd26ab938e4","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"30ebe1a33c21c25c55e4fdbb5894b832","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"a5185df881810390f29afa3ba3ccf522","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"aee707afe3847427a6d3d34e31437923","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3677e15d86603bf0a6bb50f8b010afe7","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"54b4964000ad1631e547c46a828ed1a0","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"cbb7ea319a7633cf0917c6e5cde0e923","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"acba6a53153faccd2c02a9c0e8a2d941","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"072698f9668d5a094cdc1a672acc4747","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8c43291754ba53fa1e206f0ac7a18772","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d329ff7ff76454d2282c9f01c2798588","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2b148d88c49e316f85b6e7863089a886","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"1893b0ad352ee7db0f565bc4594e6dc6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"aa9f89f9af07d53e077462471423f3ab","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"921966b15e5f1508e8650d053443c385","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d3f59bdb915bb43f2ecd96ad9296ae92","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"ee7ce85e38500b28d9d79b63c7fbf9a6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e2f0caba18b002ca9762ed56167c6188","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"37c7d17f9e371c1e11a0e22b1ce15ab0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"55ec4b057c122957d25013675512c73d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f8026fa73c97b3f69cf4369cf194fb8b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"edacf632dcadc21c328669befafe2af6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"97e0a84031c426df75af82aeff951f26","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"de391a8294254c47e8f460325eea85f8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a70441600c181b747a763ce5a7414a3f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1f926dee6544b252d38067cc7753383a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f32674aec6d3fa6a7aa2323cb35699fc","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"7103ca740aeadee8bdf7cedaefac990b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"bfbf3b84b315e741c4345ebb43e2b9cc","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"68c05655a58355526692d3a1f0968aff","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"42872dc875fef6070dfa78984184c096","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"a621ed0faf5f6d7f3ad8f5e66cd41faf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4516f28133b919f8d8039ece23d8dd2e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"74c2326ccd0bc2bd9e0f23f15b79ea16","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"02ef9a59d6da8b642271166d3ffd1b52","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"22ed70e219c67c2bf4e20e0b144b12bb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"2cec2792e54f61e12e1a0b2507826118","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3bb6760ebcd348e0c695a5fb5fccf994","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3b795f0122b28b0e6a07bec73894acee","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ac809fd715cced98911f73f1dfb1ffb9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"bcb349a220a0c33a6b780dbc29a25f71","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a875cba4e2e4da128cec805cd014731f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"b8329e527429f07e08f04ecf93563779","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d9efe89c658c7996e7738e1bb777c9f0","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e0f1938338e6f9b8cf8408e672ee6cd1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c1dedbc2ee20ed310022b9a1976d56c4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"6de4955c509e8f32f905760cad0beeae","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"8f0a7d866b4e5ebf1e34d0a44eb950a4","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d8db52dac1023a8fa0e56e92670d7ac1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"51757b1a0a985640893725af5d87d350","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"726f76e9275bfa07ccb329dda324c58f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"c7ec57695a6d83b461eba523752755ec","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"41c686088d124f17c99dcf9bf3acf9d5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"01ce91fd8dbecf637eb5e67cdab5c5aa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b1141c1ab18997c3339e8229e0b9f41a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c2562f279f2b32428e71ef8e8e1cd3d8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"66fb1fc4317badb5dfaec2bf8e5055d7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ce1d8d111ba2aaec28d68a04e483bf3f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d51cd90e95b57acb614698dc580759fb","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"c5dfb8aa2b481cb89e2602fc20941587","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"04c7e0ea3038f942f5a28778a74cd1c0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"d12759fe8dda1d65fe9077cc1ca9cf28","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"44f993a57b632b8fde0c34ed075e1d66","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6401660183a33dded59f163fc63aab4d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"dc7d3610c77e7c118082f25002f26cd4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1e9fc37a1112b198ed3d0543db7863c8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"685ea779ee012329ec2a171f1823f8a8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1c0a00b159b2154357cc9bc7499c58b2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b0ca0d2568c23c26c6704017eae471e1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1a8d25f7529d783a219ef689701dd4e2","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"aa24dbd408e5d69c6b0d62846145a244","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"cf8a25fe1a1b134a027842e7769a285b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"b1e686a5c5f127a8b92de2863503a9e5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"459244e45f29ce28991de0114a16f9fa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"491ef1635067f62c395bdffd58966092","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"a03aa6a23dc8f296567452ec2242a5fd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d32d15407d86a2044eead0d72cd3f9e7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"bb2704c9052362b112da42bf843e7d9b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"955280212814a2050dd2f640e10fc25d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"684b032107a3a32f6664dea4ef723a42","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d5ef913e6aee3067001dc610ac8af1d1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e2cbf79a06f1221cf49d1bef8e5db9cd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3d6555a4886c6e4a89104136dd5ca39e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d1c7ee5172f16dda522e46aaa4e5fa79","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"74106ca246bcf2da5c4f95b82aa6867a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e80d9134b601511a2702b54268b57249","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3111520c8424a2a5bdd46558ae7650e8","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"867e71db0537674539934bf97db51bc0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"8c255f9dc0be58d1389877ec645f1a17","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d30b3fb9c1dc7d9f0d4bd6ce8e975238","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b1413b635612c7db2c140bc671789ec7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"12ed71ced0f4e45c0aa5b37144e6f84b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":false} +{"taxon":"3597a2689efaf5525ce460494a8ac383","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3d6f762d8cda1915ad93d014e391c118","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"7595e123b71bdae8a8c1c28b7405a5c0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"87a04eba5a3dc45f9e899d8ab4c050b4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"cbc2f795edfaebaf35d10b85062b426d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"4738a05820f1a7840410c66476953498","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d9095748835ade1b8914c5f57b6acbcf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1ca133f4d30ab344f11e6624e841d9cd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6f384c926424d43c215fbe9337d55324","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f4eefbd4edf2a372131825289fffcca6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"9f4cdae8a020a8d9c4f54e5abf5a5769","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"752621a2dcf600f86357e9c2fa1fc985","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6ffdeb862aed8aedda8a8624fa960c57","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"faf2bd479f04891ef2afba2f407749ac","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5ed23cabf504db9af85bce57e9008ea2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"7cd67e7e02db4db794fd67ab72755f8b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8163d49042bbad8871a7aab8527c9a97","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"31ed03e41d53de58a6348a242165c05b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0effb4592c11dcdd619141df770563e1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"458462fa1e15c439f12deec2f19af933","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"8bcc747f27b10bb3e1182fe530c7ed24","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2ab2f3551b7aa27fd483fdcbaa1a0afb","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1e00822422afb942c9955cd450385a8b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9548347b69043c274ff7a1ce599a69ef","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8c5f2b5fce1b357f54ed4c8c047b6845","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"33176e81f3e7ef2b9de1b783ff1ca33c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"160029903cd9c779390f4719179aeea2","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"0741ae033054073fece98b9948ec4387","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"6a9b2745a31a3e5ae16682a323c28a4d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"7fa8f515ee1ac5cb8b529b13e6a89790","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"c81e310dae79b8767597762a093082c8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"51588a76b68ff3041e8b272256df5ae2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a3dc97e11838f1bf157aa875f2f6367d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f351326f9505ffc18da207391818c48e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"53dd9f9a89854c8ebdcfb105b7a26df1","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"fbf110ef5de76f86121c8504a0cb786e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"f66effc279917d65747b7c3ef8d62432","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5c541619c0a084c6609e071895d9de55","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"9b959f65abdb6cb9adc1d6160a5384ec","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a826883ed572461c97a23561f7ecea3c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"480b52afa972e6deb75357ec39db1998","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"c961cc0ecd0ac693e2fb7dcf7794c3e5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ff8c7f94f941a0c647120d4e142db316","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e6df6369108817c93a749fa640528e92","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e54bcf1c8ec24811e7c355b8d82fa59e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"cee164362eb3296a3d29e33f7b479d2e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"71e9ece7818452114b1e87f8145aefd5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ae4c61e598c093caa5b66b6919f02ba3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"a54095a893fd5abc045d162bbe20644a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3253177a44672689e4e154e842d63e35","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"45c36b8b2965484407b8b213419d4c6c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e9f0399c43aff643ceb1480929cf89b2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d985172bebaa0bbe61ff5f682d372c6e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"02878fe3ccc81d4c884ca5574178d6a0","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"a841dd7e2f38b26bb7bb37179b4141d5","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"63145f49e7efc26729094a53d97c0cd1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"f8fe4ee0ae3da9a1432872f5545a0d42","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"678424c0e69dd311d2b536cfd69a91a4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"99e6b8fa779ca2689cdc55d164e593e8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"421da954b88f7175953a73ea34b933e0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"20fb19136419ba2826c941aa152fa0eb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4aa8e1c58af1b89f613fe3bf2b81604e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"816e266d71b9a9af9d3d74893dee443e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"35b6dde81c92eb7f66ca9f741da3514e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"9df911e407318b496425698999a1d81f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b815913c61abb4a540babe5c3fae17e7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"251eb140eb9387372897c5f7db6f954c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c66348656c079cbbc916b2c2832f311b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4ea8ed64f727e17c2ecf3616119876eb","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2b6445815ec98d21dbe9640083f30d2f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1e1e0cca52fab68a8c7ba5256aeadd6d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"1395953fab837ed426f9b2ba24da41b1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"94ca1389331a3a9230237844cfd545f6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"15992a34ae0f42d6b5a21eeaaef674ba","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"b46e36edac9cab660cec7ee6f1a335a3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2ce0fa88ec7cfdda2eeb0698cdad47e8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"82e72255267397b777a1afd44ea22755","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"9d17e47f8102cca1e9a0a5b0776bb85a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4851a0c86e3c1b3f3c67e88d8a38960a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"025dd300b0ccbd9d5898969c2a1ab138","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9cd30ed12a411f643a9f6c145e3b59d8","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"831514b8b3617bed49e2a4bd9d3d6268","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5b220f66423e4004eb3520bfae1f25d0","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"959a178855242ad3833af85d38ccff45","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a6e9c3caf38d8be5744751bea41aa62f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3f61c9eee7bfb0326d3efb8da077b0da","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9c6b4f83513e63a49ce33a8aeb1813ad","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"f95cdb71258ef6cc222c673ea4546caf","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"7e4d5b19d3213719048fe55dfad0da3a","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"f8753b9f13abb306b57aedce2cf6e7d0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ae25381e186978a7230f03484baede7c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0310f41e594c49368dde5c5993a7a5d0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"de35e106a779f81d63e2e058bf18799c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"c7312d5390945aa1e45badeeba28a998","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"9584fe0b6843a9817e1c217bb65caea8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"81fad06bda8cf753d87288f1d080da88","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"9930e78f4486e70ced513d619dae53fb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5e793ed595a0793ab477b17e78421bc5","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8b300bb35321f8c125cdc4c3a242bbc0","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"54fa6da8dff69b9fec4b470312d21eb9","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"457c3dbae079470f3cf0bf146c191e1f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8fbf42d21b6c9c4a4e8e260ad1d6a1ab","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1efd43e712291698f34853dac3b67f54","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0f006e3e638afedde4892706134a4fb9","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8c001c89f020a1b78b26ee21d1d56746","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"1ea96d595539133266a3dbd49daac1e4","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"b2d056fa113334bd2797397b162c6ac9","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e03d5567ab978eb82490f359c51912b1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a5e8aaab366d42b670d589ada160581c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2328e11c4256f1f05395b7a377381279","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"55f85b9f95aa14453f466b2ee388737b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9b07cccc73bd232ffb6edb9427194c06","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"7456c5136c45202afcf8000e2a8a01c5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"99f9d85c50cec960adab2a3f0f401371","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e6953e3ef3e20c6b169ef7a759d868df","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"538c01338d48c71522ac629b17a01c9d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"76e8305b47ef8b35c452b5490589fc95","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"328cf8ca7cded30705336cf036a2df45","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2b427cf77172293239bc1c1cdb32ace4","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2f09559bc1ffcc3ea06ae2766194920b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"73291cac0e802b6a1fb25ae7079390ef","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5a61388e52a8005b6747280b9332d2de","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"37d242005eb3c4239ad2c00158ea99a1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"72cbf125e17c4e14d748543564d3d4ec","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"b3406cb10b6d6882837eaacbaec3553e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b65f8931698507015de2e1c5f0961cd3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"7b9b46a7c3fb8b76b1c68911a9b56da1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5ec803f68f3c48cd9ce6436ccbd5b1e3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2835a5008083ae7290acbca001520ad1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"0a50155a2def454344e1f2305eff7092","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"bf6066f701b31c6bba541503797da013","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ca1b627f011b52798bfb8fd2c6b76d20","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1a2d9f4af510ce624fa0337c3ea9fedc","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f9c63350a2cdcada4a0be946f4e0025a","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"6967d97d0d19d82633e2d05305850f80","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"81026563293d6ed29eec4d7f73eab34d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e9849de9c0f7be74e13c457f05177aad","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"b59d5976acdb148c29f724d6b7990410","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"bae6b03d63955f134b6e523285263226","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"14f2e2d783b09c74ccd36ed32cbeaddd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"8c12a12aedcd680ab7e259bfd627ff9a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"01173073677a287321be3484fbed0007","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e6dfd15b38618c3c7ff0a025083f56d4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"33e2cadd9d0b2b4ebeb6261766032e4a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"ea646f13713c1f3393a8b66afa03ff4a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"2a010fd0ac0d1761c2e64c9cd3fd97c4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"4cecaa1cfabe89a905940ae23dd94a64","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5454ea14c70f0323a5e836aba10947b8","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b8413d82d36f772b9a375231cb504579","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"7a9e7bd6bd3444b67f37c95db2960d50","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9abbfb135a6fceeb2ae107b7be7cb133","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e7e23553bcb3b809fe953ff90c99da54","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"217845ff2f7195cbc781eba1f7e7eaa1","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"903752a32299a5fac9505d192dc16466","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9c773cfe6cd90b39267153cd9eac020e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5202077471c942e678df50a8e4c706d6","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"04fd81a94c775a5906f2d92cf0548e4d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"f1d63da515a0c96eb9f7af5de75655bb","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"6b350f9f82a39450e0894fe9138ad267","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"167baae5fe04a754df7eb073c07adaa7","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e1e1ece9cc43057ec074912f7545a432","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"43e4b46e2ba2455e3974874722cbd75a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"76d0a9cc7116aeaa8d26bc09e768cbc4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f7a8c8f87af98f9c5f479beaadc0b892","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"21c3086fa768008b7bee62d5d13b5366","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d8adf2a20249cefe6c627f9c17abb202","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"dd9d9aad1de9345686f5cc614c5616db","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"0524cb6dcc8f60dafc09c46911c9d0ac","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"63e29d89c820b4baafc3f5622946d6ee","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0316af109bb877b5c7a85ddecd6dfd1e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c9ffd432429a7600931358e3a09860f5","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b18b389447d758e7cb173b4b4f2ad960","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f306a3c555687b1dc2c61372504fbbea","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"bb823ca6d961133b2cd91e9377cefba7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"8935afd2b1d59a37191411131d75e9f6","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"648532aadbacef2c7f8f8468a6146fb2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"124e839582c0a3329101182cb28619a8","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"51b573b10d63a2cbe455deeef5bae002","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"6bd57e46e038faafe4bb747e1d494df7","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5cf1581a0381cd73e278302acd8751b1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"3e7f7d8ab3a5fb0e3401a0fda19d8bcb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ef4cafaa5121e47ff7f31d5553a66214","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e581d288eadb8d4527694b6fe7aa5df4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2c9e19a0423a00f8c17d8086a8ab39a5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"65fbdc4707be0814fa4faf52571cc2b5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"171930820a0db82224a948125002bf46","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f78c2a4fb584f61fc0fbd75c2cc22a99","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8406abe6d9a72018bf32d189d1340472","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5e76bbf2de9c36c591f8aab3784ffd1b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5cb28bd0b2eea6847a6328712217c141","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"50feebeace77894a50a224bf001c3502","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a9e0ac523112f40942da575caf1f386e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"029cc71dc93341de90188b686798aa0d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"58c63b4710a70a640cb86afa4d851178","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9d68bd5a8479880505cf88ab4695b5c5","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5c4ad81078908a3b228188a847d12f9e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"dbd1f3c3e0f401f60d44103595acdb69","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6fea6a26dbc4de9558be63f26f07f7fa","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"58946a0b64aa351fd8e7b97d02d6639d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"b89da5ee2f75672a2656789aea91071d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"48a6cea7eaf29dcb52dc2985933f4249","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"4e34087bb8399deb145896c92e1b58a5","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"6b4a0a64da52980e7a1b1a770978bb88","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"c23ddff0e5a041733d633d7bfb93e0cc","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3d3566af17e7e52ae5413956d004e657","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"64222ae4c3f0f1cc06375a3814da355d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ab402c6b9fa511b0aa2f968cddc364eb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d45006a487d94665893aa9e759be4c97","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5546d0fe4a512f96a6d73509a1ec6e55","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"40f13b077d41d6837ca6fae65763cf01","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"26f1b1ff96f049f0e354df4c3d85efb0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"25087bd679769914988fc1e7c6d045ff","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6fda1de9604a1be1b99a41028226f4a7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f9686d94e355b66c5324677db52b3aa4","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0bf5530da55bc16c52034db82e5434af","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9815d07f1b564c9be5aab03db01608da","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"d37b36cd780fdec9627c298370571ed5","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5beb76b0d6631d10fc820c2d128d4cb6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"952fabf17975467e69af4ebb5efb0fb6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"cdf8a49dcdb0256a8ead65f65c752e40","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e83fa923d1e185d9c9de13ca3b37c8f2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"f6bb195f075d463c5e9b620a6a76dbfd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"a1759b9ca6b3363edacc599498d62b56","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d1dbb266dc8841470f3c42fe8f465507","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3b91757d40499fecfd75d1ad215fdd2e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"0b0a240a7ae19f3560d04427d753b603","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e0a941a7b62e87ae6301bce7185e5f4a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"96802b28a3942cb6b7b40f4b9bfc0d99","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d4c5acaf755ef50d18008aa6c79f60b0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"a0daabc3e11deb9b43aafbf3c8e31e35","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e9d3af4175420ffab49c29d1a6bb2030","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"eb19aca9a5979db01ba9947baa292633","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8be3d398e9e6b768ed1aa713f2981204","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0335b1664150f1e151340b1450eae898","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"42f7a4caf54667a21b5de3b888213935","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"03178a409a41853ea09a94055e138e19","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ba3ff6e27b67596844f11db93e44c496","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"af12fc27ee17864717830cafd06453cd","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"1076b2b7de5233cc917c9425aa2ea200","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"a80183c045cf890899121db3bbcbd39d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"6bf95d9914dc404e98ebff522496533d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"14732e0b78dbc03c20c505d7681b6820","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"4042bf819b2707dcb567a04950667ec7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d8469ca44fd367ae2aab986a57833586","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"95b94ac4c1c3e18210f501268e56e50e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5656d8b980bfee07e29e8fc119850901","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d002269a53cf1579adca5f0dadd4f332","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"80b9cf8b7fde7d45e0bc84a9cf9ddd56","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"464ff59b632870b5028ed3092b9443ff","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"15c03c51375c7d03bd3dda24674b9936","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a3ebb6445ca32f39df9f84fe48525773","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"47e6d3cd169787ff35f9a2278b8d4a2f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e3f051168532c89bf76e329c715c35f5","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"47fb251b4679084fee2dafef11c6bc4f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9dd67b89e90b1517d6fc340bb1745e15","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"75a61e0ca465f169e5d2ea2d19f8aefb","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b9e3d6fcb82de619e9e574be03ecaa41","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"93982d4e0f9eb9a6179d6abd57560c26","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b61a4c5ec96e7276004c81cc845e2fec","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"76d2032108822bcfaa90a4873f7a51aa","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"47be834b0f9232d552e00a36fb3c626b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"90b16eca6a6edc00f49dfb5f72be8b61","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"7d893311a14a858907d4c8ca21d32dc4","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2d832109f6396e0f93297efd12e1321e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"47fe572ed6a6b1d5f4a60a3884ec72e1","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"77f79d776f3845bc2901cf9c4229de0b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"69e4868406c82bdfd67d2b449ca9f1d8","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} +{"taxon":"e7709791d7ef6b47747de9fb43880d14","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"f908d554fc6eeb9fef7a7028fa791475","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e3d37109be4a17d8437f6fcb6072982d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"09fc3d8a98c2ca72c69b63a51b5b564e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3a31937521e389cbdf89ca01039e5ec3","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"9f816758294dec368624eabd3595ec6f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"2a71af2786dfb7aeb7ac7d5372c41686","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"59758d94cc7ed9a16526bfc9eb207575","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"190dfe815683ee977e120d35b3c83b7e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"1d7e45fd568a577b5a6a8b4a20743211","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"498128a80a796620b238d8ad5cd1d2f9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"e2f6c7b758ac2c0476a7e31787dbba84","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"df98cba64f84c4e8b7f7ea8396f4f3f9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"88191bcb077f725a8c8e37d74e110baa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"3b0e180ea70b1a946a6214eacb539c97","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"84e6f7df01548135d92febfeae9a1ea6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"dd530a50ee0277096b0cbd210cdb80b2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"033511c7ff4fe93866075cfb9129aa3b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"216d5bb567182b6210e2c3dbc455f2b6","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a9541756b547061c02922f1a3a913fce","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"059408ca99f1001f64e6df1e06fb951d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"111311cc108c483f3782c9214681ed19","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"427e48835f176c1a367a14b39b882c58","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"10ae3ca534ce9bb9f80822b4b4a6375c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8cfda573467e6a959664801713cadba1","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"73bca1b91fb8a80ee698f1833c073664","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"fc8f87209db793f740eea731e64f0b2a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9f6a3b261bc6acafa3d4a6d2de87f924","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"b387961d274808e3ffed8c1594f4cd1c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"e1b32002ee69c4e3210a2a257511f96a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6e342714744bf1b213ac0767d6c3998d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"14374c3f2fe75bb158b439ebe4a4ee87","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"30d793622ebd90e7687dd3827701d46e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"fe72a66c85df0ab333e3a37d0332df67","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"bc15061b61cf6b5002c58284591f97d4","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"dbae1b46b67ad6769ea63d33ed3d44bf","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"99acae6a2b24652d92a1ee4cbf8faca5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d0dee8a51da30ed74bcadcd7d8e43537","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"8bcec52021ee6467bf008848d55b7a9f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"32a4d183139d99ace97a18b276d7c169","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"524f22cecc9957e9bf629b5fb0047adc","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"2fe6a7331192dc6bf073d906fba93929","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"be5ed9c02284fa6aa31037f0e2d93470","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"8f146ce7c43f38ad3673dabe93c7c5bb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"8dc69d65ac9e71a130bc6dbeb71d2f03","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"d30a7f0a26bd40402be57831cfa4da69","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"26583b57be9de00bee14d30f2dc986d8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"254482075b19ff911db5e5cb26817498","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"21b849f15da11a7cc5122773552e0fef","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"f59aa47df669ef50955ce1a0512d3abf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"c89812744d8755bef87bedf499bd19cf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"f8fee8796e3188a996dfeca9e93f47e1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"a3a69f621716f9345def32e2b5e7b011","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5af6e343611d715985e35e7a3e5671cb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"317c0beca40f29f3aff863b8f028fd48","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"85943cff5ec22653bc51c22adeabe685","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"2c47de0940a8213b1ba751a7cd0b649b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"14b20f972cfa94f77bc33eccc5ffca4c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"9cd758ad7582755a7f52f2b003787795","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5d4a0085030ee808369a8f29be41e0d2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c88977d348c943b60eea8f1571e9a7ee","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"81e706ae981fcbfceea2ac547fdd7f26","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"35bfc371d940cffdc527b7b4dc954456","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"4a146c717d33b2f2719e648bd7d22059","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"541947958ad35c1591eb3ef433141196","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a95851baf426c85eae4419617db902a7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"34f493c9b3b75210406fecac2dba0f22","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"514a4ebb290842347e3f7ac7cbba276e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"cfce45c3a7af608093fd99677d635891","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ef571c059fe495366b01e977f7494fbc","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"c73d4cf2ab0b699fb47d44488b82fd40","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"f79e815e1e628908e4ab605022b0ac09","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"23b560e97aacfd0422ed3f8a1104e7d7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"eed50a4877de2fd21b146b4f0c7327ac","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"6d7d9658988c6e2b5e45ea087f1b9155","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"502b6544978890cda2ece2d14bfdba01","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ca08eabd09756731f095632656d45b01","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"694caec8dad781d338acf4a5b69c3058","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"14e1a93cf2379225b1fd6ed0f186bacb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"6488fe0aaa024ba9c06647578b5a6caf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"5ce3a51e54f30fa53b1e56dc64d11340","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"4d987a66ee0e67b68c5c4428097eb22e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"c3fd5b1d03591477953d49f0f19600c4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"08bd73939f7bfd85daf2eaee7e9c9bf8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"93a769a6b67e5f358eb9ad0e03c53ec3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"654f282fc504b4dc9af5b8e66a4d1a87","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"895453b352ae060e0ec5f7721547a3d1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"b29143b255f4b97da62310d85fe9b7f3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"95dff3e66b8bdf4d8e509ceae4373c69","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"da3328e15aae60ea55a8765511d0327e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"ebcbd71a778e6a1a776d2d50d0801fed","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"c80037fe31359840bb73250f330b60e3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} +{"taxon":"bd759efe26a5b4b869d3fa5e4693080d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"723858f72b4469efb79c323f75bc181f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"8021f872c32700d46738f3591cb4c58a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"47c7eb4df73a5d553cd2f7a360ff5872","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"ad492bcae03f566b36a19e31f04d659a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"eb8ef4756ed538fe480d979e740a04d8","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"5db2cf37007f874e25eb2c901917e15a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"fa3729663b98de0c0af7913e9f30c19e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"504572e3afd673db749ee5e8e3e57b97","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"a6b6f29a1196cacfc392e3d71f55e2a2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"0e5df3d01cc073e3c9674c2534169f03","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"06845c67bc4203081a981200f33e87eb","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"98d250a339a635f20e26397dafc6ced3","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} +{"taxon":"1830c14ead81ad012f1db0e12f8ab6a4","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} diff --git a/q2_composition/_da_barplot/tests/data/taxonomy-fake.tsv b/q2_composition/_da_barplot/tests/data/taxonomy-fake.tsv new file mode 100644 index 0000000..e08fed1 --- /dev/null +++ b/q2_composition/_da_barplot/tests/data/taxonomy-fake.tsv @@ -0,0 +1,8 @@ +Feature ID Taxon +1 d1;k1;p1 +2 d1;k1;p2 +3 d1;k2;p3 +4 d2;k1 +5 d1 +6 d2;k3;p4 +7 d2;k3;p4;c1 diff --git a/q2_composition/_da_barplot/tests/data/taxonomy.tsv b/q2_composition/_da_barplot/tests/data/taxonomy.tsv new file mode 100644 index 0000000..856183f --- /dev/null +++ b/q2_composition/_da_barplot/tests/data/taxonomy.tsv @@ -0,0 +1,771 @@ +Feature ID Taxon Confidence +4b5eeb300368260019c1fbc7a3c718fc k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.9958337221946401 +fe30ff0f71a38a39cf1717ec2be3a2fc k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999428120610714 +d29fe3c70564fc0f69f2c03e0d1e5561 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999999999436398 +868528ca947bc57b69ffdf83e6b73bae k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.9664365168086811 +154709e160e8cada6bfb21115acc80f5 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.9786399509952004 +1d2e5f3444ca750c85302ceee2473331 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Gallibacterium; s__ 0.9959925193403045 +0305a4993ecf2d8ef4149fdfc7592603 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__uniformis 0.9997327263589151 +cb2fe0146e2fbcb101050edb996a0ee2 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__Bacillus; s__cereus 0.8845609942227217 +997056ba80681bbbdd5d09aa591eadc0 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Fusobacterium; s__ 0.982050953447081 +3c9c437f27aca05f8db167cd080ff1ec k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.994133246661797 +9079bfebcce01d4b5c758067b1208c31 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__Pseudomonas; s__ 0.7046607060653575 +bfbed36e63b69fec4627424163d20118 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Faecalibacterium; s__prausnitzii 0.9999988034162666 +90d32ffe026535b392c0bad850f213c4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Faecalibacterium; s__prausnitzii 0.997400384455408 +ab4ef4399912b0507d8d1187e874684d k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9998242475609459 +d86ef5d6394f5dbeb945f39aa25e7426 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae 0.9977318057405886 +a049763053c277b16c2a318f41eb23b4 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999999870776578 +699071a4a7ce68918e4cd93a61275ecd k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999999997044 +cdd14cce4ec44b3235923652b71e947e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.8622580874814595 +7e598ad34909a3fb8ff1623f1ede11a6 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999984956034443 +b44621e5c80607cdfacbf7a81e1cbe41 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999041234594638 +e8e6b7fc969005938de8ac7ffb94f17c k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Arcanobacterium; s__ 0.8807620267439782 +535696cecf56f03d3401d7d6dbe66d7b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.999869419690279 +9f718b8f66b79c3de80546ca9a54539c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.7850965298324183 +f352c1f1efecf483511c2270aabd0ae6 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Brachymonas; s__denitrificans 0.8729647786487261 +fd86856409fe6433d719558a30910515 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.7899265881540367 +44ff26d8105cf822417b4b0c4eb27c02 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides 0.9999998655674707 +ad41fe8f8be5b01c96549309937e3b14 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__ecb11; s__ 0.925004024566233 +909755d7142ea53c7f61c97c3586f26c k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.9999998985254359 +fcd4f95c05b868060121ff709085bf21 k__Bacteria 0.9999997771712479 +ab6b063ed43d8cb3008e157a0a305c47 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Rikenellaceae; g__; s__ 0.9707800667666495 +57b34afdff2e84fb9b0befd219edcb38 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.99330596140401 +047b7fb62a5e9d2711e639ae1cb1519a k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9237938938176441 +0160e14a78b18b903618f11bc732746e k__Bacteria; p__Verrucomicrobia; c__Verrucomicrobiae; o__Verrucomicrobiales; f__Verrucomicrobiaceae; g__Akkermansia; s__muciniphila 0.9999999999958362 +e7c8b8c8fced8eead4b767bffe6dd544 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Fusobacterium; s__ 0.9999939317546679 +d2613a43f4ed1dda8a673e7fb251ebef k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9999997755760827 +e31b5affbe5e23b79a8619589f3b6620 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999990585735 +7dd9c9124ec3f118a6cef1f0d422c011 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.742295742136374 +67e23140639733766b7e127f50221289 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999810912359 +01e0b7ac306895be84179f2715af269b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9908614136627867 +500d6b485cef4c52aad211d6d6e6dbc7 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999999766736212 +1685b25b43eb070cd7655de8c2d8c0a4 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__; s__ 0.9997160699479793 +db793caa585e078770021a7979ae8ea2 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999999721534184 +ee0fb26fca3afb05e0b288d6fcab899e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides 0.9999993194388146 +d1d750ce3b00503c204516d27ca0d3b0 k__Bacteria; p__Firmicutes; c__Bacilli; o__Gemellales; f__Gemellaceae; g__Gemella; s__ 0.8518668501715814 +ebe0e9790089ad4f40151cb4a3231a8f k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__Bacillus; s__ 0.9642926701258703 +b685f8246fb6fad0fd91574c444b8f51 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.999650554921081 +636c27859c1ac0a7994ca8ed145d03fe k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Lactococcus; s__ 0.9999999999993676 +f35ce9c514e1398308f5f84ed50b260f k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__; s__ 0.9443084139218192 +79e9e337b10e2d298bb1b3bde946782d k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__Escherichia; s__coli 0.9999071638373657 +0a69950e803a5d9e7166c450e44f43cf k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.990170657785976 +e5c80b4a23b96b2fa35b6da6cac2bf73 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__; s__ 0.9994335284978522 +9118606a87ac19f8d041da20f16f3236 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9999387354903329 +d8e8459398f3f096775f4298666880a7 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__[Prevotella]; s__ 0.9999949068655338 +fba3d9b3872ff9021d66434323fb9565 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.7195657027485565 +ae27459b7f5465815b1f565d792083ce k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__; s__ 0.8226723721441197 +4fdf8dcd9451f5742982d716fa9f0536 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Brachymonas; s__denitrificans 0.990341594080054 +4ea5683e2c2a183c11c45dc8fbd0c67c k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999999202641409 +469e4ff2129066178b74b112829fc03c k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999966339634149 +6edca9464612efff71d8f97299f01663 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9888368635892377 +41fedaa9200e2933821f84ecdc0b0772 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.9998288585755445 +41735c13fb7f63db49b10fba5d959ce3 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999922527995685 +54d098d009b89779530eaf43a1bb136a k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__; s__ 0.9841307620937348 +76174505aef45f134d8068d5ad2c42aa k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Cetobacterium; s__somerae 0.999989065299615 +b8afb7bb30b7a9170b7c6dcd40251d54 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.7910683742822175 +4c4606a3dbb4f5b8bb1ad1db6dfc5617 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Propionibacteriaceae; g__Propionibacterium; s__acnes 0.9814623426752663 +3ef461f213bfc675ddf0b1bfeef2dc52 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Alcaligenaceae; g__Sutterella; s__ 0.9348931942522047 +1f50ac250618ced095a2a5c34bae7651 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__Campylobacter; s__ 0.9998667199514364 +b3d4d129c955517b446df657236ba5a2 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae] 0.7452402307199099 +fc15824cd9e9c29e1319d32843452b54 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Desulfovibrionales; f__Desulfovibrionaceae; g__Desulfovibrio; s__ 0.9993291130018358 +f8f937eeee7762f446a0e87292f98eb6 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Parabacteroides; s__gordonii 0.9753745095429026 +b2866fdca13681232057e3e85a1978cf k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9997867752403777 +052128d7d424728578efe7852b0afd0d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9763024906230429 +fc5b641a0b0408d99ddfb2a5ba64da59 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999961057711 +2514cdaab96a1a42cf15506f2ecf6439 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8498350234496956 +e0472171de6fa02a1f58e392ad3d000e k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999994890345 +e063d1c3c9daf7390e5475e48d9b01c5 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9952238383416682 +958bc15b660bce0b894665d13f910f5b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999462400823 +1b448e00c078f81e49a61933072345d2 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__; f__; g__; s__ 0.7665635644743813 +2e55763e77234a7bfc3a311067a0c7e1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9782290160244883 +162ed46308ef9dd1600fb0fe7c90b186 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__; s__ 0.9050911973312585 +9af77e369d2ba4b3bb6e0e808ed84d91 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999999987383887 +e77bac543df42865af751a32a2942fdb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9999995997924442 +5ada68b9a081358e1a7d5f1d351e656a k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.999999999987125 +f8a71161ac98c5ceafcc75e57ace7230 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Lardizabala; s__biternata 0.8749556659983647 +26b8b1509edf09c438db1634308c3c90 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__; s__ 0.7966856263546956 +3ae3e825c5e3862af6c17798e2b40a37 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__ 0.8622175299699908 +26133b4163fdcd22d86f4e04e74154f1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9996357959905147 +29a92aecac56c855cbfc0debf9bda0c8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9999999228524133 +e737a3a864791ec52f1398d83786f4f2 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__; s__ 0.8200457533405936 +880968796af86b3d6270c228fe8e7026 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.9745304212780819 +81351ef6b4d49a3a6b2fc24745d70305 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.999700105283307 +c4aad64f84f51ff331b986a67af4ed3d k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.9999641113701946 +79dcabe7f92f8cf2723b796dcd2f239f k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999999979512069 +7a5d5e6f85da7ca91daa2d803e8f9279 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__uniformis 0.8457322210944457 +401d7866836c54f3cd18bd0fc814885e k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999100598598 +75258a676bcd7e73c2437d6a2012d490 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__nigrescens 0.9999992729635437 +839fafb762395fab1ba257442ec29e7f k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.7003728037209339 +6b82e6cb771d45d6c925405b66299d7f k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999979567870964 +5c82bad13c4ebd2ed1bd23a8c2e37fc5 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.8666197575636689 +f59a4d48a03cc224462bf83e4d4ab126 k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Catenibacterium; s__ 0.9999903148261411 +eecc4a4317225eb579540e82ab785716 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Faecalibacterium; s__prausnitzii 0.9999976620583243 +a895b66cac813ac67ce1c908259b646f k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Fusobacterium; s__ 0.9926618241951963 +acfe4c003905a7074aeaf385b78ad9e0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9953214919745447 +684721318896ed01048f3502333c214d k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9987202787722055 +2ff525a1e58c54525e7f2d68a6c0b23e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__nigrescens 0.9999926903688978 +d781fa7e866ac295ce9a56bd97912983 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Faecalibacterium; s__prausnitzii 0.7493946199024752 +0b925631436d3775231b60f9d0011cae k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Sphingomonadales; f__Sphingomonadaceae; g__Sphingomonas; s__ 0.9999994998443044 +a5551fc60aa8bbaab737487552ea2a75 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__CF231; s__ 0.872880524507011 +a4c08e2c3a34038ea877b16d01736837 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9406211885029296 +4075a90811bf9c19f02f5aa2ece6da37 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.9862076771441829 +4980b85712efeef1fc4563a9a949fe2e k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999943268136 +f91c81859bf6eede55eef9c915dd8bab k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.99970078019132 +5601f094afc823d75ccb34440645a99e k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Actinomyces; s__ 0.9906224971027953 +21a0198d0a83a8f3ec0e401067138940 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9008452096264863 +56c98126dde3abb2d263088db55e12c8 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.9999683646177029 +a659784c026bd9c8cde94da36aa656d7 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9999993456027748 +f16a387e898dbae6432b2ed0241120bd k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9995424783284206 +3125abe90c7ae91aec06eb104d71845f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999999999787 +b383ade799e9c83c649cec37705a251d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae 0.7462757768512205 +3bf2fc236887eda11c969b84d30f9fbf k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.9747187767070731 +3cdd97ba69a504117de24626ba790e96 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.8770533277033848 +4132561a08d25757e4bee9f73ec4a70a k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999363170253449 +30faafef155964edd9db9374f36c45bf k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9048420712753049 +9d3ec96491b522546acbdfa3b21b6071 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae 0.9924075559663312 +fb4f7d9d3f91ac2f22a542fbd13019c1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9999880347239448 +b0f7e29de400c6b517b39230dc1b4365 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.7460603842850583 +393e6e2cbe258ed27a4ca0a2ee0d2cdc k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8358611453086482 +1d17561d16d803f652b0d6bdd671c1cc k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9956090081842228 +3982159c2603cacc4bc4893003bda323 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Parabacteroides; s__gordonii 0.990490233614371 +b1e22f094d8c64fb56dbacf680dab8c9 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.99999991340653 +b92e89d105e0a6e09e5984879c4c7809 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Megamonas; s__ 0.9998429390456497 +a5df9a825c3d8eeb228a6781c3db134c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9986964429534421 +ff3df50eea7490dd794148649c480fd3 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9686046064191691 +3a1c2d5547ddb7f76306a042f8bef6a4 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Oxalobacteraceae; g__; s__ 0.9179253970562418 +8da02c7114ba0d9ee40312926e037a8f k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999998866139841 +87899779aec8d38dfaf48d895cfe8021 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.8934389480837356 +d46bfd723f625e317606ae28580eba3e Unassigned 0.8485721294354636 +145f11599b92ad3a4c93896b0edf8c0c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.9999894997463403 +846cbaf603b77be035fe0cb61d14a23c k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.8140303161720441 +e8fb2b3d01d369dbb5d3764548193ae9 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae] 0.9954151444154564 +7eedfc5c8d0d6b8852fabb20d52a8c5d k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Flavobacterium; s__ 0.999998547369774 +c4f955168102011d272b685aa772c10a k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Aerococcaceae; g__; s__ 0.7624532674225534 +513de43781dc4c2831eb83b23940d66b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9236867674037471 +13692c41b4bf5d577c28c278caafcddb k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__Pseudomonas; s__ 0.9886074376466417 +1d284bea12006c939c03d622ce2abd5e k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.9691132611623711 +24443b70088636edf08f0c9572d7faf4 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__Bacillus; s__cereus 0.8949946086343206 +185df2b73b4805164470dfaea2d05223 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__; s__ 0.9899953809370827 +2f4c5e75c0e4cdfcbddbe93ef1f410a3 k__Bacteria; p__Synergistetes; c__Synergistia; o__Synergistales; f__; g__; s__ 0.9999999906930839 +1b963d0d7457ac133aed9497f03b5a64 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9997664162148041 +bb370945a6777f712cfd963c55f2ff54 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae 0.9682614878696726 +ed950935b660fb10449d5f229dc13fb9 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8666608752094228 +59fefb91cc66ef6930b0201e4bf24cbb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.8253780733313861 +1f0a072da4906270a684a389c1586582 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Desulfovibrionales; f__Desulfovibrionaceae; g__Desulfovibrio; s__ 0.8633349419975141 +aa668eb01ca9dcc59aeb1454b600c8c8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.9749689225854287 +724c43ad3632cb8c5c6230c874551bd2 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__Pseudomonas; s__ 0.8045349896026777 +44543d9c6bb193c64d38c9bdb6790eec k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Actinomyces; s__ 0.9967092070169485 +d3e265209c342d15d93a910e38ad9be2 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9781449370410514 +626b8ee112be0ec208bb16445611d001 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.9999761535966193 +9590aed21545774c71a124f2b5200691 k__Bacteria 0.9999999081663734 +3a69cb2f27ac76a05405efbb5088d249 k__Bacteria; p__Bacteroidetes 0.9999949655367895 +475741f076c42d2c75d2d63c14fe4d3f k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.9999984991356677 +8cd2a871fab61bdea4ef23a295c371cf k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__[Exiguobacteraceae]; g__; s__ 0.873686443320628 +84755bc954af6d3b39bb4c369e5992e7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9736843017579572 +5437cb1c86c72638cbbc12896f88d1b1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9712392840132761 +848587c4a03949500c5815bd6edb7b6e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9818825028562667 +cba5f5b1153235425628bd77a28257c7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.9999998472017612 +063fa4f5a6fa894f7f8243468324ac5e k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.9981102393479658 +49232f27012731b0a65805c0919e2bbc k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.943827855776101 +4b8228f4d7d3809aa6827e8d9e11a9ae k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.7212608163317578 +c99439f78b73ffcf55858ae828aac608 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__; s__ 0.7971982847035692 +2fa276cce32e900f0f68d30e460b8f61 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9627614696475191 +4ce1be9cea00a1eb7f960600e1ff3cfa k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.9983032988453951 +1b75626f6834620dc2c729a1a81f497a k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.982403921665726 +f023384b8f989d014dd2ead7f10db307 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.9908984722142828 +344b020d867e3210563eaf40b0c557ef k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Xanthomonadales; f__Xanthomonadaceae; g__Stenotrophomonas; s__maltophilia 0.9999401467682368 +dd7e1e45831871f719cc3cd68f568e7c k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__; s__ 0.9998045143900894 +16564bc936c839c893f951bab613a30b k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Sphingomonadales; f__Erythrobacteraceae; g__Erythrobacter; s__ 0.9460027870708861 +24523c45ca39b6c81a01ce286c0c092b k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999999067626 +b5bf6383b53e0add0d6589b73949462a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9876006300891133 +51ddb685cfb1775931489ebbd3eef6ca k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Paludibacter; s__ 0.9999972392898706 +c5b61a414bdb4305544bb4f941e0bfc9 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__; s__ 0.7621702438448272 +24dfe6a7325e4f2be7dbd522ef613e42 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9994116563577591 +465e9cab9abce306c1e0f7459b325c33 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9982004044289671 +3e2c7eb0316409806267a8d9845b0b13 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__[Prevotella]; s__tannerae 0.9999999999975131 +136e9f5aa470119165e59d202fdb318c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9914179452172375 +b8b19c4f0719a5d5b965a0f50f05827c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9997021249524974 +4a5387c4bc61f2d8f3d9d2de983ba556 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.9966287626394199 +77a517253ff10afeb78a37bc13d649a0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9712134305791008 +07b2b1c3771f46d82c90b20a79fb3d04 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.7268658473687829 +30a88dc67e6a522087c3dfc8019550a6 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Arcanobacterium; s__ 0.8305615856225699 +91d0b3b7c0329b9a164b6e04a181f1d6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9995604000358095 +14d168c89e381de6fc3091837a557e48 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__Bacillus; s__cereus 0.9929461364845236 +9616cf56be891f816aa7abc6a13c9e8f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9875063899990802 +fea5c05e9b8245c5ca46f6673f59e0bf k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9919699655949962 +32875774cffdc8c820f91d8e86f9a0e6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9446862406990475 +67f9c74eeea5a4609bd1d2fab66ad3cc k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9867353474727047 +ca96b8fd01aa6c508305bacac37da6c2 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Cetobacterium; s__somerae 0.9999789291772225 +43a9c44adeac51fd3ab95081da56d02d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9900793447197616 +0bd7addf1b999f01ad58fec8412b8931 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__Campylobacter; s__ 0.9999999999756852 +2e202c4e4e803dbc6d54c9e3117afedd k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Aerococcaceae; g__; s__ 0.9941827363037207 +c18826df5af5da174f580164c805a38a k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.8201647399124894 +ae881162d813e498f40bf33b8e42d54a k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Epulopiscium; s__ 0.9818176402859741 +fc1f49989e78fa71bc6404ff2a148576 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.8569616169076417 +62bf37c50994a06e6c8c93355ad1caa0 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__; s__ 0.9723215145050736 +4b13979d719e78a50cb0eac34d72dec1 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Alcaligenaceae; g__Sutterella; s__ 0.814212469622191 +38aff035451e491e5905508b9a173fb6 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus; s__helveticus 0.9980995004791346 +0c4b17f88dae47697d3bceb3663f47ce k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9876885766109754 +dd222108ed685d6a936d2011ea220998 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__; s__ 0.9997404717274324 +7cdabbffaaa6cc6d9f478d91f312a8ee k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9835256093866039 +f99678fdc17d27a97c79faac3f2980a4 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999448970596693 +126d3c82f184c4d9058cab124f287968 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.8818622234665441 +823698689031b0b9c2c5152f92ffc70f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9907823129804533 +9e1c6b703a4312cce306c7757688a351 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Odoribacteraceae]; g__Odoribacter; s__ 0.9741297310207316 +1edc5497d3daf6d914427d32b71daa52 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__; s__ 0.9980757748020763 +9f1913b781d2cde1c8a4c57b7dc2ab83 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9477772804076361 +96a7dbb0e2c57e289c05b82e2db880be k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999989886987 +201b6484b6abe3d4c587464be6cbd574 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9968207959371668 +3b65e1db6742cc44493248fff266f564 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9027959785999388 +7dd981802694dec3ecdb61ee53805956 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__; s__ 0.9999987447167404 +ecf9eb9fa3970ff27a221e626395c75d k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Plantago; s__sericea 0.9840198571253465 +e7a3af060bcc6686986ddfdf5536fac8 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9883204048951482 +10710d3d706451c3536228e4b7d146db k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9991151759971381 +1c7d1f74c2c43b872972f974eb196915 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__; s__ 0.981394461454234 +55937e5781c91185e27a91216008e4ca k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9355345567061277 +dab4d3e6078cfc510502a47c98e82081 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9281364971800353 +d8f7f446987e67092b6256c10b1ee69e k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9686855340233106 +0dcaf9358eddf685864afb883cdf2363 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9415941932062629 +9b0549bb6e63f681bf133d2c7996055d k__Bacteria; p__Firmicutes 0.7506149603925175 +a0b0961c7ba318abff3e5a93f09f495e k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.7686841890785621 +868a4fe285b85fa1b8eb40071d5397be k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9980785120205447 +7f99061140cbf6c9081a204380efd8e1 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__; s__ 0.9415030791477812 +b00d44992702bd3743d7f353638d42f9 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9966999786650745 +4fccea69a702bcb90cc0147c0fff2995 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9998955601279681 +aadef7fba5a0754fb631409c11fb331f k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.9667666514698227 +ed75725613954c459019eec50b431f9f k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999984391496883 +c04b03fdea7f81c8c52fc540c50a24a4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.9997907831055235 +6fea19332b7fb980e2124d0339c596c2 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9680376174631936 +9acad60e1ad588fb9250aab68dee645d k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Fusobacterium; s__ 0.9997796603959739 +bfdc8d2e7693336b4f3781920d3fa253 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Lardizabala; s__biternata 0.7662506383488885 +cfe4948493ea1b183b006512be10924a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__; s__ 0.9533462694327515 +80b20e907aa4fcf2309796bc303d151d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9986294365919474 +919764896275058362e55f0849d2b38b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9961325749610411 +9da7a39de7e82006cc9533681adf765a k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Fusobacterium; s__ 0.7831504852018654 +f3194c2eb241f821239009ca55dbb30c k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9997759560434905 +2ca928ad9749bb9726c35d6528fefec1 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9999999662362309 +50e96bbd1a8267119529843a1acb43a5 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardiaceae; g__Rhodococcus; s__ 0.9966565205671194 +5a02c9985adcd7543dff8c846cff62a5 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__Paracoccus; s__marcusii 0.9998324055647368 +54a5af5112600a1faf06be268f95616e k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Lardizabala; s__biternata 0.9993713680219449 +b428acd97e6af974db1b053a2bc2b5c8 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.9786071786319286 +53729ba7429e5bd2fe96229b14452bdc k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Capnocytophaga; s__ochracea 0.9978553659822367 +3add7df323955b22d1cea664ef38165d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9781040666781388 +7f4909ae8d31a3995fa2c200c690a21f k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Caulobacterales; f__Caulobacteraceae; g__; s__ 0.9999174896399688 +7ee56e891d069e18c3c8eb866924a26c k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardioidaceae; g__; s__ 0.8198495076572347 +8b111e12f8f73205bac732c7479a97e8 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.9842956129958905 +66a605fcdaa020dbdd6136f241ea79d9 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae 0.8349845236085003 +a1b971c01ce0b220275c218adbe717c1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.997922821685064 +e73fc2655e1cca4a2b1c419da3630c72 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae 0.8607932039465931 +39b5567d2d979a9172c02435a5ede59d k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.9413356646469416 +5df503c1ddf8f3f4ac9e49e983e3d7fd k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8541828046204444 +e22afe3cb91239d19aeb01ba79015173 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.9057614923770859 +5decdad9c550489629ce441d32a69a1c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.999999937180074 +c57b70d65a63c4bf9f12c179c2416839 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.8080738263698886 +ebd1dcd162acede67bb633c42c7b2ac2 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.7448483927360258 +e2c355360209f0b71b70b85ed0f9532d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9794786642770723 +da247df6fe91b74bf38d3ecc1c05b4b0 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9999231166687839 +41cb0c62655aa8da8968a06cde0f14a1 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__; s__ 0.9899301569501586 +2de266b1ffa8e9ec6383c98096caf8f0 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9593159938080493 +88b4862756df007aa0c6bc2ba049708b k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium 0.9972226883960247 +6be3ad080a12e28c46c9ca4f94710ac7 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999956362302 +3b74a95b189e134bb34c191b7693455d k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999995266222 +ba0941f03086680ee946a10dfe90cf12 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999998882458 +6be678de197b54f9a04f6c984b91ef22 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.8418514082095719 +01b99cb344ed2530f7d80897ffe257a9 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.9895777629670363 +0be23adca941c1335eb04db17dc66e98 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9882380319734869 +28560cffcd31045fa07dd88557b43e05 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.9984374269838746 +1a4ff0ff25ff4e919711422c2f605519 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9658842882755643 +101968ec709b68fcd964a68ff226dcd1 k__Bacteria; p__Synergistetes; c__Synergistia; o__Synergistales; f__Dethiosulfovibrionaceae; g__TG5; s__ 0.7184575263330232 +bb173654871d294466912ef22f685faa k__Bacteria; p__TM7; c__; o__; f__; g__; s__ 0.8476021797285942 +58d6cee566e26e231916ccc2093ae053 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.7693774447016705 +30273eb317696f87e7b6fd37ada4bb8f k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__; s__ 0.8612132401018252 +498ae808db957a63e20e836e1bf77f54 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.988906133756839 +c9f68eb27669d95f1e365fc085b51ee6 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__; s__ 0.8286392562371542 +f9bc8716f02b0a22f03b1a686895aae1 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Lardizabala; s__biternata 0.9989406475916182 +7fee9350277038eef98dee70b4190563 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__SMB53; s__ 0.9976757508428109 +34e40677eda6fb724e9323b0835d5ab0 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Odoribacteraceae]; g__Butyricimonas; s__ 0.9999808683380617 +956d0a6f5a8e1d2fbb39df909cc14894 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9998432927804386 +0f2a155a57fe6d0bf34767080706b3e1 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__Plesiomonas; s__shigelloides 0.9982710438028973 +95f07780b7e9b8b504c2563e63950663 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.8849721327913207 +0f55566622d8244073432b2e67b24baa k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9245116610867723 +7f2aa6f3481a4039dcc8d1b8be32beb7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.997532362495088 +f094a383692eb30761eb3d5c93240236 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999918575996913 +ecbf086d6ccbe5e8c2a69d0afb144662 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9999699072181122 +c9a1082e87563e01347729352358bbcf k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__Bacillus; s__ 0.975346998897466 +48eda83fda558aea8fdd32b9c8dfff98 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__WAL_1855D; s__ 0.9999999993871853 +7a20f7055ca2c7462cfa6a7aef16ec28 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales 0.9043747565110443 +ce0a68ef210192a51f60ec3eb8e3e92e k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__Campylobacter; s__ 0.9999999927592853 +955d8fcbb35e8bc04c8df0c6aae34d34 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Rhizobiaceae; g__Agrobacterium; s__ 0.9505148450823113 +4ab53e40e06f3a9b0b9b2669d8a52f65 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9972215900199218 +3f448350064694e647b284259bdebb91 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999999984179908 +1c40ac02c49ea9e03881b0f183373417 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales 0.9999967012895914 +1a5ff65c7f309159df626f810d96ae8b k__Bacteria; p__Proteobacteria 0.9986078840467718 +816b94bcd935ca38afe71fd1e3c5356c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.921550548542076 +5fb5ace22c46fefb30969da7bb0dcb74 k__Bacteria 0.9730628814365803 +fe98555e63f547c33b3987391cd34d5d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.8816923153420021 +5042942b77f5b924b8f8c11de37a3626 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Micrococcaceae; g__Rothia; s__dentocariosa 0.9917947631631234 +8659c05e82a2d1399cbc3fd26ab938e4 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999966112517604 +30ebe1a33c21c25c55e4fdbb5894b832 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__[Prevotella]; s__tannerae 0.9999999999993321 +a5185df881810390f29afa3ba3ccf522 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999973401851451 +aee707afe3847427a6d3d34e31437923 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9969874561969844 +3677e15d86603bf0a6bb50f8b010afe7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9591229588654293 +54b4964000ad1631e547c46a828ed1a0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9489177729425085 +cbb7ea319a7633cf0917c6e5cde0e923 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.7202063020498253 +acba6a53153faccd2c02a9c0e8a2d941 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae 0.9999910305236527 +072698f9668d5a094cdc1a672acc4747 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999988833298783 +8c43291754ba53fa1e206f0ac7a18772 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae 0.9999999026692968 +d329ff7ff76454d2282c9f01c2798588 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Rhizobiaceae 0.7683390677137731 +2b148d88c49e316f85b6e7863089a886 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9755546554884753 +1893b0ad352ee7db0f565bc4594e6dc6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9999914735349343 +aa9f89f9af07d53e077462471423f3ab k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Catenibacterium; s__ 0.9999999999551221 +921966b15e5f1508e8650d053443c385 k__Bacteria; p__Bacteroidetes 0.9999999789899514 +d3f59bdb915bb43f2ecd96ad9296ae92 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Peptostreptococcaceae; g__; s__ 0.9999996872284448 +ee7ce85e38500b28d9d79b63c7fbf9a6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9996890278528194 +e2f0caba18b002ca9762ed56167c6188 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8230992202277039 +37c7d17f9e371c1e11a0e22b1ce15ab0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__ecb11; s__ 0.7162226665476744 +55ec4b057c122957d25013675512c73d k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.99942905516211 +f8026fa73c97b3f69cf4369cf194fb8b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999999892992 +edacf632dcadc21c328669befafe2af6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Coprococcus; s__ 0.9829421855819899 +97e0a84031c426df75af82aeff951f26 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Capnocytophaga; s__ochracea 0.9424899673072666 +de391a8294254c47e8f460325eea85f8 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9994429214730802 +a70441600c181b747a763ce5a7414a3f k__Bacteria; p__Firmicutes; c__Clostridia 0.8020492794973232 +1f926dee6544b252d38067cc7753383a k__Bacteria; p__Proteobacteria; c__; o__; f__; g__; s__ 0.7716879982589978 +f32674aec6d3fa6a7aa2323cb35699fc k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.9363416885715232 +7103ca740aeadee8bdf7cedaefac990b k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__; s__ 0.8473780821924048 +bfbf3b84b315e741c4345ebb43e2b9cc k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__ACK-M1; g__; s__ 0.9908586097194413 +68c05655a58355526692d3a1f0968aff k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales 0.9999998394094225 +42872dc875fef6070dfa78984184c096 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9999356653188819 +a621ed0faf5f6d7f3ad8f5e66cd41faf k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9999992966677156 +4516f28133b919f8d8039ece23d8dd2e k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Brachymonas; s__denitrificans 0.9994623101890072 +74c2326ccd0bc2bd9e0f23f15b79ea16 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8462670522599539 +02ef9a59d6da8b642271166d3ffd1b52 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.8543465987543895 +22ed70e219c67c2bf4e20e0b144b12bb k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__Sphingobacterium; s__faecium 0.9999975426586966 +2cec2792e54f61e12e1a0b2507826118 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Oxalobacteraceae; g__; s__ 0.9673770930058341 +3bb6760ebcd348e0c695a5fb5fccf994 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.9570578593636746 +3b795f0122b28b0e6a07bec73894acee k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__ 0.7407037722492078 +ac809fd715cced98911f73f1dfb1ffb9 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9026610348209064 +bcb349a220a0c33a6b780dbc29a25f71 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.8819410503065264 +a875cba4e2e4da128cec805cd014731f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__; s__ 0.9187748033834733 +b8329e527429f07e08f04ecf93563779 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.9996504616757337 +d9efe89c658c7996e7738e1bb777c9f0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9903377659879923 +e0f1938338e6f9b8cf8408e672ee6cd1 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.993773433397292 +c1dedbc2ee20ed310022b9a1976d56c4 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae 0.9967286632534038 +6de4955c509e8f32f905760cad0beeae k__Bacteria; p__Actinobacteria; c__Coriobacteriia; o__Coriobacteriales; f__Coriobacteriaceae; g__; s__ 0.9837807669630515 +8f0a7d866b4e5ebf1e34d0a44eb950a4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__ 0.9906875259784893 +d8db52dac1023a8fa0e56e92670d7ac1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9817570313375871 +51757b1a0a985640893725af5d87d350 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.9986071363671206 +726f76e9275bfa07ccb329dda324c58f k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae; g__Treponema; s__socranskii 0.9999999999218261 +c7ec57695a6d83b461eba523752755ec k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__ 0.8216415863833852 +41c686088d124f17c99dcf9bf3acf9d5 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.9938560327219053 +01ce91fd8dbecf637eb5e67cdab5c5aa k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.999999965499598 +b1141c1ab18997c3339e8229e0b9f41a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.9978491874694801 +c2562f279f2b32428e71ef8e8e1cd3d8 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.8092885077065582 +66fb1fc4317badb5dfaec2bf8e5055d7 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.9714600487197151 +ce1d8d111ba2aaec28d68a04e483bf3f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9999722539035509 +d51cd90e95b57acb614698dc580759fb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.953211007651201 +c5dfb8aa2b481cb89e2602fc20941587 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9809176799677424 +04c7e0ea3038f942f5a28778a74cd1c0 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.999998162830321 +d12759fe8dda1d65fe9077cc1ca9cf28 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.894645937459983 +44f993a57b632b8fde0c34ed075e1d66 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__; f__; g__; s__ 0.8224024521820277 +6401660183a33dded59f163fc63aab4d k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales 0.9771145132058217 +dc7d3610c77e7c118082f25002f26cd4 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides 0.7798962821568877 +1e9fc37a1112b198ed3d0543db7863c8 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999999967741 +685ea779ee012329ec2a171f1823f8a8 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.8751644661590657 +1c0a00b159b2154357cc9bc7499c58b2 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Pseudonocardiaceae; g__Saccharomonospora; s__ 0.9392749640458771 +b0ca0d2568c23c26c6704017eae471e1 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9745960035993452 +1a8d25f7529d783a219ef689701dd4e2 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Barnesiellaceae]; g__; s__ 0.9927708072308242 +aa24dbd408e5d69c6b0d62846145a244 k__Bacteria; p__Firmicutes; c__Clostridia 0.7885985886563874 +cf8a25fe1a1b134a027842e7769a285b k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae 0.9999958620579945 +b1e686a5c5f127a8b92de2863503a9e5 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999744495820918 +459244e45f29ce28991de0114a16f9fa k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__Mogibacterium; s__ 0.9999746542265215 +491ef1635067f62c395bdffd58966092 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9998704003587595 +a03aa6a23dc8f296567452ec2242a5fd k__Bacteria; p__Actinobacteria; c__Coriobacteriia; o__Coriobacteriales; f__Coriobacteriaceae; g__; s__ 0.8998639028324782 +d32d15407d86a2044eead0d72cd3f9e7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.7847638533151173 +bb2704c9052362b112da42bf843e7d9b k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__Flavisolibacter; s__ 0.8870674213443654 +955280212814a2050dd2f640e10fc25d k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999999451035 +684b032107a3a32f6664dea4ef723a42 k__Bacteria 0.9763699651056932 +d5ef913e6aee3067001dc610ac8af1d1 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.997736403622595 +e2cbf79a06f1221cf49d1bef8e5db9cd k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Peptostreptococcaceae; g__; s__ 0.9999998454990027 +3d6555a4886c6e4a89104136dd5ca39e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9999999499447808 +d1c7ee5172f16dda522e46aaa4e5fa79 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.8838505602666903 +74106ca246bcf2da5c4f95b82aa6867a k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__Paracoccus; s__marcusii 0.8969363728973645 +e80d9134b601511a2702b54268b57249 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.846467398652712 +3111520c8424a2a5bdd46558ae7650e8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.986596475206643 +867e71db0537674539934bf97db51bc0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9671375895080958 +8c255f9dc0be58d1389877ec645f1a17 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Rhizobiaceae; g__; s__ 0.9374955192827125 +d30b3fb9c1dc7d9f0d4bd6ce8e975238 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9650161287821856 +b1413b635612c7db2c140bc671789ec7 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae 0.9974656242062745 +12ed71ced0f4e45c0aa5b37144e6f84b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__Mogibacterium; s__ 0.9999925421901555 +3597a2689efaf5525ce460494a8ac383 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9946055495174548 +3d6f762d8cda1915ad93d014e391c118 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Leuconostocaceae; g__; s__ 0.9999999981794474 +7595e123b71bdae8a8c1c28b7405a5c0 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Lactococcus; s__ 0.9807722690241437 +87a04eba5a3dc45f9e899d8ab4c050b4 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9996432667431419 +cbc2f795edfaebaf35d10b85062b426d k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.9881925141385922 +4738a05820f1a7840410c66476953498 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9713578612917114 +d9095748835ade1b8914c5f57b6acbcf k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__Plesiomonas; s__shigelloides 0.9645705724989544 +1ca133f4d30ab344f11e6624e841d9cd k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae; g__Treponema; s__ 0.950703733856568 +6f384c926424d43c215fbe9337d55324 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.8813456185136317 +f4eefbd4edf2a372131825289fffcca6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9995469607506324 +9f4cdae8a020a8d9c4f54e5abf5a5769 k__Bacteria 0.9999999613446524 +752621a2dcf600f86357e9c2fa1fc985 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9999999937560489 +6ffdeb862aed8aedda8a8624fa960c57 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__; s__ 0.9999443167941194 +faf2bd479f04891ef2afba2f407749ac k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9743558729721384 +5ed23cabf504db9af85bce57e9008ea2 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999956498442 +7cd67e7e02db4db794fd67ab72755f8b k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.9452565598835438 +8163d49042bbad8871a7aab8527c9a97 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae 0.7696715501549842 +31ed03e41d53de58a6348a242165c05b k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Vibrionales; f__Vibrionaceae; g__; s__ 0.9993822895954213 +0effb4592c11dcdd619141df770563e1 k__Bacteria; p__Actinobacteria; c__Thermoleophilia; o__Gaiellales; f__Gaiellaceae; g__; s__ 0.999244126694315 +458462fa1e15c439f12deec2f19af933 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae 0.9944057212404465 +8bcc747f27b10bb3e1182fe530c7ed24 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Megasphaera; s__ 0.9999999968720772 +2ab2f3551b7aa27fd483fdcbaa1a0afb k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Acetobacteraceae; g__Roseococcus; s__ 0.9989231159235498 +1e00822422afb942c9955cd450385a8b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9999992286357811 +9548347b69043c274ff7a1ce599a69ef k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Alcaligenaceae; g__Sutterella; s__ 0.7429133437803742 +8c5f2b5fce1b357f54ed4c8c047b6845 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.999909305633813 +33176e81f3e7ef2b9de1b783ff1ca33c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9973327370031295 +160029903cd9c779390f4719179aeea2 k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Bulleidia; s__ 0.9930797730837521 +0741ae033054073fece98b9948ec4387 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__; s__ 0.7428987191124414 +6a9b2745a31a3e5ae16682a323c28a4d k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.9953764952290288 +7fa8f515ee1ac5cb8b529b13e6a89790 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.949381274176957 +c81e310dae79b8767597762a093082c8 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__Campylobacter; s__ 0.9976261105781868 +51588a76b68ff3041e8b272256df5ae2 k__Bacteria; p__Synergistetes; c__Synergistia; o__Synergistales; f__Dethiosulfovibrionaceae; g__TG5; s__ 0.9070807368354143 +a3dc97e11838f1bf157aa875f2f6367d k__Bacteria; p__Bacteroidetes 0.9999999055295461 +f351326f9505ffc18da207391818c48e k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9821277811324446 +53dd9f9a89854c8ebdcfb105b7a26df1 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardioidaceae; g__; s__ 0.9991536366666571 +fbf110ef5de76f86121c8504a0cb786e k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9465733411849421 +f66effc279917d65747b7c3ef8d62432 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.8328144562379329 +5c541619c0a084c6609e071895d9de55 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9938955608311 +9b959f65abdb6cb9adc1d6160a5384ec k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Allobaculum; s__ 0.9999999932852575 +a826883ed572461c97a23561f7ecea3c k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae 0.972801149277789 +480b52afa972e6deb75357ec39db1998 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__MKC10; f__; g__; s__ 0.9999982632895144 +c961cc0ecd0ac693e2fb7dcf7794c3e5 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Capnocytophaga; s__ochracea 0.9119933159074036 +ff8c7f94f941a0c647120d4e142db316 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9926398192142779 +e6df6369108817c93a749fa640528e92 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Flammeovirgaceae; g__; s__ 0.790311130955446 +e54bcf1c8ec24811e7c355b8d82fa59e k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardioidaceae; g__; s__ 0.9999999890900001 +cee164362eb3296a3d29e33f7b479d2e k__Bacteria; p__Cyanobacteria; c__; o__; f__; g__; s__ 0.8789686234635555 +71e9ece7818452114b1e87f8145aefd5 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae 0.8132539537195868 +ae4c61e598c093caa5b66b6919f02ba3 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Hyphomicrobiaceae; g__; s__ 0.9418486227376394 +a54095a893fd5abc045d162bbe20644a k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae 0.908486538016183 +3253177a44672689e4e154e842d63e35 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales 0.9971138922337394 +45c36b8b2965484407b8b213419d4c6c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.999999693292712 +e9f0399c43aff643ceb1480929cf89b2 k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae; g__Treponema; s__socranskii 0.9999999999657732 +d985172bebaa0bbe61ff5f682d372c6e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9932764067703407 +02878fe3ccc81d4c884ca5574178d6a0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.711487333195246 +a841dd7e2f38b26bb7bb37179b4141d5 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9979250398867832 +63145f49e7efc26729094a53d97c0cd1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9622909553085618 +f8fe4ee0ae3da9a1432872f5545a0d42 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__; s__ 0.8154657129956009 +678424c0e69dd311d2b536cfd69a91a4 k__Bacteria; p__Tenericutes; c__Mollicutes; o__Mycoplasmatales; f__Mycoplasmataceae; g__Mycoplasma; s__ 0.9762785649968605 +99e6b8fa779ca2689cdc55d164e593e8 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__; s__ 0.9402399429962229 +421da954b88f7175953a73ea34b933e0 k__Bacteria 0.9999823310046783 +20fb19136419ba2826c941aa152fa0eb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.7561067919565475 +4aa8e1c58af1b89f613fe3bf2b81604e k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9956480283015009 +816e266d71b9a9af9d3d74893dee443e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9969405143631995 +35b6dde81c92eb7f66ca9f741da3514e k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__; s__ 0.8537937636098778 +9df911e407318b496425698999a1d81f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9636669958959824 +b815913c61abb4a540babe5c3fae17e7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8569898883160058 +251eb140eb9387372897c5f7db6f954c k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999698405569301 +c66348656c079cbbc916b2c2832f311b k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Bifidobacteriales; f__; g__; s__ 0.7389317464643197 +4ea8ed64f727e17c2ecf3616119876eb k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Mycobacteriaceae; g__Mycobacterium; s__ 0.9999999978077767 +2b6445815ec98d21dbe9640083f30d2f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999998926699534 +1e1e0cca52fab68a8c7ba5256aeadd6d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.8408303055125159 +1395953fab837ed426f9b2ba24da41b1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9999917137749439 +94ca1389331a3a9230237844cfd545f6 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__; s__ 0.9826041853598159 +15992a34ae0f42d6b5a21eeaaef674ba k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__; s__ 0.9237949480026619 +b46e36edac9cab660cec7ee6f1a335a3 k__Bacteria; p__Firmicutes 0.9973568159852382 +2ce0fa88ec7cfdda2eeb0698cdad47e8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.985428027694855 +82e72255267397b777a1afd44ea22755 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Flavobacterium; s__ 0.9999983165588121 +9d17e47f8102cca1e9a0a5b0776bb85a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.9996812403146765 +4851a0c86e3c1b3f3c67e88d8a38960a k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.983874185011404 +025dd300b0ccbd9d5898969c2a1ab138 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__; s__ 0.8633672219404543 +9cd30ed12a411f643a9f6c145e3b59d8 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9156941316050989 +831514b8b3617bed49e2a4bd9d3d6268 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.7249899307554465 +5b220f66423e4004eb3520bfae1f25d0 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Cetobacterium; s__somerae 0.9999999804418425 +959a178855242ad3833af85d38ccff45 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales 0.8599298795231495 +a6e9c3caf38d8be5744751bea41aa62f k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Hymenobacter; s__ 0.999998852244763 +3f61c9eee7bfb0326d3efb8da077b0da k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Arcanobacterium; s__ 0.9998247047927459 +9c6b4f83513e63a49ce33a8aeb1813ad k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9990517385234079 +f95cdb71258ef6cc222c673ea4546caf k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9497449261552561 +7e4d5b19d3213719048fe55dfad0da3a k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9541443901454325 +f8753b9f13abb306b57aedce2cf6e7d0 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.7845273732532884 +ae25381e186978a7230f03484baede7c k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Rhodospirillaceae; g__; s__ 0.9949399418164976 +0310f41e594c49368dde5c5993a7a5d0 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.8032276066262287 +de35e106a779f81d63e2e058bf18799c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9412551754255452 +c7312d5390945aa1e45badeeba28a998 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9255918941258421 +9584fe0b6843a9817e1c217bb65caea8 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus; s__helveticus 0.9758316233309225 +81fad06bda8cf753d87288f1d080da88 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__; s__ 0.9606111852474412 +9930e78f4486e70ced513d619dae53fb k__Bacteria; p__Bacteroidetes 0.9999228836289963 +5e793ed595a0793ab477b17e78421bc5 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Comamonas; s__ 0.7988873289496284 +8b300bb35321f8c125cdc4c3a242bbc0 k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__; s__ 0.7301076665391024 +54fa6da8dff69b9fec4b470312d21eb9 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.999936392230782 +457c3dbae079470f3cf0bf146c191e1f k__Bacteria; p__Acidobacteria; c__[Chloracidobacteria]; o__RB41; f__Ellin6075; g__; s__ 0.9634537789887654 +8fbf42d21b6c9c4a4e8e260ad1d6a1ab k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__; s__ 0.9707039256706532 +1efd43e712291698f34853dac3b67f54 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__; s__ 0.901990947308885 +0f006e3e638afedde4892706134a4fb9 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Caulobacterales; f__Caulobacteraceae; g__; s__ 0.9832020609690992 +8c001c89f020a1b78b26ee21d1d56746 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9915899542720145 +1ea96d595539133266a3dbd49daac1e4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__ecb11; s__ 0.7205241579934132 +b2d056fa113334bd2797397b162c6ac9 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8804352895267137 +e03d5567ab978eb82490f359c51912b1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__; s__ 0.8925211331293134 +a5e8aaab366d42b670d589ada160581c k__Bacteria 0.9629056153242835 +2328e11c4256f1f05395b7a377381279 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae] 0.9856418434267052 +55f85b9f95aa14453f466b2ee388737b k__Bacteria; p__Proteobacteria 0.9865472360702796 +9b07cccc73bd232ffb6edb9427194c06 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Cetobacterium; s__somerae 0.9999986865342649 +7456c5136c45202afcf8000e2a8a01c5 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Oxalobacteraceae; g__; s__ 0.9806474534135627 +99f9d85c50cec960adab2a3f0f401371 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9035345022604193 +e6953e3ef3e20c6b169ef7a759d868df k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9991081512814984 +538c01338d48c71522ac629b17a01c9d k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.9242633334579672 +76e8305b47ef8b35c452b5490589fc95 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999965927186377 +328cf8ca7cded30705336cf036a2df45 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9887591323020567 +2b427cf77172293239bc1c1cdb32ace4 k__Bacteria; p__Actinobacteria; c__Rubrobacteria; o__Rubrobacterales; f__Rubrobacteraceae; g__Rubrobacter; s__ 0.8111404016922199 +2f09559bc1ffcc3ea06ae2766194920b k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9918080002056177 +73291cac0e802b6a1fb25ae7079390ef k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.7434705154773141 +5a61388e52a8005b6747280b9332d2de k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales] 0.999905079148246 +37d242005eb3c4239ad2c00158ea99a1 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999059349749 +72cbf125e17c4e14d748543564d3d4ec k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9747354027966921 +b3406cb10b6d6882837eaacbaec3553e k__Bacteria; p__Tenericutes; c__Mollicutes; o__Mycoplasmatales; f__Mycoplasmataceae; g__Mycoplasma; s__ 0.9893731025550265 +b65f8931698507015de2e1c5f0961cd3 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999839715771 +7b9b46a7c3fb8b76b1c68911a9b56da1 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Thiotrichales; f__Thiotrichaceae; g__; s__ 0.7601571345695906 +5ec803f68f3c48cd9ce6436ccbd5b1e3 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Caulobacterales; f__Caulobacteraceae; g__; s__ 0.9999993692906912 +2835a5008083ae7290acbca001520ad1 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.9965198262346259 +0a50155a2def454344e1f2305eff7092 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9686198081065845 +bf6066f701b31c6bba541503797da013 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9896816461994447 +ca1b627f011b52798bfb8fd2c6b76d20 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Aerococcaceae; g__Aerococcus; s__ 0.9375337352941799 +1a2d9f4af510ce624fa0337c3ea9fedc k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9999983178636648 +f9c63350a2cdcada4a0be946f4e0025a k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9929607953641748 +6967d97d0d19d82633e2d05305850f80 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.9598237445248254 +81026563293d6ed29eec4d7f73eab34d Unassigned 0.8669335860002004 +e9849de9c0f7be74e13c457f05177aad k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.8864947334598079 +b59d5976acdb148c29f724d6b7990410 k__Bacteria; p__SR1; c__; o__; f__; g__; s__ 0.9999999900089733 +bae6b03d63955f134b6e523285263226 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__; s__ 0.8191588998951258 +14f2e2d783b09c74ccd36ed32cbeaddd k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__; s__ 0.9849567062374228 +8c12a12aedcd680ab7e259bfd627ff9a k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Methylophilales; f__; g__; s__ 0.8295088878842743 +01173073677a287321be3484fbed0007 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Lardizabala; s__biternata 0.994508052579864 +e6dfd15b38618c3c7ff0a025083f56d4 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.7877092844999323 +33e2cadd9d0b2b4ebeb6261766032e4a k__Bacteria; p__Firmicutes; c__Clostridia 0.971925637416479 +ea646f13713c1f3393a8b66afa03ff4a k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999729373886 +2a010fd0ac0d1761c2e64c9cd3fd97c4 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.999990269945358 +4cecaa1cfabe89a905940ae23dd94a64 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.9972645496321051 +5454ea14c70f0323a5e836aba10947b8 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Acetobacteraceae; g__Roseococcus; s__ 0.9917813038852802 +b8413d82d36f772b9a375231cb504579 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999999849365 +7a9e7bd6bd3444b67f37c95db2960d50 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Bradyrhizobiaceae; g__; s__ 0.8752742269667795 +9abbfb135a6fceeb2ae107b7be7cb133 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999997680078 +e7e23553bcb3b809fe953ff90c99da54 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Mycobacteriaceae; g__Mycobacterium; s__ 0.7384932052019988 +217845ff2f7195cbc781eba1f7e7eaa1 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Acetobacteraceae; g__Roseococcus; s__ 0.9074505060426648 +903752a32299a5fac9505d192dc16466 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9960843983720746 +9c773cfe6cd90b39267153cd9eac020e k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9923118524226692 +5202077471c942e678df50a8e4c706d6 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Intrasporangiaceae; g__; s__ 0.9641507043723985 +04fd81a94c775a5906f2d92cf0548e4d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9530247550161832 +f1d63da515a0c96eb9f7af5de75655bb k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9889378109987512 +6b350f9f82a39450e0894fe9138ad267 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Faecalibacterium; s__prausnitzii 0.9929405147402659 +167baae5fe04a754df7eb073c07adaa7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.8951188271599309 +e1e1ece9cc43057ec074912f7545a432 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999999999645 +43e4b46e2ba2455e3974874722cbd75a k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999999955679328 +76d0a9cc7116aeaa8d26bc09e768cbc4 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__; s__ 0.9997229692080328 +f7a8c8f87af98f9c5f479beaadc0b892 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.8472799110856734 +21c3086fa768008b7bee62d5d13b5366 k__Bacteria; p__Proteobacteria 0.9966900604843442 +d8adf2a20249cefe6c627f9c17abb202 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.9999997325339722 +dd9d9aad1de9345686f5cc614c5616db k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.994768888071969 +0524cb6dcc8f60dafc09c46911c9d0ac k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae 0.8858966697128057 +63e29d89c820b4baafc3f5622946d6ee k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.9995445051112875 +0316af109bb877b5c7a85ddecd6dfd1e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae 0.7356574680635376 +c9ffd432429a7600931358e3a09860f5 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Flammeovirgaceae; g__; s__ 0.7388795314518875 +b18b389447d758e7cb173b4b4f2ad960 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Bradyrhizobiaceae 0.9999999797622765 +f306a3c555687b1dc2c61372504fbbea k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9792432807310691 +bb823ca6d961133b2cd91e9377cefba7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9545799767342258 +8935afd2b1d59a37191411131d75e9f6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.8902579203158328 +648532aadbacef2c7f8f8468a6146fb2 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__; s__ 0.9873423361532491 +124e839582c0a3329101182cb28619a8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9998772356465307 +51b573b10d63a2cbe455deeef5bae002 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8587501064873783 +6bd57e46e038faafe4bb747e1d494df7 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Rikenellaceae; g__; s__ 0.9976656014175976 +5cf1581a0381cd73e278302acd8751b1 k__Bacteria 0.9998244318219386 +3e7f7d8ab3a5fb0e3401a0fda19d8bcb k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.9999751834302668 +ef4cafaa5121e47ff7f31d5553a66214 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Cetobacterium; s__somerae 0.9999999371997765 +e581d288eadb8d4527694b6fe7aa5df4 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales 0.733037449677473 +2c9e19a0423a00f8c17d8086a8ab39a5 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.958518857060934 +65fbdc4707be0814fa4faf52571cc2b5 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.999999999009674 +171930820a0db82224a948125002bf46 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999998964913512 +f78c2a4fb584f61fc0fbd75c2cc22a99 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.8962227989533198 +8406abe6d9a72018bf32d189d1340472 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardioidaceae; g__; s__ 0.9999077107445874 +5e76bbf2de9c36c591f8aab3784ffd1b k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__MKC10; f__; g__; s__ 0.9974225499197713 +5cb28bd0b2eea6847a6328712217c141 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardiaceae; g__Rhodococcus; s__ 0.9976431308665676 +50feebeace77894a50a224bf001c3502 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9724790589137857 +a9e0ac523112f40942da575caf1f386e k__Archaea; p__Crenarchaeota; c__Thaumarchaeota; o__Nitrososphaerales; f__Nitrososphaeraceae; g__Candidatus Nitrososphaera; s__gargensis 0.9958157076317823 +029cc71dc93341de90188b686798aa0d k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae 0.99782489713692 +58c63b4710a70a640cb86afa4d851178 k__Bacteria 0.9564752779539176 +9d68bd5a8479880505cf88ab4695b5c5 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Pontibacter; s__ 0.8055478494641546 +5c4ad81078908a3b228188a847d12f9e k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9458234306324379 +dbd1f3c3e0f401f60d44103595acdb69 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.9381655822231987 +6fea6a26dbc4de9558be63f26f07f7fa k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9999621494488716 +58946a0b64aa351fd8e7b97d02d6639d k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Intrasporangiaceae; g__; s__ 0.9681175153409954 +b89da5ee2f75672a2656789aea91071d k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9999975088720752 +48a6cea7eaf29dcb52dc2985933f4249 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9999666059755069 +4e34087bb8399deb145896c92e1b58a5 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9182373048341681 +6b4a0a64da52980e7a1b1a770978bb88 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.9771537392460105 +c23ddff0e5a041733d633d7bfb93e0cc k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Hymenobacter; s__ 0.9999992022137631 +3d3566af17e7e52ae5413956d004e657 k__Bacteria; p__Firmicutes; c__Bacilli 0.8299077804875117 +64222ae4c3f0f1cc06375a3814da355d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.7566000212419768 +ab402c6b9fa511b0aa2f968cddc364eb k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9781839825575556 +d45006a487d94665893aa9e759be4c97 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.7525334752835731 +5546d0fe4a512f96a6d73509a1ec6e55 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8055754758391716 +40f13b077d41d6837ca6fae65763cf01 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Actinomyces; s__ 0.8915673048061966 +26f1b1ff96f049f0e354df4c3d85efb0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9999912556154038 +25087bd679769914988fc1e7c6d045ff k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Lactococcus; s__ 0.9999999999862439 +6fda1de9604a1be1b99a41028226f4a7 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Dyadobacter; s__ 0.9345161800026223 +f9686d94e355b66c5324677db52b3aa4 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.988317316732497 +0bf5530da55bc16c52034db82e5434af k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Chlorophyta; f__; g__; s__ 0.9999759002542467 +9815d07f1b564c9be5aab03db01608da k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.8509243329248751 +d37b36cd780fdec9627c298370571ed5 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Actinomyces; s__europaeus 0.9755084621213596 +5beb76b0d6631d10fc820c2d128d4cb6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__; s__ 0.9999921482879459 +952fabf17975467e69af4ebb5efb0fb6 k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__; s__ 0.9999822239203696 +cdf8a49dcdb0256a8ead65f65c752e40 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999997306162179 +e83fa923d1e185d9c9de13ca3b37c8f2 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__; s__ 0.9994531269512054 +f6bb195f075d463c5e9b620a6a76dbfd k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Methylobacteriaceae; g__Methylobacterium; s__ 0.8887777135543066 +a1759b9ca6b3363edacc599498d62b56 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.85391682821515 +d1dbb266dc8841470f3c42fe8f465507 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__Campylobacter; s__ 0.9999999972388594 +3b91757d40499fecfd75d1ad215fdd2e k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.9862552965472559 +0b0a240a7ae19f3560d04427d753b603 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Acidaminobacteraceae]; g__; s__ 0.9999999999954383 +e0a941a7b62e87ae6301bce7185e5f4a k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Dermabacteraceae; g__Brachybacterium; s__ 0.9999920546544011 +96802b28a3942cb6b7b40f4b9bfc0d99 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Sphingomonadales; f__Sphingomonadaceae; g__Kaistobacter; s__ 0.9510529559715325 +d4c5acaf755ef50d18008aa6c79f60b0 k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae; g__Treponema; s__ 0.9607910053569405 +a0daabc3e11deb9b43aafbf3c8e31e35 k__Bacteria; p__Acidobacteria; c__[Chloracidobacteria]; o__RB41; f__Ellin6075; g__; s__ 0.9999792255859739 +e9d3af4175420ffab49c29d1a6bb2030 k__Bacteria 0.9757297522761053 +eb19aca9a5979db01ba9947baa292633 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999314443381 +8be3d398e9e6b768ed1aa713f2981204 k__Bacteria 0.9582847550146858 +0335b1664150f1e151340b1450eae898 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9982441599350995 +42f7a4caf54667a21b5de3b888213935 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Acidaminococcus; s__ 0.7933212100281971 +03178a409a41853ea09a94055e138e19 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.8011957900070852 +ba3ff6e27b67596844f11db93e44c496 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.8300600164096446 +af12fc27ee17864717830cafd06453cd k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.9795493444951942 +1076b2b7de5233cc917c9425aa2ea200 k__Bacteria; p__Actinobacteria; c__OPB41; o__; f__; g__; s__ 0.7065129705808924 +a80183c045cf890899121db3bbcbd39d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9998840440137724 +6bf95d9914dc404e98ebff522496533d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.7799533925003399 +14732e0b78dbc03c20c505d7681b6820 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.8010774132701681 +4042bf819b2707dcb567a04950667ec7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9036581829742759 +d8469ca44fd367ae2aab986a57833586 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__ 0.997648653949763 +95b94ac4c1c3e18210f501268e56e50e k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Brevibacteriaceae; g__Brevibacterium; s__casei 0.7751661221662103 +5656d8b980bfee07e29e8fc119850901 k__Bacteria 0.9999999969628199 +d002269a53cf1579adca5f0dadd4f332 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Dyadobacter; s__ 0.9930873613447002 +80b9cf8b7fde7d45e0bc84a9cf9ddd56 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales 0.7479451456437436 +464ff59b632870b5028ed3092b9443ff k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9988290225933982 +15c03c51375c7d03bd3dda24674b9936 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Leadbetterella; s__ 0.9999919623390392 +a3ebb6445ca32f39df9f84fe48525773 k__Bacteria; p__Planctomycetes; c__Phycisphaerae; o__WD2101; f__; g__; s__ 0.9993500781461582 +47e6d3cd169787ff35f9a2278b8d4a2f k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.8361696535562672 +e3f051168532c89bf76e329c715c35f5 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Brachymonas; s__denitrificans 0.7515387538812587 +47fb251b4679084fee2dafef11c6bc4f k__Bacteria; p__SR1; c__; o__; f__; g__; s__ 0.9994873155337575 +9dd67b89e90b1517d6fc340bb1745e15 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Arcanobacterium; s__ 0.9812638978431675 +75a61e0ca465f169e5d2ea2d19f8aefb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9920224754856676 +b9e3d6fcb82de619e9e574be03ecaa41 k__Bacteria 0.9678938024490443 +93982d4e0f9eb9a6179d6abd57560c26 k__Bacteria 0.9579670066466328 +b61a4c5ec96e7276004c81cc845e2fec k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.8424827369834189 +76d2032108822bcfaa90a4873f7a51aa k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Aeromonadales; f__Aeromonadaceae; g__; s__ 0.9999999867019654 +47be834b0f9232d552e00a36fb3c626b k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__MKC10; f__; g__; s__ 0.9999006313323258 +90b16eca6a6edc00f49dfb5f72be8b61 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.8102762642163077 +7d893311a14a858907d4c8ca21d32dc4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Peptococcaceae; g__Peptococcus; s__ 0.9999999999238511 +2d832109f6396e0f93297efd12e1321e k__Bacteria; p__Actinobacteria; c__Thermoleophilia; o__Solirubrobacterales; f__; g__; s__ 0.9999999992230073 +47fe572ed6a6b1d5f4a60a3884ec72e1 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales 0.7574841902020002 +77f79d776f3845bc2901cf9c4229de0b k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Xanthomonadales; f__Xanthomonadaceae; g__; s__ 0.98248093354521 +69e4868406c82bdfd67d2b449ca9f1d8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Catonella; s__ 0.999999732554379 +e7709791d7ef6b47747de9fb43880d14 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.8093373703596846 +f908d554fc6eeb9fef7a7028fa791475 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.999049169448382 +e3d37109be4a17d8437f6fcb6072982d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Acidaminobacteraceae]; g__; s__ 0.8485177953084586 +09fc3d8a98c2ca72c69b63a51b5b564e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.8259449178790261 +3a31937521e389cbdf89ca01039e5ec3 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9470786460476179 +9f816758294dec368624eabd3595ec6f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9996830684472766 +2a71af2786dfb7aeb7ac7d5372c41686 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__; s__ 0.9815496131684108 +59758d94cc7ed9a16526bfc9eb207575 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9994503019301382 +190dfe815683ee977e120d35b3c83b7e k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Peptostreptococcaceae; g__Filifactor; s__ 0.99952584216538 +1d7e45fd568a577b5a6a8b4a20743211 k__Bacteria 0.9602320194638129 +498128a80a796620b238d8ad5cd1d2f9 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Myxococcales; f__Myxococcaceae; g__Myxococcus; s__ 0.9892788990427326 +e2f6c7b758ac2c0476a7e31787dbba84 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Peptostreptococcaceae; g__; s__ 0.9989896368145779 +df98cba64f84c4e8b7f7ea8396f4f3f9 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__; s__ 0.9412638725678515 +88191bcb077f725a8c8e37d74e110baa k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__Escherichia; s__coli 0.7366509880755492 +3b0e180ea70b1a946a6214eacb539c97 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__MKC10; f__; g__; s__ 0.9273423125875078 +84e6f7df01548135d92febfeae9a1ea6 k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae 0.8937237826790412 +dd530a50ee0277096b0cbd210cdb80b2 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Capnocytophaga; s__ochracea 0.988136312507481 +033511c7ff4fe93866075cfb9129aa3b k__Archaea; p__Crenarchaeota; c__Thaumarchaeota; o__Nitrososphaerales; f__Nitrososphaeraceae; g__Candidatus Nitrososphaera; s__gargensis 0.9936199309878089 +216d5bb567182b6210e2c3dbc455f2b6 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Odoribacteraceae]; g__Odoribacter; s__ 0.9992778832225604 +a9541756b547061c02922f1a3a913fce k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.9185187935457652 +059408ca99f1001f64e6df1e06fb951d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.739486211795697 +111311cc108c483f3782c9214681ed19 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae 0.9824899905076373 +427e48835f176c1a367a14b39b882c58 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.8118007388610889 +10ae3ca534ce9bb9f80822b4b4a6375c k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Rhizobiaceae; g__; s__ 0.9704669332421135 +8cfda573467e6a959664801713cadba1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9787326755629034 +73bca1b91fb8a80ee698f1833c073664 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9335337718148026 +fc8f87209db793f740eea731e64f0b2a k__Bacteria 0.999997387393627 +9f6a3b261bc6acafa3d4a6d2de87f924 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Xanthomonadales; f__Xanthomonadaceae; g__Stenotrophomonas; s__maltophilia 0.8656053209210345 +b387961d274808e3ffed8c1594f4cd1c k__Bacteria; p__Actinobacteria; c__Acidimicrobiia; o__Acidimicrobiales; f__; g__; s__ 0.9999977144163921 +e1b32002ee69c4e3210a2a257511f96a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9958404526334174 +6e342714744bf1b213ac0767d6c3998d k__Bacteria; p__[Thermi]; c__Deinococci; o__Deinococcales; f__Trueperaceae; g__B-42; s__ 0.7896352824675161 +14374c3f2fe75bb158b439ebe4a4ee87 k__Bacteria; p__Chloroflexi; c__Anaerolineae; o__Caldilineales; f__Caldilineaceae; g__; s__ 0.9999517458425682 +30d793622ebd90e7687dd3827701d46e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.8752657828256205 +fe72a66c85df0ab333e3a37d0332df67 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Christensenellaceae; g__; s__ 0.8097925801642317 +bc15061b61cf6b5002c58284591f97d4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9999809866209918 +dbae1b46b67ad6769ea63d33ed3d44bf k__Bacteria; p__Firmicutes; c__Bacilli; o__Turicibacterales; f__Turicibacteraceae; g__Turicibacter; s__ 0.9999995307574245 +99acae6a2b24652d92a1ee4cbf8faca5 k__Bacteria 0.964368629661323 +d0dee8a51da30ed74bcadcd7d8e43537 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Chlorophyta; f__; g__; s__ 0.9999999748914664 +8bcec52021ee6467bf008848d55b7a9f k__Bacteria; p__Verrucomicrobia; c__; o__; f__; g__; s__ 0.8466530175607863 +32a4d183139d99ace97a18b276d7c169 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.8383514846450921 +524f22cecc9957e9bf629b5fb0047adc k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales 0.998835395149775 +2fe6a7331192dc6bf073d906fba93929 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.9960386373852823 +be5ed9c02284fa6aa31037f0e2d93470 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9603087777874567 +8f146ce7c43f38ad3673dabe93c7c5bb k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.7037117244150338 +8dc69d65ac9e71a130bc6dbeb71d2f03 k__Bacteria 0.9697024932246691 +d30a7f0a26bd40402be57831cfa4da69 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria 0.8756456579124897 +26583b57be9de00bee14d30f2dc986d8 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Chlorophyta; f__Trebouxiophyceae; g__; s__ 0.999999999118458 +254482075b19ff911db5e5cb26817498 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Aeromonadales; f__Aeromonadaceae; g__Tolumonas; s__ 0.7464095282022631 +21b849f15da11a7cc5122773552e0fef k__Bacteria; p__Chloroflexi 0.9857492495710293 +f59aa47df669ef50955ce1a0512d3abf k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.7555192450631512 +c89812744d8755bef87bedf499bd19cf k__Bacteria 0.9750146282643379 +f8fee8796e3188a996dfeca9e93f47e1 k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Bulleidia; s__ 0.9980916227677465 +a3a69f621716f9345def32e2b5e7b011 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9625163910766555 +5af6e343611d715985e35e7a3e5671cb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9311414150252683 +317c0beca40f29f3aff863b8f028fd48 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Gallicola; s__ 0.9997064291905559 +85943cff5ec22653bc51c22adeabe685 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Acanthamoeba; s__culbertsoni 0.9970085820748956 +2c47de0940a8213b1ba751a7cd0b649b k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Rikenellaceae; g__AF12; s__ 0.9999999996227871 +14b20f972cfa94f77bc33eccc5ffca4c k__Bacteria; p__Verrucomicrobia; c__[Spartobacteria]; o__[Chthoniobacterales]; f__[Chthoniobacteraceae]; g__DA101; s__ 0.9999375839646749 +9cd758ad7582755a7f52f2b003787795 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Helicobacteraceae 0.7884595852143892 +5d4a0085030ee808369a8f29be41e0d2 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.7622592052499118 +c88977d348c943b60eea8f1571e9a7ee k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__durum 0.9365996565974561 +81e706ae981fcbfceea2ac547fdd7f26 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.7007779955696168 +35bfc371d940cffdc527b7b4dc954456 k__Bacteria 0.8983347357171165 +4a146c717d33b2f2719e648bd7d22059 k__Bacteria; p__Planctomycetes; c__Planctomycetia; o__Planctomycetales; f__Planctomycetaceae; g__Planctomyces; s__ 0.9999999943921125 +541947958ad35c1591eb3ef433141196 k__Bacteria; p__Bacteroidetes; c__[Rhodothermi]; o__[Rhodothermales]; f__Rhodothermaceae; g__Rubricoccus; s__ 0.8368847606448594 +a95851baf426c85eae4419617db902a7 k__Bacteria 0.8839793133874827 +34f493c9b3b75210406fecac2dba0f22 k__Bacteria 0.99999999892876 +514a4ebb290842347e3f7ac7cbba276e k__Bacteria 0.977892724728328 +cfce45c3a7af608093fd99677d635891 k__Bacteria; p__Verrucomicrobia; c__[Spartobacteria]; o__[Chthoniobacterales]; f__[Chthoniobacteraceae]; g__Ellin506; s__ 0.826327166127106 +ef571c059fe495366b01e977f7494fbc k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Myxococcales; f__; g__; s__ 0.9982049095845408 +c73d4cf2ab0b699fb47d44488b82fd40 k__Bacteria; p__Verrucomicrobia; c__[Pedosphaerae]; o__[Pedosphaerales]; f__; g__; s__ 0.9997262972383966 +f79e815e1e628908e4ab605022b0ac09 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9959606220122001 +23b560e97aacfd0422ed3f8a1104e7d7 k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae; g__Treponema; s__ 0.985995667905748 +eed50a4877de2fd21b146b4f0c7327ac k__Bacteria; p__Chloroflexi; c__Gitt-GS-136; o__; f__; g__; s__ 0.7923905965393132 +6d7d9658988c6e2b5e45ea087f1b9155 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__Mogibacterium; s__ 0.9999530128058945 +502b6544978890cda2ece2d14bfdba01 k__Bacteria 0.9999992713823516 +ca08eabd09756731f095632656d45b01 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__; s__ 0.9983619317607827 +694caec8dad781d338acf4a5b69c3058 k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Allobaculum; s__ 0.9933864641518518 +14e1a93cf2379225b1fd6ed0f186bacb k__Bacteria; p__FBP; c__; o__; f__; g__; s__ 0.9996710419708875 +6488fe0aaa024ba9c06647578b5a6caf k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Acetobacteraceae; g__Roseococcus; s__ 0.9995620152418827 +5ce3a51e54f30fa53b1e56dc64d11340 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9951843239239426 +4d987a66ee0e67b68c5c4428097eb22e k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Thiotrichales; f__Thiotrichaceae; g__CF-26; s__ 0.7994705971955715 +c3fd5b1d03591477953d49f0f19600c4 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Desulfovibrionales; f__Desulfomicrobiaceae; g__; s__ 0.9999999993020481 +08bd73939f7bfd85daf2eaee7e9c9bf8 Unassigned 0.8664133093465773 +93a769a6b67e5f358eb9ad0e03c53ec3 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae] 0.9989722925004496 +654f282fc504b4dc9af5b8e66a4d1a87 k__Bacteria; p__GN02; c__BD1-5; o__; f__; g__; s__ 0.8937638443300449 +895453b352ae060e0ec5f7721547a3d1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.7756571434765006 +b29143b255f4b97da62310d85fe9b7f3 k__Bacteria; p__Firmicutes; c__Clostridia 0.7084783782168641 +95dff3e66b8bdf4d8e509ceae4373c69 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9997983395343405 +da3328e15aae60ea55a8765511d0327e k__Bacteria; p__Verrucomicrobia; c__[Pedosphaerae]; o__[Pedosphaerales]; f__; g__; s__ 0.999999885192515 +ebcbd71a778e6a1a776d2d50d0801fed k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.9975013045776004 +c80037fe31359840bb73250f330b60e3 k__Bacteria 0.9727262121442337 +bd759efe26a5b4b869d3fa5e4693080d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9995981370005347 +723858f72b4469efb79c323f75bc181f k__Bacteria; p__Planctomycetes; c__Planctomycetia; o__Planctomycetales; f__Planctomycetaceae; g__Planctomyces; s__ 0.9999842079365734 +8021f872c32700d46738f3591cb4c58a k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.950298422800317 +47c7eb4df73a5d553cd2f7a360ff5872 k__Bacteria 0.9625306758187444 +ad492bcae03f566b36a19e31f04d659a k__Bacteria 0.9592420622809142 +eb8ef4756ed538fe480d979e740a04d8 k__Bacteria 0.9992518268672295 +5db2cf37007f874e25eb2c901917e15a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__ 0.9998650088122101 +fa3729663b98de0c0af7913e9f30c19e k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__; g__; s__ 0.7260248247151302 +504572e3afd673db749ee5e8e3e57b97 k__Bacteria; p__Cyanobacteria 0.996420061481882 +a6b6f29a1196cacfc392e3d71f55e2a2 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Bdellovibrionales; f__Bacteriovoracaceae; g__Bacteriovorax; s__ 0.9536660457678927 +0e5df3d01cc073e3c9674c2534169f03 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Acidaminobacteraceae]; g__Acidaminobacter; s__ 0.749393658744113 +06845c67bc4203081a981200f33e87eb k__Bacteria; p__Proteobacteria 0.9956180804506998 +98d250a339a635f20e26397dafc6ced3 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.999193575156621 +1830c14ead81ad012f1db0e12f8ab6a4 k__Bacteria; p__TM7; c__TM7-3; o__Blgi18; f__; g__; s__ 0.9226796920359376 diff --git a/q2_composition/_da_barplot/tests/featureRecord.test.ts b/q2_composition/_da_barplot/tests/featureRecord.test.ts new file mode 100644 index 0000000..4f7b01e --- /dev/null +++ b/q2_composition/_da_barplot/tests/featureRecord.test.ts @@ -0,0 +1,93 @@ +import { describe, test, assert } from "vitest"; +import { FeatureRecord, FeatureRecords } from "../src/util/features"; + +describe("FeatureRecord class", () => { + const feature = new FeatureRecord("abc123"); + + feature.addVariable( + feature.createVariable("body-site", "lfc", 2.2, "tongue", "gut"), + ); + feature.addVariable( + feature.createVariable("body-site", "lfc", -0.3, "left palm", "gut"), + ); + feature.addVariable( + feature.createVariable("body-site", "p", 0.05, "left palm", "gut"), + ); + + test("addVariable()", () => { + assert.equal(feature.variables.size, 2); + }); + + test("getVariable()", () => { + let obs = feature.getVariable("body-site", "tongue"); + let exp = { + name: "body-site", + lfc: 2.2, + level: "tongue", + reference: "gut", + }; + assert.deepEqual(obs, exp); + + obs = feature.getVariable("body-site", "left palm"); + exp = { + name: "body-site", + lfc: -0.3, + p: 0.05, + level: "left palm", + reference: "gut", + }; + assert.deepEqual(obs, exp); + }); + + test("getVariableSlice()", () => { + let obs = feature.getVariableSlice("body-site", "lfc", "tongue"); + let exp = 2.2; + assert.equal(obs, exp); + + obs = feature.getVariableSlice("body-site", "p", "left palm"); + exp = 0.05; + assert.equal(obs, exp); + }); +}); + +describe("FeatureRecords class", () => { + const features = new FeatureRecords(); + + const feature1 = new FeatureRecord("abc123"); + feature1.addVariable( + feature1.createVariable("body-site", "lfc", 2.2, "tongue", "gut"), + ); + feature1.addVariable( + feature1.createVariable("body-site", "lfc", -0.3, "left palm", "gut"), + ); + + features.addFeature(feature1); + + test("addFeature()", () => { + assert.equal(features.records.length, 1); + }); + + const feature2 = new FeatureRecord("abc123"); + feature2.addVariable( + feature2.createVariable("body-site", "p", 0.05, "left palm", "gut"), + ); + features.addFeature(feature2); + + test("addFeature() matching feature", () => { + assert.equal(features.records.length, 1); + + assert.equal(features.records[0].variables.size, 2); + }); + + test("addFeature() merges features", () => { + assert.equal(features.records.length, 1); + + const feature = features.getFeature("abc123"); + + const lfc = feature!.getVariableSlice("body-site", "lfc", "left palm"); + assert.equal(lfc, -0.3); + + const p = feature!.getVariableSlice("body-site", "p", "left palm"); + assert.equal(p, 0.05); + }); +}); diff --git a/q2_composition/_da_barplot/tests/parse.test.ts b/q2_composition/_da_barplot/tests/parse.test.ts new file mode 100644 index 0000000..b1065a7 --- /dev/null +++ b/q2_composition/_da_barplot/tests/parse.test.ts @@ -0,0 +1,168 @@ +import { vi, describe, test, assert } from "vitest"; +import { readFileSync } from "fs"; +import { FeatureRecords } from "../src/util/features"; +import { + getColumnField, + parseJSONLFeatureRecord, + parseSlice, + parseAllSlices, +} from "../src/util/parse"; + +// mock d3.text +async function mockedText(slice: string): Promise { + return readFileSync(slice, "utf-8"); +} +vi.mock("d3-fetch", () => { + return { text: vi.fn(mockedText) }; +}); + +describe("getColumnField()", () => { + const lfcText = readFileSync("tests/data/output-format/lfc.jsonl", "utf-8"); + const header = JSON.parse(lfcText.split("\n")[0]); + + test("column name is present", () => { + const column = "body-site::left palm"; + const exp = { + name: "body-site::left palm", + type: null, + missing: false, + title: "", + description: "", + extra: { + variable: "body-site", + level: "left palm", + reference: "gut", + }, + }; + + assert.deepEqual(getColumnField(column, header), exp); + }); + + test("column name not present", () => { + const column = "waldo"; + + assert.throws( + () => getColumnField(column, header), + "Column waldo not found in JSONL header.", + ); + }); +}); + +describe("parseJSONLFeatureRecord()", () => { + const lfcText = readFileSync("tests/data/output-format/lfc.jsonl", "utf-8"); + const jsonRecords = lfcText + .split("\n") + .filter((line) => line.trim() !== "") + .map((line) => JSON.parse(line)); + + const header = jsonRecords[0]; + const jsonRecord = jsonRecords[1]; + const sliceName = "lfc"; + + const obs = parseJSONLFeatureRecord(jsonRecord, header, sliceName); + + test("parses feature id", () => { + assert.equal(obs.featureId, "4b5eeb300368260019c1fbc7a3c718fc"); + }); + + test("parses correct number of variables", () => { + assert.equal(obs.variables.size, 5); + }); + + test("parses categorical columns", () => { + const variables = Array.from(obs.variables.values()); + const bodySiteVariables = variables.filter( + (v) => v.name == "body-site", + ); + assert.equal(bodySiteVariables.length, 3); + + const levels = bodySiteVariables.map((v) => v.level); + assert.sameMembers(levels, ["right palm", "left palm", "tongue"]); + + const references = bodySiteVariables.map((v) => v.reference); + assert.sameMembers(references, ["gut", "gut", "gut"]); + }); + + test("parses numerical columns", () => { + const variables = Array.from(obs.variables.values()); + const nonCategoricalVariables = variables.filter( + (v) => !Object.hasOwn(v, "reference"), + ); + assert.equal(nonCategoricalVariables.length, 2); + + const yearVariable = nonCategoricalVariables.find( + (v) => v.name == "year", + ); + assert.deepEqual(yearVariable, { + name: "year", + lfc: 189.6871124062, + }); + }); +}); + +describe("parseSlice()", async () => { + const sliceFilepath = "tests/data/output-format/lfc.jsonl"; + const featureRecords = new FeatureRecords(); + await parseSlice(sliceFilepath, featureRecords); + + test("correct number of features", () => { + assert.equal(featureRecords.records.length, 8); + }); + + test("slice parsed correctly", () => { + const feature = featureRecords.getFeature( + "fe30ff0f71a38a39cf1717ec2be3a2fc", + ); + + assert.equal( + feature!.getVariableSlice("body-site", "lfc", "left palm"), + 113.4173262332, + ); + + assert.equal(feature!.getVariableSlice("year", "lfc"), 181.01108921); + + const variable = feature!.getVariable("body-site", "right palm"); + assert.isOk(variable!.lfc); + assert.isNotOk(variable!.q); + assert.isNotOk(variable!.p); + assert.isNotOk(variable!.se); + }); +}); + +describe("parseAllSlices()", async () => { + const sliceDirPath = "tests/data/output-format"; + const featureRecords = new FeatureRecords(); + await parseAllSlices(sliceDirPath, featureRecords); + + test("correct number of features", () => { + assert.equal(featureRecords.records.length, 8); + }); + + test("all slices parsed", () => { + for (let featureRecord of featureRecords.records) { + for (let variable of featureRecord.variables.values()) { + for (let prop of ["lfc", "se", "p", "q"]) { + assert.property(variable, prop); + assert.isDefined(variable[prop]); + } + } + } + }); + + test("structure and contents of arbitrary feature", () => { + const id = "1d2e5f3444ca750c85302ceee2473331"; + const feature = featureRecords.getFeature(id); + + assert.equal( + feature!.getVariableSlice("body-site", "lfc", "left palm"), + 86.9453579935, + ); + + assert.equal(feature!.getVariableSlice("year", "se"), 0.0030650395); + + assert.property( + feature!.getVariable("body-site", "tongue"), + "reference", + ); + }); +}); diff --git a/q2_composition/_da_barplot/tests/taxonomy.test.ts b/q2_composition/_da_barplot/tests/taxonomy.test.ts new file mode 100644 index 0000000..7af4b73 --- /dev/null +++ b/q2_composition/_da_barplot/tests/taxonomy.test.ts @@ -0,0 +1,52 @@ +import { vi, describe, test, assert } from "vitest"; +import { readFileSync } from "fs"; +import { TaxonomyNode, parseTaxonomy } from "../src/util/taxonomy"; +import * as d3 from "d3"; + +// mock d3.tsv +async function mockedTsv(slice: string): Promise { + const textData = readFileSync(slice, "utf-8"); + let lines = textData.split("\n").filter((l) => l.trim() != ""); + + // drop header + lines = lines.slice(1); + + let data: object[] = []; + for (let line of lines) { + const values = line.split("\t"); + const record = { + "Feature ID": values[0], + Taxon: values[1], + }; + data.push(record); + } + + return data; +} +vi.mock("d3-fetch", () => { + return { tsv: vi.fn(mockedTsv) }; +}); + +describe("parseTaxonomy()", async () => { + let root: d3.HierarchyNode; + + test("parses successfully", async () => { + root = await parseTaxonomy("tests/data/taxonomy-fake.tsv"); + }); + + test("has correct number of nodes", () => { + assert.equal(root.descendants().length, 12); + }); + + test("root has correct children", () => { + const exp = ["d1", "d2"]; + assert.deepEqual( + root.children!.map((c) => c.data.name), + exp, + ); + }); + + test("back references exist", () => { + assert.equal(root.data.hierarchyNode, root); + }); +}); diff --git a/q2_composition/_da_barplot/tsconfig.app.json b/q2_composition/_da_barplot/tsconfig.app.json new file mode 100644 index 0000000..55a2f9b --- /dev/null +++ b/q2_composition/_da_barplot/tsconfig.app.json @@ -0,0 +1,20 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "resolveJsonModule": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "isolatedModules": true, + "moduleDetection": "force" + }, + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/q2_composition/_da_barplot/tsconfig.json b/q2_composition/_da_barplot/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/q2_composition/_da_barplot/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/q2_composition/_da_barplot/tsconfig.node.json b/q2_composition/_da_barplot/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/q2_composition/_da_barplot/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/q2_composition/_da_barplot/vite.config.ts b/q2_composition/_da_barplot/vite.config.ts new file mode 100644 index 0000000..bfeb276 --- /dev/null +++ b/q2_composition/_da_barplot/vite.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "vite"; +import { svelte } from "@sveltejs/vite-plugin-svelte"; +import tailwindcss from "@tailwindcss/vite"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [svelte(), tailwindcss()], + base: "", +}); diff --git a/q2_composition/_diff_abundance_plots.py b/q2_composition/_diff_abundance_plots.py deleted file mode 100644 index 29baa99..0000000 --- a/q2_composition/_diff_abundance_plots.py +++ /dev/null @@ -1,242 +0,0 @@ -# ---------------------------------------------------------------------------- -# Copyright (c) 2016-2026, QIIME 2 development team. -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file LICENSE, distributed with this software. -# ---------------------------------------------------------------------------- -import importlib.resources -from pathlib import Path -import urllib.parse -from collections import Counter - -import altair as alt -import pandas as pd -import numpy as np - -import qiime2 -from q2_composition import DataLoafPackageDirFmt -import q2templates - - -def _plot_differentials( - output_dir, - df, - title, - feature_id_label, - effect_size_label, - significance_label, - error_label, - feature_ids, - effect_size_threshold, - significance_threshold, - level_delimiter, - label_limit): - - if len(df) == 0: - raise ValueError("No features present in input.") - - # ensure that all columns are of the types required internally - df = df.astype({feature_id_label: pd.StringDtype(), - error_label: pd.Float64Dtype(), - significance_label: pd.Float64Dtype(), - effect_size_label: pd.Float64Dtype()}) - - if feature_ids is not None: - df = df.query(f'`{feature_id_label}` in @feature_ids') - - df = df[df[significance_label] <= significance_threshold] - df = df[np.abs(df[effect_size_label]) >= effect_size_threshold] - - if len(df) == 0: - raise ValueError("No features remaining after applying filters.") - - output_dir = Path(output_dir) - output_dir.mkdir(parents=True, exist_ok=True) - safe_title = urllib.parse.quote(title) - fig_fn = Path(f'{safe_title}-ancombc-barplot.html') - fig_fp = output_dir / fig_fn - - if level_delimiter is not None: - # For readability, only the most specific named taxonomy will be - # included in the y-axis label. The full taxonomy text will be in - # the tool-tip. Because it's possible that the most specific - # taxonomic name are not unique, this code simply prepends a number - # to names. Providing separate labels for ticks, which - # would avoid this, doesn't seem straight-forward in altair (e.g., - # see https://github.com/altair-viz/altair/issues/938). - y_labels = [] - seen = Counter() - for i, e in enumerate(df[feature_id_label]): - if level_delimiter in e: - fields = [field for field in e.split(level_delimiter) - if not field.endswith('__')] - else: - # this is necessary to handle a case where the delimiter - # isn't found and the e ends with '__' - fields = [e] - most_specific = fields[-1] - if most_specific in seen: - y_labels.append(f"{seen[most_specific]}: {most_specific} *") - else: - y_labels.append(most_specific) - seen[most_specific] += 1 - df['y_label'] = y_labels - df['feature'] = [id_.replace(level_delimiter, ' ') - for id_ in df[feature_id_label]] - else: - df['y_label'] = df['feature'] = df[feature_id_label] - - df['enriched'] = ["enriched" if x else "depleted" - for x in df[effect_size_label] > 0] - - df['error-upper'] = df[effect_size_label] + df[error_label] - df['error-lower'] = df[effect_size_label] - df[error_label] - - # Normally we would call bars.mark_rule to add standard error marks - # (opposed to alt.Chart.mark_bar, but I want to color the the standard - # error marks differently so they stand out against the bars themselves. - # As far as I can tell, I can only do this by creating two separate charts, - # so this shared y-axis will be used for both of those. - shared_y = alt.Y("y_label", - title="Feature ID", - sort=alt.EncodingSortField(field=effect_size_label, - op="min", order="descending")) - - bars = alt.Chart(df).mark_bar().encode( - x=alt.X('lfc', title="Log Fold Change (LFC)"), - y=shared_y, - tooltip=alt.Tooltip(["feature", effect_size_label, - significance_label, error_label, - "error-lower", "error-upper"]), - color=alt.Color('enriched', title="Relative to reference", - scale=alt.Scale( - domain=["enriched", "depleted"], - range=["#4c78a8", "#f58518"]), - sort="descending") - ) - - error = alt.Chart(df).mark_rule(color='black').encode( - x='error-lower', - x2='error-upper', - y=shared_y, - ) - - chart = (bars + error).properties(title=title) - chart = chart.configure_legend( - strokeColor='gray', - padding=10, - cornerRadius=10, - ) - - # Moves the y-axis title to the top-left, making it more apparent when - # there are a lot of features. - chart = chart.configure_axisY(titleAlign='left', - titleY=-10, titleAngle=0) - if label_limit is not None: - chart = chart.configure_axis(labelLimit=label_limit) - - chart.save(fig_fp) - return fig_fp - - -def da_barplot(output_dir: str, - data: DataLoafPackageDirFmt, - effect_size_label: str = 'lfc', - feature_id_label: str = 'id', - error_label: str = 'se', - significance_label: str = 'q_val', - significance_threshold: float = 1.0, - effect_size_threshold: float = 0.0, - feature_ids: qiime2.Metadata = None, - level_delimiter: str = None, - label_limit: int = None): - - # setup for the index.html page - ASSETS = importlib.resources.files('q2_composition') / 'assets' - index = Path(ASSETS, 'diff_abundance_plots', 'index.html') - - # collect the user-provided labels for validation - provided_slice_labels = set([effect_size_label, - significance_label, - error_label]) - - slice_data = {} - for e in data.data_slices.iter_views(pd.DataFrame): - slice_data[str(e[0]).replace('_slice.csv', '')] = e[1] - - observed_slice_labels = set(slice_data.keys()) - missing_slice_labels = provided_slice_labels - observed_slice_labels - if len(missing_slice_labels) > 0: - raise KeyError( - f"Provide label(s) ({' '.join(missing_slice_labels)}) " - "are not present in input. Available options are: " - f"{' '.join(observed_slice_labels)}.") - - # exclude the Intercept column from plots - column_labels = [e for e in slice_data[effect_size_label].columns - if e not in '(Intercept)'] - - if feature_id_label not in column_labels: - raise KeyError(f"Feature id header \"{feature_id_label}\" is not " - "present in input. Available options are: " - f"{' '.join(column_labels)}.") - - # create figure_data, which contains the cross-slice data for each - # column of the input dataloaf. some of this logic likely makes sense - # to move into a transformer which handles the arrangement of data - # into a multi-index dataframe. - # - # if the input dataloaf looks like: - # slice1: lfc - # feature-id skin gut - # f1 0.2 5.4 - # f2 1.2 0.1 - # slice2: q_value - # feature-id skin gut - # f1 0.9 0.01 - # f2 0.05 0.8 - # - # figure_data for a specific category will look like: - # feature-id lfc q_value - # f1 0.2 0.9 - # f2 1.2 0.05 - # or: - # feature-id lfc q_value - # f1 5.4 0.01 - # f2 0.1 0.8 - figure_data = [] - for column_label in column_labels: - if column_label == feature_id_label: - continue - df = pd.concat( - [slice_data[effect_size_label][feature_id_label], - slice_data[effect_size_label][column_label], - slice_data[error_label][column_label], - slice_data[significance_label][column_label]], - keys=[feature_id_label, effect_size_label, - error_label, significance_label], - axis=1) - - try: - figure_fp = _plot_differentials( - output_dir, df, - title=column_label, - effect_size_label=effect_size_label, - feature_id_label=feature_id_label, - error_label=error_label, - significance_label=significance_label, - significance_threshold=significance_threshold, - effect_size_threshold=effect_size_threshold, - feature_ids=feature_ids, - level_delimiter=level_delimiter, - label_limit=label_limit) - figure_fn = figure_fp.parts[-1] - figure_data.append((True, figure_fn, column_label, None)) - except ValueError as e: - figure_data.append((False, None, column_label, str(e))) - - context = { - 'figures': figure_data - } - q2templates.render(str(index), output_dir, context=context) diff --git a/q2_composition/plugin_setup.py b/q2_composition/plugin_setup.py index e374399..e81fc78 100644 --- a/q2_composition/plugin_setup.py +++ b/q2_composition/plugin_setup.py @@ -291,25 +291,24 @@ ) plugin.visualizers.register_function( - function=q2_composition.ancombc2_visualizer, + function=q2_composition.da_barplot, inputs={ 'data': FeatureData[DifferentialAbundance | ANCOMBC2Output], 'taxonomy': FeatureData[Taxonomy], }, parameters={}, input_descriptions={ - 'data': 'The ANCOMBC2 output to visualize.', + 'data': 'The ANCOMBC or ANCOMBC2 output to visualize.', 'taxonomy': ( - 'The taxonomy associated with the features present in the ' - 'ANCOMBC2 data.' + 'The taxonomy associated with the features present in the data.' ) }, - name='Visualize ANCOMBC2 output.', + name='Visualize ANCOMBC/ANCOMBC2 output.', description=( - 'Displays ANCOMBC2 Log-Fold Change values in a barplot and allows ' - 'filtering based on p-value and standard error. If a taxonomy is ' - 'provided, features can be filtered by taxonomy using an interactive ' - 'tree.' + 'Displays ANCOMBC/ANCOMBC2 Log-Fold Change values in a barplot and ' + 'allows filtering based on p-value and standard error. If a taxonomy ' + 'is provided, features can be filtered by taxonomy using an ' + 'interactive tree.' ), ) @@ -327,48 +326,4 @@ ' (se), P values, Q values, and W scores.' ), ) - -plugin.visualizers.register_function( - function=q2_composition.da_barplot, - inputs={'data': FeatureData[DifferentialAbundance]}, - parameters={'effect_size_label': Str, - 'feature_id_label': Str, - 'error_label': Str, - 'significance_label': Str, - 'significance_threshold': Float % Range(0.0, 1.0, - inclusive_start=True, - inclusive_end=True), - 'effect_size_threshold': Float % Range(0.0, np.inf, - inclusive_start=True), - 'feature_ids': Metadata, - 'level_delimiter': Str, - 'label_limit': Int}, - input_descriptions={'data': 'The ANCOM-BC output to be plotted.'}, - parameter_descriptions={ - 'effect_size_label': "Label for effect sizes in `data`.", - 'feature_id_label': "Label for feature ids in `data`.", - 'error_label': "Label for effect size errors in `data`.", - 'significance_label': ("Label for statistical significance " - "level in `data`."), - 'significance_threshold': ("Exclude features with statistical " - "significance level greater (i.e., less " - "significant) than this threshold."), - 'effect_size_threshold': ("Exclude features with an absolute value " - "of effect size less than this threshold."), - 'feature_ids': ("Exclude features if their ids are not included in " - "this index."), - 'level_delimiter': ("If feature ids encode hierarchical information, " - "split the levels when generating feature labels " - "in the visualization using this delimiter."), - 'label_limit': ("Set the maximum length that will be viewable for " - "axis labels. You can set this parameter if your " - "axis labels are being cut off.")}, - name='Differential abundance bar plots', - description=('Generate bar plot views of ANCOM-BC output. One plot will ' - 'be present per column in the ANCOM-BC output. The ' - '`significance_threshold`, `effect_size_threshold` ' - 'and `feature_ids` filter results are intersected, ' - 'such that only features that remain after all three ' - 'filters have been applied will be present in the output.'), -) importlib.import_module('q2_composition._transformer') diff --git a/q2_composition/tests/test_ancombc2.py b/q2_composition/tests/test_ancombc2.py index 9ec8ebf..c45159d 100644 --- a/q2_composition/tests/test_ancombc2.py +++ b/q2_composition/tests/test_ancombc2.py @@ -24,7 +24,7 @@ r_base, ancombc2, _process_formula, _convert_metadata, _split_into_slices, _rename_variables_post, _is_categorical, _parse_variable_and_level, _deduce_reference_levels, _process_categorical_variables, - _process_structural_zeros, ancombc2_visualizer + _process_structural_zeros, da_barplot ) from q2_composition._format import ANCOMBC2SliceMapping @@ -185,17 +185,17 @@ def test_spaces_in_metadata_column(self): # three levels, so one reference and other two in the output self.assertEqual(len(variable_with_spaces_columns), 2) - def test_ancombc2_visualizer(self): + def test_da_barplot(self): ''' Tests that the visualizer runs successfully, which is essentially a test of whether or not the visualizer got built into the - q2_composition/_ancombc2_visualizer/dist/ folder successfully. + q2_composition/_da_barplot/dist/ folder successfully. ''' with tempfile.TemporaryDirectory() as tempdir: - ancombc2_visualizer(tempdir, self.abc2_output) + da_barplot(tempdir, self.abc2_output) assert os.path.exists(os.path.join(tempdir, 'index.html')) - def test_ancombc2_visualizer_non_overlapping_taxonomy(self): + def test_da_barplot_non_overlapping_taxonomy(self): ''' Tests that an error is raised when attempting to visualize ancombc2 data with a taxonomy that contains none of the features present in the @@ -211,7 +211,7 @@ def test_ancombc2_visualizer_non_overlapping_taxonomy(self): with self.assertRaisesRegex( ValueError, 'No features remained in your taxonomy' ): - ancombc2_visualizer(tempdir, self.abc2_output, taxonomy_df) + da_barplot(tempdir, self.abc2_output, taxonomy_df) class TestFormulaProcessing(TestANCOMBC2Base): diff --git a/q2_composition/tests/test_diff_abundance_plot.py b/q2_composition/tests/test_diff_abundance_plot.py deleted file mode 100644 index 6491033..0000000 --- a/q2_composition/tests/test_diff_abundance_plot.py +++ /dev/null @@ -1,564 +0,0 @@ -# ---------------------------------------------------------------------------- -# Copyright (c) 2016-2026, QIIME 2 development team. -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file LICENSE, distributed with this software. -# ---------------------------------------------------------------------------- -import tempfile -from pathlib import Path -import urllib.parse - -from qiime2.plugin.testing import TestPluginBase -from qiime2 import Artifact - -from q2_composition import (da_barplot, DataLoafPackageDirFmt) - - -class TestBase(TestPluginBase): - package = 'q2_composition.tests' - - def setUp(self): - super().setUp() - self.dataloaf1 = Artifact.load(self.get_data_path('dataloaf.qza')) - self.dataloaf2 = \ - Artifact.load(self.get_data_path('dataloaf-hmp1-body-habitat.qza')) - - -class TestDABarplot(TestBase): - - def _get_output_filepath(self, dir, title): - safe_title = urllib.parse.quote(title) - return dir / f'{safe_title}-ancombc-barplot.html' - - def test_basic_dl1(self): - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf1.view(DataLoafPackageDirFmt), - feature_id_label='id') - self.assertTrue((output_dir / 'index.html').exists()) - - tongue_path = self._get_output_filepath( - output_dir, 'bodysitetongue') - self.assertTrue(tongue_path.exists()) - - right_palm_path = self._get_output_filepath( - output_dir, 'bodysiteright palm') - self.assertTrue(right_palm_path.exists()) - - left_palm_path = self._get_output_filepath( - output_dir, 'bodysiteleft palm') - self.assertTrue(left_palm_path.exists()) - - # checking that spaces are converted to %20 - left_palm_path = self._get_output_filepath( - output_dir, 'bodysiteleft palm') - fp = str(left_palm_path) - expected_fp_segment = "bodysiteleft%20palm-ancombc-barplot.html" - self.assertIn(expected_fp_segment, fp) - - # file shouldn't exist for reference column - gut_path = self._get_output_filepath( - output_dir, 'bodysitegut') - self.assertFalse(gut_path.exists()) - - # spot check for a feature id - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(tongue_path).read()) - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(right_palm_path).read()) - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(left_palm_path).read()) - - def test_basic_dl2(self): - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf2.view(DataLoafPackageDirFmt)) - self.assertTrue((output_dir / 'index.html').exists()) - - feces_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:feces') - self.assertTrue(feces_path.exists()) - - oral_cavity_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:oral cavity') - self.assertTrue(oral_cavity_path.exists()) - - saliva_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:saliva') - self.assertTrue(saliva_path.exists()) - - vagina_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:vagina') - self.assertTrue(vagina_path.exists()) - - # file shouldn't exist for reference column - skin_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:skin') - self.assertFalse(skin_path.exists()) - - # spot check for a feature id - self.assertTrue( - 'g__Staphylococcus' in - open(feces_path).read()) - self.assertTrue( - 'g__Staphylococcus' in - open(oral_cavity_path).read()) - self.assertTrue( - 'g__Staphylococcus' in - open(saliva_path).read()) - self.assertTrue( - 'g__Staphylococcus' in - open(vagina_path).read()) - - def test_label_limit(self): - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf2.view(DataLoafPackageDirFmt), - label_limit=4242) - feces_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:feces') - self.assertTrue('{"labelLimit": 4242}' in open(feces_path).read()) - - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf2.view(DataLoafPackageDirFmt), - label_limit=None) - feces_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:feces') - self.assertFalse('labelLimit' in open(feces_path).read()) - - def test_filter_on_significance(self): - # confirm feature presence when not filtering - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf1.view(DataLoafPackageDirFmt), - feature_id_label='id', - significance_threshold=1.0) - tongue_path = self._get_output_filepath( - output_dir, 'bodysitetongue') - self.assertTrue(tongue_path.exists()) - - right_palm_path = self._get_output_filepath( - output_dir, 'bodysiteright palm') - self.assertTrue(right_palm_path.exists()) - - left_palm_path = self._get_output_filepath( - output_dir, 'bodysiteleft palm') - self.assertTrue(left_palm_path.exists()) - - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(tongue_path).read()) - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(right_palm_path).read()) - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(left_palm_path).read()) - - # confirm feature absence when filtering - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf1.view(DataLoafPackageDirFmt), - feature_id_label='id', - significance_threshold=1e-3) - - tongue_path = self._get_output_filepath( - output_dir, 'bodysitetongue') - self.assertTrue(tongue_path.exists()) - - right_palm_path = self._get_output_filepath( - output_dir, 'bodysiteright palm') - self.assertTrue(right_palm_path.exists()) - - left_palm_path = self._get_output_filepath( - output_dir, 'bodysiteleft palm') - self.assertTrue(left_palm_path.exists()) - - # this feature is significant at this - # threshold only in tongue and left palm - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(tongue_path).read()) - self.assertFalse( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(right_palm_path).read()) - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(left_palm_path).read()) - - def test_filter_on_effect_size(self): - # confirm feature presence when not filtering - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf1.view(DataLoafPackageDirFmt), - feature_id_label='id', - effect_size_threshold=0) - - tongue_path = self._get_output_filepath( - output_dir, 'bodysitetongue') - self.assertTrue(tongue_path.exists()) - - right_palm_path = self._get_output_filepath( - output_dir, 'bodysiteright palm') - self.assertTrue(right_palm_path.exists()) - - left_palm_path = self._get_output_filepath( - output_dir, 'bodysiteleft palm') - self.assertTrue(left_palm_path.exists()) - - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(tongue_path).read()) - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(right_palm_path).read()) - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(left_palm_path).read()) - - # confirm feature absence when filtering - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf1.view(DataLoafPackageDirFmt), - feature_id_label='id', - effect_size_threshold=3.5) - - tongue_path = self._get_output_filepath( - output_dir, 'bodysitetongue') - self.assertTrue(tongue_path.exists()) - - right_palm_path = self._get_output_filepath( - output_dir, 'bodysiteright palm') - self.assertTrue(right_palm_path.exists()) - - left_palm_path = self._get_output_filepath( - output_dir, 'bodysiteleft palm') - self.assertTrue(left_palm_path.exists()) - - # this feature's effect size is greater - # than the threshold only in tongue and left palm - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(tongue_path).read()) - self.assertFalse( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(right_palm_path).read()) - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(left_palm_path).read()) - - def test_filter_on_feature_ids(self): - ids_to_keep = ['bfbed36e63b69fec4627424163d20118', - '4b5eeb300368260019c1fbc7a3c718fc'] - - # confirm feature presence when no filtering - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf1.view(DataLoafPackageDirFmt), - feature_id_label='id', - feature_ids=None) - - tongue_path = self._get_output_filepath( - output_dir, 'bodysitetongue') - self.assertTrue(tongue_path.exists()) - - right_palm_path = self._get_output_filepath( - output_dir, 'bodysiteright palm') - self.assertTrue(right_palm_path.exists()) - - left_palm_path = self._get_output_filepath( - output_dir, 'bodysiteleft palm') - self.assertTrue(left_palm_path.exists()) - - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(tongue_path).read()) - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(right_palm_path).read()) - self.assertTrue( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(left_palm_path).read()) - - # confirm feature absence when filtering - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf1.view(DataLoafPackageDirFmt), - feature_id_label='id', - feature_ids=ids_to_keep) - - tongue_path = self._get_output_filepath( - output_dir, 'bodysitetongue') - self.assertTrue(tongue_path.exists()) - - right_palm_path = self._get_output_filepath( - output_dir, 'bodysiteright palm') - self.assertTrue(right_palm_path.exists()) - - left_palm_path = self._get_output_filepath( - output_dir, 'bodysiteleft palm') - self.assertTrue(left_palm_path.exists()) - - # feature ids expected to be absent are absent - self.assertFalse( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(tongue_path).read()) - self.assertFalse( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(right_palm_path).read()) - self.assertFalse( - 'd29fe3c70564fc0f69f2c03e0d1e5561' in - open(left_palm_path).read()) - - # feature ids expected to be present are present - self.assertTrue( - 'bfbed36e63b69fec4627424163d20118' in - open(tongue_path).read()) - self.assertTrue( - 'bfbed36e63b69fec4627424163d20118' in - open(right_palm_path).read()) - self.assertTrue( - 'bfbed36e63b69fec4627424163d20118' in - open(left_palm_path).read()) - - self.assertTrue( - '4b5eeb300368260019c1fbc7a3c718fc' in - open(tongue_path).read()) - self.assertTrue( - '4b5eeb300368260019c1fbc7a3c718fc' in - open(right_palm_path).read()) - self.assertTrue( - '4b5eeb300368260019c1fbc7a3c718fc' in - open(left_palm_path).read()) - - def test_error_on_bad_column_names(self): - with tempfile.TemporaryDirectory() as output_dir: - with self.assertRaisesRegex(KeyError, "id.*\"taxon\".*not"): - da_barplot(output_dir, - data=self.dataloaf1.view(DataLoafPackageDirFmt), - feature_id_label='taxon') - - with tempfile.TemporaryDirectory() as output_dir: - with self.assertRaisesRegex(KeyError, "label.*stderr.*not"): - da_barplot(output_dir, - data=self.dataloaf1.view(DataLoafPackageDirFmt), - error_label='stderr') - - def test_toggle_level_delimiter(self): - # no delimiter - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf2.view(DataLoafPackageDirFmt)) - - feces_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:feces') - self.assertTrue(feces_path.exists()) - - oral_cavity_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:oral cavity') - self.assertTrue(oral_cavity_path.exists()) - - saliva_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:saliva') - self.assertTrue(saliva_path.exists()) - - vagina_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:vagina') - self.assertTrue(vagina_path.exists()) - - # multi-level information should be present as 'y-label' - self.assertTrue( - '"y_label": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(feces_path).read()) - self.assertTrue( - '"y_label": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(oral_cavity_path).read()) - self.assertTrue( - '"y_label": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(saliva_path).read()) - self.assertTrue( - '"y_label": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(vagina_path).read()) - - # same labels should be present as 'feature' - self.assertTrue( - '"feature": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(feces_path).read()) - self.assertTrue( - '"feature": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(oral_cavity_path).read()) - self.assertTrue( - '"feature": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(saliva_path).read()) - self.assertTrue( - '"feature": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(vagina_path).read()) - - # typical delimiter: ; - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf2.view(DataLoafPackageDirFmt), - level_delimiter=';') - - feces_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:feces') - self.assertTrue(feces_path.exists()) - - oral_cavity_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:oral cavity') - self.assertTrue(oral_cavity_path.exists()) - - saliva_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:saliva') - self.assertTrue(saliva_path.exists()) - - vagina_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:vagina') - self.assertTrue(vagina_path.exists()) - - # single-level information should be present as 'y-label' - self.assertTrue( - '"y_label": "g__Staphylococcus' in - open(feces_path).read()) - self.assertTrue( - '"y_label": "g__Staphylococcus' in - open(oral_cavity_path).read()) - self.assertTrue( - '"y_label": "g__Staphylococcus' in - open(saliva_path).read()) - self.assertTrue( - '"y_label": "g__Staphylococcus' in - open(vagina_path).read()) - - # space delimited labels should be present as 'feature' - self.assertTrue( - '"feature": "d__Bacteria p__Firmicutes c__Bacilli o__Staphylococcales f__Staphylococcaceae g__Staphylococcus"' # noqa: E501 - in open(feces_path).read()) - self.assertTrue( - '"feature": "d__Bacteria p__Firmicutes c__Bacilli o__Staphylococcales f__Staphylococcaceae g__Staphylococcus"' # noqa: E501 - in open(oral_cavity_path).read()) - self.assertTrue( - '"feature": "d__Bacteria p__Firmicutes c__Bacilli o__Staphylococcales f__Staphylococcaceae g__Staphylococcus"' # noqa: E501 - in open(saliva_path).read()) - self.assertTrue( - '"feature": "d__Bacteria p__Firmicutes c__Bacilli o__Staphylococcales f__Staphylococcaceae g__Staphylococcus"' # noqa: E501 - in open(vagina_path).read()) - - # weird delimiter: __ - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf2.view(DataLoafPackageDirFmt), - level_delimiter='__') - - feces_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:feces') - self.assertTrue(feces_path.exists()) - - oral_cavity_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:oral cavity') - self.assertTrue(oral_cavity_path.exists()) - - saliva_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:saliva') - self.assertTrue(saliva_path.exists()) - - vagina_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:vagina') - self.assertTrue(vagina_path.exists()) - - # single-level information should be present as 'y-label' - self.assertTrue( - '"y_label": "Staphylococcus' in - open(feces_path).read()) - self.assertTrue( - '"y_label": "Staphylococcus' in - open(oral_cavity_path).read()) - self.assertTrue( - '"y_label": "Staphylococcus' in - open(saliva_path).read()) - self.assertTrue( - '"y_label": "Staphylococcus' in - open(vagina_path).read()) - - # space delimited labels should be present as 'feature' - self.assertTrue( - '"feature": "d Bacteria;p Firmicutes;c Bacilli;o Staphylococcales;f Staphylococcaceae;g Staphylococcus"' # noqa: E501 - in open(feces_path).read()) - self.assertTrue( - '"feature": "d Bacteria;p Firmicutes;c Bacilli;o Staphylococcales;f Staphylococcaceae;g Staphylococcus"' # noqa: E501 - in open(oral_cavity_path).read()) - self.assertTrue( - '"feature": "d Bacteria;p Firmicutes;c Bacilli;o Staphylococcales;f Staphylococcaceae;g Staphylococcus"' # noqa: E501 - in open(saliva_path).read()) - self.assertTrue( - '"feature": "d Bacteria;p Firmicutes;c Bacilli;o Staphylococcales;f Staphylococcaceae;g Staphylococcus"' # noqa: E501 - in open(vagina_path).read()) - - # missing delimiter: ! - with tempfile.TemporaryDirectory() as output_dir: - output_dir = Path(output_dir) - _ = da_barplot(output_dir, - self.dataloaf2.view(DataLoafPackageDirFmt), - level_delimiter='!') - - feces_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:feces') - self.assertTrue(feces_path.exists()) - - oral_cavity_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:oral cavity') - self.assertTrue(oral_cavity_path.exists()) - - saliva_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:saliva') - self.assertTrue(saliva_path.exists()) - - vagina_path = self._get_output_filepath( - output_dir, 'body_habitatUBERON:vagina') - self.assertTrue(vagina_path.exists()) - - # multi-level information should be present as 'y-label' - self.assertTrue( - '"y_label": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(feces_path).read()) - self.assertTrue( - '"y_label": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(oral_cavity_path).read()) - self.assertTrue( - '"y_label": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(saliva_path).read()) - self.assertTrue( - '"y_label": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(vagina_path).read()) - - # same labels should be present as 'feature' - self.assertTrue( - '"feature": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(feces_path).read()) - self.assertTrue( - '"feature": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(oral_cavity_path).read()) - self.assertTrue( - '"feature": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(saliva_path).read()) - self.assertTrue( - '"feature": "d__Bacteria;p__Firmicutes;c__Bacilli;o__Staphylococcales;f__Staphylococcaceae;g__Staphylococcus"' # noqa: E501 - in open(vagina_path).read()) From 79701bedc6622471ecb6eecccf18f2869941ba9b Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Tue, 19 May 2026 14:19:29 -0700 Subject: [PATCH 05/15] lint --- q2_composition/plugin_setup.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/q2_composition/plugin_setup.py b/q2_composition/plugin_setup.py index e81fc78..0422454 100644 --- a/q2_composition/plugin_setup.py +++ b/q2_composition/plugin_setup.py @@ -8,8 +8,6 @@ import importlib -import numpy as np - from qiime2.plugin import (Int, Float, Bool, Str, List, Choices, Citations, Plugin, Metadata, MetadataColumn, Categorical, Range, Threads) @@ -305,7 +303,7 @@ }, name='Visualize ANCOMBC/ANCOMBC2 output.', description=( - 'Displays ANCOMBC/ANCOMBC2 Log-Fold Change values in a barplot and ' + 'Displays ANCOMBC/ANCOMBC2 Log-Fold Change values in a barplot and ' 'allows filtering based on p-value and standard error. If a taxonomy ' 'is provided, features can be filtered by taxonomy using an ' 'interactive tree.' From 9cd58b6e2b035f42850c0ba1e981d5d6b0f41003 Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Tue, 19 May 2026 14:27:43 -0700 Subject: [PATCH 06/15] renaming folder --- .../_ancombc2_visualizer/.gitignore | 26 - .../.vscode/extensions.json | 3 - .../_ancombc2_visualizer/index.html | 14 - .../_ancombc2_visualizer/package-lock.json | 4310 ----------------- .../_ancombc2_visualizer/package.json | 30 - .../_ancombc2_visualizer/src/App.svelte | 61 - .../_ancombc2_visualizer/src/app.css | 12 - .../src/lib/Barplot.svelte | 47 - .../src/lib/BarplotControls.svelte | 82 - .../src/lib/BarplotFilters.svelte | 157 - .../src/lib/ControlContainer.svelte | 8 - .../src/lib/SelectedTaxon.svelte | 147 - .../src/lib/Taxonomy.svelte | 37 - .../src/lib/TaxonomyFilter.svelte | 99 - .../src/lib/TaxonomyFilterList.svelte | 137 - .../_ancombc2_visualizer/src/main.ts | 9 - .../src/util/features.svelte.ts | 309 -- .../_ancombc2_visualizer/src/util/parse.ts | 148 - .../_ancombc2_visualizer/src/util/plot.ts | 526 -- .../src/util/taxonomy.svelte.ts | 729 --- .../_ancombc2_visualizer/src/vite-env.d.ts | 2 - .../_ancombc2_visualizer/svelte.config.js | 7 - .../tests/data/output-format/W.jsonl | 9 - .../tests/data/output-format/diff.jsonl | 9 - .../tests/data/output-format/lfc.jsonl | 9 - .../tests/data/output-format/p.jsonl | 9 - .../tests/data/output-format/passed_ss.jsonl | 9 - .../tests/data/output-format/q.jsonl | 9 - .../tests/data/output-format/se.jsonl | 9 - .../data/output-format/structural-zeros.jsonl | 771 --- .../tests/data/taxonomy-fake.tsv | 8 - .../tests/data/taxonomy.tsv | 771 --- .../tests/featureRecord.test.ts | 93 - .../_ancombc2_visualizer/tests/parse.test.ts | 168 - .../tests/taxonomy.test.ts | 52 - .../_ancombc2_visualizer/tsconfig.app.json | 20 - .../_ancombc2_visualizer/tsconfig.json | 7 - .../_ancombc2_visualizer/tsconfig.node.json | 24 - .../_ancombc2_visualizer/vite.config.ts | 9 - 39 files changed, 8886 deletions(-) delete mode 100644 q2_composition/_ancombc2_visualizer/.gitignore delete mode 100644 q2_composition/_ancombc2_visualizer/.vscode/extensions.json delete mode 100644 q2_composition/_ancombc2_visualizer/index.html delete mode 100644 q2_composition/_ancombc2_visualizer/package-lock.json delete mode 100644 q2_composition/_ancombc2_visualizer/package.json delete mode 100644 q2_composition/_ancombc2_visualizer/src/App.svelte delete mode 100644 q2_composition/_ancombc2_visualizer/src/app.css delete mode 100644 q2_composition/_ancombc2_visualizer/src/lib/Barplot.svelte delete mode 100644 q2_composition/_ancombc2_visualizer/src/lib/BarplotControls.svelte delete mode 100644 q2_composition/_ancombc2_visualizer/src/lib/BarplotFilters.svelte delete mode 100644 q2_composition/_ancombc2_visualizer/src/lib/ControlContainer.svelte delete mode 100644 q2_composition/_ancombc2_visualizer/src/lib/SelectedTaxon.svelte delete mode 100644 q2_composition/_ancombc2_visualizer/src/lib/Taxonomy.svelte delete mode 100644 q2_composition/_ancombc2_visualizer/src/lib/TaxonomyFilter.svelte delete mode 100644 q2_composition/_ancombc2_visualizer/src/lib/TaxonomyFilterList.svelte delete mode 100644 q2_composition/_ancombc2_visualizer/src/main.ts delete mode 100644 q2_composition/_ancombc2_visualizer/src/util/features.svelte.ts delete mode 100644 q2_composition/_ancombc2_visualizer/src/util/parse.ts delete mode 100644 q2_composition/_ancombc2_visualizer/src/util/plot.ts delete mode 100644 q2_composition/_ancombc2_visualizer/src/util/taxonomy.svelte.ts delete mode 100644 q2_composition/_ancombc2_visualizer/src/vite-env.d.ts delete mode 100644 q2_composition/_ancombc2_visualizer/svelte.config.js delete mode 100644 q2_composition/_ancombc2_visualizer/tests/data/output-format/W.jsonl delete mode 100644 q2_composition/_ancombc2_visualizer/tests/data/output-format/diff.jsonl delete mode 100644 q2_composition/_ancombc2_visualizer/tests/data/output-format/lfc.jsonl delete mode 100644 q2_composition/_ancombc2_visualizer/tests/data/output-format/p.jsonl delete mode 100644 q2_composition/_ancombc2_visualizer/tests/data/output-format/passed_ss.jsonl delete mode 100644 q2_composition/_ancombc2_visualizer/tests/data/output-format/q.jsonl delete mode 100644 q2_composition/_ancombc2_visualizer/tests/data/output-format/se.jsonl delete mode 100644 q2_composition/_ancombc2_visualizer/tests/data/output-format/structural-zeros.jsonl delete mode 100644 q2_composition/_ancombc2_visualizer/tests/data/taxonomy-fake.tsv delete mode 100644 q2_composition/_ancombc2_visualizer/tests/data/taxonomy.tsv delete mode 100644 q2_composition/_ancombc2_visualizer/tests/featureRecord.test.ts delete mode 100644 q2_composition/_ancombc2_visualizer/tests/parse.test.ts delete mode 100644 q2_composition/_ancombc2_visualizer/tests/taxonomy.test.ts delete mode 100644 q2_composition/_ancombc2_visualizer/tsconfig.app.json delete mode 100644 q2_composition/_ancombc2_visualizer/tsconfig.json delete mode 100644 q2_composition/_ancombc2_visualizer/tsconfig.node.json delete mode 100644 q2_composition/_ancombc2_visualizer/vite.config.ts diff --git a/q2_composition/_ancombc2_visualizer/.gitignore b/q2_composition/_ancombc2_visualizer/.gitignore deleted file mode 100644 index 775bbdd..0000000 --- a/q2_composition/_ancombc2_visualizer/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -!lib/ diff --git a/q2_composition/_ancombc2_visualizer/.vscode/extensions.json b/q2_composition/_ancombc2_visualizer/.vscode/extensions.json deleted file mode 100644 index bdef820..0000000 --- a/q2_composition/_ancombc2_visualizer/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["svelte.svelte-vscode"] -} diff --git a/q2_composition/_ancombc2_visualizer/index.html b/q2_composition/_ancombc2_visualizer/index.html deleted file mode 100644 index f9207c1..0000000 --- a/q2_composition/_ancombc2_visualizer/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - ANCOMBC2 Visualizer - - - -
- - - diff --git a/q2_composition/_ancombc2_visualizer/package-lock.json b/q2_composition/_ancombc2_visualizer/package-lock.json deleted file mode 100644 index e3c5ec0..0000000 --- a/q2_composition/_ancombc2_visualizer/package-lock.json +++ /dev/null @@ -1,4310 +0,0 @@ -{ - "name": "diverging-barplot", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "diverging-barplot", - "version": "0.0.0", - "dependencies": { - "d3": "^7.9.0", - "ts-node": "^10.9.2" - }, - "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^5.0.3", - "@tailwindcss/vite": "^4.1.4", - "@tsconfig/svelte": "^5.0.4", - "@types/d3": "^7.4.3", - "@types/node": "^22.10.5", - "svelte": "^5.53.0", - "svelte-check": "^4.1.1", - "tailwindcss": "^4.1.4", - "typescript": "~5.6.2", - "vite": "^6.4.1", - "vitest": "^2.1.8" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", - "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", - "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", - "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", - "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", - "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", - "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", - "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", - "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", - "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", - "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", - "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", - "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", - "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", - "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", - "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", - "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", - "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", - "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", - "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", - "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", - "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", - "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8.9.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.0.3.tgz", - "integrity": "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", - "debug": "^4.4.0", - "deepmerge": "^4.3.1", - "kleur": "^4.1.5", - "magic-string": "^0.30.15", - "vitefu": "^1.0.4" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22" - }, - "peerDependencies": { - "svelte": "^5.0.0", - "vite": "^6.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", - "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.7" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^5.0.0", - "svelte": "^5.0.0", - "vite": "^6.0.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.4.tgz", - "integrity": "sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==", - "dev": true, - "dependencies": { - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "lightningcss": "1.29.2", - "tailwindcss": "4.1.4" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.4.tgz", - "integrity": "sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==", - "dev": true, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.4", - "@tailwindcss/oxide-darwin-arm64": "4.1.4", - "@tailwindcss/oxide-darwin-x64": "4.1.4", - "@tailwindcss/oxide-freebsd-x64": "4.1.4", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.4", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.4", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.4", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.4", - "@tailwindcss/oxide-linux-x64-musl": "4.1.4", - "@tailwindcss/oxide-wasm32-wasi": "4.1.4", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.4", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.4" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.4.tgz", - "integrity": "sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.4.tgz", - "integrity": "sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.4.tgz", - "integrity": "sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.4.tgz", - "integrity": "sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.4.tgz", - "integrity": "sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.4.tgz", - "integrity": "sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.4.tgz", - "integrity": "sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.4.tgz", - "integrity": "sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.4.tgz", - "integrity": "sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.4.tgz", - "integrity": "sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.0", - "@emnapi/runtime": "^1.4.0", - "@emnapi/wasi-threads": "^1.0.1", - "@napi-rs/wasm-runtime": "^0.2.8", - "@tybys/wasm-util": "^0.9.0", - "tslib": "^2.8.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.0.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.8", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.0", - "@emnapi/runtime": "^1.4.0", - "@tybys/wasm-util": "^0.9.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { - "version": "2.8.0", - "dev": true, - "inBundle": true, - "license": "0BSD", - "optional": true - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.4.tgz", - "integrity": "sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.4.tgz", - "integrity": "sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.4.tgz", - "integrity": "sha512-4UQeMrONbvrsXKXXp/uxmdEN5JIJ9RkH7YVzs6AMxC/KC1+Np7WZBaNIco7TEjlkthqxZbt8pU/ipD+hKjm80A==", - "dev": true, - "dependencies": { - "@tailwindcss/node": "4.1.4", - "@tailwindcss/oxide": "4.1.4", - "tailwindcss": "4.1.4" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" - }, - "node_modules/@tsconfig/svelte": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz", - "integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", - "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.12.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", - "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/expect": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", - "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.8", - "@vitest/utils": "2.1.8", - "chai": "^5.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", - "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", - "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.1.8", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", - "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.8", - "magic-string": "^0.30.12", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", - "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", - "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.8", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/devalue": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz", - "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==", - "dev": true, - "license": "MIT" - }, - "node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" - } - }, - "node_modules/esm-env": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esrap": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.3.tgz", - "integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", - "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "dev": true, - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lightningcss": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", - "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.2", - "lightningcss-darwin-x64": "1.29.2", - "lightningcss-freebsd-x64": "1.29.2", - "lightningcss-linux-arm-gnueabihf": "1.29.2", - "lightningcss-linux-arm64-gnu": "1.29.2", - "lightningcss-linux-arm64-musl": "1.29.2", - "lightningcss-linux-x64-gnu": "1.29.2", - "lightningcss-linux-x64-musl": "1.29.2", - "lightningcss-win32-arm64-msvc": "1.29.2", - "lightningcss-win32-x64-msvc": "1.29.2" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", - "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", - "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", - "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", - "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", - "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", - "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", - "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", - "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", - "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", - "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true, - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "license": "Unlicense" - }, - "node_modules/rollup": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", - "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.50.1", - "@rollup/rollup-android-arm64": "4.50.1", - "@rollup/rollup-darwin-arm64": "4.50.1", - "@rollup/rollup-darwin-x64": "4.50.1", - "@rollup/rollup-freebsd-arm64": "4.50.1", - "@rollup/rollup-freebsd-x64": "4.50.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", - "@rollup/rollup-linux-arm-musleabihf": "4.50.1", - "@rollup/rollup-linux-arm64-gnu": "4.50.1", - "@rollup/rollup-linux-arm64-musl": "4.50.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", - "@rollup/rollup-linux-ppc64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-musl": "4.50.1", - "@rollup/rollup-linux-s390x-gnu": "4.50.1", - "@rollup/rollup-linux-x64-gnu": "4.50.1", - "@rollup/rollup-linux-x64-musl": "4.50.1", - "@rollup/rollup-openharmony-arm64": "4.50.1", - "@rollup/rollup-win32-arm64-msvc": "4.50.1", - "@rollup/rollup-win32-ia32-msvc": "4.50.1", - "@rollup/rollup-win32-x64-msvc": "4.50.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/svelte": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.0.tgz", - "integrity": "sha512-7dhHkSamGS2vtoBmIW2hRab+gl5Z60alEHZB4910ePqqJNxAWnDAxsofVmlZ2tREmWyHNE+A1nCKwICAquoD2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "@jridgewell/sourcemap-codec": "^1.5.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/estree": "^1.0.5", - "@types/trusted-types": "^2.0.7", - "acorn": "^8.12.1", - "aria-query": "^5.3.1", - "axobject-query": "^4.1.0", - "clsx": "^2.1.1", - "devalue": "^5.6.3", - "esm-env": "^1.2.1", - "esrap": "^2.2.2", - "is-reference": "^3.0.3", - "locate-character": "^3.0.0", - "magic-string": "^0.30.11", - "zimmerframe": "^1.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/svelte-check": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.4.tgz", - "integrity": "sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "chokidar": "^4.0.1", - "fdir": "^6.2.0", - "picocolors": "^1.0.0", - "sade": "^1.7.4" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": ">=5.0.0" - } - }, - "node_modules/tailwindcss": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz", - "integrity": "sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==", - "dev": true - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" - }, - "node_modules/vite": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", - "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.7", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-node/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vite-node/node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.5.tgz", - "integrity": "sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==", - "dev": true, - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", - "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "2.1.8", - "@vitest/mocker": "2.1.8", - "@vitest/pretty-format": "^2.1.8", - "@vitest/runner": "2.1.8", - "@vitest/snapshot": "2.1.8", - "@vitest/spy": "2.1.8", - "@vitest/utils": "2.1.8", - "chai": "^5.1.2", - "debug": "^4.3.7", - "expect-type": "^1.1.0", - "magic-string": "^0.30.12", - "pathe": "^1.1.2", - "std-env": "^3.8.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.1", - "tinypool": "^1.0.1", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.1.8", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.8", - "@vitest/ui": "2.1.8", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@vitest/mocker": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", - "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.8", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.12" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vitest/node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/zimmerframe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", - "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", - "dev": true, - "license": "MIT" - } - } -} diff --git a/q2_composition/_ancombc2_visualizer/package.json b/q2_composition/_ancombc2_visualizer/package.json deleted file mode 100644 index fdc86d0..0000000 --- a/q2_composition/_ancombc2_visualizer/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "diverging-barplot", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview", - "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json", - "test": "vitest" - }, - "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^5.0.3", - "@tailwindcss/vite": "^4.1.4", - "@tsconfig/svelte": "^5.0.4", - "@types/d3": "^7.4.3", - "@types/node": "^22.10.5", - "svelte": "^5.53.0", - "svelte-check": "^4.1.1", - "tailwindcss": "^4.1.4", - "typescript": "~5.6.2", - "vite": "^6.4.1", - "vitest": "^2.1.8" - }, - "dependencies": { - "d3": "^7.9.0", - "ts-node": "^10.9.2" - } -} diff --git a/q2_composition/_ancombc2_visualizer/src/App.svelte b/q2_composition/_ancombc2_visualizer/src/App.svelte deleted file mode 100644 index 8099442..0000000 --- a/q2_composition/_ancombc2_visualizer/src/App.svelte +++ /dev/null @@ -1,61 +0,0 @@ - - -
- {#await featuresPromise} -

Parsing slices...

- {:then features} - - {:catch error} -

An error occurred: {error.message}

- {/await} - - {#await taxonomyPromise} -

Parsing taxonomy...

- {:then rootTaxon} - {#if rootTaxon} - - {/if} - {:catch error} -

An error occurred: {error.message}

- {/await} -
diff --git a/q2_composition/_ancombc2_visualizer/src/app.css b/q2_composition/_ancombc2_visualizer/src/app.css deleted file mode 100644 index 592a0a2..0000000 --- a/q2_composition/_ancombc2_visualizer/src/app.css +++ /dev/null @@ -1,12 +0,0 @@ -@import "tailwindcss"; - -button { - @apply px-4 py-1 bg-purple-500 text-white rounded cursor-pointer; -} -button:hover { - @apply bg-purple-600; -} - -button:active { - @apply bg-purple-700; -} \ No newline at end of file diff --git a/q2_composition/_ancombc2_visualizer/src/lib/Barplot.svelte b/q2_composition/_ancombc2_visualizer/src/lib/Barplot.svelte deleted file mode 100644 index 57ca1d6..0000000 --- a/q2_composition/_ancombc2_visualizer/src/lib/Barplot.svelte +++ /dev/null @@ -1,47 +0,0 @@ - - -
-
- {#if features.viewVariableLevel != ""} -

- Reference Level: {referenceLevel} -

- {/if} - -
- -
- - diff --git a/q2_composition/_ancombc2_visualizer/src/lib/BarplotControls.svelte b/q2_composition/_ancombc2_visualizer/src/lib/BarplotControls.svelte deleted file mode 100644 index 7bcdbf1..0000000 --- a/q2_composition/_ancombc2_visualizer/src/lib/BarplotControls.svelte +++ /dev/null @@ -1,82 +0,0 @@ - - - -
-
- - -
-
- - -
-
-

Bar Thickness:

- - -
-
-
diff --git a/q2_composition/_ancombc2_visualizer/src/lib/BarplotFilters.svelte b/q2_composition/_ancombc2_visualizer/src/lib/BarplotFilters.svelte deleted file mode 100644 index 755f026..0000000 --- a/q2_composition/_ancombc2_visualizer/src/lib/BarplotFilters.svelte +++ /dev/null @@ -1,157 +0,0 @@ - - - -
-
- - -
-
- - -
-
- - -
- - - - {#if errorMessage} -

{errorMessage}

- {/if} -
-
- -{#if filters.length} -
- {#each filters as filter} -
-

- {filter.slice} - {getSymbol(filter.relationship)} - {filter.value} -

- - -
- {/each} -
-{/if} - - diff --git a/q2_composition/_ancombc2_visualizer/src/lib/ControlContainer.svelte b/q2_composition/_ancombc2_visualizer/src/lib/ControlContainer.svelte deleted file mode 100644 index e50f5cf..0000000 --- a/q2_composition/_ancombc2_visualizer/src/lib/ControlContainer.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - -
-

{title}

-
{@render children()}
-
diff --git a/q2_composition/_ancombc2_visualizer/src/lib/SelectedTaxon.svelte b/q2_composition/_ancombc2_visualizer/src/lib/SelectedTaxon.svelte deleted file mode 100644 index 861b2b2..0000000 --- a/q2_composition/_ancombc2_visualizer/src/lib/SelectedTaxon.svelte +++ /dev/null @@ -1,147 +0,0 @@ - - - -
- - -
- {#if searchError != ""} -
-

{searchError}

-
- {/if} -
- - -
-
- {#if taxonomyPlot?.selectedTaxon == undefined} - {#if searchError == ""} -

Click on a taxon name for more information.

- {/if} - {:else} -

Name: {name}

-

- Features classified to taxon: - {featureCount} ({featurePercent}%) -

-

- Features classified to subtree: - {subtreeCount} ({subtreePercent}%) -

- {/if} -
- - diff --git a/q2_composition/_ancombc2_visualizer/src/lib/Taxonomy.svelte b/q2_composition/_ancombc2_visualizer/src/lib/Taxonomy.svelte deleted file mode 100644 index 2ee9f09..0000000 --- a/q2_composition/_ancombc2_visualizer/src/lib/Taxonomy.svelte +++ /dev/null @@ -1,37 +0,0 @@ - - -
-
- -
- -
- - diff --git a/q2_composition/_ancombc2_visualizer/src/lib/TaxonomyFilter.svelte b/q2_composition/_ancombc2_visualizer/src/lib/TaxonomyFilter.svelte deleted file mode 100644 index d8a5806..0000000 --- a/q2_composition/_ancombc2_visualizer/src/lib/TaxonomyFilter.svelte +++ /dev/null @@ -1,99 +0,0 @@ - - - -
-
- - -
-
- - -
- -
- - {#if errorMessage != ""} -
-

{errorMessage}

-
- {/if} -
- - diff --git a/q2_composition/_ancombc2_visualizer/src/lib/TaxonomyFilterList.svelte b/q2_composition/_ancombc2_visualizer/src/lib/TaxonomyFilterList.svelte deleted file mode 100644 index 96f072b..0000000 --- a/q2_composition/_ancombc2_visualizer/src/lib/TaxonomyFilterList.svelte +++ /dev/null @@ -1,137 +0,0 @@ - - - -
- - -
-
- - -
-
- - -
-
- {#each taxonomyFilters?.filters as filter} -
- {#if filter.type == "feature-count"} -

features {"<"} {filter.value}

- - {:else if filter.type == "individual"} -

- individual filter of - {filter.node.getNonAnonymousTaxonString()} -

- - {/if} -
- {/each} -
-
diff --git a/q2_composition/_ancombc2_visualizer/src/main.ts b/q2_composition/_ancombc2_visualizer/src/main.ts deleted file mode 100644 index 664a057..0000000 --- a/q2_composition/_ancombc2_visualizer/src/main.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { mount } from 'svelte' -import './app.css' -import App from './App.svelte' - -const app = mount(App, { - target: document.getElementById('app')!, -}) - -export default app diff --git a/q2_composition/_ancombc2_visualizer/src/util/features.svelte.ts b/q2_composition/_ancombc2_visualizer/src/util/features.svelte.ts deleted file mode 100644 index b5b85a5..0000000 --- a/q2_composition/_ancombc2_visualizer/src/util/features.svelte.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { TaxonomyNode } from "./taxonomy.svelte"; - -export type VariableRecord = { - name: string; - lfc?: number; - p?: number; - q?: number; - se?: number; - level?: string; - reference?: string; -} & Record; - -export class FeatureRecord { - featureId: string; - classification?: string; - shortClassification?: string; - variables: Map = new Map(); - - constructor(featureId: string, taxonomyNode?: TaxonomyNode) { - this.featureId = featureId; - - this.classification = taxonomyNode?.getFullTaxonString(); - if (taxonomyNode) { - const nonAnonymousName = taxonomyNode.getNonAnonymousTaxonString(); - this.shortClassification = `(${featureId.slice(0, 6)}) ${nonAnonymousName}`; - } - } - - /** - * Returns the variable with `variableName` and `level` or undefined if - * none is found. - */ - getVariable( - variableName: string, - level: string | undefined = undefined, - ): VariableRecord | undefined { - if (level) { - return this.variables.get(`${variableName}::${level}`); - } - - return this.variables.get(variableName); - } - - /** - * Creates a VariableRecord from primitives. - */ - createVariable( - variableName: string, - slice: string, - value: number, - level: string | undefined = undefined, - reference: string | undefined = undefined, - ): VariableRecord { - let variable = { - name: variableName, - [slice]: value, - }; - if (level && reference) { - variable.level = level; - variable.reference = reference; - } - - return variable; - } - - /** - * Adds a new variable to the set of feature variables. If a matching - * variable is already present then updates that variable with the any new - * slice properties from `variable`. - */ - addVariable(variable: VariableRecord): undefined { - let matchingVariable = this.getVariable(variable.name, variable.level); - - let newVariable: VariableRecord; - if (!matchingVariable) { - newVariable = variable; - } else { - newVariable = { - ...matchingVariable, - ...variable, - }; - } - - if (newVariable.level) { - this.variables.set( - `${newVariable.name}::${newVariable.level}`, - newVariable, - ); - } else { - this.variables.set(newVariable.name, newVariable); - } - } - - /** - * Returns the slice value for some variable. Errors if the variable or - * slice is not found. - */ - getVariableSlice( - variableName: string, - slice: string, - level: string | undefined = undefined, - ): number { - const variable = this.getVariable(variableName, level); - - if (!variable) { - throw new Error(`The ${variable} variable was not found.`); - } - if (!Object.hasOwn(variable, slice)) { - throw new Error(`The ${variable} variable has no ${slice} slice.`); - } - - return variable[slice] as number; - } -} - -export type ViewRecord = { - featureId: string; - lfc: number; - se: number; - p: number; - q: number; - classification: string; - shortClassification: string; -}; - -type Filter = { - (record: FeatureRecord): boolean; - slice: string; - relationship: string; - value: number; -}; - -export class FeatureRecords { - records: FeatureRecord[] = []; - - rootTaxon: TaxonomyNode | null = null; - hideFiltered: boolean = false; - showOnlyKept: boolean = false; - - view: ViewRecord[] = []; - viewVariable: string = $state(""); - viewVariableLevel: string = $state(""); - - filters: Filter[] = []; - - /** - * Returns an arbitrary variable record, useful for initializing the - * barplot. - */ - getInitialVariable(): VariableRecord { - return this.getAllVariables()[0]; - } - - /* - * Return the feature with id `featureId`, or undefined if not found. - */ - getFeature(featureId: string): FeatureRecord | undefined { - return this.records.find((r) => r.featureId == featureId); - } - - /** - * Adds a new feature. If a matching feature is already present then - * merges that feature's variables with those from `feature`. - */ - addFeature(feature: FeatureRecord): undefined { - let matchingFeature = this.getFeature(feature.featureId); - - if (!matchingFeature) { - this.records.push(feature); - } else { - Array.from(feature.variables.values()).forEach((v) => - matchingFeature.addVariable(v), - ); - } - } - - /** - * Adds a user-specified filter to the set of filters applied to the - * data. The filter function is annotated with each of this functions - * arguments for display in the UI. - */ - addFilter(slice: string, relationship: string, value: number) { - const filter = (record: FeatureRecord) => { - const variableValue = record.getVariableSlice( - this.viewVariable, - slice, - this.viewVariableLevel, - ); - - if (relationship == "gt") return variableValue > value; - if (relationship == "lt") return variableValue < value; - if (relationship == 'gtabsval') return Math.abs(variableValue) > value; - if (relationship == 'ltabsval') return Math.abs(variableValue) < value; - - throw new Error(`Unexpected relationship ${relationship}.`); - }; - - // annotate function with its defining characteristics - filter.slice = slice; - filter.relationship = relationship; - filter.value = value; - - this.filters.push(filter); - } - - /** - * Removes a filter by index. - */ - removeFilter(slice: string, relationship: string, value: number) { - this.filters = this.filters.filter((f) => { - return !( - f.slice == slice && - f.relationship == relationship && - f.value == value - ); - }); - } - - /** - * Returns all variable records in the feature dataset. Accessing only the - * first feature record is sufficient because all features have the same - * set of variable records. Removes the intercept variable record. - */ - getAllVariables(): VariableRecord[] { - const variables = Array.from(this.records[0].variables.values()); - return variables.filter((v) => v.name != "(Intercept)"); - } - - /** - */ - getVariablesWithName(variableName: string): VariableRecord[] { - const variables = this.getAllVariables(); - return variables.filter((v) => v.name == variableName); - } - - /** - * Renders the `view` by applying all existing filters, sorting features - * by decreasing lfc value, and extracting the slice values for the current - * `viewVariable`. - */ - render() { - let filtered: FeatureRecord[] = []; - - // apply taxonomyFilters if present - if (this.hideFiltered || this.showOnlyKept) { - for (let record of this.records) { - const node = this.rootTaxon.findTaxonById(record.featureId); - if (node == null) { - throw new Error( - `Could not find taxon with id ${record.featureId}`, - ); - } - - if (this.hideFiltered && !node.filtered) { - filtered.push(record); - } else if (this.showOnlyKept && node.hierarchyNode.keep) { - filtered.push(record); - } - } - } else { - filtered = this.records; - } - - // apply slice filters - for (let f of Object.values(this.filters)) { - filtered = filtered.filter(f); - } - - // map to view records by only selecting from variable of interest - let viewRecords: ViewRecord[] = filtered.map((record) => { - const variable = record.getVariable( - this.viewVariable, - this.viewVariableLevel, - ); - - if (!variable) { - throw new Error( - `Could not find variable ${this.viewVariable}.`, - ); - } - - let classification = record.classification; - if (classification == null) classification = "N/A"; - - return { - featureId: record.featureId, - lfc: variable.lfc!, - se: variable.se!, - p: variable.p!, - q: variable.q!, - classification, - shortClassification: record.shortClassification, - }; - }); - - // filter null lfc values - viewRecords = viewRecords.filter((r) => r.lfc != null); - - // sort view records by decreasing lfc - viewRecords = viewRecords.sort((r1, r2) => r2.lfc - r1.lfc); - - // update state - this.view = viewRecords; - } -} - -// global state -let features = new FeatureRecords(); -export default features; diff --git a/q2_composition/_ancombc2_visualizer/src/util/parse.ts b/q2_composition/_ancombc2_visualizer/src/util/parse.ts deleted file mode 100644 index cfbc06b..0000000 --- a/q2_composition/_ancombc2_visualizer/src/util/parse.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { text } from "d3-fetch"; - -import { - FeatureRecords, - FeatureRecord, - type VariableRecord, -} from "./features.svelte"; - -import { TaxonomyNode } from "./taxonomy.svelte"; - -type JSONLHeaderField = { - name: string; - type: string | null; - missing: boolean; - title: string; - description: string; - extra: Record; -}; -type JSONLHeader = { - doctype: object; - direction: string; - style: string; - fields: JSONLHeaderField[]; -}; -type JSONLFeatureRecord = { - taxon: string; -} & Record; - -/** - * Parses slice data from the ANCOMBC2 output format that resides inside of the - * visualization artifact. Side-effects `featureRecords` by adding/updating - * parsed features. - */ -export async function parseAllSlices( - slicesDir: string, - featureRecords: FeatureRecords, - rootTaxon: TaxonomyNode | null = null, -): Promise { - const slices = ["lfc", "p", "q", "se"]; - for (let slice of slices) { - const sliceFilepath = `${slicesDir}/${slice}.jsonl`; - await parseSlice(sliceFilepath, featureRecords, rootTaxon); - } - - return Promise.resolve(); -} - -/** - * Parses a JSONL slice into `FeatureRecord`s and adds them to `featureRecords`. - */ -export async function parseSlice( - sliceFilepath: string, - featureRecords: FeatureRecords, - rootTaxon: TaxonomyNode | null, -): Promise { - // open file, convert to json - const textData: string = await text(sliceFilepath); - const jsonRecords: any = textData - .split("\n") - .filter((line) => line.trim() != "") - .map((line) => JSON.parse(line)); - - // parse header and check if empty - if (jsonRecords.length < 1) { - const msg = `The ${sliceFilepath} slice is empty.`; - throw new Error(msg); - } else if (jsonRecords.length === 1) { - const msg = `The ${sliceFilepath} slice has a header but no records.`; - throw new Error(msg); - } - const header: JSONLHeader = jsonRecords.shift()!; - - // parse each remaining line into a feature record - const jsonFeatureRecords: JSONLFeatureRecord[] = jsonRecords; - const sliceName = sliceFilepath.split("/").pop()!.replace(".jsonl", ""); - - jsonFeatureRecords.forEach((record) => { - const feature = parseJSONLFeatureRecord( - record, - header, - sliceName, - rootTaxon, - ); - featureRecords.addFeature(feature); - }); -} - -/** - * Parses a feature record line from a JSONL slice into a `FeatureRecord` - * object. - */ -export function parseJSONLFeatureRecord( - jsonRecord: JSONLFeatureRecord, - header: JSONLHeader, - slice: string, - rootTaxon: TaxonomyNode | null, -): FeatureRecord { - const taxonNode = rootTaxon?.findTaxonById(jsonRecord.taxon); - - const featureRecord = new FeatureRecord(jsonRecord.taxon, taxonNode); - - for (let column of Object.keys(jsonRecord)) { - if (column == "taxon") continue; - - const value = jsonRecord[column]; - - const headerField = getColumnField(column, header); - - let variable: VariableRecord; - if (headerField.extra.reference) { - variable = featureRecord.createVariable( - headerField.extra.variable, - slice, - value, - headerField.extra.level, - headerField.extra.reference, - ); - } else { - variable = featureRecord.createVariable(column, slice, value); - } - - featureRecord.addVariable(variable); - } - - return featureRecord; -} - -/** - * Retrieves the header field entry for the `column` column. - */ -export function getColumnField( - column: string, - header: JSONLHeader, -): JSONLHeaderField { - const columnFields: JSONLHeaderField[] = header.fields.filter((field) => { - return field.name === column; - }); - - if (columnFields.length > 1) { - const msg = `Duplicate name '${column}' found in JSONL header.`; - throw new Error(msg); - } else if (!columnFields.length) { - const msg = `Column ${column} not found in JSONL header.`; - throw new Error(msg); - } - - return columnFields.shift()!; -} diff --git a/q2_composition/_ancombc2_visualizer/src/util/plot.ts b/q2_composition/_ancombc2_visualizer/src/util/plot.ts deleted file mode 100644 index ef3a2e5..0000000 --- a/q2_composition/_ancombc2_visualizer/src/util/plot.ts +++ /dev/null @@ -1,526 +0,0 @@ -import * as d3 from "d3"; -import { type ViewRecord } from "./features.svelte"; - -type PlotDimensions = { - svgWidth: number; - svgHeight: number; - margin: number; - plotWidth: number; - plotHeight: number; - barHeight: number; - barPadding: number; -}; - -export class DivergingBarplot { - data: ViewRecord[] = []; - dimensions: PlotDimensions = {}; - xScale: d3.ScaleLinear = d3.scaleLinear(); - yScale: d3.ScaleBand = d3.scaleBand(); - xAxis: d3.Selection = d3.selection(); - yAxis: d3.Selection = d3.selection(); - - /** - */ - init(data: ViewRecord[]) { - this.data = data; - this.dimensions = this.createDimensions(); - this.xScale = this.createXScale(); - this.yScale = this.createYScale(); - this.xAxis = this.createXAxis(); - this.yAxis = this.createYAxis(); - } - - /** - */ - createDimensions(): PlotDimensions { - const svg = d3.select("svg"); - let svgWidth: number; - if (!svg.empty()) { - svgWidth = svg.node()!.getBoundingClientRect().width; - } else { - throw new Error(`Svg element not found.`); - } - - const numFeatures = this.data.length; - - const barHeight = 20; - const barPadding = 1.25; - - const plotHeight = numFeatures * barHeight * barPadding; - - const margin = 120; - const plotWidth = svgWidth - 2 * margin; - - return { - svgWidth: svgWidth, - svgHeight: plotHeight + 2 * margin, - margin, - plotWidth, - plotHeight, - barHeight, - barPadding, - }; - } - - /** - * Updates the plotted data and redraws the plot if the data is non-empty, - * otherwise hides the plot. - */ - updateData(data: ViewRecord[]) { - this.data = data; - if (data.length > 0) { - this.showPlot(); - this.drawPlot(true); - } else { - this.hidePlot(); - } - } - - /** - */ - updatePlotHeight() { - this.dimensions.plotHeight = - this.data.length * - this.dimensions.barHeight * - this.dimensions.barPadding; - this.dimensions.svgHeight = - this.dimensions.plotHeight + 2 * this.dimensions.margin; - } - - /** - */ - increaseBarThickness() { - this.dimensions.barHeight *= 1.1; - this.drawPlot(true); - } - - /** - */ - decreaseBarThickness() { - this.dimensions.barHeight *= 0.9; - this.drawPlot(true); - } - - /** - */ - getXDomain(): [number, number] { - // get min and max lfc +- se values - const lfc_minus_se = this.data.map((f) => f.lfc - f.se); - const lfc_plus_se = this.data.map((f) => f.lfc + f.se); - - let [min, max] = d3.extent([...lfc_minus_se, ...lfc_plus_se]); - - if (min == undefined || max == undefined) { - throw new Error("Unable to find min/max of feature lfcs."); - } - - // calculate scale range - const scaleMargin = 0.25; - if (min < 0) { - min = (1 + scaleMargin) * min; - } else { - min = -scaleMargin * max; - } - - if (max > 0) { - max = (1 + scaleMargin) * max; - } else { - max = -scaleMargin * min; - } - - return [min, max]; - } - - /** - */ - getXRange() { - return [ - this.dimensions.margin, - this.dimensions.margin + this.dimensions.plotWidth, - ]; - } - - /** - */ - createXScale(): d3.ScaleLinear { - const domain = this.getXDomain(); - const range = this.getXRange(); - const scale = d3.scaleLinear().domain(domain).range(range); - - return scale; - } - - /** - */ - getYDomain(): string[] { - return d3.range(0, this.data.length).map((i) => String(i)); - } - - /** - */ - getYRange() { - return [ - this.dimensions.margin, - this.dimensions.margin + this.dimensions.plotHeight, - ]; - } - - /** - */ - createYScale(): d3.ScaleBand { - const domain = this.getYDomain(); - const range = this.getYRange(); - const scale = d3.scaleBand().domain(domain).range(range); - - return scale; - } - - /** - */ - getXAxisTranslation() { - const translation = this.dimensions.margin + this.dimensions.plotHeight; - return `translate(0, ${translation})`; - } - - /** - */ - getYAxisTranslation() { - return `translate(${this.xScale(0)}, 0)`; - } - - /** - */ - createXAxis(): d3.Selection { - let axis = d3 - .select("svg") - .append("g") - .attr("class", "x-axis") - .attr("transform", this.getXAxisTranslation()) - .call(d3.axisBottom(this.xScale)); - - axis.selectAll("text").attr("font-size", "14px"); - - axis.append("text") - .text("LFC (Log Fold Change)") - .attr("fill", "black") - .attr("font-size", "18px") - .attr("id", "xaxis-label") - .attr("x", "50%") - .attr("y", 60); - - return axis; - } - - /** - */ - createYAxis(): d3.Selection { - let axis = d3 - .select("svg") - .append("g") - .attr("class", "y-axis") - .attr("transform", this.getYAxisTranslation()) - .call( - d3 - .axisLeft(this.yScale) - .tickSize(0) - .tickFormat("" as any), - ); - - return axis; - } - - /** - */ - addHoverHandlers() { - // event handlers - const handleMouseover = (e: any, d: any) => { - const tooltipData = [ - `feature ID: ${d.featureId}`, - `classification: ${d.classification}`, - `lfc: ${d.lfc}`, - `se: ${d.se}`, - `p-value: ${d.p}`, - `q-value: ${d.q}`, - ]; - - d3.select(".tooltip") - .style("display", "unset") - .style("left", `${e.clientX + 25}px`) - .style("top", `${e.clientY - 10}px`) - .selectAll("p") - .data(tooltipData) - .join("p") - .text((d, i) => tooltipData[i]) - .style("margin", "2px") - .style("box-shadow", "none"); - - d3.select(".tooltip") - .transition() - .duration(200) - .style("opacity", 1); - }; - - const handleMousemove = (e: any, d: any) => { - d3.select(".tooltip") - .style("left", `${e.clientX + 25}px`) - .style("top", `${e.clientY - 10}px`); - }; - - const handleMouseout = (e: any, d: any) => { - d3.select(".tooltip") - .transition() - .duration(200) - .style("opacity", 0) - .end() - .then(() => { - d3.select(".tooltip").style("display", "none"); - }); - }; - - // create tooltip - d3.select("body") - .selectAll(".tooltip") - .data([1]) - .join("div") - .attr("class", "tooltip") - .style("background-color", "#f0edef") - .style("padding", "10px") - .style("border-radius", "10px") - .style("position", "absolute") - .style("box-shadow", "1px 1px 2px gray") - .style("display", "none") - .style("opacity", 0); - - // register event handlers - d3.select("svg") - .selectAll("rect, .error-bar") - .on("mouseover", handleMouseover) - .on("mousemove", handleMousemove) - .on("mouseout", handleMouseout); - } - - /** - */ - drawErrorBar(path: d3.Path, d: ViewRecord, i: number): d3.Path { - // calculate error bar layout - const startX = this.xScale(d.lfc)!; - const startY = - this.yScale(i.toString())! + this.dimensions.barHeight / 2; - - const errorBarRight = this.xScale(d.lfc + d.se); - const errorBarLeft = startX - (errorBarRight - startX); - const errorBarTop = startY + 0.25 * this.dimensions.barHeight; - const errorBarBottom = startY - 0.25 * this.dimensions.barHeight; - - // draw error bar - path.moveTo(errorBarRight, errorBarTop); - path.lineTo(errorBarRight, errorBarBottom); - path.moveTo(errorBarRight, startY); - path.lineTo(errorBarLeft, startY); - path.moveTo(errorBarLeft, errorBarTop); - path.lineTo(errorBarLeft, errorBarBottom); - - return path; - } - - /** - */ - drawPlot(transition: boolean) { - const sizeSvg = () => { - let svg = d3 - .select("svg") - .attr("width", this.dimensions.svgWidth) - .attr("height", this.dimensions.svgHeight); - }; - - if (!transition) { - sizeSvg(); - } - - if (transition) { - // update plot height - this.updatePlotHeight(); - - // update scales - const xDomain = this.getXDomain(); - const xRange = this.getXRange(); - const yDomain = this.getYDomain(); - const yRange = this.getYRange(); - - this.xScale.domain(xDomain).range(xRange); - this.yScale.domain(yDomain).range(yRange); - - // resize svg - sizeSvg(); - - // transition axes - this.xAxis - .transition() - .duration(500) - .attr("transform", this.getXAxisTranslation()) - .call(d3.axisBottom(this.xScale)); - - this.xAxis.selectAll("text").attr("font-size", "14px"); - this.xAxis.select("#xaxis-label").attr("font-size", "18px"); - - this.yAxis - .transition() - .duration(500) - .attr("transform", this.getYAxisTranslation()) - .call( - d3 - .axisLeft(this.yScale) - .tickSize(0) - .tickFormat("" as any), - ); - } - - // draw bars - let barSelection = d3 - .select("svg") - .selectAll("rect") - .data(this.data) - .join("rect"); - - const drawBars = (selection: any) => { - selection - .attr("x", (d) => - d.lfc > 0 ? this.xScale(0) : this.xScale(d.lfc), - ) - .attr("y", (d, i) => this.yScale(String(i))) - .attr("width", (d) => - Math.abs(this.xScale(d.lfc) - this.xScale(0)), - ) - .attr("height", this.dimensions.barHeight) - .attr("fill", (d) => (d.lfc > 0 ? "green" : "red")); - }; - - if (transition) { - barSelection.transition().duration(400).call(drawBars.bind(this)); - } else { - barSelection.call(drawBars.bind(this)); - } - - // draw error bars - let errorBarSelection = d3 - .select("svg") - .selectAll(".error-bar") - .data(this.data) - .join("path") - .attr("class", "error-bar"); - - const drawErrorBars = (selection: any) => { - selection - .attr("d", (d, i) => - this.drawErrorBar(d3.path(), d, i).toString(), - ) - .attr("stroke", "black") - .attr("stroke-width", "2px"); - }; - - if (transition) { - errorBarSelection - .transition() - .duration(400) - .call(drawErrorBars.bind(this)); - } else { - errorBarSelection.call(drawErrorBars.bind(this)); - } - - // draw labels - let labelSelection = d3 - .select("svg") - .selectAll(".label") - .data(this.data) - .join("text") - .attr("class", "label"); - - const drawLabels = (selection: any) => { - selection - .text((d) => { - let classification = d.shortClassification - ? d.shortClassification - : d.featureId; - - if (classification.length > 30) { - classification = classification.slice(0, 25) + "(...)"; - } - - return classification; - }) - .attr("x", (d) => { - if (d.lfc > 0) { - return Math.min( - this.xScale(d.lfc - d.se), - this.xScale(0), - ); - } - return Math.max(this.xScale(d.lfc + d.se), this.xScale(0)); - }) - .attr( - "y", - (d, i) => - this.yScale(String(i)) + this.yScale.bandwidth() / 2, - ) - .attr("text-anchor", (d) => (d.lfc > 0 ? "end" : "start")) - .attr("dx", (d) => (d.lfc > 0 ? -8 : 8)) - .attr("dy", "1px") - .attr("font-size", "12px") - .attr("fill", "#474747"); - }; - - if (transition) { - labelSelection - .transition() - .duration(400) - .call(drawLabels.bind(this)); - } else { - labelSelection.call(drawLabels.bind(this)); - } - - // attach hover event listeners - this.addHoverHandlers(); - } - - /** - */ - hidePlot() { - // gray-out the plot - d3.select("svg") - .append("rect") - .attr("class", "hider") - .attr("width", this.dimensions.svgWidth) - .attr("height", this.dimensions.svgHeight) - .attr("fill", "gray") - .attr("opacity", 0.9); - - // add error message - d3.select("svg") - .append("rect") - .attr("class", "hider-text-box") - .attr("x", 0.3 * this.dimensions.svgWidth) - .attr("y", 0.4 * this.dimensions.svgHeight) - .attr("width", 0.4 * this.dimensions.svgWidth) - .attr("height", 0.2 * this.dimensions.svgHeight) - .attr("fill", "white"); - - d3.select("svg") - .append("text") - .attr("class", "hider-text") - .text("Oops! All features were filtered.") - .attr("x", this.dimensions.svgWidth / 2) - .attr("y", this.dimensions.svgHeight / 2) - .attr("dominant-baseline", "middle") - .attr("text-anchor", "middle") - .attr("font-size", "18px"); - } - - /** - */ - showPlot() { - d3.selectAll(".hider, .hider-text, .hider-text-box").remove(); - } -} - -const plot = new DivergingBarplot(); -export default plot; diff --git a/q2_composition/_ancombc2_visualizer/src/util/taxonomy.svelte.ts b/q2_composition/_ancombc2_visualizer/src/util/taxonomy.svelte.ts deleted file mode 100644 index d362f6d..0000000 --- a/q2_composition/_ancombc2_visualizer/src/util/taxonomy.svelte.ts +++ /dev/null @@ -1,729 +0,0 @@ -import { tsv } from "d3-fetch"; -import * as d3 from "d3"; - -type PlotDimensions = { - margin: number; - nodeWidth: number; - nodeHeight: number; - boxHeight: number; - boxWidth: number; -}; - -export class TaxonomyPlot { - dimensions: PlotDimensions; - root: d3.HierarchyNode; - treeLayout: d3.TreeLayout; - link: d3.Link; - - selectedTaxon: TaxonomyNode | null = $state(null); - hideFiltered: boolean = false; - - constructor(root: d3.HierarchyNode) { - this.root = root; - this.initTree(this.root); - - this.dimensions = this.getDimensions(); - this.treeLayout = this.createTreeLayout(); - this.link = this.createLinkGenerator(); - - this.initSvg(); - } - - initTree(root: d3.HierarchyNode) { - root.descendants().forEach((node, i) => { - node._children = node.children; - node.id = i; - node.children = null; - node.expand = false; - node.keep = false; - node.match = false; - }); - } - - getSvgDimensions() { - const svg = d3.select("#taxonomy-svg-container svg"); - - if (svg.empty()) { - throw new Error("No svg element found."); - } - - const svgRect = (svg.node() as any).getBoundingClientRect(); - - return { width: svgRect.width, height: svgRect.height }; - } - - getDimensions() { - const margin = 25; - - const { width: svgWidth, height: svgHeight } = this.getSvgDimensions(); - - const taxonomyDepth = this.root.height; - const nodeWidth = 225; - const nodeHeight = 30; - - const dimensions: PlotDimensions = { - margin: margin, - nodeHeight: nodeHeight, - nodeWidth: nodeWidth, - boxWidth: 0.8 * nodeWidth, - boxHeight: 0.8 * nodeHeight, - }; - - return dimensions; - } - - createTreeLayout(): d3.TreeLayout { - const treeLayout = d3 - .tree() - .nodeSize([this.dimensions.nodeHeight, this.dimensions.nodeWidth]); - - return treeLayout; - } - - createLinkGenerator(): d3.Link { - return d3 - .linkHorizontal() - .x((d) => d.y) - .y((d) => d.x); - } - - initSvg() { - const svg = d3.select("#taxonomy-svg-container svg"); - - // create groups for nodes and links - const zoomContainer = svg.append("g"); - zoomContainer.append("g").attr("class", "link-group"); - zoomContainer.append("g").attr("class", "node-group"); - - // set svg view box - const { width: svgWidth, height: svgHeight } = this.getSvgDimensions(); - - svg.attr("viewBox", [ - -this.dimensions.margin, - -svgHeight / 2, - svgWidth, - svgHeight, - ]); - - // make svg zoomable & pannable - const zoom = d3 - .zoom() - .scaleExtent([0.4, 2]) - .on("zoom", (event) => { - zoomContainer.attr("transform", event.transform); - }); - - svg.call(zoom).on("dblclick.zoom", null); - } - - addSelectHandlers() { - d3.selectAll(".taxonomy-node").on("click", (event, d) => { - this.selectedTaxon = d.data; - }); - } - - addExpandHandlers() { - d3.selectAll(".expand-button").on("click", (event, d) => { - d.expand = !d.expand; - this.render(d); - - event.stopPropagation(); - }); - } - - addKeepHandlers() { - d3.selectAll(".keep-button").on("click", (event, d) => { - d.keep = !d.keep; - - const fillColor = d.keep ? "orange" : "lightgray"; - d3.select(event.currentTarget) - .select("rect") - .attr("fill", fillColor); - - this.render(d); - - event.stopPropagation(); - }); - } - - drawButton( - selection: d3.Selection, - type: "expand" | "keep", - ) { - let xTranslation; - let className; - let letter; - if (type == "expand") { - xTranslation = this.dimensions.boxWidth - this.dimensions.boxHeight; - className = "expand-button"; - letter = "E"; - } else if (type == "keep") { - xTranslation = - this.dimensions.boxWidth - 2 * this.dimensions.boxHeight; - className = "keep-button"; - letter = "K"; - } else { - throw new Error("Unrecognized button type."); - } - - const button = selection - .append("g") - .attr("class", className) - .attr("transform", `translate(${xTranslation}, 2)`); - - button - .append("rect") - .attr("width", this.dimensions.boxHeight - 4) - .attr("height", this.dimensions.boxHeight - 4) - .attr("fill", "lightgray"); - - if (type == "keep") { - button - .selectAll("rect") - .attr("fill", (d) => (d.keep ? "orange" : "lightgray")); - } - - button - .append("text") - .text(letter) - .attr("x", this.dimensions.boxHeight / 2 - 2) - .attr("y", this.dimensions.boxHeight / 2 - 2) - .attr("dominant-baseline", "middle") - .attr("text-anchor", "middle") - .attr("font-size", 14) - .attr("dy", 2); - } - - drawNodes( - nodes: d3.HierarchyNode[], - source: d3.HierarchyNode, - ) { - const updateSelection = d3 - .select(".node-group") - .selectAll(".taxonomy-node") - .data(nodes, (d) => d.id); - - // create entering node groups - const enterSelection = updateSelection - .enter() - .append("g") - .attr("class", "taxonomy-node") - .attr("cursor", "pointer") - .attr("transform", (d) => `translate(${source.y0}, ${source.x0})`) - .attr("stroke-opacity", 1) - .attr("fill-opacity", 1); - - // taxon names - enterSelection - .append("text") - .text((d) => { - if (d.data.name.length > 18) { - return d.data.name.slice(0, 15) + "..."; - } - return d.data.name; - }) - .attr("dx", 10) - .attr("y", this.dimensions.boxHeight / 2) - .attr("dominant-baseline", "middle") - .attr("stroke-linejoin", "round") - .attr("stroke-width", 5) - .attr("stroke", "white") - .attr("paint-order", "stroke") - .attr("font-weight", "bold") - .attr("font-size", 13); - - // draw taxon boxes - enterSelection - .append("rect") - .attr("class", "taxon-box") - .attr("height", this.dimensions.boxHeight) - .attr("width", this.dimensions.boxWidth) - .attr("fill", (d) => { - if (d.data.searchMatch) return "green"; - if (d.data.filtered) return "red"; - return "white"; - }) - .attr("stroke", "gray") - .attr("stroke-width", 2) - .attr("rx", 2) - .attr("ry", 2) - .attr("stroke-opacity", 1) - .attr("fill-opacity", (d) => { - if (d.data.searchMatch || d.data.filtered) { - return 0.2; - } - return 0; - }); - - // left circle - enterSelection - .append("circle") - .attr("cx", 0) - .attr("cy", this.dimensions.boxHeight / 2) - .attr("r", 3) - .attr("fill", "#555"); - - // right circle; visible only if node has children - enterSelection - .append("circle") - .attr("class", "right-circle") - .attr("cx", this.dimensions.boxWidth) - .attr("cy", this.dimensions.boxHeight / 2) - .attr("r", (d) => { - let kept = d._children; - if (this.hideFiltered) { - kept = d._children?.filter((n) => !n.data.filtered); - } - if (kept && kept.length > 0) { - return 3; - } - return 0; - }) - .attr("fill", "#555"); - - updateSelection.selectAll(".right-circle").attr("r", (d) => { - let kept = d._children; - if (this.hideFiltered) { - kept = d._children?.filter((n) => !n.data.filtered); - } - if (kept && kept.length > 0) { - return 3; - } - return 0; - }); - - // color search matches - updateSelection - .selectAll(".taxon-box") - .attr("fill", (d) => { - if (d.data.searchMatch) return "green"; - if (d.data.filtered) return "red"; - return "white"; - }) - .attr("fill-opacity", (d) => { - if (d.data.searchMatch || d.data.filtered) { - return 0.2; - } - return 0; - }); - - this.drawButton(enterSelection, "expand"); - this.drawButton(enterSelection, "keep"); - - // add click event handlers - this.addSelectHandlers(); - this.addExpandHandlers(); - this.addKeepHandlers(); - - // color buttons - updateSelection - .merge(enterSelection) - .selectAll(".expand-button") - .select("rect") - .attr("fill", (d) => { - if (d.children && d.children.length == d._children.length) { - return "lightblue"; - } else { - return "lightgray"; - } - }); - - updateSelection - .merge(enterSelection) - .selectAll(".keep-button") - .select("rect") - .attr("fill", (d) => (d.keep ? "orange" : "lightgray")); - - // transition all nodes to their new positions - updateSelection - .merge(enterSelection) - .transition() - .duration(200) - .attr("transform", (d) => `translate(${d.y}, ${d.x})`) - .attr("fill-opacity", 1) - .attr("stroke-opacity", 1); - - // transition exiting nodes to parents' new positions - updateSelection - .exit() - .transition() - .duration(200) - .remove() - .attr("transform", (d) => `translate(${source.y}, ${source.x})`) - .attr("fill-opacity", 0) - .attr("stroke-opacity", 0); - } - - drawLinks( - links: d3.HierarchyLink[], - source: d3.HierarchyNode, - ) { - const updateSelection = d3 - .select(".link-group") - .selectAll(".taxonomy-link") - .data(links, (d) => d.target.id); - - // create entering link paths - const enterSelection = updateSelection - .enter() - .append("path") - .attr("class", "taxonomy-link") - .attr("fill", "none") - .attr("stroke", "#555") - .attr("stroke-opacity", 0.5) - .attr("stroke-width", 1.5) - .attr("d", (d) => { - const parentOld = { x: source.x0, y: source.y0 }; - return this.link({ source: parentOld, target: parentOld }); - }); - - // transition all links to their new shapes - updateSelection - .merge(enterSelection) - .transition() - .duration(200) - .attr("d", (d) => { - const sourceX = d.source.x! + this.dimensions.boxHeight / 2; - const targetX = d.target.x! + this.dimensions.boxHeight / 2; - - const sourceY = d.source.y! + this.dimensions.boxWidth; - const targetY = d.target.y!; - - const positions = { - source: { x: sourceX, y: sourceY }, - target: { x: targetX, y: targetY }, - }; - return this.link(positions); - }); - - // transition exiting links to parent's new position - updateSelection - .exit() - .transition() - .duration(200) - .remove() - .attr("d", (d) => { - const parentNew = { x: source.x, y: source.y }; - return this.link({ source: parentNew, target: parentNew }); - }); - } - - assignChildren(node: d3.HierarchyNode): boolean { - let keptDescendant = node.keep || node.data.searchMatch; - - if (this.hideFiltered && node.data.filtered) { - return false; - } - - // leaf - if (!node._children) { - return keptDescendant; - } - - node.children = []; - for (let child of node._children) { - if (this.assignChildren(child)) { - node.children.push(child); - keptDescendant = true; - } - } - - if (node.expand) { - node.children = node._children; - if (this.hideFiltered) { - node.children = node.children.filter((n) => !n.data.filtered); - } - } - - if (node.children!.length == 0) { - node.children = undefined; - } - - return keptDescendant; - } - - render(source: d3.HierarchyNode) { - // update visible children - this.assignChildren(this.root); - - // gather all expanded nodes and links - const nodes = this.root.descendants().reverse(); - const links = this.root.links(); - - // assign coordinates to nodes - this.treeLayout(this.root); - - // const transition = this.resizeSvg(); - this.drawLinks(links, source); - this.drawNodes(nodes, source); - - // store the current positions for the next render - this.root.eachBefore((node) => { - node.x0 = node.x; - node.y0 = node.y; - }); - } -} - -export class TaxonomyNode { - name: string; - parent: TaxonomyNode | null; - children: TaxonomyNode[]; - featureIDs: string[]; - hierarchyNode: d3.HierarchyNode | null; - searchMatch: boolean = false; - filtered: boolean = false; - - constructor(name: string, parent: TaxonomyNode | null) { - this.name = name; - this.parent = parent; - this.children = []; - this.featureIDs = []; - this.hierarchyNode = null; - } - - getChild(name: string): TaxonomyNode | null { - let matchingChildren = this.children.filter((child) => { - return child.name == name; - }); - - if (matchingChildren.length > 1) { - throw new Error("More than one matching child found."); - } - if (matchingChildren.length == 0) { - return null; - } - - return matchingChildren[0]; - } - - getRoot(): TaxonomyNode { - let currentNode: TaxonomyNode = this; - while (currentNode.parent != null) { - currentNode = currentNode.parent; - } - - return currentNode; - } - - getDescendants(): TaxonomyNode[] { - const descendants: TaxonomyNode[] = [this]; - for (let child of this.children) { - descendants.push(...child.getDescendants()); - } - - return descendants; - } - - findTaxa(name: string): TaxonomyNode[] { - const root = this.getRoot(); - const descendants = root.getDescendants(); - - const matches = descendants.filter((descendant) => { - const index = descendant.name - .toLowerCase() - .indexOf(name.toLowerCase()); - - return index != -1 && !descendant.filtered; - }); - - return matches; - } - - findTaxonById(id: string): TaxonomyNode | null { - const descendants = this.getRoot().getDescendants(); - const matches = descendants.filter((descendant) => { - return descendant.featureIDs.indexOf(id) != -1; - }); - - if (matches.length == 0) { - return null; - } else if (matches.length == 1) { - return matches[0]; - } else { - throw new Error( - "More than one taxonomy node with the same feature ID.", - ); - } - } - - getAncestors(): TaxonomyNode[] { - const ancestors = []; - let currentNode: TaxonomyNode = this; - while (currentNode.parent != null) { - ancestors.push(currentNode); - currentNode = currentNode.parent; - } - - return ancestors; - } - - getFullTaxonString(): string { - const ancestorNames = this.getAncestors() - .reverse() - .map((a) => a.name); - - return ancestorNames.join(";"); - } - - /** - * Gets the shortest taxonomy string that contains a non-anonymous level - * label. - * - * Examples: - * (...);f__family;g__genus;s__ => g__genus;s__ - * (...);o__order;f__family;g__;s__ => f__family;g__;s__ - * (...);g__genus;s__species => s__species - */ - getNonAnonymousTaxonString(): string { - if (this.parent == null) return "root"; - - const ancestorNames = this.getAncestors() - .reverse() - .map((a) => a.name); - - let lastNonAnonymousIndex = null; - for (const [index, ancestorName] of ancestorNames.entries()) { - if (ancestorName.slice(-2) != "__") { - lastNonAnonymousIndex = index; - } - } - if (lastNonAnonymousIndex == null) lastNonAnonymousIndex = 0; - - return ancestorNames.slice(lastNonAnonymousIndex).join(";"); - } - - getFeatureCount(): number { - return this.featureIDs.length; - } - - getSubtreeFeatureCount(): number { - let subtreeCount = this.getFeatureCount(); - - for (let child of this.children) { - subtreeCount += child.getSubtreeFeatureCount(); - } - - return subtreeCount; - } - - getTreeFeatureCount(): number { - return this.getRoot().getSubtreeFeatureCount(); - } - - clearSearchMatches() { - this.getRoot() - .getDescendants() - .forEach((n) => { - n.searchMatch = false; - }); - } -} - -export class TaxonomyFilters { - filters: ((node: TaxonomyNode) => boolean)[] = $state([]); - taxonomyRoot: TaxonomyNode; - - constructor(taxonomyRoot: TaxonomyNode) { - this.filters = []; - this.taxonomyRoot = taxonomyRoot; - } - - addFeatureCountFilter(featureCount: number) { - const filter = (node: TaxonomyNode) => { - return node.getSubtreeFeatureCount() < featureCount; - }; - - filter.type = "feature-count"; - filter.value = featureCount; - - this.filters = [...this.filters, filter]; - } - - removeFeatureCountFilter(value: number) { - this.filters = this.filters.filter((f) => { - if (f.type != "feature-count") return true; - - return !(f.value == value); - }); - } - - addIndividualFilter(filterNode: TaxonomyNode) { - const filter = (node: TaxonomyNode) => { - return node == filterNode; - }; - - filter.type = "individual"; - filter.node = filterNode; - - this.filters = [...this.filters, filter]; - } - - removeIndividualFilter(filterNode: TaxonomyNode) { - this.filters = this.filters.filter((f) => { - if (f.type != "individual") return true; - - return !(f.node == filterNode); - }); - } - - applyFilters() { - const nodes = this.taxonomyRoot.getDescendants(); - - nodes.forEach((node) => (node.filtered = false)); - - nodes.forEach((node) => { - for (let filter of this.filters) { - node.filtered = filter(node); - if (node.filtered) return; - } - }); - } -} - -/** - * Parses a taxonomy.tsv file into a d3.hierarchy. - */ -export async function parseTaxonomy( - taxonomyFilepath: string, -): Promise> { - const taxonomyRecords = await tsv(taxonomyFilepath); - - const root = new TaxonomyNode("root", null); - - for (let taxonRecord of taxonomyRecords) { - const levelNames = taxonRecord["Taxon"] - .split(";") - .filter((n) => n != ""); - const featureId = taxonRecord["Feature ID"]; - - let parentNode = root; - for (let [levelIndex, levelName] of levelNames.entries()) { - const currentNode = new TaxonomyNode(levelName, parentNode); - - // if this is the last level then it has a feature ID - if (levelIndex == levelNames.length - 1) { - currentNode.featureIDs.push(featureId); - } - - // merge with matching child if one exists - const matchingChild = parentNode.getChild(levelName); - if (matchingChild) { - matchingChild.featureIDs.push(...currentNode.featureIDs); - parentNode = matchingChild; - } else { - parentNode.children.push(currentNode); - parentNode = currentNode; - } - } - } - - const hierarchyRoot = d3.hierarchy(root); - - // create back references from TaxonomyNodes to d3 nodes - hierarchyRoot.eachBefore((node) => { - node.data.hierarchyNode = node; - }); - - return hierarchyRoot; -} diff --git a/q2_composition/_ancombc2_visualizer/src/vite-env.d.ts b/q2_composition/_ancombc2_visualizer/src/vite-env.d.ts deleted file mode 100644 index 4078e74..0000000 --- a/q2_composition/_ancombc2_visualizer/src/vite-env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/q2_composition/_ancombc2_visualizer/svelte.config.js b/q2_composition/_ancombc2_visualizer/svelte.config.js deleted file mode 100644 index b0683fd..0000000 --- a/q2_composition/_ancombc2_visualizer/svelte.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' - -export default { - // Consult https://svelte.dev/docs#compile-time-svelte-preprocess - // for more information about preprocessors - preprocess: vitePreprocess(), -} diff --git a/q2_composition/_ancombc2_visualizer/tests/data/output-format/W.jsonl b/q2_composition/_ancombc2_visualizer/tests/data/output-format/W.jsonl deleted file mode 100644 index b2b60e3..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/data/output-format/W.jsonl +++ /dev/null @@ -1,9 +0,0 @@ -{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} -{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":-1235411664.1230688095,"body-site::left palm":15.5292100831,"body-site::right palm":10.7105143567,"body-site::tongue":8.3444601801,"year":90816.4971581012} -{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":-861683502.712356925,"body-site::left palm":12.8611438894,"body-site::right palm":20.1786232328,"body-site::tongue":-1.1898355664,"year":83819.0848453717} -{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":-961414485.8867735863,"body-site::left palm":16.4795912965,"body-site::right palm":8.1245010178,"body-site::tongue":-6.2934466966,"year":60330.7200633827} -{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":-625235541.3033596277,"body-site::left palm":6.403687463,"body-site::right palm":-7.4625854074,"body-site::tongue":-31.4808951948,"year":57525.0512022309} -{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":-668967508.3477175236,"body-site::left palm":8.9335789656,"body-site::right palm":8.1319547063,"body-site::tongue":-3.7156614085,"year":50694.0094878902} -{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":-604964203.058027029,"body-site::left palm":7.1165557658,"body-site::right palm":15.0396253547,"body-site::tongue":-5.8999027765,"year":52435.7146843889} -{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":-565497775.4869476557,"body-site::left palm":9.8580413537,"body-site::right palm":8.676120271,"body-site::tongue":-2.8743821139,"year":47264.5415720465} -{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":-412024.2829955241,"body-site::left palm":17.9672217594,"body-site::right palm":21.8192771315,"body-site::tongue":-3.4455303863,"year":null} diff --git a/q2_composition/_ancombc2_visualizer/tests/data/output-format/diff.jsonl b/q2_composition/_ancombc2_visualizer/tests/data/output-format/diff.jsonl deleted file mode 100644 index 3381cca..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/data/output-format/diff.jsonl +++ /dev/null @@ -1,9 +0,0 @@ -{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} -{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} -{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":true} -{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} -{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} -{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} -{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} -{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} -{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":false} diff --git a/q2_composition/_ancombc2_visualizer/tests/data/output-format/lfc.jsonl b/q2_composition/_ancombc2_visualizer/tests/data/output-format/lfc.jsonl deleted file mode 100644 index 99fab10..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/data/output-format/lfc.jsonl +++ /dev/null @@ -1,9 +0,0 @@ -{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} -{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":-381187.7596056733,"body-site::left palm":99.9213043999,"body-site::right palm":75.1103468794,"body-site::tongue":37.6196966908,"year":189.6871124062} -{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":-363784.8371233153,"body-site::left palm":113.4173262332,"body-site::right palm":130.8411801231,"body-site::tongue":-7.817212847,"year":181.01108921} -{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":-275242.5772360777,"body-site::left palm":98.2119684127,"body-site::right palm":69.6255589629,"body-site::tongue":-31.5738984682,"year":136.9430983631} -{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":-227115.1882186811,"body-site::left palm":48.6007069953,"body-site::right palm":-32.7277940736,"body-site::tongue":-135.9171411395,"year":112.9844146537} -{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":-312280.1775272848,"body-site::left palm":86.9453579935,"body-site::right palm":88.2926908605,"body-site::tongue":-42.8747204223,"year":155.3791414063} -{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":-253102.4472176514,"body-site::left palm":62.1326028539,"body-site::right palm":100.5600775815,"body-site::tongue":-56.6271362907,"year":125.9261668175} -{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":-313151.4841887562,"body-site::left palm":113.9514973012,"body-site::right palm":94.7169124597,"body-site::tongue":-34.179869551,"year":155.8080157617} -{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":-130.7117681704,"body-site::left palm":119.0321247894,"body-site::right palm":84.6142672425,"body-site::tongue":-13.2813695394,"year":null} diff --git a/q2_composition/_ancombc2_visualizer/tests/data/output-format/p.jsonl b/q2_composition/_ancombc2_visualizer/tests/data/output-format/p.jsonl deleted file mode 100644 index 79fe01e..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/data/output-format/p.jsonl +++ /dev/null @@ -1,9 +0,0 @@ -{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} -{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":2.064070103e-70,"body-site::left palm":0.0000002944,"body-site::right palm":0.0000050731,"body-site::tongue":0.0000321986,"year":2.420471904e-37} -{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":6.459829583e-94,"body-site::left palm":0.0000000569,"body-site::right palm":0.0000000005,"body-site::tongue":0.2591582754,"year":8.755371043e-50} -{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":2.310737191e-44,"body-site::left palm":0.0000150172,"body-site::right palm":0.0004584471,"body-site::tongue":0.001489409,"year":2.374714022e-23} -{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":4.795885034e-68,"body-site::left palm":0.0002083127,"body-site::right palm":0.0000717806,"body-site::tongue":0.0000000011,"year":9.340323274e-36} -{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":5.110191021e-149,"body-site::left palm":0.0000000492,"body-site::right palm":0.000000194,"body-site::tongue":0.001582484,"year":7.525025925e-75} -{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":3.162424539e-92,"body-site::left palm":0.0000195101,"body-site::right palm":0.0000000111,"body-site::tongue":0.000103132,"year":1.524570474e-47} -{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":2.079293839e-171,"body-site::left palm":0.0000000025,"body-site::right palm":0.0000000219,"body-site::tongue":0.0090756756,"year":8.989184521e-86} -{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":2.081900652e-22,"body-site::left palm":0.0000564042,"body-site::right palm":0.0000261055,"body-site::tongue":0.0261610926,"year":1.0} diff --git a/q2_composition/_ancombc2_visualizer/tests/data/output-format/passed_ss.jsonl b/q2_composition/_ancombc2_visualizer/tests/data/output-format/passed_ss.jsonl deleted file mode 100644 index be48034..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/data/output-format/passed_ss.jsonl +++ /dev/null @@ -1,9 +0,0 @@ -{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} -{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} -{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} -{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} -{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true,"year":true} -{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":true} -{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":true} -{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":true} -{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false,"year":false} diff --git a/q2_composition/_ancombc2_visualizer/tests/data/output-format/q.jsonl b/q2_composition/_ancombc2_visualizer/tests/data/output-format/q.jsonl deleted file mode 100644 index 2cf55c0..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/data/output-format/q.jsonl +++ /dev/null @@ -1,9 +0,0 @@ -{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} -{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":8.256280413e-70,"body-site::left palm":0.0000014722,"body-site::right palm":0.0000202926,"body-site::tongue":0.00022539,"year":9.681887616e-37} -{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":3.87589775e-93,"body-site::left palm":0.0000003442,"body-site::right palm":0.0000000039,"body-site::tongue":0.2591582754,"year":5.253222626e-49} -{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":4.621474383e-44,"body-site::left palm":0.0000600688,"body-site::right palm":0.0004584471,"body-site::tongue":0.0074470448,"year":4.749428044e-23} -{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":1.43876551e-67,"body-site::left palm":0.0002083127,"body-site::right palm":0.0001435613,"body-site::tongue":0.000000009,"year":2.802096982e-35} -{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":3.577133715e-148,"body-site::left palm":0.0000003442,"body-site::right palm":0.0000009699,"body-site::tongue":0.0074470448,"year":5.267518147e-74} -{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":1.58121227e-91,"body-site::left palm":0.0000600688,"body-site::right palm":0.0000000776,"body-site::tongue":0.0006187922,"year":7.622852369e-47} -{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":1.663435072e-170,"body-site::left palm":0.0000000199,"body-site::right palm":0.0000001314,"body-site::tongue":0.0272270269,"year":7.191347617e-85} -{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":2.081900652e-22,"body-site::left palm":0.0001128084,"body-site::right palm":0.0000783166,"body-site::tongue":0.0523221852,"year":1.0} diff --git a/q2_composition/_ancombc2_visualizer/tests/data/output-format/se.jsonl b/q2_composition/_ancombc2_visualizer/tests/data/output-format/se.jsonl deleted file mode 100644 index 2bc7fc3..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/data/output-format/se.jsonl +++ /dev/null @@ -1,9 +0,0 @@ -{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"(Intercept)","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}},{"name":"year","type":null,"missing":false,"title":"","description":"","extra":{}}],"index":[],"title":"","description":"","extra":{}} -{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","(Intercept)":0.0003085512,"body-site::left palm":6.4344099839,"body-site::right palm":7.0127674898,"body-site::tongue":4.5083439646,"year":0.0020886856} -{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","(Intercept)":0.0004221792,"body-site::left palm":8.8186033224,"body-site::right palm":6.484148032,"body-site::tongue":6.5699942647,"year":0.002159545} -{"taxon":"868528ca947bc57b69ffdf83e6b73bae","(Intercept)":0.0002862892,"body-site::left palm":5.9596119009,"body-site::right palm":8.569825865,"body-site::tongue":5.01694858,"year":0.0022698734} -{"taxon":"154709e160e8cada6bfb21115acc80f5","(Intercept)":0.0003632474,"body-site::left palm":7.5894876626,"body-site::right palm":4.3855838542,"body-site::tongue":4.3174484175,"year":0.0019640906} -{"taxon":"1d2e5f3444ca750c85302ceee2473331","(Intercept)":0.0004668092,"body-site::left palm":9.7324217235,"body-site::right palm":10.8574990945,"body-site::tongue":11.5389201837,"year":0.0030650395} -{"taxon":"997056ba80681bbbdd5d09aa591eadc0","(Intercept)":0.0004183759,"body-site::left palm":8.7307125663,"body-site::right palm":6.6863419274,"body-site::tongue":9.5979778711,"year":0.0024015343} -{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","(Intercept)":0.0005537625,"body-site::left palm":11.5592431815,"body-site::right palm":10.9169662823,"body-site::tongue":11.8912058998,"year":0.0032965096} -{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","(Intercept)":0.0003172429,"body-site::left palm":6.6249599623,"body-site::right palm":3.8779592345,"body-site::tongue":3.8546662053,"year":null} diff --git a/q2_composition/_ancombc2_visualizer/tests/data/output-format/structural-zeros.jsonl b/q2_composition/_ancombc2_visualizer/tests/data/output-format/structural-zeros.jsonl deleted file mode 100644 index 79a81b4..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/data/output-format/structural-zeros.jsonl +++ /dev/null @@ -1,771 +0,0 @@ -{"doctype":{"name":"table.jsonl","format":"application/x-json-lines","version":"1.0"},"direction":"row","style":"key:value","fields":[{"name":"taxon","type":null,"missing":false,"title":"","description":"","extra":{}},{"name":"body-site::gut","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"gut","reference":"gut"}},{"name":"body-site::left palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"left palm","reference":"gut"}},{"name":"body-site::right palm","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"right palm","reference":"gut"}},{"name":"body-site::tongue","type":null,"missing":false,"title":"","description":"","extra":{"variable":"body-site","level":"tongue","reference":"gut"}}],"index":[],"title":"","description":"","extra":{}} -{"taxon":"4b5eeb300368260019c1fbc7a3c718fc","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"fe30ff0f71a38a39cf1717ec2be3a2fc","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"d29fe3c70564fc0f69f2c03e0d1e5561","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"868528ca947bc57b69ffdf83e6b73bae","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"154709e160e8cada6bfb21115acc80f5","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"1d2e5f3444ca750c85302ceee2473331","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"0305a4993ecf2d8ef4149fdfc7592603","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"cb2fe0146e2fbcb101050edb996a0ee2","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"997056ba80681bbbdd5d09aa591eadc0","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"3c9c437f27aca05f8db167cd080ff1ec","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"9079bfebcce01d4b5c758067b1208c31","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"bfbed36e63b69fec4627424163d20118","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"90d32ffe026535b392c0bad850f213c4","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ab4ef4399912b0507d8d1187e874684d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"d86ef5d6394f5dbeb945f39aa25e7426","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a049763053c277b16c2a318f41eb23b4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"699071a4a7ce68918e4cd93a61275ecd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"cdd14cce4ec44b3235923652b71e947e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"7e598ad34909a3fb8ff1623f1ede11a6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b44621e5c80607cdfacbf7a81e1cbe41","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"e8e6b7fc969005938de8ac7ffb94f17c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"535696cecf56f03d3401d7d6dbe66d7b","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9f718b8f66b79c3de80546ca9a54539c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"f352c1f1efecf483511c2270aabd0ae6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"fd86856409fe6433d719558a30910515","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"44ff26d8105cf822417b4b0c4eb27c02","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ad41fe8f8be5b01c96549309937e3b14","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"909755d7142ea53c7f61c97c3586f26c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"fcd4f95c05b868060121ff709085bf21","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ab6b063ed43d8cb3008e157a0a305c47","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"57b34afdff2e84fb9b0befd219edcb38","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"047b7fb62a5e9d2711e639ae1cb1519a","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"0160e14a78b18b903618f11bc732746e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e7c8b8c8fced8eead4b767bffe6dd544","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"d2613a43f4ed1dda8a673e7fb251ebef","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e31b5affbe5e23b79a8619589f3b6620","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"7dd9c9124ec3f118a6cef1f0d422c011","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"67e23140639733766b7e127f50221289","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"01e0b7ac306895be84179f2715af269b","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"500d6b485cef4c52aad211d6d6e6dbc7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1685b25b43eb070cd7655de8c2d8c0a4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"db793caa585e078770021a7979ae8ea2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ee0fb26fca3afb05e0b288d6fcab899e","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d1d750ce3b00503c204516d27ca0d3b0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"ebe0e9790089ad4f40151cb4a3231a8f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"b685f8246fb6fad0fd91574c444b8f51","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"636c27859c1ac0a7994ca8ed145d03fe","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f35ce9c514e1398308f5f84ed50b260f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"79e9e337b10e2d298bb1b3bde946782d","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0a69950e803a5d9e7166c450e44f43cf","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e5c80b4a23b96b2fa35b6da6cac2bf73","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9118606a87ac19f8d041da20f16f3236","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d8e8459398f3f096775f4298666880a7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"fba3d9b3872ff9021d66434323fb9565","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"ae27459b7f5465815b1f565d792083ce","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"4fdf8dcd9451f5742982d716fa9f0536","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"4ea5683e2c2a183c11c45dc8fbd0c67c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"469e4ff2129066178b74b112829fc03c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6edca9464612efff71d8f97299f01663","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"41fedaa9200e2933821f84ecdc0b0772","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"41735c13fb7f63db49b10fba5d959ce3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"54d098d009b89779530eaf43a1bb136a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"76174505aef45f134d8068d5ad2c42aa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b8afb7bb30b7a9170b7c6dcd40251d54","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"4c4606a3dbb4f5b8bb1ad1db6dfc5617","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3ef461f213bfc675ddf0b1bfeef2dc52","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"1f50ac250618ced095a2a5c34bae7651","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"b3d4d129c955517b446df657236ba5a2","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"fc15824cd9e9c29e1319d32843452b54","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f8f937eeee7762f446a0e87292f98eb6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"b2866fdca13681232057e3e85a1978cf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"052128d7d424728578efe7852b0afd0d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"fc5b641a0b0408d99ddfb2a5ba64da59","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2514cdaab96a1a42cf15506f2ecf6439","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"e0472171de6fa02a1f58e392ad3d000e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e063d1c3c9daf7390e5475e48d9b01c5","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"958bc15b660bce0b894665d13f910f5b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1b448e00c078f81e49a61933072345d2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2e55763e77234a7bfc3a311067a0c7e1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"162ed46308ef9dd1600fb0fe7c90b186","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9af77e369d2ba4b3bb6e0e808ed84d91","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e77bac543df42865af751a32a2942fdb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"5ada68b9a081358e1a7d5f1d351e656a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"f8a71161ac98c5ceafcc75e57ace7230","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"26b8b1509edf09c438db1634308c3c90","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"3ae3e825c5e3862af6c17798e2b40a37","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"26133b4163fdcd22d86f4e04e74154f1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"29a92aecac56c855cbfc0debf9bda0c8","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e737a3a864791ec52f1398d83786f4f2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"880968796af86b3d6270c228fe8e7026","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"81351ef6b4d49a3a6b2fc24745d70305","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c4aad64f84f51ff331b986a67af4ed3d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"79dcabe7f92f8cf2723b796dcd2f239f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"7a5d5e6f85da7ca91daa2d803e8f9279","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"401d7866836c54f3cd18bd0fc814885e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"75258a676bcd7e73c2437d6a2012d490","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"839fafb762395fab1ba257442ec29e7f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6b82e6cb771d45d6c925405b66299d7f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5c82bad13c4ebd2ed1bd23a8c2e37fc5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"f59a4d48a03cc224462bf83e4d4ab126","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"eecc4a4317225eb579540e82ab785716","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a895b66cac813ac67ce1c908259b646f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"acfe4c003905a7074aeaf385b78ad9e0","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"684721318896ed01048f3502333c214d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2ff525a1e58c54525e7f2d68a6c0b23e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"d781fa7e866ac295ce9a56bd97912983","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"0b925631436d3775231b60f9d0011cae","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a5551fc60aa8bbaab737487552ea2a75","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"a4c08e2c3a34038ea877b16d01736837","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4075a90811bf9c19f02f5aa2ece6da37","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4980b85712efeef1fc4563a9a949fe2e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f91c81859bf6eede55eef9c915dd8bab","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5601f094afc823d75ccb34440645a99e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"21a0198d0a83a8f3ec0e401067138940","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"56c98126dde3abb2d263088db55e12c8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a659784c026bd9c8cde94da36aa656d7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"f16a387e898dbae6432b2ed0241120bd","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3125abe90c7ae91aec06eb104d71845f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b383ade799e9c83c649cec37705a251d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3bf2fc236887eda11c969b84d30f9fbf","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3cdd97ba69a504117de24626ba790e96","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4132561a08d25757e4bee9f73ec4a70a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"30faafef155964edd9db9374f36c45bf","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"9d3ec96491b522546acbdfa3b21b6071","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"fb4f7d9d3f91ac2f22a542fbd13019c1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b0f7e29de400c6b517b39230dc1b4365","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"393e6e2cbe258ed27a4ca0a2ee0d2cdc","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"1d17561d16d803f652b0d6bdd671c1cc","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3982159c2603cacc4bc4893003bda323","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b1e22f094d8c64fb56dbacf680dab8c9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"b92e89d105e0a6e09e5984879c4c7809","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a5df9a825c3d8eeb228a6781c3db134c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ff3df50eea7490dd794148649c480fd3","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3a1c2d5547ddb7f76306a042f8bef6a4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8da02c7114ba0d9ee40312926e037a8f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"87899779aec8d38dfaf48d895cfe8021","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d46bfd723f625e317606ae28580eba3e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"145f11599b92ad3a4c93896b0edf8c0c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"846cbaf603b77be035fe0cb61d14a23c","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e8fb2b3d01d369dbb5d3764548193ae9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"7eedfc5c8d0d6b8852fabb20d52a8c5d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c4f955168102011d272b685aa772c10a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"513de43781dc4c2831eb83b23940d66b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"13692c41b4bf5d577c28c278caafcddb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1d284bea12006c939c03d622ce2abd5e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"24443b70088636edf08f0c9572d7faf4","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"185df2b73b4805164470dfaea2d05223","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2f4c5e75c0e4cdfcbddbe93ef1f410a3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1b963d0d7457ac133aed9497f03b5a64","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"bb370945a6777f712cfd963c55f2ff54","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ed950935b660fb10449d5f229dc13fb9","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"59fefb91cc66ef6930b0201e4bf24cbb","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"1f0a072da4906270a684a389c1586582","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"aa668eb01ca9dcc59aeb1454b600c8c8","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"724c43ad3632cb8c5c6230c874551bd2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"44543d9c6bb193c64d38c9bdb6790eec","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"d3e265209c342d15d93a910e38ad9be2","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"626b8ee112be0ec208bb16445611d001","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9590aed21545774c71a124f2b5200691","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3a69cb2f27ac76a05405efbb5088d249","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"475741f076c42d2c75d2d63c14fe4d3f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"8cd2a871fab61bdea4ef23a295c371cf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"84755bc954af6d3b39bb4c369e5992e7","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5437cb1c86c72638cbbc12896f88d1b1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"848587c4a03949500c5815bd6edb7b6e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"cba5f5b1153235425628bd77a28257c7","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"063fa4f5a6fa894f7f8243468324ac5e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"49232f27012731b0a65805c0919e2bbc","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"4b8228f4d7d3809aa6827e8d9e11a9ae","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"c99439f78b73ffcf55858ae828aac608","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2fa276cce32e900f0f68d30e460b8f61","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4ce1be9cea00a1eb7f960600e1ff3cfa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1b75626f6834620dc2c729a1a81f497a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f023384b8f989d014dd2ead7f10db307","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"344b020d867e3210563eaf40b0c557ef","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"dd7e1e45831871f719cc3cd68f568e7c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"16564bc936c839c893f951bab613a30b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"24523c45ca39b6c81a01ce286c0c092b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b5bf6383b53e0add0d6589b73949462a","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"51ddb685cfb1775931489ebbd3eef6ca","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c5b61a414bdb4305544bb4f941e0bfc9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"24dfe6a7325e4f2be7dbd522ef613e42","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"465e9cab9abce306c1e0f7459b325c33","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3e2c7eb0316409806267a8d9845b0b13","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"136e9f5aa470119165e59d202fdb318c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"b8b19c4f0719a5d5b965a0f50f05827c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"4a5387c4bc61f2d8f3d9d2de983ba556","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"77a517253ff10afeb78a37bc13d649a0","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"07b2b1c3771f46d82c90b20a79fb3d04","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"30a88dc67e6a522087c3dfc8019550a6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"91d0b3b7c0329b9a164b6e04a181f1d6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"14d168c89e381de6fc3091837a557e48","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9616cf56be891f816aa7abc6a13c9e8f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"fea5c05e9b8245c5ca46f6673f59e0bf","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"32875774cffdc8c820f91d8e86f9a0e6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"67f9c74eeea5a4609bd1d2fab66ad3cc","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ca96b8fd01aa6c508305bacac37da6c2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"43a9c44adeac51fd3ab95081da56d02d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"0bd7addf1b999f01ad58fec8412b8931","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2e202c4e4e803dbc6d54c9e3117afedd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c18826df5af5da174f580164c805a38a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ae881162d813e498f40bf33b8e42d54a","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"fc1f49989e78fa71bc6404ff2a148576","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"62bf37c50994a06e6c8c93355ad1caa0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4b13979d719e78a50cb0eac34d72dec1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"38aff035451e491e5905508b9a173fb6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0c4b17f88dae47697d3bceb3663f47ce","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"dd222108ed685d6a936d2011ea220998","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"7cdabbffaaa6cc6d9f478d91f312a8ee","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"f99678fdc17d27a97c79faac3f2980a4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"126d3c82f184c4d9058cab124f287968","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"823698689031b0b9c2c5152f92ffc70f","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"9e1c6b703a4312cce306c7757688a351","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"1edc5497d3daf6d914427d32b71daa52","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9f1913b781d2cde1c8a4c57b7dc2ab83","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"96a7dbb0e2c57e289c05b82e2db880be","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"201b6484b6abe3d4c587464be6cbd574","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3b65e1db6742cc44493248fff266f564","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"7dd981802694dec3ecdb61ee53805956","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ecf9eb9fa3970ff27a221e626395c75d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e7a3af060bcc6686986ddfdf5536fac8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"10710d3d706451c3536228e4b7d146db","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1c7d1f74c2c43b872972f974eb196915","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"55937e5781c91185e27a91216008e4ca","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"dab4d3e6078cfc510502a47c98e82081","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d8f7f446987e67092b6256c10b1ee69e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0dcaf9358eddf685864afb883cdf2363","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"9b0549bb6e63f681bf133d2c7996055d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"a0b0961c7ba318abff3e5a93f09f495e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"868a4fe285b85fa1b8eb40071d5397be","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"7f99061140cbf6c9081a204380efd8e1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"b00d44992702bd3743d7f353638d42f9","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"4fccea69a702bcb90cc0147c0fff2995","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"aadef7fba5a0754fb631409c11fb331f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ed75725613954c459019eec50b431f9f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c04b03fdea7f81c8c52fc540c50a24a4","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"6fea19332b7fb980e2124d0339c596c2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9acad60e1ad588fb9250aab68dee645d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"bfdc8d2e7693336b4f3781920d3fa253","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"cfe4948493ea1b183b006512be10924a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"80b20e907aa4fcf2309796bc303d151d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"919764896275058362e55f0849d2b38b","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"9da7a39de7e82006cc9533681adf765a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f3194c2eb241f821239009ca55dbb30c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2ca928ad9749bb9726c35d6528fefec1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"50e96bbd1a8267119529843a1acb43a5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5a02c9985adcd7543dff8c846cff62a5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"54a5af5112600a1faf06be268f95616e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b428acd97e6af974db1b053a2bc2b5c8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"53729ba7429e5bd2fe96229b14452bdc","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"3add7df323955b22d1cea664ef38165d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"7f4909ae8d31a3995fa2c200c690a21f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"7ee56e891d069e18c3c8eb866924a26c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8b111e12f8f73205bac732c7479a97e8","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"66a605fcdaa020dbdd6136f241ea79d9","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"a1b971c01ce0b220275c218adbe717c1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e73fc2655e1cca4a2b1c419da3630c72","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"39b5567d2d979a9172c02435a5ede59d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5df503c1ddf8f3f4ac9e49e983e3d7fd","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e22afe3cb91239d19aeb01ba79015173","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5decdad9c550489629ce441d32a69a1c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c57b70d65a63c4bf9f12c179c2416839","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ebd1dcd162acede67bb633c42c7b2ac2","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e2c355360209f0b71b70b85ed0f9532d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"da247df6fe91b74bf38d3ecc1c05b4b0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"41cb0c62655aa8da8968a06cde0f14a1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2de266b1ffa8e9ec6383c98096caf8f0","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"88b4862756df007aa0c6bc2ba049708b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6be3ad080a12e28c46c9ca4f94710ac7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"3b74a95b189e134bb34c191b7693455d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ba0941f03086680ee946a10dfe90cf12","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6be678de197b54f9a04f6c984b91ef22","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"01b99cb344ed2530f7d80897ffe257a9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0be23adca941c1335eb04db17dc66e98","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"28560cffcd31045fa07dd88557b43e05","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1a4ff0ff25ff4e919711422c2f605519","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"101968ec709b68fcd964a68ff226dcd1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"bb173654871d294466912ef22f685faa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"58d6cee566e26e231916ccc2093ae053","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"30273eb317696f87e7b6fd37ada4bb8f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"498ae808db957a63e20e836e1bf77f54","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c9f68eb27669d95f1e365fc085b51ee6","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f9bc8716f02b0a22f03b1a686895aae1","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"7fee9350277038eef98dee70b4190563","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"34e40677eda6fb724e9323b0835d5ab0","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"956d0a6f5a8e1d2fbb39df909cc14894","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"0f2a155a57fe6d0bf34767080706b3e1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"95f07780b7e9b8b504c2563e63950663","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"0f55566622d8244073432b2e67b24baa","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"7f2aa6f3481a4039dcc8d1b8be32beb7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"f094a383692eb30761eb3d5c93240236","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ecbf086d6ccbe5e8c2a69d0afb144662","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c9a1082e87563e01347729352358bbcf","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"48eda83fda558aea8fdd32b9c8dfff98","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"7a20f7055ca2c7462cfa6a7aef16ec28","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ce0a68ef210192a51f60ec3eb8e3e92e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"955d8fcbb35e8bc04c8df0c6aae34d34","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4ab53e40e06f3a9b0b9b2669d8a52f65","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3f448350064694e647b284259bdebb91","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1c40ac02c49ea9e03881b0f183373417","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"1a5ff65c7f309159df626f810d96ae8b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"816b94bcd935ca38afe71fd1e3c5356c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5fb5ace22c46fefb30969da7bb0dcb74","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"fe98555e63f547c33b3987391cd34d5d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"5042942b77f5b924b8f8c11de37a3626","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8659c05e82a2d1399cbc3fd26ab938e4","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"30ebe1a33c21c25c55e4fdbb5894b832","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"a5185df881810390f29afa3ba3ccf522","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"aee707afe3847427a6d3d34e31437923","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3677e15d86603bf0a6bb50f8b010afe7","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"54b4964000ad1631e547c46a828ed1a0","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"cbb7ea319a7633cf0917c6e5cde0e923","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"acba6a53153faccd2c02a9c0e8a2d941","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"072698f9668d5a094cdc1a672acc4747","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8c43291754ba53fa1e206f0ac7a18772","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d329ff7ff76454d2282c9f01c2798588","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2b148d88c49e316f85b6e7863089a886","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"1893b0ad352ee7db0f565bc4594e6dc6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"aa9f89f9af07d53e077462471423f3ab","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"921966b15e5f1508e8650d053443c385","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d3f59bdb915bb43f2ecd96ad9296ae92","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"ee7ce85e38500b28d9d79b63c7fbf9a6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e2f0caba18b002ca9762ed56167c6188","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"37c7d17f9e371c1e11a0e22b1ce15ab0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"55ec4b057c122957d25013675512c73d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f8026fa73c97b3f69cf4369cf194fb8b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"edacf632dcadc21c328669befafe2af6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"97e0a84031c426df75af82aeff951f26","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"de391a8294254c47e8f460325eea85f8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a70441600c181b747a763ce5a7414a3f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1f926dee6544b252d38067cc7753383a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f32674aec6d3fa6a7aa2323cb35699fc","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"7103ca740aeadee8bdf7cedaefac990b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"bfbf3b84b315e741c4345ebb43e2b9cc","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"68c05655a58355526692d3a1f0968aff","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"42872dc875fef6070dfa78984184c096","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"a621ed0faf5f6d7f3ad8f5e66cd41faf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4516f28133b919f8d8039ece23d8dd2e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"74c2326ccd0bc2bd9e0f23f15b79ea16","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"02ef9a59d6da8b642271166d3ffd1b52","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"22ed70e219c67c2bf4e20e0b144b12bb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"2cec2792e54f61e12e1a0b2507826118","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3bb6760ebcd348e0c695a5fb5fccf994","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3b795f0122b28b0e6a07bec73894acee","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ac809fd715cced98911f73f1dfb1ffb9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"bcb349a220a0c33a6b780dbc29a25f71","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a875cba4e2e4da128cec805cd014731f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"b8329e527429f07e08f04ecf93563779","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d9efe89c658c7996e7738e1bb777c9f0","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e0f1938338e6f9b8cf8408e672ee6cd1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c1dedbc2ee20ed310022b9a1976d56c4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"6de4955c509e8f32f905760cad0beeae","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"8f0a7d866b4e5ebf1e34d0a44eb950a4","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d8db52dac1023a8fa0e56e92670d7ac1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"51757b1a0a985640893725af5d87d350","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"726f76e9275bfa07ccb329dda324c58f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"c7ec57695a6d83b461eba523752755ec","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"41c686088d124f17c99dcf9bf3acf9d5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"01ce91fd8dbecf637eb5e67cdab5c5aa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b1141c1ab18997c3339e8229e0b9f41a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c2562f279f2b32428e71ef8e8e1cd3d8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"66fb1fc4317badb5dfaec2bf8e5055d7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ce1d8d111ba2aaec28d68a04e483bf3f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d51cd90e95b57acb614698dc580759fb","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"c5dfb8aa2b481cb89e2602fc20941587","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"04c7e0ea3038f942f5a28778a74cd1c0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"d12759fe8dda1d65fe9077cc1ca9cf28","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"44f993a57b632b8fde0c34ed075e1d66","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6401660183a33dded59f163fc63aab4d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"dc7d3610c77e7c118082f25002f26cd4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1e9fc37a1112b198ed3d0543db7863c8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"685ea779ee012329ec2a171f1823f8a8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1c0a00b159b2154357cc9bc7499c58b2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b0ca0d2568c23c26c6704017eae471e1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1a8d25f7529d783a219ef689701dd4e2","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"aa24dbd408e5d69c6b0d62846145a244","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"cf8a25fe1a1b134a027842e7769a285b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"b1e686a5c5f127a8b92de2863503a9e5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"459244e45f29ce28991de0114a16f9fa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"491ef1635067f62c395bdffd58966092","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"a03aa6a23dc8f296567452ec2242a5fd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d32d15407d86a2044eead0d72cd3f9e7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"bb2704c9052362b112da42bf843e7d9b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"955280212814a2050dd2f640e10fc25d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"684b032107a3a32f6664dea4ef723a42","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d5ef913e6aee3067001dc610ac8af1d1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e2cbf79a06f1221cf49d1bef8e5db9cd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3d6555a4886c6e4a89104136dd5ca39e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d1c7ee5172f16dda522e46aaa4e5fa79","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"74106ca246bcf2da5c4f95b82aa6867a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e80d9134b601511a2702b54268b57249","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3111520c8424a2a5bdd46558ae7650e8","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"867e71db0537674539934bf97db51bc0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"8c255f9dc0be58d1389877ec645f1a17","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d30b3fb9c1dc7d9f0d4bd6ce8e975238","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b1413b635612c7db2c140bc671789ec7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"12ed71ced0f4e45c0aa5b37144e6f84b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":false} -{"taxon":"3597a2689efaf5525ce460494a8ac383","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3d6f762d8cda1915ad93d014e391c118","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"7595e123b71bdae8a8c1c28b7405a5c0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"87a04eba5a3dc45f9e899d8ab4c050b4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"cbc2f795edfaebaf35d10b85062b426d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"4738a05820f1a7840410c66476953498","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d9095748835ade1b8914c5f57b6acbcf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1ca133f4d30ab344f11e6624e841d9cd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6f384c926424d43c215fbe9337d55324","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f4eefbd4edf2a372131825289fffcca6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"9f4cdae8a020a8d9c4f54e5abf5a5769","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"752621a2dcf600f86357e9c2fa1fc985","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6ffdeb862aed8aedda8a8624fa960c57","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"faf2bd479f04891ef2afba2f407749ac","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5ed23cabf504db9af85bce57e9008ea2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"7cd67e7e02db4db794fd67ab72755f8b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8163d49042bbad8871a7aab8527c9a97","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"31ed03e41d53de58a6348a242165c05b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0effb4592c11dcdd619141df770563e1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"458462fa1e15c439f12deec2f19af933","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"8bcc747f27b10bb3e1182fe530c7ed24","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2ab2f3551b7aa27fd483fdcbaa1a0afb","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1e00822422afb942c9955cd450385a8b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9548347b69043c274ff7a1ce599a69ef","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8c5f2b5fce1b357f54ed4c8c047b6845","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"33176e81f3e7ef2b9de1b783ff1ca33c","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"160029903cd9c779390f4719179aeea2","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"0741ae033054073fece98b9948ec4387","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"6a9b2745a31a3e5ae16682a323c28a4d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"7fa8f515ee1ac5cb8b529b13e6a89790","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"c81e310dae79b8767597762a093082c8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"51588a76b68ff3041e8b272256df5ae2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a3dc97e11838f1bf157aa875f2f6367d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f351326f9505ffc18da207391818c48e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"53dd9f9a89854c8ebdcfb105b7a26df1","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"fbf110ef5de76f86121c8504a0cb786e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"f66effc279917d65747b7c3ef8d62432","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5c541619c0a084c6609e071895d9de55","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"9b959f65abdb6cb9adc1d6160a5384ec","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a826883ed572461c97a23561f7ecea3c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"480b52afa972e6deb75357ec39db1998","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"c961cc0ecd0ac693e2fb7dcf7794c3e5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ff8c7f94f941a0c647120d4e142db316","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e6df6369108817c93a749fa640528e92","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e54bcf1c8ec24811e7c355b8d82fa59e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"cee164362eb3296a3d29e33f7b479d2e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"71e9ece7818452114b1e87f8145aefd5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ae4c61e598c093caa5b66b6919f02ba3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"a54095a893fd5abc045d162bbe20644a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3253177a44672689e4e154e842d63e35","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"45c36b8b2965484407b8b213419d4c6c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e9f0399c43aff643ceb1480929cf89b2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d985172bebaa0bbe61ff5f682d372c6e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"02878fe3ccc81d4c884ca5574178d6a0","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"a841dd7e2f38b26bb7bb37179b4141d5","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"63145f49e7efc26729094a53d97c0cd1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"f8fe4ee0ae3da9a1432872f5545a0d42","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"678424c0e69dd311d2b536cfd69a91a4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"99e6b8fa779ca2689cdc55d164e593e8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"421da954b88f7175953a73ea34b933e0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"20fb19136419ba2826c941aa152fa0eb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4aa8e1c58af1b89f613fe3bf2b81604e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"816e266d71b9a9af9d3d74893dee443e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"35b6dde81c92eb7f66ca9f741da3514e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"9df911e407318b496425698999a1d81f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b815913c61abb4a540babe5c3fae17e7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"251eb140eb9387372897c5f7db6f954c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c66348656c079cbbc916b2c2832f311b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4ea8ed64f727e17c2ecf3616119876eb","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2b6445815ec98d21dbe9640083f30d2f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1e1e0cca52fab68a8c7ba5256aeadd6d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"1395953fab837ed426f9b2ba24da41b1","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"94ca1389331a3a9230237844cfd545f6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"15992a34ae0f42d6b5a21eeaaef674ba","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"b46e36edac9cab660cec7ee6f1a335a3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2ce0fa88ec7cfdda2eeb0698cdad47e8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"82e72255267397b777a1afd44ea22755","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"9d17e47f8102cca1e9a0a5b0776bb85a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4851a0c86e3c1b3f3c67e88d8a38960a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"025dd300b0ccbd9d5898969c2a1ab138","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9cd30ed12a411f643a9f6c145e3b59d8","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"831514b8b3617bed49e2a4bd9d3d6268","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5b220f66423e4004eb3520bfae1f25d0","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"959a178855242ad3833af85d38ccff45","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a6e9c3caf38d8be5744751bea41aa62f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3f61c9eee7bfb0326d3efb8da077b0da","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9c6b4f83513e63a49ce33a8aeb1813ad","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"f95cdb71258ef6cc222c673ea4546caf","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"7e4d5b19d3213719048fe55dfad0da3a","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"f8753b9f13abb306b57aedce2cf6e7d0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ae25381e186978a7230f03484baede7c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0310f41e594c49368dde5c5993a7a5d0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"de35e106a779f81d63e2e058bf18799c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"c7312d5390945aa1e45badeeba28a998","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"9584fe0b6843a9817e1c217bb65caea8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"81fad06bda8cf753d87288f1d080da88","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"9930e78f4486e70ced513d619dae53fb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5e793ed595a0793ab477b17e78421bc5","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8b300bb35321f8c125cdc4c3a242bbc0","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"54fa6da8dff69b9fec4b470312d21eb9","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"457c3dbae079470f3cf0bf146c191e1f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8fbf42d21b6c9c4a4e8e260ad1d6a1ab","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1efd43e712291698f34853dac3b67f54","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0f006e3e638afedde4892706134a4fb9","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8c001c89f020a1b78b26ee21d1d56746","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"1ea96d595539133266a3dbd49daac1e4","body-site::gut":false,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"b2d056fa113334bd2797397b162c6ac9","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e03d5567ab978eb82490f359c51912b1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a5e8aaab366d42b670d589ada160581c","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2328e11c4256f1f05395b7a377381279","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"55f85b9f95aa14453f466b2ee388737b","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9b07cccc73bd232ffb6edb9427194c06","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"7456c5136c45202afcf8000e2a8a01c5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"99f9d85c50cec960adab2a3f0f401371","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e6953e3ef3e20c6b169ef7a759d868df","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"538c01338d48c71522ac629b17a01c9d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"76e8305b47ef8b35c452b5490589fc95","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"328cf8ca7cded30705336cf036a2df45","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2b427cf77172293239bc1c1cdb32ace4","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2f09559bc1ffcc3ea06ae2766194920b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"73291cac0e802b6a1fb25ae7079390ef","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5a61388e52a8005b6747280b9332d2de","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"37d242005eb3c4239ad2c00158ea99a1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"72cbf125e17c4e14d748543564d3d4ec","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"b3406cb10b6d6882837eaacbaec3553e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b65f8931698507015de2e1c5f0961cd3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"7b9b46a7c3fb8b76b1c68911a9b56da1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5ec803f68f3c48cd9ce6436ccbd5b1e3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2835a5008083ae7290acbca001520ad1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"0a50155a2def454344e1f2305eff7092","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"bf6066f701b31c6bba541503797da013","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ca1b627f011b52798bfb8fd2c6b76d20","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1a2d9f4af510ce624fa0337c3ea9fedc","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f9c63350a2cdcada4a0be946f4e0025a","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"6967d97d0d19d82633e2d05305850f80","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"81026563293d6ed29eec4d7f73eab34d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e9849de9c0f7be74e13c457f05177aad","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"b59d5976acdb148c29f724d6b7990410","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"bae6b03d63955f134b6e523285263226","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"14f2e2d783b09c74ccd36ed32cbeaddd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"8c12a12aedcd680ab7e259bfd627ff9a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"01173073677a287321be3484fbed0007","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e6dfd15b38618c3c7ff0a025083f56d4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"33e2cadd9d0b2b4ebeb6261766032e4a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"ea646f13713c1f3393a8b66afa03ff4a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"2a010fd0ac0d1761c2e64c9cd3fd97c4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"4cecaa1cfabe89a905940ae23dd94a64","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5454ea14c70f0323a5e836aba10947b8","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b8413d82d36f772b9a375231cb504579","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"7a9e7bd6bd3444b67f37c95db2960d50","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9abbfb135a6fceeb2ae107b7be7cb133","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e7e23553bcb3b809fe953ff90c99da54","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"217845ff2f7195cbc781eba1f7e7eaa1","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"903752a32299a5fac9505d192dc16466","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9c773cfe6cd90b39267153cd9eac020e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5202077471c942e678df50a8e4c706d6","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"04fd81a94c775a5906f2d92cf0548e4d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"f1d63da515a0c96eb9f7af5de75655bb","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"6b350f9f82a39450e0894fe9138ad267","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"167baae5fe04a754df7eb073c07adaa7","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e1e1ece9cc43057ec074912f7545a432","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"43e4b46e2ba2455e3974874722cbd75a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"76d0a9cc7116aeaa8d26bc09e768cbc4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f7a8c8f87af98f9c5f479beaadc0b892","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"21c3086fa768008b7bee62d5d13b5366","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d8adf2a20249cefe6c627f9c17abb202","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"dd9d9aad1de9345686f5cc614c5616db","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"0524cb6dcc8f60dafc09c46911c9d0ac","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"63e29d89c820b4baafc3f5622946d6ee","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0316af109bb877b5c7a85ddecd6dfd1e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c9ffd432429a7600931358e3a09860f5","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b18b389447d758e7cb173b4b4f2ad960","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f306a3c555687b1dc2c61372504fbbea","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"bb823ca6d961133b2cd91e9377cefba7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"8935afd2b1d59a37191411131d75e9f6","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"648532aadbacef2c7f8f8468a6146fb2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"124e839582c0a3329101182cb28619a8","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"51b573b10d63a2cbe455deeef5bae002","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"6bd57e46e038faafe4bb747e1d494df7","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5cf1581a0381cd73e278302acd8751b1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"3e7f7d8ab3a5fb0e3401a0fda19d8bcb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ef4cafaa5121e47ff7f31d5553a66214","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e581d288eadb8d4527694b6fe7aa5df4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2c9e19a0423a00f8c17d8086a8ab39a5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"65fbdc4707be0814fa4faf52571cc2b5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"171930820a0db82224a948125002bf46","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f78c2a4fb584f61fc0fbd75c2cc22a99","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8406abe6d9a72018bf32d189d1340472","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5e76bbf2de9c36c591f8aab3784ffd1b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5cb28bd0b2eea6847a6328712217c141","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"50feebeace77894a50a224bf001c3502","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a9e0ac523112f40942da575caf1f386e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"029cc71dc93341de90188b686798aa0d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"58c63b4710a70a640cb86afa4d851178","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9d68bd5a8479880505cf88ab4695b5c5","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5c4ad81078908a3b228188a847d12f9e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"dbd1f3c3e0f401f60d44103595acdb69","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6fea6a26dbc4de9558be63f26f07f7fa","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"58946a0b64aa351fd8e7b97d02d6639d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"b89da5ee2f75672a2656789aea91071d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"48a6cea7eaf29dcb52dc2985933f4249","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"4e34087bb8399deb145896c92e1b58a5","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"6b4a0a64da52980e7a1b1a770978bb88","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"c23ddff0e5a041733d633d7bfb93e0cc","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3d3566af17e7e52ae5413956d004e657","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"64222ae4c3f0f1cc06375a3814da355d","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ab402c6b9fa511b0aa2f968cddc364eb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d45006a487d94665893aa9e759be4c97","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5546d0fe4a512f96a6d73509a1ec6e55","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"40f13b077d41d6837ca6fae65763cf01","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"26f1b1ff96f049f0e354df4c3d85efb0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"25087bd679769914988fc1e7c6d045ff","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6fda1de9604a1be1b99a41028226f4a7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f9686d94e355b66c5324677db52b3aa4","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0bf5530da55bc16c52034db82e5434af","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9815d07f1b564c9be5aab03db01608da","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"d37b36cd780fdec9627c298370571ed5","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5beb76b0d6631d10fc820c2d128d4cb6","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"952fabf17975467e69af4ebb5efb0fb6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"cdf8a49dcdb0256a8ead65f65c752e40","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e83fa923d1e185d9c9de13ca3b37c8f2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"f6bb195f075d463c5e9b620a6a76dbfd","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"a1759b9ca6b3363edacc599498d62b56","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d1dbb266dc8841470f3c42fe8f465507","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3b91757d40499fecfd75d1ad215fdd2e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"0b0a240a7ae19f3560d04427d753b603","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e0a941a7b62e87ae6301bce7185e5f4a","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"96802b28a3942cb6b7b40f4b9bfc0d99","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d4c5acaf755ef50d18008aa6c79f60b0","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"a0daabc3e11deb9b43aafbf3c8e31e35","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e9d3af4175420ffab49c29d1a6bb2030","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"eb19aca9a5979db01ba9947baa292633","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8be3d398e9e6b768ed1aa713f2981204","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0335b1664150f1e151340b1450eae898","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"42f7a4caf54667a21b5de3b888213935","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"03178a409a41853ea09a94055e138e19","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ba3ff6e27b67596844f11db93e44c496","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"af12fc27ee17864717830cafd06453cd","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"1076b2b7de5233cc917c9425aa2ea200","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"a80183c045cf890899121db3bbcbd39d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"6bf95d9914dc404e98ebff522496533d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"14732e0b78dbc03c20c505d7681b6820","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"4042bf819b2707dcb567a04950667ec7","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d8469ca44fd367ae2aab986a57833586","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"95b94ac4c1c3e18210f501268e56e50e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5656d8b980bfee07e29e8fc119850901","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d002269a53cf1579adca5f0dadd4f332","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"80b9cf8b7fde7d45e0bc84a9cf9ddd56","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"464ff59b632870b5028ed3092b9443ff","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"15c03c51375c7d03bd3dda24674b9936","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a3ebb6445ca32f39df9f84fe48525773","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"47e6d3cd169787ff35f9a2278b8d4a2f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e3f051168532c89bf76e329c715c35f5","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"47fb251b4679084fee2dafef11c6bc4f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9dd67b89e90b1517d6fc340bb1745e15","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"75a61e0ca465f169e5d2ea2d19f8aefb","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b9e3d6fcb82de619e9e574be03ecaa41","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"93982d4e0f9eb9a6179d6abd57560c26","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b61a4c5ec96e7276004c81cc845e2fec","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"76d2032108822bcfaa90a4873f7a51aa","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"47be834b0f9232d552e00a36fb3c626b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"90b16eca6a6edc00f49dfb5f72be8b61","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"7d893311a14a858907d4c8ca21d32dc4","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2d832109f6396e0f93297efd12e1321e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"47fe572ed6a6b1d5f4a60a3884ec72e1","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"77f79d776f3845bc2901cf9c4229de0b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"69e4868406c82bdfd67d2b449ca9f1d8","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} -{"taxon":"e7709791d7ef6b47747de9fb43880d14","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"f908d554fc6eeb9fef7a7028fa791475","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e3d37109be4a17d8437f6fcb6072982d","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"09fc3d8a98c2ca72c69b63a51b5b564e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3a31937521e389cbdf89ca01039e5ec3","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"9f816758294dec368624eabd3595ec6f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"2a71af2786dfb7aeb7ac7d5372c41686","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"59758d94cc7ed9a16526bfc9eb207575","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"190dfe815683ee977e120d35b3c83b7e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"1d7e45fd568a577b5a6a8b4a20743211","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"498128a80a796620b238d8ad5cd1d2f9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"e2f6c7b758ac2c0476a7e31787dbba84","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"df98cba64f84c4e8b7f7ea8396f4f3f9","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"88191bcb077f725a8c8e37d74e110baa","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"3b0e180ea70b1a946a6214eacb539c97","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"84e6f7df01548135d92febfeae9a1ea6","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"dd530a50ee0277096b0cbd210cdb80b2","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"033511c7ff4fe93866075cfb9129aa3b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"216d5bb567182b6210e2c3dbc455f2b6","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a9541756b547061c02922f1a3a913fce","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"059408ca99f1001f64e6df1e06fb951d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"111311cc108c483f3782c9214681ed19","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"427e48835f176c1a367a14b39b882c58","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"10ae3ca534ce9bb9f80822b4b4a6375c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8cfda573467e6a959664801713cadba1","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"73bca1b91fb8a80ee698f1833c073664","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"fc8f87209db793f740eea731e64f0b2a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9f6a3b261bc6acafa3d4a6d2de87f924","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"b387961d274808e3ffed8c1594f4cd1c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"e1b32002ee69c4e3210a2a257511f96a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6e342714744bf1b213ac0767d6c3998d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"14374c3f2fe75bb158b439ebe4a4ee87","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"30d793622ebd90e7687dd3827701d46e","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"fe72a66c85df0ab333e3a37d0332df67","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"bc15061b61cf6b5002c58284591f97d4","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"dbae1b46b67ad6769ea63d33ed3d44bf","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"99acae6a2b24652d92a1ee4cbf8faca5","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d0dee8a51da30ed74bcadcd7d8e43537","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"8bcec52021ee6467bf008848d55b7a9f","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"32a4d183139d99ace97a18b276d7c169","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"524f22cecc9957e9bf629b5fb0047adc","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"2fe6a7331192dc6bf073d906fba93929","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"be5ed9c02284fa6aa31037f0e2d93470","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"8f146ce7c43f38ad3673dabe93c7c5bb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"8dc69d65ac9e71a130bc6dbeb71d2f03","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"d30a7f0a26bd40402be57831cfa4da69","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"26583b57be9de00bee14d30f2dc986d8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"254482075b19ff911db5e5cb26817498","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"21b849f15da11a7cc5122773552e0fef","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"f59aa47df669ef50955ce1a0512d3abf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"c89812744d8755bef87bedf499bd19cf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"f8fee8796e3188a996dfeca9e93f47e1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"a3a69f621716f9345def32e2b5e7b011","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5af6e343611d715985e35e7a3e5671cb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"317c0beca40f29f3aff863b8f028fd48","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"85943cff5ec22653bc51c22adeabe685","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"2c47de0940a8213b1ba751a7cd0b649b","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"14b20f972cfa94f77bc33eccc5ffca4c","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"9cd758ad7582755a7f52f2b003787795","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5d4a0085030ee808369a8f29be41e0d2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c88977d348c943b60eea8f1571e9a7ee","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"81e706ae981fcbfceea2ac547fdd7f26","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"35bfc371d940cffdc527b7b4dc954456","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"4a146c717d33b2f2719e648bd7d22059","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"541947958ad35c1591eb3ef433141196","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a95851baf426c85eae4419617db902a7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"34f493c9b3b75210406fecac2dba0f22","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"514a4ebb290842347e3f7ac7cbba276e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"cfce45c3a7af608093fd99677d635891","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ef571c059fe495366b01e977f7494fbc","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"c73d4cf2ab0b699fb47d44488b82fd40","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"f79e815e1e628908e4ab605022b0ac09","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"23b560e97aacfd0422ed3f8a1104e7d7","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"eed50a4877de2fd21b146b4f0c7327ac","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"6d7d9658988c6e2b5e45ea087f1b9155","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"502b6544978890cda2ece2d14bfdba01","body-site::gut":false,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ca08eabd09756731f095632656d45b01","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"694caec8dad781d338acf4a5b69c3058","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"14e1a93cf2379225b1fd6ed0f186bacb","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"6488fe0aaa024ba9c06647578b5a6caf","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"5ce3a51e54f30fa53b1e56dc64d11340","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"4d987a66ee0e67b68c5c4428097eb22e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"c3fd5b1d03591477953d49f0f19600c4","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"08bd73939f7bfd85daf2eaee7e9c9bf8","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"93a769a6b67e5f358eb9ad0e03c53ec3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"654f282fc504b4dc9af5b8e66a4d1a87","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"895453b352ae060e0ec5f7721547a3d1","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"b29143b255f4b97da62310d85fe9b7f3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"95dff3e66b8bdf4d8e509ceae4373c69","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"da3328e15aae60ea55a8765511d0327e","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"ebcbd71a778e6a1a776d2d50d0801fed","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"c80037fe31359840bb73250f330b60e3","body-site::gut":true,"body-site::left palm":false,"body-site::right palm":true,"body-site::tongue":true} -{"taxon":"bd759efe26a5b4b869d3fa5e4693080d","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"723858f72b4469efb79c323f75bc181f","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"8021f872c32700d46738f3591cb4c58a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"47c7eb4df73a5d553cd2f7a360ff5872","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"ad492bcae03f566b36a19e31f04d659a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"eb8ef4756ed538fe480d979e740a04d8","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"5db2cf37007f874e25eb2c901917e15a","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"fa3729663b98de0c0af7913e9f30c19e","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"504572e3afd673db749ee5e8e3e57b97","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"a6b6f29a1196cacfc392e3d71f55e2a2","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"0e5df3d01cc073e3c9674c2534169f03","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"06845c67bc4203081a981200f33e87eb","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"98d250a339a635f20e26397dafc6ced3","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":false,"body-site::tongue":true} -{"taxon":"1830c14ead81ad012f1db0e12f8ab6a4","body-site::gut":true,"body-site::left palm":true,"body-site::right palm":true,"body-site::tongue":false} diff --git a/q2_composition/_ancombc2_visualizer/tests/data/taxonomy-fake.tsv b/q2_composition/_ancombc2_visualizer/tests/data/taxonomy-fake.tsv deleted file mode 100644 index e08fed1..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/data/taxonomy-fake.tsv +++ /dev/null @@ -1,8 +0,0 @@ -Feature ID Taxon -1 d1;k1;p1 -2 d1;k1;p2 -3 d1;k2;p3 -4 d2;k1 -5 d1 -6 d2;k3;p4 -7 d2;k3;p4;c1 diff --git a/q2_composition/_ancombc2_visualizer/tests/data/taxonomy.tsv b/q2_composition/_ancombc2_visualizer/tests/data/taxonomy.tsv deleted file mode 100644 index 856183f..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/data/taxonomy.tsv +++ /dev/null @@ -1,771 +0,0 @@ -Feature ID Taxon Confidence -4b5eeb300368260019c1fbc7a3c718fc k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.9958337221946401 -fe30ff0f71a38a39cf1717ec2be3a2fc k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999428120610714 -d29fe3c70564fc0f69f2c03e0d1e5561 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999999999436398 -868528ca947bc57b69ffdf83e6b73bae k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.9664365168086811 -154709e160e8cada6bfb21115acc80f5 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.9786399509952004 -1d2e5f3444ca750c85302ceee2473331 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Gallibacterium; s__ 0.9959925193403045 -0305a4993ecf2d8ef4149fdfc7592603 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__uniformis 0.9997327263589151 -cb2fe0146e2fbcb101050edb996a0ee2 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__Bacillus; s__cereus 0.8845609942227217 -997056ba80681bbbdd5d09aa591eadc0 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Fusobacterium; s__ 0.982050953447081 -3c9c437f27aca05f8db167cd080ff1ec k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.994133246661797 -9079bfebcce01d4b5c758067b1208c31 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__Pseudomonas; s__ 0.7046607060653575 -bfbed36e63b69fec4627424163d20118 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Faecalibacterium; s__prausnitzii 0.9999988034162666 -90d32ffe026535b392c0bad850f213c4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Faecalibacterium; s__prausnitzii 0.997400384455408 -ab4ef4399912b0507d8d1187e874684d k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9998242475609459 -d86ef5d6394f5dbeb945f39aa25e7426 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae 0.9977318057405886 -a049763053c277b16c2a318f41eb23b4 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999999870776578 -699071a4a7ce68918e4cd93a61275ecd k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999999997044 -cdd14cce4ec44b3235923652b71e947e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.8622580874814595 -7e598ad34909a3fb8ff1623f1ede11a6 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999984956034443 -b44621e5c80607cdfacbf7a81e1cbe41 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999041234594638 -e8e6b7fc969005938de8ac7ffb94f17c k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Arcanobacterium; s__ 0.8807620267439782 -535696cecf56f03d3401d7d6dbe66d7b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.999869419690279 -9f718b8f66b79c3de80546ca9a54539c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.7850965298324183 -f352c1f1efecf483511c2270aabd0ae6 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Brachymonas; s__denitrificans 0.8729647786487261 -fd86856409fe6433d719558a30910515 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.7899265881540367 -44ff26d8105cf822417b4b0c4eb27c02 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides 0.9999998655674707 -ad41fe8f8be5b01c96549309937e3b14 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__ecb11; s__ 0.925004024566233 -909755d7142ea53c7f61c97c3586f26c k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.9999998985254359 -fcd4f95c05b868060121ff709085bf21 k__Bacteria 0.9999997771712479 -ab6b063ed43d8cb3008e157a0a305c47 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Rikenellaceae; g__; s__ 0.9707800667666495 -57b34afdff2e84fb9b0befd219edcb38 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.99330596140401 -047b7fb62a5e9d2711e639ae1cb1519a k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9237938938176441 -0160e14a78b18b903618f11bc732746e k__Bacteria; p__Verrucomicrobia; c__Verrucomicrobiae; o__Verrucomicrobiales; f__Verrucomicrobiaceae; g__Akkermansia; s__muciniphila 0.9999999999958362 -e7c8b8c8fced8eead4b767bffe6dd544 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Fusobacterium; s__ 0.9999939317546679 -d2613a43f4ed1dda8a673e7fb251ebef k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9999997755760827 -e31b5affbe5e23b79a8619589f3b6620 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999990585735 -7dd9c9124ec3f118a6cef1f0d422c011 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.742295742136374 -67e23140639733766b7e127f50221289 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999810912359 -01e0b7ac306895be84179f2715af269b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9908614136627867 -500d6b485cef4c52aad211d6d6e6dbc7 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999999766736212 -1685b25b43eb070cd7655de8c2d8c0a4 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__; s__ 0.9997160699479793 -db793caa585e078770021a7979ae8ea2 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999999721534184 -ee0fb26fca3afb05e0b288d6fcab899e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides 0.9999993194388146 -d1d750ce3b00503c204516d27ca0d3b0 k__Bacteria; p__Firmicutes; c__Bacilli; o__Gemellales; f__Gemellaceae; g__Gemella; s__ 0.8518668501715814 -ebe0e9790089ad4f40151cb4a3231a8f k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__Bacillus; s__ 0.9642926701258703 -b685f8246fb6fad0fd91574c444b8f51 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.999650554921081 -636c27859c1ac0a7994ca8ed145d03fe k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Lactococcus; s__ 0.9999999999993676 -f35ce9c514e1398308f5f84ed50b260f k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__; s__ 0.9443084139218192 -79e9e337b10e2d298bb1b3bde946782d k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__Escherichia; s__coli 0.9999071638373657 -0a69950e803a5d9e7166c450e44f43cf k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.990170657785976 -e5c80b4a23b96b2fa35b6da6cac2bf73 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__; s__ 0.9994335284978522 -9118606a87ac19f8d041da20f16f3236 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9999387354903329 -d8e8459398f3f096775f4298666880a7 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__[Prevotella]; s__ 0.9999949068655338 -fba3d9b3872ff9021d66434323fb9565 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.7195657027485565 -ae27459b7f5465815b1f565d792083ce k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__; s__ 0.8226723721441197 -4fdf8dcd9451f5742982d716fa9f0536 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Brachymonas; s__denitrificans 0.990341594080054 -4ea5683e2c2a183c11c45dc8fbd0c67c k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999999202641409 -469e4ff2129066178b74b112829fc03c k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999966339634149 -6edca9464612efff71d8f97299f01663 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9888368635892377 -41fedaa9200e2933821f84ecdc0b0772 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.9998288585755445 -41735c13fb7f63db49b10fba5d959ce3 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999922527995685 -54d098d009b89779530eaf43a1bb136a k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__; s__ 0.9841307620937348 -76174505aef45f134d8068d5ad2c42aa k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Cetobacterium; s__somerae 0.999989065299615 -b8afb7bb30b7a9170b7c6dcd40251d54 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.7910683742822175 -4c4606a3dbb4f5b8bb1ad1db6dfc5617 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Propionibacteriaceae; g__Propionibacterium; s__acnes 0.9814623426752663 -3ef461f213bfc675ddf0b1bfeef2dc52 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Alcaligenaceae; g__Sutterella; s__ 0.9348931942522047 -1f50ac250618ced095a2a5c34bae7651 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__Campylobacter; s__ 0.9998667199514364 -b3d4d129c955517b446df657236ba5a2 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae] 0.7452402307199099 -fc15824cd9e9c29e1319d32843452b54 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Desulfovibrionales; f__Desulfovibrionaceae; g__Desulfovibrio; s__ 0.9993291130018358 -f8f937eeee7762f446a0e87292f98eb6 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Parabacteroides; s__gordonii 0.9753745095429026 -b2866fdca13681232057e3e85a1978cf k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9997867752403777 -052128d7d424728578efe7852b0afd0d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9763024906230429 -fc5b641a0b0408d99ddfb2a5ba64da59 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999961057711 -2514cdaab96a1a42cf15506f2ecf6439 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8498350234496956 -e0472171de6fa02a1f58e392ad3d000e k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999994890345 -e063d1c3c9daf7390e5475e48d9b01c5 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9952238383416682 -958bc15b660bce0b894665d13f910f5b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999462400823 -1b448e00c078f81e49a61933072345d2 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__; f__; g__; s__ 0.7665635644743813 -2e55763e77234a7bfc3a311067a0c7e1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9782290160244883 -162ed46308ef9dd1600fb0fe7c90b186 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__; s__ 0.9050911973312585 -9af77e369d2ba4b3bb6e0e808ed84d91 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999999987383887 -e77bac543df42865af751a32a2942fdb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9999995997924442 -5ada68b9a081358e1a7d5f1d351e656a k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.999999999987125 -f8a71161ac98c5ceafcc75e57ace7230 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Lardizabala; s__biternata 0.8749556659983647 -26b8b1509edf09c438db1634308c3c90 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__; s__ 0.7966856263546956 -3ae3e825c5e3862af6c17798e2b40a37 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__ 0.8622175299699908 -26133b4163fdcd22d86f4e04e74154f1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9996357959905147 -29a92aecac56c855cbfc0debf9bda0c8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9999999228524133 -e737a3a864791ec52f1398d83786f4f2 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__; s__ 0.8200457533405936 -880968796af86b3d6270c228fe8e7026 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.9745304212780819 -81351ef6b4d49a3a6b2fc24745d70305 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.999700105283307 -c4aad64f84f51ff331b986a67af4ed3d k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.9999641113701946 -79dcabe7f92f8cf2723b796dcd2f239f k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999999979512069 -7a5d5e6f85da7ca91daa2d803e8f9279 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__uniformis 0.8457322210944457 -401d7866836c54f3cd18bd0fc814885e k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999100598598 -75258a676bcd7e73c2437d6a2012d490 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__nigrescens 0.9999992729635437 -839fafb762395fab1ba257442ec29e7f k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.7003728037209339 -6b82e6cb771d45d6c925405b66299d7f k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999979567870964 -5c82bad13c4ebd2ed1bd23a8c2e37fc5 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.8666197575636689 -f59a4d48a03cc224462bf83e4d4ab126 k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Catenibacterium; s__ 0.9999903148261411 -eecc4a4317225eb579540e82ab785716 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Faecalibacterium; s__prausnitzii 0.9999976620583243 -a895b66cac813ac67ce1c908259b646f k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Fusobacterium; s__ 0.9926618241951963 -acfe4c003905a7074aeaf385b78ad9e0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9953214919745447 -684721318896ed01048f3502333c214d k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9987202787722055 -2ff525a1e58c54525e7f2d68a6c0b23e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__nigrescens 0.9999926903688978 -d781fa7e866ac295ce9a56bd97912983 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Faecalibacterium; s__prausnitzii 0.7493946199024752 -0b925631436d3775231b60f9d0011cae k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Sphingomonadales; f__Sphingomonadaceae; g__Sphingomonas; s__ 0.9999994998443044 -a5551fc60aa8bbaab737487552ea2a75 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__CF231; s__ 0.872880524507011 -a4c08e2c3a34038ea877b16d01736837 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9406211885029296 -4075a90811bf9c19f02f5aa2ece6da37 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.9862076771441829 -4980b85712efeef1fc4563a9a949fe2e k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999943268136 -f91c81859bf6eede55eef9c915dd8bab k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.99970078019132 -5601f094afc823d75ccb34440645a99e k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Actinomyces; s__ 0.9906224971027953 -21a0198d0a83a8f3ec0e401067138940 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9008452096264863 -56c98126dde3abb2d263088db55e12c8 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.9999683646177029 -a659784c026bd9c8cde94da36aa656d7 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9999993456027748 -f16a387e898dbae6432b2ed0241120bd k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9995424783284206 -3125abe90c7ae91aec06eb104d71845f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999999999787 -b383ade799e9c83c649cec37705a251d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae 0.7462757768512205 -3bf2fc236887eda11c969b84d30f9fbf k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.9747187767070731 -3cdd97ba69a504117de24626ba790e96 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.8770533277033848 -4132561a08d25757e4bee9f73ec4a70a k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999363170253449 -30faafef155964edd9db9374f36c45bf k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9048420712753049 -9d3ec96491b522546acbdfa3b21b6071 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae 0.9924075559663312 -fb4f7d9d3f91ac2f22a542fbd13019c1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9999880347239448 -b0f7e29de400c6b517b39230dc1b4365 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.7460603842850583 -393e6e2cbe258ed27a4ca0a2ee0d2cdc k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8358611453086482 -1d17561d16d803f652b0d6bdd671c1cc k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9956090081842228 -3982159c2603cacc4bc4893003bda323 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Parabacteroides; s__gordonii 0.990490233614371 -b1e22f094d8c64fb56dbacf680dab8c9 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.99999991340653 -b92e89d105e0a6e09e5984879c4c7809 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Megamonas; s__ 0.9998429390456497 -a5df9a825c3d8eeb228a6781c3db134c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9986964429534421 -ff3df50eea7490dd794148649c480fd3 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9686046064191691 -3a1c2d5547ddb7f76306a042f8bef6a4 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Oxalobacteraceae; g__; s__ 0.9179253970562418 -8da02c7114ba0d9ee40312926e037a8f k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999998866139841 -87899779aec8d38dfaf48d895cfe8021 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.8934389480837356 -d46bfd723f625e317606ae28580eba3e Unassigned 0.8485721294354636 -145f11599b92ad3a4c93896b0edf8c0c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.9999894997463403 -846cbaf603b77be035fe0cb61d14a23c k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.8140303161720441 -e8fb2b3d01d369dbb5d3764548193ae9 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae] 0.9954151444154564 -7eedfc5c8d0d6b8852fabb20d52a8c5d k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Flavobacterium; s__ 0.999998547369774 -c4f955168102011d272b685aa772c10a k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Aerococcaceae; g__; s__ 0.7624532674225534 -513de43781dc4c2831eb83b23940d66b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9236867674037471 -13692c41b4bf5d577c28c278caafcddb k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__Pseudomonas; s__ 0.9886074376466417 -1d284bea12006c939c03d622ce2abd5e k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.9691132611623711 -24443b70088636edf08f0c9572d7faf4 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__Bacillus; s__cereus 0.8949946086343206 -185df2b73b4805164470dfaea2d05223 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__; s__ 0.9899953809370827 -2f4c5e75c0e4cdfcbddbe93ef1f410a3 k__Bacteria; p__Synergistetes; c__Synergistia; o__Synergistales; f__; g__; s__ 0.9999999906930839 -1b963d0d7457ac133aed9497f03b5a64 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9997664162148041 -bb370945a6777f712cfd963c55f2ff54 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae 0.9682614878696726 -ed950935b660fb10449d5f229dc13fb9 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8666608752094228 -59fefb91cc66ef6930b0201e4bf24cbb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.8253780733313861 -1f0a072da4906270a684a389c1586582 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Desulfovibrionales; f__Desulfovibrionaceae; g__Desulfovibrio; s__ 0.8633349419975141 -aa668eb01ca9dcc59aeb1454b600c8c8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.9749689225854287 -724c43ad3632cb8c5c6230c874551bd2 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__Pseudomonas; s__ 0.8045349896026777 -44543d9c6bb193c64d38c9bdb6790eec k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Actinomyces; s__ 0.9967092070169485 -d3e265209c342d15d93a910e38ad9be2 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9781449370410514 -626b8ee112be0ec208bb16445611d001 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.9999761535966193 -9590aed21545774c71a124f2b5200691 k__Bacteria 0.9999999081663734 -3a69cb2f27ac76a05405efbb5088d249 k__Bacteria; p__Bacteroidetes 0.9999949655367895 -475741f076c42d2c75d2d63c14fe4d3f k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.9999984991356677 -8cd2a871fab61bdea4ef23a295c371cf k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__[Exiguobacteraceae]; g__; s__ 0.873686443320628 -84755bc954af6d3b39bb4c369e5992e7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9736843017579572 -5437cb1c86c72638cbbc12896f88d1b1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9712392840132761 -848587c4a03949500c5815bd6edb7b6e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9818825028562667 -cba5f5b1153235425628bd77a28257c7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.9999998472017612 -063fa4f5a6fa894f7f8243468324ac5e k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.9981102393479658 -49232f27012731b0a65805c0919e2bbc k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.943827855776101 -4b8228f4d7d3809aa6827e8d9e11a9ae k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.7212608163317578 -c99439f78b73ffcf55858ae828aac608 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__; s__ 0.7971982847035692 -2fa276cce32e900f0f68d30e460b8f61 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9627614696475191 -4ce1be9cea00a1eb7f960600e1ff3cfa k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.9983032988453951 -1b75626f6834620dc2c729a1a81f497a k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.982403921665726 -f023384b8f989d014dd2ead7f10db307 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.9908984722142828 -344b020d867e3210563eaf40b0c557ef k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Xanthomonadales; f__Xanthomonadaceae; g__Stenotrophomonas; s__maltophilia 0.9999401467682368 -dd7e1e45831871f719cc3cd68f568e7c k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__; s__ 0.9998045143900894 -16564bc936c839c893f951bab613a30b k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Sphingomonadales; f__Erythrobacteraceae; g__Erythrobacter; s__ 0.9460027870708861 -24523c45ca39b6c81a01ce286c0c092b k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999999067626 -b5bf6383b53e0add0d6589b73949462a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9876006300891133 -51ddb685cfb1775931489ebbd3eef6ca k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Paludibacter; s__ 0.9999972392898706 -c5b61a414bdb4305544bb4f941e0bfc9 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__; s__ 0.7621702438448272 -24dfe6a7325e4f2be7dbd522ef613e42 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9994116563577591 -465e9cab9abce306c1e0f7459b325c33 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9982004044289671 -3e2c7eb0316409806267a8d9845b0b13 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__[Prevotella]; s__tannerae 0.9999999999975131 -136e9f5aa470119165e59d202fdb318c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9914179452172375 -b8b19c4f0719a5d5b965a0f50f05827c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9997021249524974 -4a5387c4bc61f2d8f3d9d2de983ba556 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.9966287626394199 -77a517253ff10afeb78a37bc13d649a0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9712134305791008 -07b2b1c3771f46d82c90b20a79fb3d04 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.7268658473687829 -30a88dc67e6a522087c3dfc8019550a6 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Arcanobacterium; s__ 0.8305615856225699 -91d0b3b7c0329b9a164b6e04a181f1d6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9995604000358095 -14d168c89e381de6fc3091837a557e48 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__Bacillus; s__cereus 0.9929461364845236 -9616cf56be891f816aa7abc6a13c9e8f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9875063899990802 -fea5c05e9b8245c5ca46f6673f59e0bf k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9919699655949962 -32875774cffdc8c820f91d8e86f9a0e6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9446862406990475 -67f9c74eeea5a4609bd1d2fab66ad3cc k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9867353474727047 -ca96b8fd01aa6c508305bacac37da6c2 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Cetobacterium; s__somerae 0.9999789291772225 -43a9c44adeac51fd3ab95081da56d02d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9900793447197616 -0bd7addf1b999f01ad58fec8412b8931 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__Campylobacter; s__ 0.9999999999756852 -2e202c4e4e803dbc6d54c9e3117afedd k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Aerococcaceae; g__; s__ 0.9941827363037207 -c18826df5af5da174f580164c805a38a k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.8201647399124894 -ae881162d813e498f40bf33b8e42d54a k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Epulopiscium; s__ 0.9818176402859741 -fc1f49989e78fa71bc6404ff2a148576 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.8569616169076417 -62bf37c50994a06e6c8c93355ad1caa0 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__; s__ 0.9723215145050736 -4b13979d719e78a50cb0eac34d72dec1 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Alcaligenaceae; g__Sutterella; s__ 0.814212469622191 -38aff035451e491e5905508b9a173fb6 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus; s__helveticus 0.9980995004791346 -0c4b17f88dae47697d3bceb3663f47ce k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9876885766109754 -dd222108ed685d6a936d2011ea220998 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__; s__ 0.9997404717274324 -7cdabbffaaa6cc6d9f478d91f312a8ee k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9835256093866039 -f99678fdc17d27a97c79faac3f2980a4 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999448970596693 -126d3c82f184c4d9058cab124f287968 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.8818622234665441 -823698689031b0b9c2c5152f92ffc70f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9907823129804533 -9e1c6b703a4312cce306c7757688a351 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Odoribacteraceae]; g__Odoribacter; s__ 0.9741297310207316 -1edc5497d3daf6d914427d32b71daa52 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__; s__ 0.9980757748020763 -9f1913b781d2cde1c8a4c57b7dc2ab83 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9477772804076361 -96a7dbb0e2c57e289c05b82e2db880be k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999989886987 -201b6484b6abe3d4c587464be6cbd574 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9968207959371668 -3b65e1db6742cc44493248fff266f564 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9027959785999388 -7dd981802694dec3ecdb61ee53805956 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__; s__ 0.9999987447167404 -ecf9eb9fa3970ff27a221e626395c75d k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Plantago; s__sericea 0.9840198571253465 -e7a3af060bcc6686986ddfdf5536fac8 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9883204048951482 -10710d3d706451c3536228e4b7d146db k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9991151759971381 -1c7d1f74c2c43b872972f974eb196915 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__; s__ 0.981394461454234 -55937e5781c91185e27a91216008e4ca k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9355345567061277 -dab4d3e6078cfc510502a47c98e82081 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9281364971800353 -d8f7f446987e67092b6256c10b1ee69e k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9686855340233106 -0dcaf9358eddf685864afb883cdf2363 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9415941932062629 -9b0549bb6e63f681bf133d2c7996055d k__Bacteria; p__Firmicutes 0.7506149603925175 -a0b0961c7ba318abff3e5a93f09f495e k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.7686841890785621 -868a4fe285b85fa1b8eb40071d5397be k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9980785120205447 -7f99061140cbf6c9081a204380efd8e1 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__; s__ 0.9415030791477812 -b00d44992702bd3743d7f353638d42f9 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9966999786650745 -4fccea69a702bcb90cc0147c0fff2995 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9998955601279681 -aadef7fba5a0754fb631409c11fb331f k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.9667666514698227 -ed75725613954c459019eec50b431f9f k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999984391496883 -c04b03fdea7f81c8c52fc540c50a24a4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.9997907831055235 -6fea19332b7fb980e2124d0339c596c2 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9680376174631936 -9acad60e1ad588fb9250aab68dee645d k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Fusobacterium; s__ 0.9997796603959739 -bfdc8d2e7693336b4f3781920d3fa253 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Lardizabala; s__biternata 0.7662506383488885 -cfe4948493ea1b183b006512be10924a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__; s__ 0.9533462694327515 -80b20e907aa4fcf2309796bc303d151d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9986294365919474 -919764896275058362e55f0849d2b38b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9961325749610411 -9da7a39de7e82006cc9533681adf765a k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Fusobacterium; s__ 0.7831504852018654 -f3194c2eb241f821239009ca55dbb30c k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9997759560434905 -2ca928ad9749bb9726c35d6528fefec1 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9999999662362309 -50e96bbd1a8267119529843a1acb43a5 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardiaceae; g__Rhodococcus; s__ 0.9966565205671194 -5a02c9985adcd7543dff8c846cff62a5 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__Paracoccus; s__marcusii 0.9998324055647368 -54a5af5112600a1faf06be268f95616e k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Lardizabala; s__biternata 0.9993713680219449 -b428acd97e6af974db1b053a2bc2b5c8 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.9786071786319286 -53729ba7429e5bd2fe96229b14452bdc k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Capnocytophaga; s__ochracea 0.9978553659822367 -3add7df323955b22d1cea664ef38165d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9781040666781388 -7f4909ae8d31a3995fa2c200c690a21f k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Caulobacterales; f__Caulobacteraceae; g__; s__ 0.9999174896399688 -7ee56e891d069e18c3c8eb866924a26c k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardioidaceae; g__; s__ 0.8198495076572347 -8b111e12f8f73205bac732c7479a97e8 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.9842956129958905 -66a605fcdaa020dbdd6136f241ea79d9 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae 0.8349845236085003 -a1b971c01ce0b220275c218adbe717c1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.997922821685064 -e73fc2655e1cca4a2b1c419da3630c72 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae 0.8607932039465931 -39b5567d2d979a9172c02435a5ede59d k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.9413356646469416 -5df503c1ddf8f3f4ac9e49e983e3d7fd k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8541828046204444 -e22afe3cb91239d19aeb01ba79015173 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.9057614923770859 -5decdad9c550489629ce441d32a69a1c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.999999937180074 -c57b70d65a63c4bf9f12c179c2416839 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.8080738263698886 -ebd1dcd162acede67bb633c42c7b2ac2 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.7448483927360258 -e2c355360209f0b71b70b85ed0f9532d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9794786642770723 -da247df6fe91b74bf38d3ecc1c05b4b0 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9999231166687839 -41cb0c62655aa8da8968a06cde0f14a1 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__; s__ 0.9899301569501586 -2de266b1ffa8e9ec6383c98096caf8f0 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9593159938080493 -88b4862756df007aa0c6bc2ba049708b k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium 0.9972226883960247 -6be3ad080a12e28c46c9ca4f94710ac7 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999956362302 -3b74a95b189e134bb34c191b7693455d k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999995266222 -ba0941f03086680ee946a10dfe90cf12 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999998882458 -6be678de197b54f9a04f6c984b91ef22 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.8418514082095719 -01b99cb344ed2530f7d80897ffe257a9 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.9895777629670363 -0be23adca941c1335eb04db17dc66e98 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9882380319734869 -28560cffcd31045fa07dd88557b43e05 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.9984374269838746 -1a4ff0ff25ff4e919711422c2f605519 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9658842882755643 -101968ec709b68fcd964a68ff226dcd1 k__Bacteria; p__Synergistetes; c__Synergistia; o__Synergistales; f__Dethiosulfovibrionaceae; g__TG5; s__ 0.7184575263330232 -bb173654871d294466912ef22f685faa k__Bacteria; p__TM7; c__; o__; f__; g__; s__ 0.8476021797285942 -58d6cee566e26e231916ccc2093ae053 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.7693774447016705 -30273eb317696f87e7b6fd37ada4bb8f k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__; s__ 0.8612132401018252 -498ae808db957a63e20e836e1bf77f54 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.988906133756839 -c9f68eb27669d95f1e365fc085b51ee6 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__; s__ 0.8286392562371542 -f9bc8716f02b0a22f03b1a686895aae1 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Lardizabala; s__biternata 0.9989406475916182 -7fee9350277038eef98dee70b4190563 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__SMB53; s__ 0.9976757508428109 -34e40677eda6fb724e9323b0835d5ab0 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Odoribacteraceae]; g__Butyricimonas; s__ 0.9999808683380617 -956d0a6f5a8e1d2fbb39df909cc14894 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9998432927804386 -0f2a155a57fe6d0bf34767080706b3e1 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__Plesiomonas; s__shigelloides 0.9982710438028973 -95f07780b7e9b8b504c2563e63950663 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.8849721327913207 -0f55566622d8244073432b2e67b24baa k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9245116610867723 -7f2aa6f3481a4039dcc8d1b8be32beb7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.997532362495088 -f094a383692eb30761eb3d5c93240236 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999918575996913 -ecbf086d6ccbe5e8c2a69d0afb144662 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9999699072181122 -c9a1082e87563e01347729352358bbcf k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__Bacillus; s__ 0.975346998897466 -48eda83fda558aea8fdd32b9c8dfff98 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__WAL_1855D; s__ 0.9999999993871853 -7a20f7055ca2c7462cfa6a7aef16ec28 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales 0.9043747565110443 -ce0a68ef210192a51f60ec3eb8e3e92e k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__Campylobacter; s__ 0.9999999927592853 -955d8fcbb35e8bc04c8df0c6aae34d34 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Rhizobiaceae; g__Agrobacterium; s__ 0.9505148450823113 -4ab53e40e06f3a9b0b9b2669d8a52f65 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9972215900199218 -3f448350064694e647b284259bdebb91 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999999984179908 -1c40ac02c49ea9e03881b0f183373417 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales 0.9999967012895914 -1a5ff65c7f309159df626f810d96ae8b k__Bacteria; p__Proteobacteria 0.9986078840467718 -816b94bcd935ca38afe71fd1e3c5356c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.921550548542076 -5fb5ace22c46fefb30969da7bb0dcb74 k__Bacteria 0.9730628814365803 -fe98555e63f547c33b3987391cd34d5d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.8816923153420021 -5042942b77f5b924b8f8c11de37a3626 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Micrococcaceae; g__Rothia; s__dentocariosa 0.9917947631631234 -8659c05e82a2d1399cbc3fd26ab938e4 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9999966112517604 -30ebe1a33c21c25c55e4fdbb5894b832 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__[Prevotella]; s__tannerae 0.9999999999993321 -a5185df881810390f29afa3ba3ccf522 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999973401851451 -aee707afe3847427a6d3d34e31437923 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9969874561969844 -3677e15d86603bf0a6bb50f8b010afe7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9591229588654293 -54b4964000ad1631e547c46a828ed1a0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9489177729425085 -cbb7ea319a7633cf0917c6e5cde0e923 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.7202063020498253 -acba6a53153faccd2c02a9c0e8a2d941 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae 0.9999910305236527 -072698f9668d5a094cdc1a672acc4747 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999988833298783 -8c43291754ba53fa1e206f0ac7a18772 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae 0.9999999026692968 -d329ff7ff76454d2282c9f01c2798588 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Rhizobiaceae 0.7683390677137731 -2b148d88c49e316f85b6e7863089a886 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9755546554884753 -1893b0ad352ee7db0f565bc4594e6dc6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9999914735349343 -aa9f89f9af07d53e077462471423f3ab k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Catenibacterium; s__ 0.9999999999551221 -921966b15e5f1508e8650d053443c385 k__Bacteria; p__Bacteroidetes 0.9999999789899514 -d3f59bdb915bb43f2ecd96ad9296ae92 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Peptostreptococcaceae; g__; s__ 0.9999996872284448 -ee7ce85e38500b28d9d79b63c7fbf9a6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9996890278528194 -e2f0caba18b002ca9762ed56167c6188 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8230992202277039 -37c7d17f9e371c1e11a0e22b1ce15ab0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__ecb11; s__ 0.7162226665476744 -55ec4b057c122957d25013675512c73d k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.99942905516211 -f8026fa73c97b3f69cf4369cf194fb8b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999999892992 -edacf632dcadc21c328669befafe2af6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Coprococcus; s__ 0.9829421855819899 -97e0a84031c426df75af82aeff951f26 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Capnocytophaga; s__ochracea 0.9424899673072666 -de391a8294254c47e8f460325eea85f8 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9994429214730802 -a70441600c181b747a763ce5a7414a3f k__Bacteria; p__Firmicutes; c__Clostridia 0.8020492794973232 -1f926dee6544b252d38067cc7753383a k__Bacteria; p__Proteobacteria; c__; o__; f__; g__; s__ 0.7716879982589978 -f32674aec6d3fa6a7aa2323cb35699fc k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.9363416885715232 -7103ca740aeadee8bdf7cedaefac990b k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__; s__ 0.8473780821924048 -bfbf3b84b315e741c4345ebb43e2b9cc k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__ACK-M1; g__; s__ 0.9908586097194413 -68c05655a58355526692d3a1f0968aff k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales 0.9999998394094225 -42872dc875fef6070dfa78984184c096 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9999356653188819 -a621ed0faf5f6d7f3ad8f5e66cd41faf k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9999992966677156 -4516f28133b919f8d8039ece23d8dd2e k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Brachymonas; s__denitrificans 0.9994623101890072 -74c2326ccd0bc2bd9e0f23f15b79ea16 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8462670522599539 -02ef9a59d6da8b642271166d3ffd1b52 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.8543465987543895 -22ed70e219c67c2bf4e20e0b144b12bb k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__Sphingobacterium; s__faecium 0.9999975426586966 -2cec2792e54f61e12e1a0b2507826118 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Oxalobacteraceae; g__; s__ 0.9673770930058341 -3bb6760ebcd348e0c695a5fb5fccf994 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.9570578593636746 -3b795f0122b28b0e6a07bec73894acee k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__ 0.7407037722492078 -ac809fd715cced98911f73f1dfb1ffb9 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9026610348209064 -bcb349a220a0c33a6b780dbc29a25f71 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.8819410503065264 -a875cba4e2e4da128cec805cd014731f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__; s__ 0.9187748033834733 -b8329e527429f07e08f04ecf93563779 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.9996504616757337 -d9efe89c658c7996e7738e1bb777c9f0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9903377659879923 -e0f1938338e6f9b8cf8408e672ee6cd1 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.993773433397292 -c1dedbc2ee20ed310022b9a1976d56c4 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae 0.9967286632534038 -6de4955c509e8f32f905760cad0beeae k__Bacteria; p__Actinobacteria; c__Coriobacteriia; o__Coriobacteriales; f__Coriobacteriaceae; g__; s__ 0.9837807669630515 -8f0a7d866b4e5ebf1e34d0a44eb950a4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__ 0.9906875259784893 -d8db52dac1023a8fa0e56e92670d7ac1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9817570313375871 -51757b1a0a985640893725af5d87d350 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.9986071363671206 -726f76e9275bfa07ccb329dda324c58f k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae; g__Treponema; s__socranskii 0.9999999999218261 -c7ec57695a6d83b461eba523752755ec k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__ 0.8216415863833852 -41c686088d124f17c99dcf9bf3acf9d5 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.9938560327219053 -01ce91fd8dbecf637eb5e67cdab5c5aa k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.999999965499598 -b1141c1ab18997c3339e8229e0b9f41a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.9978491874694801 -c2562f279f2b32428e71ef8e8e1cd3d8 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.8092885077065582 -66fb1fc4317badb5dfaec2bf8e5055d7 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.9714600487197151 -ce1d8d111ba2aaec28d68a04e483bf3f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9999722539035509 -d51cd90e95b57acb614698dc580759fb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.953211007651201 -c5dfb8aa2b481cb89e2602fc20941587 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9809176799677424 -04c7e0ea3038f942f5a28778a74cd1c0 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.999998162830321 -d12759fe8dda1d65fe9077cc1ca9cf28 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.894645937459983 -44f993a57b632b8fde0c34ed075e1d66 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__; f__; g__; s__ 0.8224024521820277 -6401660183a33dded59f163fc63aab4d k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales 0.9771145132058217 -dc7d3610c77e7c118082f25002f26cd4 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides 0.7798962821568877 -1e9fc37a1112b198ed3d0543db7863c8 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999999967741 -685ea779ee012329ec2a171f1823f8a8 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.8751644661590657 -1c0a00b159b2154357cc9bc7499c58b2 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Pseudonocardiaceae; g__Saccharomonospora; s__ 0.9392749640458771 -b0ca0d2568c23c26c6704017eae471e1 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9745960035993452 -1a8d25f7529d783a219ef689701dd4e2 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Barnesiellaceae]; g__; s__ 0.9927708072308242 -aa24dbd408e5d69c6b0d62846145a244 k__Bacteria; p__Firmicutes; c__Clostridia 0.7885985886563874 -cf8a25fe1a1b134a027842e7769a285b k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae 0.9999958620579945 -b1e686a5c5f127a8b92de2863503a9e5 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9999744495820918 -459244e45f29ce28991de0114a16f9fa k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__Mogibacterium; s__ 0.9999746542265215 -491ef1635067f62c395bdffd58966092 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9998704003587595 -a03aa6a23dc8f296567452ec2242a5fd k__Bacteria; p__Actinobacteria; c__Coriobacteriia; o__Coriobacteriales; f__Coriobacteriaceae; g__; s__ 0.8998639028324782 -d32d15407d86a2044eead0d72cd3f9e7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.7847638533151173 -bb2704c9052362b112da42bf843e7d9b k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__Flavisolibacter; s__ 0.8870674213443654 -955280212814a2050dd2f640e10fc25d k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999999451035 -684b032107a3a32f6664dea4ef723a42 k__Bacteria 0.9763699651056932 -d5ef913e6aee3067001dc610ac8af1d1 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.997736403622595 -e2cbf79a06f1221cf49d1bef8e5db9cd k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Peptostreptococcaceae; g__; s__ 0.9999998454990027 -3d6555a4886c6e4a89104136dd5ca39e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9999999499447808 -d1c7ee5172f16dda522e46aaa4e5fa79 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.8838505602666903 -74106ca246bcf2da5c4f95b82aa6867a k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__Paracoccus; s__marcusii 0.8969363728973645 -e80d9134b601511a2702b54268b57249 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.846467398652712 -3111520c8424a2a5bdd46558ae7650e8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.986596475206643 -867e71db0537674539934bf97db51bc0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9671375895080958 -8c255f9dc0be58d1389877ec645f1a17 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Rhizobiaceae; g__; s__ 0.9374955192827125 -d30b3fb9c1dc7d9f0d4bd6ce8e975238 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9650161287821856 -b1413b635612c7db2c140bc671789ec7 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae 0.9974656242062745 -12ed71ced0f4e45c0aa5b37144e6f84b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__Mogibacterium; s__ 0.9999925421901555 -3597a2689efaf5525ce460494a8ac383 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9946055495174548 -3d6f762d8cda1915ad93d014e391c118 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Leuconostocaceae; g__; s__ 0.9999999981794474 -7595e123b71bdae8a8c1c28b7405a5c0 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Lactococcus; s__ 0.9807722690241437 -87a04eba5a3dc45f9e899d8ab4c050b4 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9996432667431419 -cbc2f795edfaebaf35d10b85062b426d k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.9881925141385922 -4738a05820f1a7840410c66476953498 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9713578612917114 -d9095748835ade1b8914c5f57b6acbcf k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__Plesiomonas; s__shigelloides 0.9645705724989544 -1ca133f4d30ab344f11e6624e841d9cd k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae; g__Treponema; s__ 0.950703733856568 -6f384c926424d43c215fbe9337d55324 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.8813456185136317 -f4eefbd4edf2a372131825289fffcca6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.9995469607506324 -9f4cdae8a020a8d9c4f54e5abf5a5769 k__Bacteria 0.9999999613446524 -752621a2dcf600f86357e9c2fa1fc985 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9999999937560489 -6ffdeb862aed8aedda8a8624fa960c57 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__; s__ 0.9999443167941194 -faf2bd479f04891ef2afba2f407749ac k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9743558729721384 -5ed23cabf504db9af85bce57e9008ea2 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999956498442 -7cd67e7e02db4db794fd67ab72755f8b k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.9452565598835438 -8163d49042bbad8871a7aab8527c9a97 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae 0.7696715501549842 -31ed03e41d53de58a6348a242165c05b k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Vibrionales; f__Vibrionaceae; g__; s__ 0.9993822895954213 -0effb4592c11dcdd619141df770563e1 k__Bacteria; p__Actinobacteria; c__Thermoleophilia; o__Gaiellales; f__Gaiellaceae; g__; s__ 0.999244126694315 -458462fa1e15c439f12deec2f19af933 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae 0.9944057212404465 -8bcc747f27b10bb3e1182fe530c7ed24 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Megasphaera; s__ 0.9999999968720772 -2ab2f3551b7aa27fd483fdcbaa1a0afb k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Acetobacteraceae; g__Roseococcus; s__ 0.9989231159235498 -1e00822422afb942c9955cd450385a8b k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9999992286357811 -9548347b69043c274ff7a1ce599a69ef k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Alcaligenaceae; g__Sutterella; s__ 0.7429133437803742 -8c5f2b5fce1b357f54ed4c8c047b6845 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.999909305633813 -33176e81f3e7ef2b9de1b783ff1ca33c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9973327370031295 -160029903cd9c779390f4719179aeea2 k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Bulleidia; s__ 0.9930797730837521 -0741ae033054073fece98b9948ec4387 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__; s__ 0.7428987191124414 -6a9b2745a31a3e5ae16682a323c28a4d k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.9953764952290288 -7fa8f515ee1ac5cb8b529b13e6a89790 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.949381274176957 -c81e310dae79b8767597762a093082c8 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__Campylobacter; s__ 0.9976261105781868 -51588a76b68ff3041e8b272256df5ae2 k__Bacteria; p__Synergistetes; c__Synergistia; o__Synergistales; f__Dethiosulfovibrionaceae; g__TG5; s__ 0.9070807368354143 -a3dc97e11838f1bf157aa875f2f6367d k__Bacteria; p__Bacteroidetes 0.9999999055295461 -f351326f9505ffc18da207391818c48e k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9821277811324446 -53dd9f9a89854c8ebdcfb105b7a26df1 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardioidaceae; g__; s__ 0.9991536366666571 -fbf110ef5de76f86121c8504a0cb786e k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9465733411849421 -f66effc279917d65747b7c3ef8d62432 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.8328144562379329 -5c541619c0a084c6609e071895d9de55 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9938955608311 -9b959f65abdb6cb9adc1d6160a5384ec k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Allobaculum; s__ 0.9999999932852575 -a826883ed572461c97a23561f7ecea3c k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae 0.972801149277789 -480b52afa972e6deb75357ec39db1998 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__MKC10; f__; g__; s__ 0.9999982632895144 -c961cc0ecd0ac693e2fb7dcf7794c3e5 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Capnocytophaga; s__ochracea 0.9119933159074036 -ff8c7f94f941a0c647120d4e142db316 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9926398192142779 -e6df6369108817c93a749fa640528e92 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Flammeovirgaceae; g__; s__ 0.790311130955446 -e54bcf1c8ec24811e7c355b8d82fa59e k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardioidaceae; g__; s__ 0.9999999890900001 -cee164362eb3296a3d29e33f7b479d2e k__Bacteria; p__Cyanobacteria; c__; o__; f__; g__; s__ 0.8789686234635555 -71e9ece7818452114b1e87f8145aefd5 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae 0.8132539537195868 -ae4c61e598c093caa5b66b6919f02ba3 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Hyphomicrobiaceae; g__; s__ 0.9418486227376394 -a54095a893fd5abc045d162bbe20644a k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae 0.908486538016183 -3253177a44672689e4e154e842d63e35 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales 0.9971138922337394 -45c36b8b2965484407b8b213419d4c6c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.999999693292712 -e9f0399c43aff643ceb1480929cf89b2 k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae; g__Treponema; s__socranskii 0.9999999999657732 -d985172bebaa0bbe61ff5f682d372c6e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9932764067703407 -02878fe3ccc81d4c884ca5574178d6a0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.711487333195246 -a841dd7e2f38b26bb7bb37179b4141d5 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9979250398867832 -63145f49e7efc26729094a53d97c0cd1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9622909553085618 -f8fe4ee0ae3da9a1432872f5545a0d42 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__; s__ 0.8154657129956009 -678424c0e69dd311d2b536cfd69a91a4 k__Bacteria; p__Tenericutes; c__Mollicutes; o__Mycoplasmatales; f__Mycoplasmataceae; g__Mycoplasma; s__ 0.9762785649968605 -99e6b8fa779ca2689cdc55d164e593e8 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__; s__ 0.9402399429962229 -421da954b88f7175953a73ea34b933e0 k__Bacteria 0.9999823310046783 -20fb19136419ba2826c941aa152fa0eb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.7561067919565475 -4aa8e1c58af1b89f613fe3bf2b81604e k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9956480283015009 -816e266d71b9a9af9d3d74893dee443e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9969405143631995 -35b6dde81c92eb7f66ca9f741da3514e k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__; s__ 0.8537937636098778 -9df911e407318b496425698999a1d81f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9636669958959824 -b815913c61abb4a540babe5c3fae17e7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8569898883160058 -251eb140eb9387372897c5f7db6f954c k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999698405569301 -c66348656c079cbbc916b2c2832f311b k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Bifidobacteriales; f__; g__; s__ 0.7389317464643197 -4ea8ed64f727e17c2ecf3616119876eb k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Mycobacteriaceae; g__Mycobacterium; s__ 0.9999999978077767 -2b6445815ec98d21dbe9640083f30d2f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999998926699534 -1e1e0cca52fab68a8c7ba5256aeadd6d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__ 0.8408303055125159 -1395953fab837ed426f9b2ba24da41b1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9999917137749439 -94ca1389331a3a9230237844cfd545f6 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__; s__ 0.9826041853598159 -15992a34ae0f42d6b5a21eeaaef674ba k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__; s__ 0.9237949480026619 -b46e36edac9cab660cec7ee6f1a335a3 k__Bacteria; p__Firmicutes 0.9973568159852382 -2ce0fa88ec7cfdda2eeb0698cdad47e8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.985428027694855 -82e72255267397b777a1afd44ea22755 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Flavobacterium; s__ 0.9999983165588121 -9d17e47f8102cca1e9a0a5b0776bb85a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.9996812403146765 -4851a0c86e3c1b3f3c67e88d8a38960a k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pasteurellales; f__Pasteurellaceae; g__Aggregatibacter; s__segnis 0.983874185011404 -025dd300b0ccbd9d5898969c2a1ab138 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__; s__ 0.8633672219404543 -9cd30ed12a411f643a9f6c145e3b59d8 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9156941316050989 -831514b8b3617bed49e2a4bd9d3d6268 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.7249899307554465 -5b220f66423e4004eb3520bfae1f25d0 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Cetobacterium; s__somerae 0.9999999804418425 -959a178855242ad3833af85d38ccff45 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales 0.8599298795231495 -a6e9c3caf38d8be5744751bea41aa62f k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Hymenobacter; s__ 0.999998852244763 -3f61c9eee7bfb0326d3efb8da077b0da k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Arcanobacterium; s__ 0.9998247047927459 -9c6b4f83513e63a49ce33a8aeb1813ad k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9990517385234079 -f95cdb71258ef6cc222c673ea4546caf k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9497449261552561 -7e4d5b19d3213719048fe55dfad0da3a k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9541443901454325 -f8753b9f13abb306b57aedce2cf6e7d0 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.7845273732532884 -ae25381e186978a7230f03484baede7c k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Rhodospirillaceae; g__; s__ 0.9949399418164976 -0310f41e594c49368dde5c5993a7a5d0 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.8032276066262287 -de35e106a779f81d63e2e058bf18799c k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9412551754255452 -c7312d5390945aa1e45badeeba28a998 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9255918941258421 -9584fe0b6843a9817e1c217bb65caea8 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus; s__helveticus 0.9758316233309225 -81fad06bda8cf753d87288f1d080da88 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae]; g__; s__ 0.9606111852474412 -9930e78f4486e70ced513d619dae53fb k__Bacteria; p__Bacteroidetes 0.9999228836289963 -5e793ed595a0793ab477b17e78421bc5 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Comamonas; s__ 0.7988873289496284 -8b300bb35321f8c125cdc4c3a242bbc0 k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__; s__ 0.7301076665391024 -54fa6da8dff69b9fec4b470312d21eb9 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.999936392230782 -457c3dbae079470f3cf0bf146c191e1f k__Bacteria; p__Acidobacteria; c__[Chloracidobacteria]; o__RB41; f__Ellin6075; g__; s__ 0.9634537789887654 -8fbf42d21b6c9c4a4e8e260ad1d6a1ab k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__; s__ 0.9707039256706532 -1efd43e712291698f34853dac3b67f54 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__; s__ 0.901990947308885 -0f006e3e638afedde4892706134a4fb9 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Caulobacterales; f__Caulobacteraceae; g__; s__ 0.9832020609690992 -8c001c89f020a1b78b26ee21d1d56746 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9915899542720145 -1ea96d595539133266a3dbd49daac1e4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__ecb11; s__ 0.7205241579934132 -b2d056fa113334bd2797397b162c6ac9 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8804352895267137 -e03d5567ab978eb82490f359c51912b1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__; s__ 0.8925211331293134 -a5e8aaab366d42b670d589ada160581c k__Bacteria 0.9629056153242835 -2328e11c4256f1f05395b7a377381279 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Paraprevotellaceae] 0.9856418434267052 -55f85b9f95aa14453f466b2ee388737b k__Bacteria; p__Proteobacteria 0.9865472360702796 -9b07cccc73bd232ffb6edb9427194c06 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Cetobacterium; s__somerae 0.9999986865342649 -7456c5136c45202afcf8000e2a8a01c5 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Oxalobacteraceae; g__; s__ 0.9806474534135627 -99f9d85c50cec960adab2a3f0f401371 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9035345022604193 -e6953e3ef3e20c6b169ef7a759d868df k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9991081512814984 -538c01338d48c71522ac629b17a01c9d k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.9242633334579672 -76e8305b47ef8b35c452b5490589fc95 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999965927186377 -328cf8ca7cded30705336cf036a2df45 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.9887591323020567 -2b427cf77172293239bc1c1cdb32ace4 k__Bacteria; p__Actinobacteria; c__Rubrobacteria; o__Rubrobacterales; f__Rubrobacteraceae; g__Rubrobacter; s__ 0.8111404016922199 -2f09559bc1ffcc3ea06ae2766194920b k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9918080002056177 -73291cac0e802b6a1fb25ae7079390ef k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.7434705154773141 -5a61388e52a8005b6747280b9332d2de k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales] 0.999905079148246 -37d242005eb3c4239ad2c00158ea99a1 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999059349749 -72cbf125e17c4e14d748543564d3d4ec k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Streptococcus; s__ 0.9747354027966921 -b3406cb10b6d6882837eaacbaec3553e k__Bacteria; p__Tenericutes; c__Mollicutes; o__Mycoplasmatales; f__Mycoplasmataceae; g__Mycoplasma; s__ 0.9893731025550265 -b65f8931698507015de2e1c5f0961cd3 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__ 0.9999999839715771 -7b9b46a7c3fb8b76b1c68911a9b56da1 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Thiotrichales; f__Thiotrichaceae; g__; s__ 0.7601571345695906 -5ec803f68f3c48cd9ce6436ccbd5b1e3 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Caulobacterales; f__Caulobacteraceae; g__; s__ 0.9999993692906912 -2835a5008083ae7290acbca001520ad1 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.9965198262346259 -0a50155a2def454344e1f2305eff7092 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9686198081065845 -bf6066f701b31c6bba541503797da013 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Dialister; s__ 0.9896816461994447 -ca1b627f011b52798bfb8fd2c6b76d20 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Aerococcaceae; g__Aerococcus; s__ 0.9375337352941799 -1a2d9f4af510ce624fa0337c3ea9fedc k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.9999983178636648 -f9c63350a2cdcada4a0be946f4e0025a k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9929607953641748 -6967d97d0d19d82633e2d05305850f80 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.9598237445248254 -81026563293d6ed29eec4d7f73eab34d Unassigned 0.8669335860002004 -e9849de9c0f7be74e13c457f05177aad k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.8864947334598079 -b59d5976acdb148c29f724d6b7990410 k__Bacteria; p__SR1; c__; o__; f__; g__; s__ 0.9999999900089733 -bae6b03d63955f134b6e523285263226 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__; s__ 0.8191588998951258 -14f2e2d783b09c74ccd36ed32cbeaddd k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Pseudomonadaceae; g__; s__ 0.9849567062374228 -8c12a12aedcd680ab7e259bfd627ff9a k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Methylophilales; f__; g__; s__ 0.8295088878842743 -01173073677a287321be3484fbed0007 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Lardizabala; s__biternata 0.994508052579864 -e6dfd15b38618c3c7ff0a025083f56d4 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.7877092844999323 -33e2cadd9d0b2b4ebeb6261766032e4a k__Bacteria; p__Firmicutes; c__Clostridia 0.971925637416479 -ea646f13713c1f3393a8b66afa03ff4a k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999999729373886 -2a010fd0ac0d1761c2e64c9cd3fd97c4 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.999990269945358 -4cecaa1cfabe89a905940ae23dd94a64 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.9972645496321051 -5454ea14c70f0323a5e836aba10947b8 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Acetobacteraceae; g__Roseococcus; s__ 0.9917813038852802 -b8413d82d36f772b9a375231cb504579 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999999849365 -7a9e7bd6bd3444b67f37c95db2960d50 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Bradyrhizobiaceae; g__; s__ 0.8752742269667795 -9abbfb135a6fceeb2ae107b7be7cb133 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999997680078 -e7e23553bcb3b809fe953ff90c99da54 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Mycobacteriaceae; g__Mycobacterium; s__ 0.7384932052019988 -217845ff2f7195cbc781eba1f7e7eaa1 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Acetobacteraceae; g__Roseococcus; s__ 0.9074505060426648 -903752a32299a5fac9505d192dc16466 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9960843983720746 -9c773cfe6cd90b39267153cd9eac020e k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9923118524226692 -5202077471c942e678df50a8e4c706d6 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Intrasporangiaceae; g__; s__ 0.9641507043723985 -04fd81a94c775a5906f2d92cf0548e4d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9530247550161832 -f1d63da515a0c96eb9f7af5de75655bb k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales 0.9889378109987512 -6b350f9f82a39450e0894fe9138ad267 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Faecalibacterium; s__prausnitzii 0.9929405147402659 -167baae5fe04a754df7eb073c07adaa7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.8951188271599309 -e1e1ece9cc43057ec074912f7545a432 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999999999645 -43e4b46e2ba2455e3974874722cbd75a k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__; s__ 0.9999999955679328 -76d0a9cc7116aeaa8d26bc09e768cbc4 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__; s__ 0.9997229692080328 -f7a8c8f87af98f9c5f479beaadc0b892 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.8472799110856734 -21c3086fa768008b7bee62d5d13b5366 k__Bacteria; p__Proteobacteria 0.9966900604843442 -d8adf2a20249cefe6c627f9c17abb202 k__Bacteria; p__Bacteroidetes; c__Sphingobacteriia; o__Sphingobacteriales; f__Sphingobacteriaceae; g__; s__ 0.9999997325339722 -dd9d9aad1de9345686f5cc614c5616db k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.994768888071969 -0524cb6dcc8f60dafc09c46911c9d0ac k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae 0.8858966697128057 -63e29d89c820b4baafc3f5622946d6ee k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__ 0.9995445051112875 -0316af109bb877b5c7a85ddecd6dfd1e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae 0.7356574680635376 -c9ffd432429a7600931358e3a09860f5 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Flammeovirgaceae; g__; s__ 0.7388795314518875 -b18b389447d758e7cb173b4b4f2ad960 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Bradyrhizobiaceae 0.9999999797622765 -f306a3c555687b1dc2c61372504fbbea k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9792432807310691 -bb823ca6d961133b2cd91e9377cefba7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9545799767342258 -8935afd2b1d59a37191411131d75e9f6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.8902579203158328 -648532aadbacef2c7f8f8468a6146fb2 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__; s__ 0.9873423361532491 -124e839582c0a3329101182cb28619a8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9998772356465307 -51b573b10d63a2cbe455deeef5bae002 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8587501064873783 -6bd57e46e038faafe4bb747e1d494df7 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Rikenellaceae; g__; s__ 0.9976656014175976 -5cf1581a0381cd73e278302acd8751b1 k__Bacteria 0.9998244318219386 -3e7f7d8ab3a5fb0e3401a0fda19d8bcb k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Pseudomonadales; f__Moraxellaceae; g__Acinetobacter; s__ 0.9999751834302668 -ef4cafaa5121e47ff7f31d5553a66214 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Fusobacteriaceae; g__Cetobacterium; s__somerae 0.9999999371997765 -e581d288eadb8d4527694b6fe7aa5df4 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales 0.733037449677473 -2c9e19a0423a00f8c17d8086a8ab39a5 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.958518857060934 -65fbdc4707be0814fa4faf52571cc2b5 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.999999999009674 -171930820a0db82224a948125002bf46 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999998964913512 -f78c2a4fb584f61fc0fbd75c2cc22a99 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__; s__ 0.8962227989533198 -8406abe6d9a72018bf32d189d1340472 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardioidaceae; g__; s__ 0.9999077107445874 -5e76bbf2de9c36c591f8aab3784ffd1b k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__MKC10; f__; g__; s__ 0.9974225499197713 -5cb28bd0b2eea6847a6328712217c141 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Nocardiaceae; g__Rhodococcus; s__ 0.9976431308665676 -50feebeace77894a50a224bf001c3502 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9724790589137857 -a9e0ac523112f40942da575caf1f386e k__Archaea; p__Crenarchaeota; c__Thaumarchaeota; o__Nitrososphaerales; f__Nitrososphaeraceae; g__Candidatus Nitrososphaera; s__gargensis 0.9958157076317823 -029cc71dc93341de90188b686798aa0d k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae 0.99782489713692 -58c63b4710a70a640cb86afa4d851178 k__Bacteria 0.9564752779539176 -9d68bd5a8479880505cf88ab4695b5c5 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Pontibacter; s__ 0.8055478494641546 -5c4ad81078908a3b228188a847d12f9e k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodobacterales; f__Rhodobacteraceae; g__; s__ 0.9458234306324379 -dbd1f3c3e0f401f60d44103595acdb69 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.9381655822231987 -6fea6a26dbc4de9558be63f26f07f7fa k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9999621494488716 -58946a0b64aa351fd8e7b97d02d6639d k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Intrasporangiaceae; g__; s__ 0.9681175153409954 -b89da5ee2f75672a2656789aea91071d k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9999975088720752 -48a6cea7eaf29dcb52dc2985933f4249 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9999666059755069 -4e34087bb8399deb145896c92e1b58a5 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9182373048341681 -6b4a0a64da52980e7a1b1a770978bb88 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia; s__ 0.9771537392460105 -c23ddff0e5a041733d633d7bfb93e0cc k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Hymenobacter; s__ 0.9999992022137631 -3d3566af17e7e52ae5413956d004e657 k__Bacteria; p__Firmicutes; c__Bacilli 0.8299077804875117 -64222ae4c3f0f1cc06375a3814da355d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.7566000212419768 -ab402c6b9fa511b0aa2f968cddc364eb k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__; g__; s__ 0.9781839825575556 -d45006a487d94665893aa9e759be4c97 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.7525334752835731 -5546d0fe4a512f96a6d73509a1ec6e55 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.8055754758391716 -40f13b077d41d6837ca6fae65763cf01 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Actinomyces; s__ 0.8915673048061966 -26f1b1ff96f049f0e354df4c3d85efb0 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9999912556154038 -25087bd679769914988fc1e7c6d045ff k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae; g__Lactococcus; s__ 0.9999999999862439 -6fda1de9604a1be1b99a41028226f4a7 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Dyadobacter; s__ 0.9345161800026223 -f9686d94e355b66c5324677db52b3aa4 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria 0.988317316732497 -0bf5530da55bc16c52034db82e5434af k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Chlorophyta; f__; g__; s__ 0.9999759002542467 -9815d07f1b564c9be5aab03db01608da k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.8509243329248751 -d37b36cd780fdec9627c298370571ed5 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Actinomyces; s__europaeus 0.9755084621213596 -5beb76b0d6631d10fc820c2d128d4cb6 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__; s__ 0.9999921482879459 -952fabf17975467e69af4ebb5efb0fb6 k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__; s__ 0.9999822239203696 -cdf8a49dcdb0256a8ead65f65c752e40 k__Bacteria; p__Fusobacteria; c__Fusobacteriia; o__Fusobacteriales; f__Leptotrichiaceae; g__Leptotrichia; s__ 0.9999997306162179 -e83fa923d1e185d9c9de13ca3b37c8f2 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__; s__ 0.9994531269512054 -f6bb195f075d463c5e9b620a6a76dbfd k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Methylobacteriaceae; g__Methylobacterium; s__ 0.8887777135543066 -a1759b9ca6b3363edacc599498d62b56 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.85391682821515 -d1dbb266dc8841470f3c42fe8f465507 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__Campylobacter; s__ 0.9999999972388594 -3b91757d40499fecfd75d1ad215fdd2e k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Cryomorphaceae; g__; s__ 0.9862552965472559 -0b0a240a7ae19f3560d04427d753b603 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Acidaminobacteraceae]; g__; s__ 0.9999999999954383 -e0a941a7b62e87ae6301bce7185e5f4a k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Dermabacteraceae; g__Brachybacterium; s__ 0.9999920546544011 -96802b28a3942cb6b7b40f4b9bfc0d99 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Sphingomonadales; f__Sphingomonadaceae; g__Kaistobacter; s__ 0.9510529559715325 -d4c5acaf755ef50d18008aa6c79f60b0 k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae; g__Treponema; s__ 0.9607910053569405 -a0daabc3e11deb9b43aafbf3c8e31e35 k__Bacteria; p__Acidobacteria; c__[Chloracidobacteria]; o__RB41; f__Ellin6075; g__; s__ 0.9999792255859739 -e9d3af4175420ffab49c29d1a6bb2030 k__Bacteria 0.9757297522761053 -eb19aca9a5979db01ba9947baa292633 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Anaerococcus; s__ 0.9999999314443381 -8be3d398e9e6b768ed1aa713f2981204 k__Bacteria 0.9582847550146858 -0335b1664150f1e151340b1450eae898 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9982441599350995 -42f7a4caf54667a21b5de3b888213935 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__Acidaminococcus; s__ 0.7933212100281971 -03178a409a41853ea09a94055e138e19 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__ 0.8011957900070852 -ba3ff6e27b67596844f11db93e44c496 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.8300600164096446 -af12fc27ee17864717830cafd06453cd k__Bacteria; p__Proteobacteria; c__Betaproteobacteria 0.9795493444951942 -1076b2b7de5233cc917c9425aa2ea200 k__Bacteria; p__Actinobacteria; c__OPB41; o__; f__; g__; s__ 0.7065129705808924 -a80183c045cf890899121db3bbcbd39d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9998840440137724 -6bf95d9914dc404e98ebff522496533d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae 0.7799533925003399 -14732e0b78dbc03c20c505d7681b6820 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.8010774132701681 -4042bf819b2707dcb567a04950667ec7 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9036581829742759 -d8469ca44fd367ae2aab986a57833586 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__ 0.997648653949763 -95b94ac4c1c3e18210f501268e56e50e k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Brevibacteriaceae; g__Brevibacterium; s__casei 0.7751661221662103 -5656d8b980bfee07e29e8fc119850901 k__Bacteria 0.9999999969628199 -d002269a53cf1579adca5f0dadd4f332 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Dyadobacter; s__ 0.9930873613447002 -80b9cf8b7fde7d45e0bc84a9cf9ddd56 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales 0.7479451456437436 -464ff59b632870b5028ed3092b9443ff k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9988290225933982 -15c03c51375c7d03bd3dda24674b9936 k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales; f__Cytophagaceae; g__Leadbetterella; s__ 0.9999919623390392 -a3ebb6445ca32f39df9f84fe48525773 k__Bacteria; p__Planctomycetes; c__Phycisphaerae; o__WD2101; f__; g__; s__ 0.9993500781461582 -47e6d3cd169787ff35f9a2278b8d4a2f k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__; f__; g__; s__ 0.8361696535562672 -e3f051168532c89bf76e329c715c35f5 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Brachymonas; s__denitrificans 0.7515387538812587 -47fb251b4679084fee2dafef11c6bc4f k__Bacteria; p__SR1; c__; o__; f__; g__; s__ 0.9994873155337575 -9dd67b89e90b1517d6fc340bb1745e15 k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Actinomycetaceae; g__Arcanobacterium; s__ 0.9812638978431675 -75a61e0ca465f169e5d2ea2d19f8aefb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Veillonellaceae; g__; s__ 0.9920224754856676 -b9e3d6fcb82de619e9e574be03ecaa41 k__Bacteria 0.9678938024490443 -93982d4e0f9eb9a6179d6abd57560c26 k__Bacteria 0.9579670066466328 -b61a4c5ec96e7276004c81cc845e2fec k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.8424827369834189 -76d2032108822bcfaa90a4873f7a51aa k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Aeromonadales; f__Aeromonadaceae; g__; s__ 0.9999999867019654 -47be834b0f9232d552e00a36fb3c626b k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__MKC10; f__; g__; s__ 0.9999006313323258 -90b16eca6a6edc00f49dfb5f72be8b61 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.8102762642163077 -7d893311a14a858907d4c8ca21d32dc4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Peptococcaceae; g__Peptococcus; s__ 0.9999999999238511 -2d832109f6396e0f93297efd12e1321e k__Bacteria; p__Actinobacteria; c__Thermoleophilia; o__Solirubrobacterales; f__; g__; s__ 0.9999999992230073 -47fe572ed6a6b1d5f4a60a3884ec72e1 k__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales 0.7574841902020002 -77f79d776f3845bc2901cf9c4229de0b k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Xanthomonadales; f__Xanthomonadaceae; g__; s__ 0.98248093354521 -69e4868406c82bdfd67d2b449ca9f1d8 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Catonella; s__ 0.999999732554379 -e7709791d7ef6b47747de9fb43880d14 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.8093373703596846 -f908d554fc6eeb9fef7a7028fa791475 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.999049169448382 -e3d37109be4a17d8437f6fcb6072982d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Acidaminobacteraceae]; g__; s__ 0.8485177953084586 -09fc3d8a98c2ca72c69b63a51b5b564e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.8259449178790261 -3a31937521e389cbdf89ca01039e5ec3 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9470786460476179 -9f816758294dec368624eabd3595ec6f k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.9996830684472766 -2a71af2786dfb7aeb7ac7d5372c41686 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__; s__ 0.9815496131684108 -59758d94cc7ed9a16526bfc9eb207575 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9994503019301382 -190dfe815683ee977e120d35b3c83b7e k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Peptostreptococcaceae; g__Filifactor; s__ 0.99952584216538 -1d7e45fd568a577b5a6a8b4a20743211 k__Bacteria 0.9602320194638129 -498128a80a796620b238d8ad5cd1d2f9 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Myxococcales; f__Myxococcaceae; g__Myxococcus; s__ 0.9892788990427326 -e2f6c7b758ac2c0476a7e31787dbba84 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Peptostreptococcaceae; g__; s__ 0.9989896368145779 -df98cba64f84c4e8b7f7ea8396f4f3f9 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Campylobacteraceae; g__; s__ 0.9412638725678515 -88191bcb077f725a8c8e37d74e110baa k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__Escherichia; s__coli 0.7366509880755492 -3b0e180ea70b1a946a6214eacb539c97 k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__MKC10; f__; g__; s__ 0.9273423125875078 -84e6f7df01548135d92febfeae9a1ea6 k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae 0.8937237826790412 -dd530a50ee0277096b0cbd210cdb80b2 k__Bacteria; p__Bacteroidetes; c__Flavobacteriia; o__Flavobacteriales; f__Flavobacteriaceae; g__Capnocytophaga; s__ochracea 0.988136312507481 -033511c7ff4fe93866075cfb9129aa3b k__Archaea; p__Crenarchaeota; c__Thaumarchaeota; o__Nitrososphaerales; f__Nitrososphaeraceae; g__Candidatus Nitrososphaera; s__gargensis 0.9936199309878089 -216d5bb567182b6210e2c3dbc455f2b6 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__[Odoribacteraceae]; g__Odoribacter; s__ 0.9992778832225604 -a9541756b547061c02922f1a3a913fce k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.9185187935457652 -059408ca99f1001f64e6df1e06fb951d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.739486211795697 -111311cc108c483f3782c9214681ed19 k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Streptococcaceae 0.9824899905076373 -427e48835f176c1a367a14b39b882c58 k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.8118007388610889 -10ae3ca534ce9bb9f80822b4b4a6375c k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f__Rhizobiaceae; g__; s__ 0.9704669332421135 -8cfda573467e6a959664801713cadba1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9787326755629034 -73bca1b91fb8a80ee698f1833c073664 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9335337718148026 -fc8f87209db793f740eea731e64f0b2a k__Bacteria 0.999997387393627 -9f6a3b261bc6acafa3d4a6d2de87f924 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Xanthomonadales; f__Xanthomonadaceae; g__Stenotrophomonas; s__maltophilia 0.8656053209210345 -b387961d274808e3ffed8c1594f4cd1c k__Bacteria; p__Actinobacteria; c__Acidimicrobiia; o__Acidimicrobiales; f__; g__; s__ 0.9999977144163921 -e1b32002ee69c4e3210a2a257511f96a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Porphyromonadaceae; g__Porphyromonas; s__ 0.9958404526334174 -6e342714744bf1b213ac0767d6c3998d k__Bacteria; p__[Thermi]; c__Deinococci; o__Deinococcales; f__Trueperaceae; g__B-42; s__ 0.7896352824675161 -14374c3f2fe75bb158b439ebe4a4ee87 k__Bacteria; p__Chloroflexi; c__Anaerolineae; o__Caldilineales; f__Caldilineaceae; g__; s__ 0.9999517458425682 -30d793622ebd90e7687dd3827701d46e k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Prevotellaceae; g__Prevotella; s__ 0.8752657828256205 -fe72a66c85df0ab333e3a37d0332df67 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Christensenellaceae; g__; s__ 0.8097925801642317 -bc15061b61cf6b5002c58284591f97d4 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9999809866209918 -dbae1b46b67ad6769ea63d33ed3d44bf k__Bacteria; p__Firmicutes; c__Bacilli; o__Turicibacterales; f__Turicibacteraceae; g__Turicibacter; s__ 0.9999995307574245 -99acae6a2b24652d92a1ee4cbf8faca5 k__Bacteria 0.964368629661323 -d0dee8a51da30ed74bcadcd7d8e43537 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Chlorophyta; f__; g__; s__ 0.9999999748914664 -8bcec52021ee6467bf008848d55b7a9f k__Bacteria; p__Verrucomicrobia; c__; o__; f__; g__; s__ 0.8466530175607863 -32a4d183139d99ace97a18b276d7c169 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.8383514846450921 -524f22cecc9957e9bf629b5fb0047adc k__Bacteria; p__Bacteroidetes; c__Cytophagia; o__Cytophagales 0.998835395149775 -2fe6a7331192dc6bf073d906fba93929 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.9960386373852823 -be5ed9c02284fa6aa31037f0e2d93470 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria 0.9603087777874567 -8f146ce7c43f38ad3673dabe93c7c5bb k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.7037117244150338 -8dc69d65ac9e71a130bc6dbeb71d2f03 k__Bacteria 0.9697024932246691 -d30a7f0a26bd40402be57831cfa4da69 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria 0.8756456579124897 -26583b57be9de00bee14d30f2dc986d8 k__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Chlorophyta; f__Trebouxiophyceae; g__; s__ 0.999999999118458 -254482075b19ff911db5e5cb26817498 k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Aeromonadales; f__Aeromonadaceae; g__Tolumonas; s__ 0.7464095282022631 -21b849f15da11a7cc5122773552e0fef k__Bacteria; p__Chloroflexi 0.9857492495710293 -f59aa47df669ef50955ce1a0512d3abf k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__; g__; s__ 0.7555192450631512 -c89812744d8755bef87bedf499bd19cf k__Bacteria 0.9750146282643379 -f8fee8796e3188a996dfeca9e93f47e1 k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Bulleidia; s__ 0.9980916227677465 -a3a69f621716f9345def32e2b5e7b011 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__ 0.9625163910766555 -5af6e343611d715985e35e7a3e5671cb k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9311414150252683 -317c0beca40f29f3aff863b8f028fd48 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae]; g__Gallicola; s__ 0.9997064291905559 -85943cff5ec22653bc51c22adeabe685 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__Acanthamoeba; s__culbertsoni 0.9970085820748956 -2c47de0940a8213b1ba751a7cd0b649b k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Rikenellaceae; g__AF12; s__ 0.9999999996227871 -14b20f972cfa94f77bc33eccc5ffca4c k__Bacteria; p__Verrucomicrobia; c__[Spartobacteria]; o__[Chthoniobacterales]; f__[Chthoniobacteraceae]; g__DA101; s__ 0.9999375839646749 -9cd758ad7582755a7f52f2b003787795 k__Bacteria; p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales; f__Helicobacteraceae 0.7884595852143892 -5d4a0085030ee808369a8f29be41e0d2 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.7622592052499118 -c88977d348c943b60eea8f1571e9a7ee k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales; f__Corynebacteriaceae; g__Corynebacterium; s__durum 0.9365996565974561 -81e706ae981fcbfceea2ac547fdd7f26 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.7007779955696168 -35bfc371d940cffdc527b7b4dc954456 k__Bacteria 0.8983347357171165 -4a146c717d33b2f2719e648bd7d22059 k__Bacteria; p__Planctomycetes; c__Planctomycetia; o__Planctomycetales; f__Planctomycetaceae; g__Planctomyces; s__ 0.9999999943921125 -541947958ad35c1591eb3ef433141196 k__Bacteria; p__Bacteroidetes; c__[Rhodothermi]; o__[Rhodothermales]; f__Rhodothermaceae; g__Rubricoccus; s__ 0.8368847606448594 -a95851baf426c85eae4419617db902a7 k__Bacteria 0.8839793133874827 -34f493c9b3b75210406fecac2dba0f22 k__Bacteria 0.99999999892876 -514a4ebb290842347e3f7ac7cbba276e k__Bacteria 0.977892724728328 -cfce45c3a7af608093fd99677d635891 k__Bacteria; p__Verrucomicrobia; c__[Spartobacteria]; o__[Chthoniobacterales]; f__[Chthoniobacteraceae]; g__Ellin506; s__ 0.826327166127106 -ef571c059fe495366b01e977f7494fbc k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Myxococcales; f__; g__; s__ 0.9982049095845408 -c73d4cf2ab0b699fb47d44488b82fd40 k__Bacteria; p__Verrucomicrobia; c__[Pedosphaerae]; o__[Pedosphaerales]; f__; g__; s__ 0.9997262972383966 -f79e815e1e628908e4ab605022b0ac09 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__; s__ 0.9959606220122001 -23b560e97aacfd0422ed3f8a1104e7d7 k__Bacteria; p__Spirochaetes; c__Spirochaetes; o__Spirochaetales; f__Spirochaetaceae; g__Treponema; s__ 0.985995667905748 -eed50a4877de2fd21b146b4f0c7327ac k__Bacteria; p__Chloroflexi; c__Gitt-GS-136; o__; f__; g__; s__ 0.7923905965393132 -6d7d9658988c6e2b5e45ea087f1b9155 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Mogibacteriaceae]; g__Mogibacterium; s__ 0.9999530128058945 -502b6544978890cda2ece2d14bfdba01 k__Bacteria 0.9999992713823516 -ca08eabd09756731f095632656d45b01 k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__; s__ 0.9983619317607827 -694caec8dad781d338acf4a5b69c3058 k__Bacteria; p__Firmicutes; c__Erysipelotrichi; o__Erysipelotrichales; f__Erysipelotrichaceae; g__Allobaculum; s__ 0.9933864641518518 -14e1a93cf2379225b1fd6ed0f186bacb k__Bacteria; p__FBP; c__; o__; f__; g__; s__ 0.9996710419708875 -6488fe0aaa024ba9c06647578b5a6caf k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__Acetobacteraceae; g__Roseococcus; s__ 0.9995620152418827 -5ce3a51e54f30fa53b1e56dc64d11340 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales 0.9951843239239426 -4d987a66ee0e67b68c5c4428097eb22e k__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Thiotrichales; f__Thiotrichaceae; g__CF-26; s__ 0.7994705971955715 -c3fd5b1d03591477953d49f0f19600c4 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Desulfovibrionales; f__Desulfomicrobiaceae; g__; s__ 0.9999999993020481 -08bd73939f7bfd85daf2eaee7e9c9bf8 Unassigned 0.8664133093465773 -93a769a6b67e5f358eb9ad0e03c53ec3 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Tissierellaceae] 0.9989722925004496 -654f282fc504b4dc9af5b8e66a4d1a87 k__Bacteria; p__GN02; c__BD1-5; o__; f__; g__; s__ 0.8937638443300449 -895453b352ae060e0ec5f7721547a3d1 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.7756571434765006 -b29143b255f4b97da62310d85fe9b7f3 k__Bacteria; p__Firmicutes; c__Clostridia 0.7084783782168641 -95dff3e66b8bdf4d8e509ceae4373c69 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Lachnospira; s__ 0.9997983395343405 -da3328e15aae60ea55a8765511d0327e k__Bacteria; p__Verrucomicrobia; c__[Pedosphaerae]; o__[Pedosphaerales]; f__; g__; s__ 0.999999885192515 -ebcbd71a778e6a1a776d2d50d0801fed k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.9975013045776004 -c80037fe31359840bb73250f330b60e3 k__Bacteria 0.9727262121442337 -bd759efe26a5b4b869d3fa5e4693080d k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__ 0.9995981370005347 -723858f72b4469efb79c323f75bc181f k__Bacteria; p__Planctomycetes; c__Planctomycetia; o__Planctomycetales; f__Planctomycetaceae; g__Planctomyces; s__ 0.9999842079365734 -8021f872c32700d46738f3591cb4c58a k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__ 0.950298422800317 -47c7eb4df73a5d553cd2f7a360ff5872 k__Bacteria 0.9625306758187444 -ad492bcae03f566b36a19e31f04d659a k__Bacteria 0.9592420622809142 -eb8ef4756ed538fe480d979e740a04d8 k__Bacteria 0.9992518268672295 -5db2cf37007f874e25eb2c901917e15a k__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__ 0.9998650088122101 -fa3729663b98de0c0af7913e9f30c19e k__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhodospirillales; f__; g__; s__ 0.7260248247151302 -504572e3afd673db749ee5e8e3e57b97 k__Bacteria; p__Cyanobacteria 0.996420061481882 -a6b6f29a1196cacfc392e3d71f55e2a2 k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Bdellovibrionales; f__Bacteriovoracaceae; g__Bacteriovorax; s__ 0.9536660457678927 -0e5df3d01cc073e3c9674c2534169f03 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__[Acidaminobacteraceae]; g__Acidaminobacter; s__ 0.749393658744113 -06845c67bc4203081a981200f33e87eb k__Bacteria; p__Proteobacteria 0.9956180804506998 -98d250a339a635f20e26397dafc6ced3 k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Clostridiaceae; g__Clostridium; s__ 0.999193575156621 -1830c14ead81ad012f1db0e12f8ab6a4 k__Bacteria; p__TM7; c__TM7-3; o__Blgi18; f__; g__; s__ 0.9226796920359376 diff --git a/q2_composition/_ancombc2_visualizer/tests/featureRecord.test.ts b/q2_composition/_ancombc2_visualizer/tests/featureRecord.test.ts deleted file mode 100644 index 4f7b01e..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/featureRecord.test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { describe, test, assert } from "vitest"; -import { FeatureRecord, FeatureRecords } from "../src/util/features"; - -describe("FeatureRecord class", () => { - const feature = new FeatureRecord("abc123"); - - feature.addVariable( - feature.createVariable("body-site", "lfc", 2.2, "tongue", "gut"), - ); - feature.addVariable( - feature.createVariable("body-site", "lfc", -0.3, "left palm", "gut"), - ); - feature.addVariable( - feature.createVariable("body-site", "p", 0.05, "left palm", "gut"), - ); - - test("addVariable()", () => { - assert.equal(feature.variables.size, 2); - }); - - test("getVariable()", () => { - let obs = feature.getVariable("body-site", "tongue"); - let exp = { - name: "body-site", - lfc: 2.2, - level: "tongue", - reference: "gut", - }; - assert.deepEqual(obs, exp); - - obs = feature.getVariable("body-site", "left palm"); - exp = { - name: "body-site", - lfc: -0.3, - p: 0.05, - level: "left palm", - reference: "gut", - }; - assert.deepEqual(obs, exp); - }); - - test("getVariableSlice()", () => { - let obs = feature.getVariableSlice("body-site", "lfc", "tongue"); - let exp = 2.2; - assert.equal(obs, exp); - - obs = feature.getVariableSlice("body-site", "p", "left palm"); - exp = 0.05; - assert.equal(obs, exp); - }); -}); - -describe("FeatureRecords class", () => { - const features = new FeatureRecords(); - - const feature1 = new FeatureRecord("abc123"); - feature1.addVariable( - feature1.createVariable("body-site", "lfc", 2.2, "tongue", "gut"), - ); - feature1.addVariable( - feature1.createVariable("body-site", "lfc", -0.3, "left palm", "gut"), - ); - - features.addFeature(feature1); - - test("addFeature()", () => { - assert.equal(features.records.length, 1); - }); - - const feature2 = new FeatureRecord("abc123"); - feature2.addVariable( - feature2.createVariable("body-site", "p", 0.05, "left palm", "gut"), - ); - features.addFeature(feature2); - - test("addFeature() matching feature", () => { - assert.equal(features.records.length, 1); - - assert.equal(features.records[0].variables.size, 2); - }); - - test("addFeature() merges features", () => { - assert.equal(features.records.length, 1); - - const feature = features.getFeature("abc123"); - - const lfc = feature!.getVariableSlice("body-site", "lfc", "left palm"); - assert.equal(lfc, -0.3); - - const p = feature!.getVariableSlice("body-site", "p", "left palm"); - assert.equal(p, 0.05); - }); -}); diff --git a/q2_composition/_ancombc2_visualizer/tests/parse.test.ts b/q2_composition/_ancombc2_visualizer/tests/parse.test.ts deleted file mode 100644 index b1065a7..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/parse.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { vi, describe, test, assert } from "vitest"; -import { readFileSync } from "fs"; -import { FeatureRecords } from "../src/util/features"; -import { - getColumnField, - parseJSONLFeatureRecord, - parseSlice, - parseAllSlices, -} from "../src/util/parse"; - -// mock d3.text -async function mockedText(slice: string): Promise { - return readFileSync(slice, "utf-8"); -} -vi.mock("d3-fetch", () => { - return { text: vi.fn(mockedText) }; -}); - -describe("getColumnField()", () => { - const lfcText = readFileSync("tests/data/output-format/lfc.jsonl", "utf-8"); - const header = JSON.parse(lfcText.split("\n")[0]); - - test("column name is present", () => { - const column = "body-site::left palm"; - const exp = { - name: "body-site::left palm", - type: null, - missing: false, - title: "", - description: "", - extra: { - variable: "body-site", - level: "left palm", - reference: "gut", - }, - }; - - assert.deepEqual(getColumnField(column, header), exp); - }); - - test("column name not present", () => { - const column = "waldo"; - - assert.throws( - () => getColumnField(column, header), - "Column waldo not found in JSONL header.", - ); - }); -}); - -describe("parseJSONLFeatureRecord()", () => { - const lfcText = readFileSync("tests/data/output-format/lfc.jsonl", "utf-8"); - const jsonRecords = lfcText - .split("\n") - .filter((line) => line.trim() !== "") - .map((line) => JSON.parse(line)); - - const header = jsonRecords[0]; - const jsonRecord = jsonRecords[1]; - const sliceName = "lfc"; - - const obs = parseJSONLFeatureRecord(jsonRecord, header, sliceName); - - test("parses feature id", () => { - assert.equal(obs.featureId, "4b5eeb300368260019c1fbc7a3c718fc"); - }); - - test("parses correct number of variables", () => { - assert.equal(obs.variables.size, 5); - }); - - test("parses categorical columns", () => { - const variables = Array.from(obs.variables.values()); - const bodySiteVariables = variables.filter( - (v) => v.name == "body-site", - ); - assert.equal(bodySiteVariables.length, 3); - - const levels = bodySiteVariables.map((v) => v.level); - assert.sameMembers(levels, ["right palm", "left palm", "tongue"]); - - const references = bodySiteVariables.map((v) => v.reference); - assert.sameMembers(references, ["gut", "gut", "gut"]); - }); - - test("parses numerical columns", () => { - const variables = Array.from(obs.variables.values()); - const nonCategoricalVariables = variables.filter( - (v) => !Object.hasOwn(v, "reference"), - ); - assert.equal(nonCategoricalVariables.length, 2); - - const yearVariable = nonCategoricalVariables.find( - (v) => v.name == "year", - ); - assert.deepEqual(yearVariable, { - name: "year", - lfc: 189.6871124062, - }); - }); -}); - -describe("parseSlice()", async () => { - const sliceFilepath = "tests/data/output-format/lfc.jsonl"; - const featureRecords = new FeatureRecords(); - await parseSlice(sliceFilepath, featureRecords); - - test("correct number of features", () => { - assert.equal(featureRecords.records.length, 8); - }); - - test("slice parsed correctly", () => { - const feature = featureRecords.getFeature( - "fe30ff0f71a38a39cf1717ec2be3a2fc", - ); - - assert.equal( - feature!.getVariableSlice("body-site", "lfc", "left palm"), - 113.4173262332, - ); - - assert.equal(feature!.getVariableSlice("year", "lfc"), 181.01108921); - - const variable = feature!.getVariable("body-site", "right palm"); - assert.isOk(variable!.lfc); - assert.isNotOk(variable!.q); - assert.isNotOk(variable!.p); - assert.isNotOk(variable!.se); - }); -}); - -describe("parseAllSlices()", async () => { - const sliceDirPath = "tests/data/output-format"; - const featureRecords = new FeatureRecords(); - await parseAllSlices(sliceDirPath, featureRecords); - - test("correct number of features", () => { - assert.equal(featureRecords.records.length, 8); - }); - - test("all slices parsed", () => { - for (let featureRecord of featureRecords.records) { - for (let variable of featureRecord.variables.values()) { - for (let prop of ["lfc", "se", "p", "q"]) { - assert.property(variable, prop); - assert.isDefined(variable[prop]); - } - } - } - }); - - test("structure and contents of arbitrary feature", () => { - const id = "1d2e5f3444ca750c85302ceee2473331"; - const feature = featureRecords.getFeature(id); - - assert.equal( - feature!.getVariableSlice("body-site", "lfc", "left palm"), - 86.9453579935, - ); - - assert.equal(feature!.getVariableSlice("year", "se"), 0.0030650395); - - assert.property( - feature!.getVariable("body-site", "tongue"), - "reference", - ); - }); -}); diff --git a/q2_composition/_ancombc2_visualizer/tests/taxonomy.test.ts b/q2_composition/_ancombc2_visualizer/tests/taxonomy.test.ts deleted file mode 100644 index 7af4b73..0000000 --- a/q2_composition/_ancombc2_visualizer/tests/taxonomy.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { vi, describe, test, assert } from "vitest"; -import { readFileSync } from "fs"; -import { TaxonomyNode, parseTaxonomy } from "../src/util/taxonomy"; -import * as d3 from "d3"; - -// mock d3.tsv -async function mockedTsv(slice: string): Promise { - const textData = readFileSync(slice, "utf-8"); - let lines = textData.split("\n").filter((l) => l.trim() != ""); - - // drop header - lines = lines.slice(1); - - let data: object[] = []; - for (let line of lines) { - const values = line.split("\t"); - const record = { - "Feature ID": values[0], - Taxon: values[1], - }; - data.push(record); - } - - return data; -} -vi.mock("d3-fetch", () => { - return { tsv: vi.fn(mockedTsv) }; -}); - -describe("parseTaxonomy()", async () => { - let root: d3.HierarchyNode; - - test("parses successfully", async () => { - root = await parseTaxonomy("tests/data/taxonomy-fake.tsv"); - }); - - test("has correct number of nodes", () => { - assert.equal(root.descendants().length, 12); - }); - - test("root has correct children", () => { - const exp = ["d1", "d2"]; - assert.deepEqual( - root.children!.map((c) => c.data.name), - exp, - ); - }); - - test("back references exist", () => { - assert.equal(root.data.hierarchyNode, root); - }); -}); diff --git a/q2_composition/_ancombc2_visualizer/tsconfig.app.json b/q2_composition/_ancombc2_visualizer/tsconfig.app.json deleted file mode 100644 index 55a2f9b..0000000 --- a/q2_composition/_ancombc2_visualizer/tsconfig.app.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": "@tsconfig/svelte/tsconfig.json", - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "resolveJsonModule": true, - /** - * Typecheck JS in `.svelte` and `.js` files by default. - * Disable checkJs if you'd like to use dynamic types in JS. - * Note that setting allowJs false does not prevent the use - * of JS in `.svelte` files. - */ - "allowJs": true, - "checkJs": true, - "isolatedModules": true, - "moduleDetection": "force" - }, - "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] -} diff --git a/q2_composition/_ancombc2_visualizer/tsconfig.json b/q2_composition/_ancombc2_visualizer/tsconfig.json deleted file mode 100644 index 1ffef60..0000000 --- a/q2_composition/_ancombc2_visualizer/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] -} diff --git a/q2_composition/_ancombc2_visualizer/tsconfig.node.json b/q2_composition/_ancombc2_visualizer/tsconfig.node.json deleted file mode 100644 index db0becc..0000000 --- a/q2_composition/_ancombc2_visualizer/tsconfig.node.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "target": "ES2022", - "lib": ["ES2023"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/q2_composition/_ancombc2_visualizer/vite.config.ts b/q2_composition/_ancombc2_visualizer/vite.config.ts deleted file mode 100644 index bfeb276..0000000 --- a/q2_composition/_ancombc2_visualizer/vite.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig } from "vite"; -import { svelte } from "@sveltejs/vite-plugin-svelte"; -import tailwindcss from "@tailwindcss/vite"; - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [svelte(), tailwindcss()], - base: "", -}); From 7557b8d4d2ced4f1d53142a356ad602681b03207 Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Tue, 26 May 2026 13:54:08 -0700 Subject: [PATCH 07/15] Separating and adding tests --- q2_composition/tests/test_ancombc2.py | 31 +----- .../tests/test_diff_abundance_plot.py | 104 ++++++++++++++++++ 2 files changed, 105 insertions(+), 30 deletions(-) create mode 100644 q2_composition/tests/test_diff_abundance_plot.py diff --git a/q2_composition/tests/test_ancombc2.py b/q2_composition/tests/test_ancombc2.py index c45159d..45a7d9c 100644 --- a/q2_composition/tests/test_ancombc2.py +++ b/q2_composition/tests/test_ancombc2.py @@ -10,7 +10,6 @@ import pandas as pd from pandas.testing import assert_frame_equal -import os from pathlib import Path import subprocess import tempfile @@ -24,7 +23,7 @@ r_base, ancombc2, _process_formula, _convert_metadata, _split_into_slices, _rename_variables_post, _is_categorical, _parse_variable_and_level, _deduce_reference_levels, _process_categorical_variables, - _process_structural_zeros, da_barplot + _process_structural_zeros ) from q2_composition._format import ANCOMBC2SliceMapping @@ -185,34 +184,6 @@ def test_spaces_in_metadata_column(self): # three levels, so one reference and other two in the output self.assertEqual(len(variable_with_spaces_columns), 2) - def test_da_barplot(self): - ''' - Tests that the visualizer runs successfully, which is essentially a - test of whether or not the visualizer got built into the - q2_composition/_da_barplot/dist/ folder successfully. - ''' - with tempfile.TemporaryDirectory() as tempdir: - da_barplot(tempdir, self.abc2_output) - assert os.path.exists(os.path.join(tempdir, 'index.html')) - - def test_da_barplot_non_overlapping_taxonomy(self): - ''' - Tests that an error is raised when attempting to visualize ancombc2 - data with a taxonomy that contains none of the features present in the - ancombc2 data. - ''' - taxonomy_df = pd.DataFrame({ - 'Feature ID': ['feat1', 'feat2'], - 'Taxon': ['taxon1', 'taxon2'], - 'Confidence': [0.9, 0.95] - }) - - with tempfile.TemporaryDirectory() as tempdir: - with self.assertRaisesRegex( - ValueError, 'No features remained in your taxonomy' - ): - da_barplot(tempdir, self.abc2_output, taxonomy_df) - class TestFormulaProcessing(TestANCOMBC2Base): def test_process_formula(self): diff --git a/q2_composition/tests/test_diff_abundance_plot.py b/q2_composition/tests/test_diff_abundance_plot.py new file mode 100644 index 0000000..401936a --- /dev/null +++ b/q2_composition/tests/test_diff_abundance_plot.py @@ -0,0 +1,104 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2016-2026, QIIME 2 development team. +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file LICENSE, distributed with this software. +# ---------------------------------------------------------------------------- +import unittest +import qiime2 +import biom +import os +import tempfile +import pandas as pd + +from pathlib import Path +from q2_composition._ancombc2 import da_barplot, ancombc2 +from q2_composition._ancombc import ancombc + + +class TestDiffAbundancePlot(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.test_data_fp = Path(__file__).parent / 'data' / 'ancombc2' + + table_fp = cls.test_data_fp / 'feature-table.biom' + cls.biom_table = biom.load_table(table_fp) + + metadata_fp = cls.test_data_fp / 'metadata.tsv' + cls.ancombc2_metadata = qiime2.Metadata.load(metadata_fp) + + ancombc_table_fp = Path(__file__).parent / 'data' / 'table-ancombc.qza' + ancombc_table = qiime2.Artifact.load(ancombc_table_fp) + cls.ancombc_table = ancombc_table.view(pd.DataFrame) + + metadata_fp = Path(__file__).parent / 'data' / 'sample-md-ancombc.tsv' + cls.ancombc_metadata = qiime2.Metadata.load(metadata_fp) + + cls.abc2_output = ancombc2( + table=cls.biom_table, + metadata=cls.ancombc2_metadata, + fixed_effects_formula='body-site + year', + group='body-site', + structural_zeros=True + ) + + cls.abc_output = ancombc( + table=cls.ancombc_table, + metadata=cls.ancombc_metadata, + formula='bodysite' + ) + + def test_da_barplot(self): + ''' + Tests that the visualizer runs successfully, which is essentially a + test of whether or not the visualizer got built into the + q2_composition/_da_barplot/dist/ folder successfully. + ''' + with tempfile.TemporaryDirectory() as tempdir: + da_barplot(tempdir, self.abc2_output) + assert os.path.exists(os.path.join(tempdir, 'index.html')) + + with tempfile.TemporaryDirectory() as tempdir: + da_barplot(tempdir, self.abc_output) + assert os.path.exists(os.path.join(tempdir, 'index.html')) + + def test_da_barplot_non_overlapping_taxonomy(self): + ''' + Tests that an error is raised when attempting to visualize ancombc2 + data with a taxonomy that contains none of the features present in the + ancombc2 data. + ''' + taxonomy_df = pd.DataFrame({ + 'Feature ID': ['feat1', 'feat2'], + 'Taxon': ['taxon1', 'taxon2'], + 'Confidence': [0.9, 0.95] + }) + + with tempfile.TemporaryDirectory() as tempdir: + with self.assertRaisesRegex( + ValueError, 'No features remained in your taxonomy' + ): + da_barplot(tempdir, self.abc2_output, taxonomy_df) + + with tempfile.TemporaryDirectory() as tempdir: + with self.assertRaisesRegex( + ValueError, 'No features remained in your taxonomy' + ): + da_barplot(tempdir, self.abc_output, taxonomy_df) + + def test_da_barplot_accepts_ancombc2(self): + ''' + Tests that da_barplot accepts ancombc2 outputs. + ''' + with tempfile.TemporaryDirectory() as tempdir: + da_barplot(tempdir, self.abc2_output) + assert os.path.exists(os.path.join(tempdir, 'index.html')) + + def test_da_barplot_accepts_ancombc(self): + ''' + Tests that da_barplot accepts ancombc outputs. + ''' + with tempfile.TemporaryDirectory() as tempdir: + da_barplot(tempdir, self.abc_output) + assert os.path.exists(os.path.join(tempdir, 'index.html')) From 18d236a645f408cadda1743157271ead4ae155eb Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Wed, 3 Jun 2026 10:30:15 -0700 Subject: [PATCH 08/15] tests for da_barplot action --- .../tests/test_diff_abundance_plot.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/q2_composition/tests/test_diff_abundance_plot.py b/q2_composition/tests/test_diff_abundance_plot.py index 401936a..87afeea 100644 --- a/q2_composition/tests/test_diff_abundance_plot.py +++ b/q2_composition/tests/test_diff_abundance_plot.py @@ -15,6 +15,8 @@ from pathlib import Path from q2_composition._ancombc2 import da_barplot, ancombc2 from q2_composition._ancombc import ancombc +from qiime2.sdk import PluginManager +from qiime2 import Artifact class TestDiffAbundancePlot(unittest.TestCase): @@ -102,3 +104,33 @@ def test_da_barplot_accepts_ancombc(self): with tempfile.TemporaryDirectory() as tempdir: da_barplot(tempdir, self.abc_output) assert os.path.exists(os.path.join(tempdir, 'index.html')) + + def test_da_barplot_action_ancombc2(self): + pm = PluginManager() + da_barplot = pm.plugins['composition'].actions['da_barplot'] + + ancombc2_artifact = Artifact.import_data( + type='FeatureData[ANCOMBC2Output]', view=self.abc2_output + ) + + viz = da_barplot(ancombc2_artifact) + viz = viz.visualization + + with tempfile.TemporaryDirectory() as tempdir: + viz.export_data(tempdir) + assert os.path.exists(os.path.join(tempdir, 'index.html')) + + def test_da_barplot_action_ancombc(self): + pm = PluginManager() + da_barplot = pm.plugins['composition'].actions['da_barplot'] + + ancombc_artifact = Artifact.import_data( + type='FeatureData[DifferentialAbundance]', view=self.abc_output + ) + + viz = da_barplot(ancombc_artifact) + viz = viz.visualization + + with tempfile.TemporaryDirectory() as tempdir: + viz.export_data(tempdir) + assert os.path.exists(os.path.join(tempdir, 'index.html')) From 03140122883a6cd0a697ea759e99815bf1b75664 Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Wed, 3 Jun 2026 12:26:00 -0700 Subject: [PATCH 09/15] github test From 7296973ae606b3cf28ed36e0ce2b8e61a856dc6e Mon Sep 17 00:00:00 2001 From: Oddant1 Date: Wed, 24 Jun 2026 11:31:52 -0700 Subject: [PATCH 10/15] Have ancombc2 return ANCOMBC2SliceMapping --- q2_composition/_ancombc2.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/q2_composition/_ancombc2.py b/q2_composition/_ancombc2.py index 5e2978d..ac25bac 100644 --- a/q2_composition/_ancombc2.py +++ b/q2_composition/_ancombc2.py @@ -54,7 +54,7 @@ def ancombc2( alpha: float = 0.05, diff_robust: bool = False, num_processes: int = 1, -) -> ANCOMBC2OutputDirFmt: +) -> ANCOMBC2SliceMapping: ''' Wraps the `ancombc2` R function from the ANCOMBC package. @@ -64,10 +64,8 @@ def ancombc2( Returns ------- - ANCOMBC2OutputDirFmt - A directory format containing the ANCOMBC2 model's per-feature - statistics and per-feature structural zero designations if - `structural_zeros` is set. + ANCOMBC2SliceMapping + A dictionary mapping the name of the slice to the slice's columns. ''' if structural_zeros and group is None: msg = ( @@ -114,6 +112,8 @@ def ancombc2( model_statistics_df = ro.conversion.get_conversion().rpy2py( model_statistics ) + model_statistics_df['taxon'] = \ + model_statistics_df['taxon'].astype('string') slices = _split_into_slices(model_statistics_df, diff_robust) @@ -133,7 +133,7 @@ def ancombc2( # split categorical variables from levels and annotate references slices = _process_categorical_variables(slices, metadata, table) - return transform(data=slices, to_type=ANCOMBC2OutputDirFmt) + return slices def _process_formula(formula: str, metadata: qiime2.Metadata) -> str: From f5bb50d1c10ea33acd9af0a80193847b1c3af537 Mon Sep 17 00:00:00 2001 From: Oddant1 Date: Wed, 24 Jun 2026 11:31:58 -0700 Subject: [PATCH 11/15] Update tests --- q2_composition/tests/test_ancombc2.py | 15 ++++++--------- q2_composition/tests/test_diff_abundance_plot.py | 13 ++++++++++--- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/q2_composition/tests/test_ancombc2.py b/q2_composition/tests/test_ancombc2.py index 45a7d9c..241a37b 100644 --- a/q2_composition/tests/test_ancombc2.py +++ b/q2_composition/tests/test_ancombc2.py @@ -25,7 +25,7 @@ _deduce_reference_levels, _process_categorical_variables, _process_structural_zeros ) -from q2_composition._format import ANCOMBC2SliceMapping +from q2_composition._format import ANCOMBC2SliceMapping, ANCOMBC2OutputDirFmt class TestANCOMBC2Base(unittest.TestCase): @@ -119,7 +119,7 @@ def test_wrapped_ancombc2(self): 'q2_composition._ancombc2._process_structural_zeros', side_effect=lambda structural_zeros: structural_zeros ): - output_format = ancombc2( + slices = ancombc2( table=self.biom_table, metadata=self.metadata, fixed_effects_formula='body-site + year', @@ -128,11 +128,11 @@ def test_wrapped_ancombc2(self): diff_robust=True, ) - slices = transform(data=output_format, to_type=ANCOMBC2SliceMapping) + output_format = transform(data=slices, to_type=ANCOMBC2OutputDirFmt) model_stats = self._slices_to_single_df(slices) struc_zeros = output_format.structural_zeros.view(pd.DataFrame) - + assert_frame_equal( ground_truth_model_stats, model_stats, check_like=True ) @@ -145,8 +145,7 @@ def test_ancombc2_without_diff_robust(self): Ensure that the `diff_robust` slice is not present by default in the output format. ''' - slices = transform(data=self.abc2_output, to_type=ANCOMBC2SliceMapping) - self.assertNotIn('diff_robust', slices) + self.assertNotIn('diff_robust', self.abc2_output) def test_group_enforced_if_structural_zeros(self): ''' @@ -168,14 +167,12 @@ def test_spaces_in_metadata_column(self): ''' Tests that metadata columns that contain spaces are handled properly. ''' - output_format = ancombc2( + slices = ancombc2( table=self.biom_table, metadata=self.metadata, fixed_effects_formula='Variable with spaces', ) - slices = transform(data=output_format, to_type=ANCOMBC2SliceMapping) - lfc_slice_columns = list(slices['lfc'].columns) variable_with_spaces_columns = [ col for col in lfc_slice_columns if 'Variable with spaces::' in col diff --git a/q2_composition/tests/test_diff_abundance_plot.py b/q2_composition/tests/test_diff_abundance_plot.py index 87afeea..d814e98 100644 --- a/q2_composition/tests/test_diff_abundance_plot.py +++ b/q2_composition/tests/test_diff_abundance_plot.py @@ -15,6 +15,7 @@ from pathlib import Path from q2_composition._ancombc2 import da_barplot, ancombc2 from q2_composition._ancombc import ancombc +from q2_composition._format import ANCOMBC2OutputDirFmt from qiime2.sdk import PluginManager from qiime2 import Artifact @@ -45,6 +46,12 @@ def setUpClass(cls): structural_zeros=True ) + # Use this for raw calls to da_barplot but use the original for when we + # load it to an Artifact and invoke the action + cls.abc2_output_DirFmt = qiime2.plugin.util.transform( + data=cls.abc2_output, to_type=ANCOMBC2OutputDirFmt + ) + cls.abc_output = ancombc( table=cls.ancombc_table, metadata=cls.ancombc_metadata, @@ -58,7 +65,7 @@ def test_da_barplot(self): q2_composition/_da_barplot/dist/ folder successfully. ''' with tempfile.TemporaryDirectory() as tempdir: - da_barplot(tempdir, self.abc2_output) + da_barplot(tempdir, self.abc2_output_DirFmt) assert os.path.exists(os.path.join(tempdir, 'index.html')) with tempfile.TemporaryDirectory() as tempdir: @@ -81,7 +88,7 @@ def test_da_barplot_non_overlapping_taxonomy(self): with self.assertRaisesRegex( ValueError, 'No features remained in your taxonomy' ): - da_barplot(tempdir, self.abc2_output, taxonomy_df) + da_barplot(tempdir, self.abc2_output_DirFmt, taxonomy_df) with tempfile.TemporaryDirectory() as tempdir: with self.assertRaisesRegex( @@ -94,7 +101,7 @@ def test_da_barplot_accepts_ancombc2(self): Tests that da_barplot accepts ancombc2 outputs. ''' with tempfile.TemporaryDirectory() as tempdir: - da_barplot(tempdir, self.abc2_output) + da_barplot(tempdir, self.abc2_output_DirFmt) assert os.path.exists(os.path.join(tempdir, 'index.html')) def test_da_barplot_accepts_ancombc(self): From 909f7f2e142ed19313c021193e3b6c5c350bfb74 Mon Sep 17 00:00:00 2001 From: Oddant1 Date: Wed, 24 Jun 2026 11:32:19 -0700 Subject: [PATCH 12/15] whitespace --- q2_composition/tests/test_ancombc2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/q2_composition/tests/test_ancombc2.py b/q2_composition/tests/test_ancombc2.py index 241a37b..b957b24 100644 --- a/q2_composition/tests/test_ancombc2.py +++ b/q2_composition/tests/test_ancombc2.py @@ -132,7 +132,7 @@ def test_wrapped_ancombc2(self): model_stats = self._slices_to_single_df(slices) struc_zeros = output_format.structural_zeros.view(pd.DataFrame) - + assert_frame_equal( ground_truth_model_stats, model_stats, check_like=True ) From d7c81ef8e7d902cc85ebd3873bf1ab5706cd4376 Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Wed, 24 Jun 2026 14:09:58 -0700 Subject: [PATCH 13/15] Revert "Ancombc2 refactor" --- q2_composition/_ancombc2.py | 12 ++++++------ q2_composition/tests/test_ancombc2.py | 13 ++++++++----- q2_composition/tests/test_diff_abundance_plot.py | 13 +++---------- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/q2_composition/_ancombc2.py b/q2_composition/_ancombc2.py index ac25bac..5e2978d 100644 --- a/q2_composition/_ancombc2.py +++ b/q2_composition/_ancombc2.py @@ -54,7 +54,7 @@ def ancombc2( alpha: float = 0.05, diff_robust: bool = False, num_processes: int = 1, -) -> ANCOMBC2SliceMapping: +) -> ANCOMBC2OutputDirFmt: ''' Wraps the `ancombc2` R function from the ANCOMBC package. @@ -64,8 +64,10 @@ def ancombc2( Returns ------- - ANCOMBC2SliceMapping - A dictionary mapping the name of the slice to the slice's columns. + ANCOMBC2OutputDirFmt + A directory format containing the ANCOMBC2 model's per-feature + statistics and per-feature structural zero designations if + `structural_zeros` is set. ''' if structural_zeros and group is None: msg = ( @@ -112,8 +114,6 @@ def ancombc2( model_statistics_df = ro.conversion.get_conversion().rpy2py( model_statistics ) - model_statistics_df['taxon'] = \ - model_statistics_df['taxon'].astype('string') slices = _split_into_slices(model_statistics_df, diff_robust) @@ -133,7 +133,7 @@ def ancombc2( # split categorical variables from levels and annotate references slices = _process_categorical_variables(slices, metadata, table) - return slices + return transform(data=slices, to_type=ANCOMBC2OutputDirFmt) def _process_formula(formula: str, metadata: qiime2.Metadata) -> str: diff --git a/q2_composition/tests/test_ancombc2.py b/q2_composition/tests/test_ancombc2.py index b957b24..45a7d9c 100644 --- a/q2_composition/tests/test_ancombc2.py +++ b/q2_composition/tests/test_ancombc2.py @@ -25,7 +25,7 @@ _deduce_reference_levels, _process_categorical_variables, _process_structural_zeros ) -from q2_composition._format import ANCOMBC2SliceMapping, ANCOMBC2OutputDirFmt +from q2_composition._format import ANCOMBC2SliceMapping class TestANCOMBC2Base(unittest.TestCase): @@ -119,7 +119,7 @@ def test_wrapped_ancombc2(self): 'q2_composition._ancombc2._process_structural_zeros', side_effect=lambda structural_zeros: structural_zeros ): - slices = ancombc2( + output_format = ancombc2( table=self.biom_table, metadata=self.metadata, fixed_effects_formula='body-site + year', @@ -128,7 +128,7 @@ def test_wrapped_ancombc2(self): diff_robust=True, ) - output_format = transform(data=slices, to_type=ANCOMBC2OutputDirFmt) + slices = transform(data=output_format, to_type=ANCOMBC2SliceMapping) model_stats = self._slices_to_single_df(slices) struc_zeros = output_format.structural_zeros.view(pd.DataFrame) @@ -145,7 +145,8 @@ def test_ancombc2_without_diff_robust(self): Ensure that the `diff_robust` slice is not present by default in the output format. ''' - self.assertNotIn('diff_robust', self.abc2_output) + slices = transform(data=self.abc2_output, to_type=ANCOMBC2SliceMapping) + self.assertNotIn('diff_robust', slices) def test_group_enforced_if_structural_zeros(self): ''' @@ -167,12 +168,14 @@ def test_spaces_in_metadata_column(self): ''' Tests that metadata columns that contain spaces are handled properly. ''' - slices = ancombc2( + output_format = ancombc2( table=self.biom_table, metadata=self.metadata, fixed_effects_formula='Variable with spaces', ) + slices = transform(data=output_format, to_type=ANCOMBC2SliceMapping) + lfc_slice_columns = list(slices['lfc'].columns) variable_with_spaces_columns = [ col for col in lfc_slice_columns if 'Variable with spaces::' in col diff --git a/q2_composition/tests/test_diff_abundance_plot.py b/q2_composition/tests/test_diff_abundance_plot.py index d814e98..87afeea 100644 --- a/q2_composition/tests/test_diff_abundance_plot.py +++ b/q2_composition/tests/test_diff_abundance_plot.py @@ -15,7 +15,6 @@ from pathlib import Path from q2_composition._ancombc2 import da_barplot, ancombc2 from q2_composition._ancombc import ancombc -from q2_composition._format import ANCOMBC2OutputDirFmt from qiime2.sdk import PluginManager from qiime2 import Artifact @@ -46,12 +45,6 @@ def setUpClass(cls): structural_zeros=True ) - # Use this for raw calls to da_barplot but use the original for when we - # load it to an Artifact and invoke the action - cls.abc2_output_DirFmt = qiime2.plugin.util.transform( - data=cls.abc2_output, to_type=ANCOMBC2OutputDirFmt - ) - cls.abc_output = ancombc( table=cls.ancombc_table, metadata=cls.ancombc_metadata, @@ -65,7 +58,7 @@ def test_da_barplot(self): q2_composition/_da_barplot/dist/ folder successfully. ''' with tempfile.TemporaryDirectory() as tempdir: - da_barplot(tempdir, self.abc2_output_DirFmt) + da_barplot(tempdir, self.abc2_output) assert os.path.exists(os.path.join(tempdir, 'index.html')) with tempfile.TemporaryDirectory() as tempdir: @@ -88,7 +81,7 @@ def test_da_barplot_non_overlapping_taxonomy(self): with self.assertRaisesRegex( ValueError, 'No features remained in your taxonomy' ): - da_barplot(tempdir, self.abc2_output_DirFmt, taxonomy_df) + da_barplot(tempdir, self.abc2_output, taxonomy_df) with tempfile.TemporaryDirectory() as tempdir: with self.assertRaisesRegex( @@ -101,7 +94,7 @@ def test_da_barplot_accepts_ancombc2(self): Tests that da_barplot accepts ancombc2 outputs. ''' with tempfile.TemporaryDirectory() as tempdir: - da_barplot(tempdir, self.abc2_output_DirFmt) + da_barplot(tempdir, self.abc2_output) assert os.path.exists(os.path.join(tempdir, 'index.html')) def test_da_barplot_accepts_ancombc(self): From db9c109ba59a449a76c32dcaeb8bcb4e061906c4 Mon Sep 17 00:00:00 2001 From: Oddant1 Date: Thu, 25 Jun 2026 12:29:23 -0700 Subject: [PATCH 14/15] Reapply "Ancombc2 refactor" This reverts commit d7c81ef8e7d902cc85ebd3873bf1ab5706cd4376. --- q2_composition/_ancombc2.py | 12 ++++++------ q2_composition/tests/test_ancombc2.py | 13 +++++-------- q2_composition/tests/test_diff_abundance_plot.py | 13 ++++++++++--- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/q2_composition/_ancombc2.py b/q2_composition/_ancombc2.py index 5e2978d..ac25bac 100644 --- a/q2_composition/_ancombc2.py +++ b/q2_composition/_ancombc2.py @@ -54,7 +54,7 @@ def ancombc2( alpha: float = 0.05, diff_robust: bool = False, num_processes: int = 1, -) -> ANCOMBC2OutputDirFmt: +) -> ANCOMBC2SliceMapping: ''' Wraps the `ancombc2` R function from the ANCOMBC package. @@ -64,10 +64,8 @@ def ancombc2( Returns ------- - ANCOMBC2OutputDirFmt - A directory format containing the ANCOMBC2 model's per-feature - statistics and per-feature structural zero designations if - `structural_zeros` is set. + ANCOMBC2SliceMapping + A dictionary mapping the name of the slice to the slice's columns. ''' if structural_zeros and group is None: msg = ( @@ -114,6 +112,8 @@ def ancombc2( model_statistics_df = ro.conversion.get_conversion().rpy2py( model_statistics ) + model_statistics_df['taxon'] = \ + model_statistics_df['taxon'].astype('string') slices = _split_into_slices(model_statistics_df, diff_robust) @@ -133,7 +133,7 @@ def ancombc2( # split categorical variables from levels and annotate references slices = _process_categorical_variables(slices, metadata, table) - return transform(data=slices, to_type=ANCOMBC2OutputDirFmt) + return slices def _process_formula(formula: str, metadata: qiime2.Metadata) -> str: diff --git a/q2_composition/tests/test_ancombc2.py b/q2_composition/tests/test_ancombc2.py index 45a7d9c..b957b24 100644 --- a/q2_composition/tests/test_ancombc2.py +++ b/q2_composition/tests/test_ancombc2.py @@ -25,7 +25,7 @@ _deduce_reference_levels, _process_categorical_variables, _process_structural_zeros ) -from q2_composition._format import ANCOMBC2SliceMapping +from q2_composition._format import ANCOMBC2SliceMapping, ANCOMBC2OutputDirFmt class TestANCOMBC2Base(unittest.TestCase): @@ -119,7 +119,7 @@ def test_wrapped_ancombc2(self): 'q2_composition._ancombc2._process_structural_zeros', side_effect=lambda structural_zeros: structural_zeros ): - output_format = ancombc2( + slices = ancombc2( table=self.biom_table, metadata=self.metadata, fixed_effects_formula='body-site + year', @@ -128,7 +128,7 @@ def test_wrapped_ancombc2(self): diff_robust=True, ) - slices = transform(data=output_format, to_type=ANCOMBC2SliceMapping) + output_format = transform(data=slices, to_type=ANCOMBC2OutputDirFmt) model_stats = self._slices_to_single_df(slices) struc_zeros = output_format.structural_zeros.view(pd.DataFrame) @@ -145,8 +145,7 @@ def test_ancombc2_without_diff_robust(self): Ensure that the `diff_robust` slice is not present by default in the output format. ''' - slices = transform(data=self.abc2_output, to_type=ANCOMBC2SliceMapping) - self.assertNotIn('diff_robust', slices) + self.assertNotIn('diff_robust', self.abc2_output) def test_group_enforced_if_structural_zeros(self): ''' @@ -168,14 +167,12 @@ def test_spaces_in_metadata_column(self): ''' Tests that metadata columns that contain spaces are handled properly. ''' - output_format = ancombc2( + slices = ancombc2( table=self.biom_table, metadata=self.metadata, fixed_effects_formula='Variable with spaces', ) - slices = transform(data=output_format, to_type=ANCOMBC2SliceMapping) - lfc_slice_columns = list(slices['lfc'].columns) variable_with_spaces_columns = [ col for col in lfc_slice_columns if 'Variable with spaces::' in col diff --git a/q2_composition/tests/test_diff_abundance_plot.py b/q2_composition/tests/test_diff_abundance_plot.py index 87afeea..d814e98 100644 --- a/q2_composition/tests/test_diff_abundance_plot.py +++ b/q2_composition/tests/test_diff_abundance_plot.py @@ -15,6 +15,7 @@ from pathlib import Path from q2_composition._ancombc2 import da_barplot, ancombc2 from q2_composition._ancombc import ancombc +from q2_composition._format import ANCOMBC2OutputDirFmt from qiime2.sdk import PluginManager from qiime2 import Artifact @@ -45,6 +46,12 @@ def setUpClass(cls): structural_zeros=True ) + # Use this for raw calls to da_barplot but use the original for when we + # load it to an Artifact and invoke the action + cls.abc2_output_DirFmt = qiime2.plugin.util.transform( + data=cls.abc2_output, to_type=ANCOMBC2OutputDirFmt + ) + cls.abc_output = ancombc( table=cls.ancombc_table, metadata=cls.ancombc_metadata, @@ -58,7 +65,7 @@ def test_da_barplot(self): q2_composition/_da_barplot/dist/ folder successfully. ''' with tempfile.TemporaryDirectory() as tempdir: - da_barplot(tempdir, self.abc2_output) + da_barplot(tempdir, self.abc2_output_DirFmt) assert os.path.exists(os.path.join(tempdir, 'index.html')) with tempfile.TemporaryDirectory() as tempdir: @@ -81,7 +88,7 @@ def test_da_barplot_non_overlapping_taxonomy(self): with self.assertRaisesRegex( ValueError, 'No features remained in your taxonomy' ): - da_barplot(tempdir, self.abc2_output, taxonomy_df) + da_barplot(tempdir, self.abc2_output_DirFmt, taxonomy_df) with tempfile.TemporaryDirectory() as tempdir: with self.assertRaisesRegex( @@ -94,7 +101,7 @@ def test_da_barplot_accepts_ancombc2(self): Tests that da_barplot accepts ancombc2 outputs. ''' with tempfile.TemporaryDirectory() as tempdir: - da_barplot(tempdir, self.abc2_output) + da_barplot(tempdir, self.abc2_output_DirFmt) assert os.path.exists(os.path.join(tempdir, 'index.html')) def test_da_barplot_accepts_ancombc(self): From bba7aa92d94da26decb9c6f40962775e10601919 Mon Sep 17 00:00:00 2001 From: Colin Wood Date: Tue, 7 Jul 2026 11:59:29 -0700 Subject: [PATCH 15/15] small --- q2_composition/_ancombc2.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/q2_composition/_ancombc2.py b/q2_composition/_ancombc2.py index ac25bac..7639297 100644 --- a/q2_composition/_ancombc2.py +++ b/q2_composition/_ancombc2.py @@ -26,11 +26,8 @@ import qiime2 from qiime2.metadata import NumericMetadataColumn, CategoricalMetadataColumn from qiime2.plugin.util import transform -from typing import Union -from q2_composition._format import ( - ANCOMBC2OutputDirFmt, ANCOMBC2SliceMapping, DataLoafPackageDirFmt -) +from q2_composition._format import ANCOMBC2OutputDirFmt, ANCOMBC2SliceMapping r_base = importr('base') r_stats = importr('stats') @@ -856,7 +853,7 @@ def _rename(column: str) -> str: def da_barplot( output_dir: str, - data: Union[ANCOMBC2OutputDirFmt, DataLoafPackageDirFmt], + data: ANCOMBC2OutputDirFmt, taxonomy: pd.DataFrame = None ): ''' @@ -868,7 +865,7 @@ def da_barplot( ---------- output_dir : str The path to the data/ directory in the to-be-created visualization. - data : ANCOMBC2SliceMapping + data : ANCOMBC2OutputDirFmt The ancombc2 slice data to visualize taxonomy : pd.DataFrame | None The taxonomy associated with the features present in `slices`.