diff --git a/.changeset/bare-set-column-contract.md b/.changeset/bare-set-column-contract.md new file mode 100644 index 0000000..21066c9 --- /dev/null +++ b/.changeset/bare-set-column-contract.md @@ -0,0 +1,17 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Add the bare-set column contract, with tengo unit tests + +`bare-set-specs.lib.tengo` holds the axis and column specs a bare imported set emits: one +`pl7.app/variantKey` axis carrying the VDJ run id, the amino-acid variable domain per chain, +seven region columns per chain, a per-chain region-annotation status, the synthetic +abundance, and the record label. Chains are separated by the +`pl7.app/vdj/scClonotypeChain` column domain, so the set is one frame rather than one per +chain. + +Nothing emits these yet — the library is consumed by the import path that lands next. + +Also enables `pl-tengo test` for the workflow package, so these specs are covered in CI. diff --git a/.changeset/bare-set-import-path.md b/.changeset/bare-set-import-path.md new file mode 100644 index 0000000..d853929 --- /dev/null +++ b/.changeset/bare-set-import-path.md @@ -0,0 +1,36 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj.xlsx-to-csv': minor +'@platforma-open/milaboratories.import-vdj.model': minor +'@platforma-open/milaboratories.import-vdj.ui': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Import bare paired sequence sets + +A file of receptor sequences with no gene calls, no region boundaries and no count can now be +imported as a custom format. Each row becomes one record holding both chains, keyed on the +hash of an identity column the scientist selects and labelled with that column's value. +Regions are located by ANARCI during the import, under a numbering scheme the scientist +chooses, and every record carries a per-chain annotation status. + +The custom-format validity rule no longer demands a V gene, a J gene and an abundance for +such a set; it requires a sequence mapped to a chain and an identity column instead. The +other formats are untouched. + +The identity column is checked for uniqueness before the run starts, and the values that +clash are shown. Rows that repeat an identity while differing elsewhere would merge into one +record, so the import refuses them; rows identical in every mapped cell state the same record +twice and collapse to one. + +The direct door accepts csv, tsv and xlsx. A workbook's first worksheet is converted to csv +before anything reads it, so the header list, the identity check and the import all see the same +converted file and the pipeline never handles a workbook. + +Non-sequence columns are offered for import rather than dropped. Each one the scientist accepts +becomes a record property, named from the header with special characters replaced and labelled +with the header exactly as the file wrote it. Two headers that would become the same column are +refused rather than silently merged. + +The block also reports the columns it emitted, so a successful import shows what it produced +rather than an empty table. diff --git a/.changeset/bare-set-mapping-ui.md b/.changeset/bare-set-mapping-ui.md new file mode 100644 index 0000000..1c83552 --- /dev/null +++ b/.changeset/bare-set-mapping-ui.md @@ -0,0 +1,22 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': patch +'@platforma-open/milaboratories.import-vdj.model': patch +'@platforma-open/milaboratories.import-vdj.ui': patch +'@platforma-open/milaboratories.import-vdj': patch +--- + +Name a file import after its file, and stop offering identifiers as sequences + +- The block's title on the file door is the file's name, plus the numbering scheme when it is + not IMGT. It previously showed the six default chain names, which the scientist never chose + and which say nothing about what was imported. +- The dataset's trace label is the file's name too, so a downstream dataset dropdown + distinguishes two imports instead of showing "Import V(D)J Data" twice. +- The chain dropdowns offer only columns whose values actually read as amino-acid variable + domains. Prerun samples up to 20 rows and reads the alphabet, because a header cannot say + it: an antibody's name could previously be mapped into a sequence slot, which imports + cleanly and leaves every record Failed after ANARCI declines to number it. Falls back to + every header when nothing could be sampled. +- "Other columns" is gone; record properties are mapped in the same section as the sequences. +- The numbering scheme moved out of the column mapping into a "Region annotation" section of + its own — it assigns nothing, it chooses how the mapped sequences are numbered. diff --git a/.changeset/bare-set-record-grain.md b/.changeset/bare-set-record-grain.md new file mode 100644 index 0000000..a32a568 --- /dev/null +++ b/.changeset/bare-set-record-grain.md @@ -0,0 +1,25 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Emit bare-set properties on the record axis, keeping only abundance per sample + +A bare set now has MiXCR's shape: `pl7.app/vdj/uniqueMoleculeCount` sits on +`[pl7.app/sampleId, pl7.app/variantKey]`, and every other column — the amino-acid variable +domain per chain, the located regions and their statuses, the imported properties and the +record label — sits on `[pl7.app/variantKey]` alone. + +Previously every column kept the sample axis. Consumers match axes positionally: a selector +naming one axis is compared against the candidate column's axis 0, so a property column +carrying the sample axis first was invisible to them, and `sequence-properties` reported +"antibody/TCR mode detected but no amino-acid VDJ sequence columns found" — a missing column +rather than the mismatch that caused it. Collapsing the sample axis here is what lets every +downstream consumer read a bare set unchanged. + +The import and annotation passes still run per sample; two aggregate passes collapse their +output onto the record key. Collapsing is lossless — every collapsed column is a function of +the record key and identical in every sample the record appears in. + +The sample label column on the direct file door now reads "Sample" rather than "Sample Name", +matching samples-and-data. diff --git a/.changeset/chain-slots-are-loci.md b/.changeset/chain-slots-are-loci.md new file mode 100644 index 0000000..e6a1522 --- /dev/null +++ b/.changeset/chain-slots-are-loci.md @@ -0,0 +1,22 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj.model': minor +'@platforma-open/milaboratories.import-vdj.ui': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Name the mapping slots after loci, not A/B + +The two sequence slots were called `A` and `B` throughout — the `pl7.app/vdj/scClonotypeChain` +vocabulary, which exists to tell apart chains sharing one frame. A single-chain import is a bulk +shape with nothing to tell apart, so that vocabulary was the wrong one to think in. + +Slots are now `IGHeavy` / `IGLight`, the `pl7.app/vdj/chain` vocabulary the block's bulk path +already uses, and the one that extends to TCR loci if bare sets ever accept them. + +Emitted specs are unchanged: `pl7.app/vdj/scClonotypeChain` still carries `A` / `B` on a paired +set, translated at the point of emission. Two vocabularies for two questions — which locus the +scientist mapped, and which position a chain occupies in a paired record. + +A bare-set mapping saved before this keeps its columns under the old slot keys and will need +re-selecting. The bare path is unreleased. diff --git a/.changeset/declare-what-is-imported.md b/.changeset/declare-what-is-imported.md new file mode 100644 index 0000000..e2fbb06 --- /dev/null +++ b/.changeset/declare-what-is-imported.md @@ -0,0 +1,27 @@ +--- +'@platforma-open/milaboratories.import-vdj.model': minor +'@platforma-open/milaboratories.import-vdj.ui': minor +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Declare what is being imported, rather than inferring it from filled slots + +The panel offered a fixed pair of chain dropdowns and worked out whether the set was paired from +how many were filled. A paired panel whose light column was not yet mapped was indistinguishable +from a deliberately heavy-only one — and the two emit different shapes. + +A "Receptor / chain" selector now says which: **IG (heavy + light)**, **IG Heavy only**, or **IG +Light only**. The sequence slots follow the choice, labelled from it, and every slot it asks for +must be filled before the block will run. Declaring IG and mapping one column is an unfinished +mapping, not a heavy-only set. + +Switching the selection drops columns mapped to slots the new choice does not ask for, so the +block never emits a chain the scientist has just said they are not importing. + +The key axis derives its receptor from the declared chains instead of assuming IG, and refuses +chains from two receptors in one set. + +TCR is not offered yet. ANARCI numbers TCR — its HMM library ships human and mouse A/B/G/D +models — but this block reads only ANARCI's `H` and `KL` output and has no region-boundary table +for TCR chains, so a TCR import would annotate nothing. diff --git a/.changeset/full-file-column-profile.md b/.changeset/full-file-column-profile.md new file mode 100644 index 0000000..03bab68 --- /dev/null +++ b/.changeset/full-file-column-profile.md @@ -0,0 +1,24 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj.model': minor +'@platforma-open/milaboratories.import-vdj.ui': minor +'@platforma-open/milaboratories.import-vdj.column-profile': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Detect column types by reading the whole file + +Record properties were imported as text because nothing could safely say otherwise. Prerun now +profiles a directly-loaded file over every row and the panel records the answer when a column is +accepted, so a numeric column is emitted `Long` or `Double` and stays sortable downstream. + +The type widens monotonically as rows are read — the rule `samples-and-data` uses for imported +metadata — so a single non-numeric value anywhere settles the column as `String`. A column that +reads numeric for the first rows and holds `N/A` further down cannot be typed numeric, which is +the failure a sampled answer would have. + +The same pass answers which columns hold amino-acid variable domains, replacing the 20-row +sample the chain dropdowns used. + +Also: the record axis and its label column now read "Variant Id" rather than "Record ID", and the +identity dropdown reads "Select id column". diff --git a/.changeset/key-axis-names-the-chain.md b/.changeset/key-axis-names-the-chain.md new file mode 100644 index 0000000..5a88b11 --- /dev/null +++ b/.changeset/key-axis-names-the-chain.md @@ -0,0 +1,14 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Name the chain on the key axis of a single-chain import + +With one mapped chain the record *is* that chain, so the `pl7.app/variantKey` axis now carries +`pl7.app/vdj/chain` — `IGHeavy` or `IGLight` — the same key and vocabulary the block's bulk path +puts on its `clonotypeKey` axis. It is the only machine-readable statement of the chain on such a +set, since the columns no longer carry one. + +A paired record holds both chains, so no single value applies and the key is absent. There, chain +is a property of the column rather than of the record. diff --git a/.changeset/model-v3.md b/.changeset/model-v3.md new file mode 100644 index 0000000..abd8411 --- /dev/null +++ b/.changeset/model-v3.md @@ -0,0 +1,28 @@ +--- +'@platforma-open/milaboratories.import-vdj.model': minor +'@platforma-open/milaboratories.import-vdj.ui': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Migrate the block to BlockModelV3 + +Persisted state moves from V1's two buckets (`args` + `uiState`) into one `BlockData`, upgraded +in place the first time a project saved under V1 is opened. No setting is lost; a project saved +between the direct file door landing and the `loadFromFile` flag existing reopens on the file +door rather than on the dataset door with a hidden file behind it. + +What changes for the scientist: + +- **Renaming a block no longer stales it.** Both labels lived in `args` under V1, so editing the + block's name asked for a re-import. Neither is read by the workflow; they now stay in the UI. + The same applies to the secondary count type, which shapes which columns the panel offers and + reaches the workflow only through the mapping it produces. +- **Prerun is declared separately from args.** Header inference, column suggestions and the + identity-collision check are discovery, and re-run on their own; they no longer share a + projection with the analysis decisions that gate Run. +- **The door that is not in use is stripped from args**, along with the dataset-door mapping + fields when a bare set is configured. A mapping abandoned mid-edit no longer travels to the + workflow. + +Because two fields leave `args`, every existing block is stale once after the upgrade and wants +a Run. The workflow's own caching makes that re-run cheap — the inputs it keys on are unchanged. diff --git a/.changeset/property-columns-are-strings.md b/.changeset/property-columns-are-strings.md new file mode 100644 index 0000000..59c9352 --- /dev/null +++ b/.changeset/property-columns-are-strings.md @@ -0,0 +1,18 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': patch +'@platforma-open/milaboratories.import-vdj.model': patch +'@platforma-open/milaboratories.import-vdj.ui': patch +'@platforma-open/milaboratories.import-vdj': patch +--- + +Import record properties as text, without asking for a type + +The panel offered Text / Whole number / Decimal per accepted property column. It asked the +scientist to declare something nothing verifies: no stage re-reads the values, so a column typed +Decimal that turns out to hold `N/A` further down fails at import or nulls out, and the mistake +surfaces far from where it was made. The choice is gone and every property column is emitted as +String. + +Guessing the type by sampling the file was the alternative and has the same tail — the guess +comes from the first rows and is applied to all of them. A downstream block that needs a number +can convert a column it can see in full. diff --git a/.changeset/region-annotation-at-import.md b/.changeset/region-annotation-at-import.md new file mode 100644 index 0000000..b83eea2 --- /dev/null +++ b/.changeset/region-annotation-at-import.md @@ -0,0 +1,23 @@ +--- +'@platforma-open/milaboratories.import-vdj.region-annotation': minor +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Add ANARCI region annotation to the import block + +A new `region-annotation` software package and an `annotate-regions` template locate FR1–FR4 +and CDR1–CDR3 in amino-acid antibody variable domains, with the numbering scheme (`imgt`, +`kabat`, `chothia`) as the scientist's choice. ANARCI is the shared published artifact +already used elsewhere in the workspace, reused rather than introduced. + +Each chain of each record also gets a region-annotation status — `Annotated`, +`Not applicable` or `Failed`, never empty — so a record whose boundaries could not be located +says so instead of silently receiving empty region strings. + +The template also reports per-chain outcome counts, including how many annotated records +ANARCI numbered as the *other* chain. Chain is declared by the mapping slot and inferred by +ANARCI, and those can disagree; the count makes a wrong slot assignment visible instead of +letting it import cleanly with every chain label wrong. Nothing acts on the number. + +Not yet wired into the import pipeline; the template is callable but no path invokes it. diff --git a/.changeset/scheme-follows-selection.md b/.changeset/scheme-follows-selection.md new file mode 100644 index 0000000..5dbd893 --- /dev/null +++ b/.changeset/scheme-follows-selection.md @@ -0,0 +1,15 @@ +--- +'@platforma-open/milaboratories.import-vdj.model': patch +'@platforma-open/milaboratories.import-vdj.ui': patch +'@platforma-open/milaboratories.import-vdj': patch +--- + +Offer only the numbering schemes the declared chains can use + +Kabat and Chothia were defined on antibody structures, and ANARCI implements them for heavy and +light chains only — a TCR chain raises "Unimplemented numbering scheme". IMGT is position-unified +and chain-agnostic. + +The scheme dropdown now follows the receptor/chain declaration, and changing the declaration +resets a scheme the new chains cannot be numbered under. Today every selection is IG, so all +three remain on offer; the narrowing takes effect when TCR chains arrive. diff --git a/.changeset/sdk-181-structure-refresh.md b/.changeset/sdk-181-structure-refresh.md new file mode 100644 index 0000000..e04391f --- /dev/null +++ b/.changeset/sdk-181-structure-refresh.md @@ -0,0 +1,19 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj.model': minor +'@platforma-open/milaboratories.import-vdj.ui': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Upgrade the SDK and refresh the block structure + +Catalog moves to `@platforma-sdk/model`/`ui-vue` 1.81.1, `workflow-tengo` 6.8.2, +`block-tools` 2.13.0, `tengo-builder` 4.0.22, `package-builder` 3.15.0, `test` 1.81.3. +`block/` becomes the slim facade (bundled `dist/` + `block-pack/`, `ImportVdjBlockPointer` +export), and the root build scripts move from `PL_PKG_DEV` to +`PL_BUILD_CHANNEL`/`PL_BUILD_VARIANT`/`PL_BUILD_LOCATION` — `build:dev` is now +`build:dev-local`. + +Author-visible change: the model is exported as `platforma` instead of `model`, matching +the generated facade and every V3 block. No behaviour change to import, column emission or +the block's outputs. diff --git a/.changeset/settings-panel-closes.md b/.changeset/settings-panel-closes.md new file mode 100644 index 0000000..74e6ecf --- /dev/null +++ b/.changeset/settings-panel-closes.md @@ -0,0 +1,13 @@ +--- +'@platforma-open/milaboratories.import-vdj.ui': patch +'@platforma-open/milaboratories.import-vdj': patch +--- + +Let the settings panel close before the mapping is finished + +The panel refused to close while a custom mapping was incomplete, so there was no way to look at +the table, re-read the file or check an upstream block without finishing first. Nothing needed +the refusal: the args projection already keeps Run disabled until the mapping is valid, and +Settings reopens the panel. + +Applied to both doors. The refusal predates the file door but had been extended to it. diff --git a/.changeset/single-chain-is-bulk-shaped.md b/.changeset/single-chain-is-bulk-shaped.md new file mode 100644 index 0000000..ef22845 --- /dev/null +++ b/.changeset/single-chain-is-bulk-shaped.md @@ -0,0 +1,20 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Stop stamping the chain domain on single-chain imports + +`pl7.app/vdj/scClonotypeChain` is how a consumer recognises a dataset holding paired chains in +one frame — clonotype-clustering probes for it, antibody-sequence-liabilities scans for it. A set +with one mapped chain is bulk-shaped, so stamping it there made both blocks treat a one-chain +import as paired. + +With one chain the sequence, region and status columns now carry no `scClonotypeChain` or +`/index` key. With two they are unchanged. The chain is still named in each column's label. + +Nothing machine-readable states the chain on a one-chain set, which matches how bulk already +behaves: sequence-properties defaults an absent chain to `A` and names its properties VH +accordingly — as it already does for every bulk MiXCR light-chain dataset. A light-only import +therefore produces VH-named properties downstream. That is inherited from the bulk convention, +not introduced here. diff --git a/.changeset/source-dropdown.md b/.changeset/source-dropdown.md new file mode 100644 index 0000000..52b10a7 --- /dev/null +++ b/.changeset/source-dropdown.md @@ -0,0 +1,20 @@ +--- +'@platforma-open/milaboratories.import-vdj.ui': minor +'@platforma-open/milaboratories.import-vdj.model': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Choose the source in one dropdown, with "Load from file" in the list + +The panel asked two questions where there is one: a "Load from file" checkbox decided which door +was showing, and a dropdown then chose within it. The checkbox is gone. The dataset dropdown now +carries a "Load from file…" entry that opens the platform's file browser — the same dialog +`PlFileInput` opens, so remote storages are reachable, not just the local disk — and a loaded +file appears in the list as the selected entry, so the control always shows what the block is +reading. + +Re-selecting a loaded file reopens the dialog, which is how a file is swapped. Cancelling leaves +the previous selection untouched — nothing is cleared on the way in. + +`loadFromFile` is dropped from the block's data: which door is showing is derived from whether a +file is loaded, so a stored flag could only disagree with it. diff --git a/.changeset/split-door-column-lists.md b/.changeset/split-door-column-lists.md new file mode 100644 index 0000000..c67d984 --- /dev/null +++ b/.changeset/split-door-column-lists.md @@ -0,0 +1,14 @@ +--- +'@platforma-open/milaboratories.import-vdj.model': patch +'@platforma-open/milaboratories.import-vdj.ui': patch +'@platforma-open/milaboratories.import-vdj': patch +--- + +Give each import door its own column list + +The mapping dropdowns read one output that answered for both doors — the columns of a loaded +file and the columns the pool infers for a selected dataset. The two are discovered by different +means and belong to different panels, so a single output let one door offer columns that had +been discovered for the other. + +`fileColumns` and `datasetColumns` are now separate, and each panel reads its own. diff --git a/.changeset/stale-table-sorting.md b/.changeset/stale-table-sorting.md new file mode 100644 index 0000000..02656f7 --- /dev/null +++ b/.changeset/stale-table-sorting.md @@ -0,0 +1,14 @@ +--- +'@platforma-open/milaboratories.import-vdj.model': patch +'@platforma-open/milaboratories.import-vdj': patch +--- + +Stop a saved sort from failing the statistics table + +Sorting the statistics table and then importing a different receptor set left the whole output +failed: the saved sort names a column, and changing the receptor set changes which columns the +run emits. There was no way to clear it from the interface. + +The table is built with `createPlDataTableV3`, which ignores a sort or filter naming a column the +current run does not emit instead of failing. The rendered table is unchanged — same columns, and +still one row per mapped chain. diff --git a/.changeset/stats-chain-in-domain.md b/.changeset/stats-chain-in-domain.md new file mode 100644 index 0000000..833a874 --- /dev/null +++ b/.changeset/stats-chain-in-domain.md @@ -0,0 +1,13 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Key the annotation statistics on the chain, and name it as the panel does + +The statistics table showed a Chain column reading the raw `A` / `B` — the positional +paired-chain vocabulary, which is not what the scientist chose in the mapping panel. + +It is now keyed on `pl7.app/vdj/chain`, holding the locus that was mapped, with a label column +carrying the panel's own words. A paired set reads as two rows, `TCR-β` and `TCR-α`, so the two +chains can be compared; a single-chain set is one row that still says which chain it is. diff --git a/.changeset/status-descriptions.md b/.changeset/status-descriptions.md new file mode 100644 index 0000000..5b3ac09 --- /dev/null +++ b/.changeset/status-descriptions.md @@ -0,0 +1,12 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': patch +'@platforma-open/milaboratories.import-vdj': patch +--- + +Describe what the region-annotation statuses mean + +The status column's three values are terse, and "Not applicable" reads as a diagnosis when it +only means no sequence was supplied for that chain — which is the expected value on any panel +where one chain is partly filled in. The column now carries a `pl7.app/description` explaining +all three, and each of the four statistics explains what it counts, including that a non-zero +Failed count usually points at a mis-mapped column rather than bad data. diff --git a/.changeset/tcr-support.md b/.changeset/tcr-support.md new file mode 100644 index 0000000..537eaea --- /dev/null +++ b/.changeset/tcr-support.md @@ -0,0 +1,25 @@ +--- +'@platforma-open/milaboratories.import-vdj.workflow': minor +'@platforma-open/milaboratories.import-vdj.model': minor +'@platforma-open/milaboratories.import-vdj.ui': minor +'@platforma-open/milaboratories.import-vdj.region-annotation': minor +'@platforma-open/milaboratories.import-vdj': minor +--- + +Import TCR sequences, not only antibodies + +The receptor selector now offers **TCR-αβ** and **TCR-γδ**, and each of their chains on its own. +Numbering, region location, statuses and the emitted columns work as they do for IG. + +ANARCI could always number TCR — its HMM library ships human and mouse models for all four chain +types. What was missing was ours: the annotation step read only ANARCI's `H` and `KL` output files +and had region boundaries for those two buckets. It now handles all six buckets ANARCI can write, +and the TCR boundaries are the IG ones — IMGT numbering does not vary by chain, which is why the +`H` and `KL` tables were already identical under IMGT. + +TCR is numbered under IMGT only. Kabat and Chothia were defined on antibody structures and ANARCI +raises for a TCR chain, so the scheme dropdown narrows to IMGT when a TCR receptor is chosen. + +The more diverse chain — the one recombining a D segment — takes slot `A`: IGHeavy, TCRBeta, +TCRDelta. That is MiXCR's rule and the order its own receptor table uses, and this block's +single-cell path already followed it. diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 43e8b7f..497a0df 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,7 +11,7 @@ on: workflow_dispatch: {} jobs: init: - runs-on: ubuntu-latest + runs-on: hz-ubuntu-dind steps: - uses: milaboratory/github-ci/actions/context/init@v4 with: @@ -24,8 +24,10 @@ jobs: with: app-name: 'Block: Import Vdj' app-name-slug: 'block-import-vdj' - node-version: '20.x' - build-script-name: 'build' + node-version: '22.x' + gha-runner-label: hz-ubuntu-dind + build-script-name: 'build:dev-local' + build-before-publish-script-name: 'build:release' pnpm-recursive-build: false test: true @@ -37,6 +39,11 @@ jobs: package-path: 'block' create-tag: 'true' + # Require the published `block` package to be bumped by a changeset on + # PRs (empty changeset or the `skip-changelog` label waives it). Needs + # the input to exist on the pinned `@v4` reusable workflow. + require-package-path-bump: true + npmrc-config: | { "registries": { @@ -56,6 +63,15 @@ jobs: "AWS_CI_IAM_MONOREPO_SIMPLE_ROLE": ${{ toJSON(secrets.AWS_CI_IAM_MONOREPO_SIMPLE_ROLE) }}, "AWS_CI_TURBOREPO_S3_BUCKET": ${{ toJSON(secrets.AWS_CI_TURBOREPO_S3_BUCKET) }}, + + "HZ_CI_TURBO_S3_BUCKET": ${{ toJSON(vars.HZ_CI_TURBO_S3_BUCKET) }}, + "HZ_CI_TURBO_S3_ENDPOINT": ${{ toJSON(vars.HZ_CI_TURBO_S3_ENDPOINT) }}, + "HZ_CI_TURBO_S3_REGION": ${{ toJSON(vars.HZ_CI_TURBO_S3_REGION) }}, + "HZ_CI_TURBO_S3_ACCESS_KEY": ${{ toJSON(secrets.HZ_CI_TURBO_S3_ACCESS_KEY) }}, + "HZ_CI_TURBO_S3_SECRET_KEY": ${{ toJSON(secrets.HZ_CI_TURBO_S3_SECRET_KEY) }}, + "HZ_CI_CACHE_S3_ACCESS_KEY": ${{ toJSON(secrets.HZ_CI_CACHE_S3_ACCESS_KEY) }}, + "HZ_CI_CACHE_S3_SECRET_KEY": ${{ toJSON(secrets.HZ_CI_CACHE_S3_SECRET_KEY) }}, + "PL_REGISTRY_PLATFORMA_OPEN_UPLOAD_URL": ${{ toJSON(secrets.PL_REGISTRY_PLOPEN_UPLOAD_URL) }}, "QUAY_USERNAME": ${{ toJSON(secrets.QUAY_USERNAME) }}, "QUAY_ROBOT_TOKEN": ${{ toJSON(secrets.QUAY_ROBOT_TOKEN) }} } diff --git a/.github/workflows/mark-stable.yaml b/.github/workflows/mark-stable.yaml index d269bba..8f331be 100644 --- a/.github/workflows/mark-stable.yaml +++ b/.github/workflows/mark-stable.yaml @@ -15,7 +15,7 @@ jobs: uses: milaboratory/github-ci/.github/workflows/block-mark-stable.yaml@v4 with: app-name: 'Block: Import Vdj - Mark Stable' - node-version: '20.x' + node-version: '22.x' npmrc-config: | { "registries": { diff --git a/.gitignore b/.gitignore index 2b0c0ad..5f7a80b 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,8 @@ ui/tsconfig.app.tsbuildinfo ui/tsconfig.node.tsbuildinfo software/**/*.tgz .vscode/sftp.json + +# Python bytecode. A stale .pyc shadows an edited source file inside a dev block +# archive, so the backend silently runs the old code. +__pycache__/ +*.py[cod] diff --git a/.structure b/.structure index 491d734..218abba 100644 --- a/.structure +++ b/.structure @@ -1 +1 @@ -{"version":1} \ No newline at end of file +{"version":2} \ No newline at end of file diff --git a/block/index.d.ts b/block/index.d.ts deleted file mode 100644 index d2bd596..0000000 --- a/block/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare const blockSpec: { - type: "dev-v2"; - folder: string; -}; - -export { blockSpec }; diff --git a/block/index.js b/block/index.js deleted file mode 100644 index 469ef77..0000000 --- a/block/index.js +++ /dev/null @@ -1,8 +0,0 @@ -const blockSpec = { - type: "dev-v2", - folder: __dirname, -}; - -module.exports = { - blockSpec, -}; diff --git a/block/package.json b/block/package.json index 1e52556..aed16a5 100644 --- a/block/package.json +++ b/block/package.json @@ -2,25 +2,38 @@ "name": "@platforma-open/milaboratories.import-vdj", "version": "1.6.5", "files": [ - "index.d.ts", - "index.js" + "dist", + "block-pack" ], + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "sources": "./src/index.ts", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, "scripts": { "pretty": "prettier --write \"./**/*.{js,jsx,mjs,cjs,ts,tsx,json,vue}\"", - "build": "shx rm -rf ./block-pack && block-tools pack", - "mark-stable": "block-tools mark-stable -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'", - "prepublishOnly": "block-tools pack && block-tools publish -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'", - "do-pack": "shx rm -f *.tgz && block-tools pack && pnpm pack && shx mv *.tgz package.tgz" + "build": "ts-builder build --target block-facade && block-tools pack", + "prepublishOnly": "block-tools publish -r s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1 --registry-serve-url https://blocks.pl-open.science", + "do-pack": "shx rm -f package.tgz && pnpm pack && shx mv *.tgz package.tgz", + "check": "ts-builder type-check --target block-facade" }, - "dependencies": { + "dependencies": {}, + "devDependencies": { + "@milaboratories/ts-builder": "catalog:", + "@milaboratories/ts-configs": "catalog:", "@platforma-open/milaboratories.import-vdj.model": "workspace:*", "@platforma-open/milaboratories.import-vdj.ui": "workspace:*", "@platforma-open/milaboratories.import-vdj.workflow": "workspace:*", - "@platforma-sdk/model": "catalog:" - }, - "devDependencies": { "@platforma-sdk/block-tools": "catalog:", - "shx": "catalog:" + "@platforma-sdk/model": "catalog:", + "shx": "catalog:", + "typescript": "catalog:" }, "packageManager": "pnpm@9.14.4", "block": { @@ -51,4 +64,4 @@ "marketplaceRanking": 16900 } } -} \ No newline at end of file +} diff --git a/block/src/AGENTS.ts b/block/src/AGENTS.ts new file mode 100644 index 0000000..5cf2589 --- /dev/null +++ b/block/src/AGENTS.ts @@ -0,0 +1,5 @@ +// This file is managed by `block-tools structure`. Do not edit by hand. +// Narrow MCP / AI surface. + +export type { BlockContract, BlockOutputs, BlockData } from "./index"; +export * from "./agents-extra"; diff --git a/block/src/agents-extra.ts b/block/src/agents-extra.ts new file mode 100644 index 0000000..228811f --- /dev/null +++ b/block/src/agents-extra.ts @@ -0,0 +1,8 @@ +// Author-owned. `block-tools structure` does not modify this file. +// MCP / AI extension surface. Add types and functions the agent +// surface should expose. +// +// In the future this file will host JS functions the MCP runtime +// can execute. The `.d.ts` declarations stay visible to the agent; +// the JS bodies execute in the MCP code-execution context (the +// agent sees the types but not the implementation). diff --git a/block/src/block-extra.ts b/block/src/block-extra.ts new file mode 100644 index 0000000..fc00cdd --- /dev/null +++ b/block/src/block-extra.ts @@ -0,0 +1,9 @@ +// Author-owned. `block-tools structure` does not modify this file. +// Add block-specific helper types or values the consumer surface +// should expose. Anything you `export` here flows out via the +// main entry (./index re-exports this file). +// +// Do NOT redefine: BlockContract, BlockOutputs, BlockData, +// BlockPointer, platforma, or the block-named Block* +// aliases — those names come from ./index and `export *` from this +// file would shadow them. diff --git a/block/src/index.ts b/block/src/index.ts new file mode 100644 index 0000000..fc8f330 --- /dev/null +++ b/block/src/index.ts @@ -0,0 +1,55 @@ +// This file is managed by `block-tools structure`. Do not edit by hand. +// Author content lives in ./block-extra.ts. + +import { platforma } from "@platforma-open/milaboratories.import-vdj.model"; +import { + InferOutputsType, + InferDataType, + InferHrefType, +} from "@platforma-sdk/model"; + +export { platforma }; + +export type BlockContract = { + outputs: InferOutputsType; + data: InferDataType; + href: InferHrefType; +}; + +export type BlockOutputs = BlockContract["outputs"]; +export type BlockData = BlockContract["data"]; + +// import.meta.url is a file: URL (always forward-slash, even on Windows: +// file:///C:/…). We expose URLs, NOT paths — the facade stays dependency-free +// and loadable in minimal engines (e.g. QuickJS), and each consumer converts +// at its own edge with the right tool (fileURLToPath in Node), where Windows +// drive letters / %-encoding / UNC are handled correctly. The bundled entry +// sits one dir under the package root (dist/index.js, or src/index.ts in dev), +// so the root is two URL segments up. The structurer owns this layout — +// consumers read these URLs, they never reconstruct /block-pack. +// +// TypeScript ships `ImportMeta.url` only in the `dom`/`webworker` libs; the +// facade tsconfig is lib-minimal (no `dom`, no `@types/node`) by design. We +// type the one ESM-standard member we use with a local cast rather than a +// `declare global` — a global augmentation would leak into the published +// `dist/index.d.ts` and clash with `@types/node`'s `ImportMeta` in full-Node +// consumers (test packages, the Middle Layer). +const selfUrl = (import.meta as ImportMeta & { url: string }).url; +const dirUrl = selfUrl.slice(0, selfUrl.lastIndexOf("/")); +const rootUrl = dirUrl.slice(0, dirUrl.lastIndexOf("/")); + +export const BlockPointer = { + type: "from-pack-v2" as const, + packUrl: rootUrl + "/block-pack", + rootUrl, +} as const; + +// Block-named aliases for readable cross-block imports in tests and +// consumer code. Same types / same runtime value as the universal +// names above; the aliases avoid `as`-renames at the import site. +export type ImportVdjBlockContract = BlockContract; +export type ImportVdjBlockOutputs = BlockOutputs; +export type ImportVdjBlockData = BlockData; +export const ImportVdjBlockPointer = BlockPointer; + +export * from "./block-extra"; diff --git a/block/tsconfig.json b/block/tsconfig.json new file mode 100644 index 0000000..8b5ec69 --- /dev/null +++ b/block/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "@milaboratories/ts-configs/block/facade", + "include": ["src/**/*"] +} diff --git a/model/package.json b/model/package.json index 47bbe40..8126bf9 100644 --- a/model/package.json +++ b/model/package.json @@ -1,6 +1,7 @@ { "name": "@platforma-open/milaboratories.import-vdj.model", "version": "1.10.2", + "private": true, "description": "Block model", "type": "module", "main": "dist/index.cjs", diff --git a/model/src/data-model.ts b/model/src/data-model.ts new file mode 100644 index 0000000..ab96a0e --- /dev/null +++ b/model/src/data-model.ts @@ -0,0 +1,70 @@ +import { createPlDataTableStateV2, DataModelBuilder } from "@platforma-sdk/model"; +import type { BlockData, LegacyBlockArgs, LegacyUiState } from "./types"; + +/** The six chains a fresh block offers. Unchanged from V1's `withArgs` default. */ +const DEFAULT_CHAINS = ["IGHeavy", "IGLight", "TCRAlpha", "TCRBeta", "TCRDelta", "TCRGamma"]; + +/** + * View-state defaults, shared by the fresh-project initialiser and the legacy upgrade. + * + * The upgrade needs them because V1's `uiState` fields are all optional on disk: a project + * saved before a flag was introduced simply has no value for it, and an undefined boolean + * reaching `argsValid` used to read as false by accident. Making the defaults explicit here + * means the V3 data is complete whatever shape the project was saved in. + */ +const viewStateDefaults = () => ({ + tableState: createPlDataTableStateV2(), + settingsOpen: true, + qiagenColumnsPresent: false, + immunoSeqColumnsPresent: false, + mixcrColumnsPresent: false, + crColumnsPresent: false, + airrColumnsPresent: false, +}); + +/** + * V1 kept the scientist's edits in two buckets — `args` and `uiState`. V3 keeps them in one, + * and derives what the workflow sees. This upgrade runs once per project, the first time a + * project saved under V1 is opened. + * + * The mapping is field-for-field: nothing is reshaped, because nothing in V1's shape was bent + * to dodge the stale gate. What changes is where the fields *go afterwards* — the labels and + * the secondary count type stop being projected into args, which is the whole point of the + * migration for this block. See `index.ts`. + * + * V1's `loadFromFile` is dropped rather than carried: the panel now derives which door it is + * showing from whether a file is loaded, so a stored flag could only disagree with the data. + */ +export function upgradeLegacyData({ + args, + uiState, +}: { + args?: LegacyBlockArgs; + uiState?: LegacyUiState; +}): BlockData { + return { + ...viewStateDefaults(), + ...(uiState ?? {}), + + defaultBlockLabel: args?.defaultBlockLabel ?? "", + customBlockLabel: args?.customBlockLabel ?? "", + datasetRef: args?.datasetRef, + fileSource: args?.fileSource, + format: args?.format, + chains: args?.chains ?? DEFAULT_CHAINS, + customMapping: args?.customMapping, + primaryCountType: args?.primaryCountType, + secondaryCountType: args?.secondaryCountType, + bareSet: args?.bareSet, + }; +} + +export const blockDataModel = new DataModelBuilder() + .from("v1") + .upgradeLegacy(upgradeLegacyData) + .init(() => ({ + ...viewStateDefaults(), + defaultBlockLabel: "", + customBlockLabel: "", + chains: DEFAULT_CHAINS, + })); diff --git a/model/src/index.ts b/model/src/index.ts index 54c80eb..2700e24 100644 --- a/model/src/index.ts +++ b/model/src/index.ts @@ -1,101 +1,180 @@ -import type { InferOutputsType, PlDataTableStateV2, PlRef } from "@platforma-sdk/model"; -import { - BlockModel, - createPlDataTableStateV2, - createPlDataTableV2, - PColumnCollection, -} from "@platforma-sdk/model"; - -export type BlockArgs = { - defaultBlockLabel: string; - customBlockLabel: string; - datasetRef?: PlRef; - format?: - | "immunoSeq" - | "qiagen" - | "mixcr" - | "mixcr-sc" - | "cellranger" - | "airr" - | "airr-sc" - | "custom"; - chains: string[]; - customMapping?: Record; - primaryCountType?: "read" | "umi"; - secondaryCountType?: "read" | "umi"; -}; - -export type UiState = { - tableState: PlDataTableStateV2; - settingsOpen: boolean; - qiagenColumnsPresent: boolean; - immunoSeqColumnsPresent: boolean; - mixcrColumnsPresent: boolean; - crColumnsPresent: boolean; - airrColumnsPresent: boolean; -}; - -export type ColumnDescription = { - label: string; - description: string; -}; - -export const model = BlockModel.create() - - .withArgs({ - defaultBlockLabel: "", - customBlockLabel: "", - chains: ["IGHeavy", "IGLight", "TCRAlpha", "TCRBeta", "TCRDelta", "TCRGamma"], - }) - - .withUiState({ - tableState: createPlDataTableStateV2(), - settingsOpen: true, - qiagenColumnsPresent: false, - immunoSeqColumnsPresent: false, - mixcrColumnsPresent: false, - crColumnsPresent: false, - airrColumnsPresent: false, - }) - - .argsValid((ctx) => { - const { datasetRef, format, chains, customMapping, primaryCountType } = ctx.args; - if (datasetRef === undefined) return false; - if (format === undefined) return false; - if (!Array.isArray(chains) || chains.length === 0) return false; - - if (format === "custom") { - const m = customMapping ?? {}; - const hasSeq = !!m["cdr3-nt"] || !!m["cdr3-aa"]; - const hasV = !!m["v-gene"]; - const hasJ = !!m["j-gene"]; - const pct = primaryCountType ?? "read"; - const hasPrimaryAbundance = pct === "umi" ? !!m["umi-count"] : !!m["read-count"]; - return hasSeq && hasV && hasJ && hasPrimaryAbundance; - } - - if (format === "qiagen") { - return ctx.uiState.qiagenColumnsPresent === true; - } - - if (format === "immunoSeq") { - return ctx.uiState.immunoSeqColumnsPresent === true; +import type { InferOutputsType } from "@platforma-sdk/model"; +import { BlockModelV3, DataColumn, createPlDataTableV3 } from "@platforma-sdk/model"; +import { blockDataModel } from "./data-model"; +import type { BlockArgs, BlockData, ColumnDescription, ColumnProfile } from "./types"; +import { bareSetValid } from "./types"; + +export * from "./types"; +export { upgradeLegacyData } from "./data-model"; + +/** + * The mapping fields that belong to the dataset door and mean nothing on a bare set: the bare + * path in the workflow reads `bareSet`, `fileSource` and `datasetRef` and nothing else. + * + * Stripping them is not tidiness. A scientist who configures a custom mapping, switches to a + * bare set and runs would otherwise ship the abandoned mapping to the workflow, where it is + * dead weight in the args and in every diff a reader of the run later looks at. + */ +function withoutDatasetDoorMapping(args: BlockArgs): BlockArgs { + return { + datasetRef: args.datasetRef, + fileSource: args.fileSource, + chains: args.chains, + bareSet: args.bareSet, + }; +} + +/** + * The workflow's view of the block, and the only place validation lives. + * + * Three jobs, in order: refuse what cannot run (by throwing), drop the door that is not in + * use, and drop the fields the chosen path never reads. What it deliberately does NOT do is + * reorder `chains`: canonicalising a set the user picked in their own order would change the + * args of every project already on disk, and buys only the rare case of someone re-picking the + * same chains in a different order. + */ +function projectArgs(data: BlockData): BlockArgs { + const { datasetRef, format, chains, customMapping, primaryCountType, fileSource } = data; + + // Exactly one door. Both set is a UI bug rather than a choice, and neither means nothing + // has been picked yet. + if ((datasetRef === undefined) === (fileSource === undefined)) { + throw new Error("Select a dataset, or load a file"); + } + + const args: BlockArgs = { + datasetRef, + fileSource, + format, + chains, + customMapping, + primaryCountType, + bareSet: data.bareSet, + }; + + // The direct door serves the custom format and no other, so the door decides which + // validation applies. Making the interface set `format` instead was worse than redundant: + // the value outlived the door, so switching back to a dataset left the whole per-format + // mapping unfurled under a format nobody had chosen. + if (fileSource !== undefined) { + if (!bareSetValid(data.bareSet)) throw new Error("Finish mapping the file's columns"); + return withoutDatasetDoorMapping(args); + } + + if (format === undefined) throw new Error("Choose a data format"); + if (!Array.isArray(chains) || chains.length === 0) throw new Error("Choose at least one chain"); + + if (format === "custom") { + // A bare set drops the V gene, the J gene and the abundance — it supplies none of them, + // and the rule that demanded all three could not tell a bare set from a malformed + // repertoire export. What it requires instead is a sequence mapped to a chain and an + // identity column, because the key is the identity's hash and the label is its value. + if (data.bareSet !== undefined) { + if (!bareSetValid(data.bareSet)) throw new Error("Finish mapping the record's columns"); + return withoutDatasetDoorMapping(args); } - if (format === "mixcr" || format === "mixcr-sc") { - return ctx.uiState.mixcrColumnsPresent === true; + const m = customMapping ?? {}; + const hasSeq = !!m["cdr3-nt"] || !!m["cdr3-aa"]; + const hasV = !!m["v-gene"]; + const hasJ = !!m["j-gene"]; + const pct = primaryCountType ?? "read"; + const hasPrimaryAbundance = pct === "umi" ? !!m["umi-count"] : !!m["read-count"]; + if (!hasSeq || !hasV || !hasJ || !hasPrimaryAbundance) { + throw new Error("Map a sequence, a V gene, a J gene and an abundance column"); } - - if (format === "cellranger") { - return ctx.uiState.crColumnsPresent === true; - } - - if (format === "airr" || format === "airr-sc") { - return ctx.uiState.airrColumnsPresent === true; - } - - // For other formats, basic args are sufficient - return true; + return args; + } + + // The per-format flags are written by the UI from the `validationResult` output. They are a + // mirror of a derivation, which is a hairpin, but replacing them is a separate change: the + // check they stand for needs the file's headers, and the args lambda cannot reach prerun. + const presentByFormat: Record = { + qiagen: data.qiagenColumnsPresent === true, + immunoSeq: data.immunoSeqColumnsPresent === true, + mixcr: data.mixcrColumnsPresent === true, + "mixcr-sc": data.mixcrColumnsPresent === true, + cellranger: data.crColumnsPresent === true, + airr: data.airrColumnsPresent === true, + "airr-sc": data.airrColumnsPresent === true, + }; + if (format in presentByFormat && !presentByFormat[format]) { + throw new Error(`The file does not carry the columns a ${format} dataset needs`); + } + + return args; +} + +// Named `platforma` because the structurer-generated block facade +// (block/src/index.ts) imports that name. Every V3 block uses it too. +export const platforma = BlockModelV3.create(blockDataModel) + + .args(projectArgs) + + /** + * Prerun reads the file's header, infers the mapping and checks the identity column for + * collisions — discovery, all of it, and all of it expected to be current without the + * scientist pressing Run. So the projection is deliberately permissive where `args` is + * strict: it must survive a half-finished mapping, because a half-finished mapping is + * exactly when the panel needs the headers back. + * + * `chains` is absent because prerun never reads it (`workflow/src/prerun.tpl.tengo`). + */ + .prerunArgs((data) => ({ + datasetRef: data.datasetRef, + fileSource: data.fileSource, + format: data.format, + customMapping: data.customMapping, + primaryCountType: data.primaryCountType, + bareSet: data.bareSet, + })) + + /** + * Identity values that appear on rows which are not identical to each other. + * + * Not `retentive`: this gates the run, so a stale value is worse than a briefly absent one. + * + * Read straight from prerun here, and *not* mirrored into `uiState` from a UI watcher. That + * mirror is what the format-validity flags do, and it is a hairpin — an output written back + * into state that a derivation then reads. It survives on one client and races on two. + */ + /** + * Drives the upload for a directly-loaded file. + * + * `getImportProgress()` is what *starts* the transfer — retrieving the progress is the side + * effect. `isActive` forces the lambda to run even when nobody is looking at the block, and + * without it the upload never begins, prerun never resolves, and nothing errors anywhere. + */ + .output( + "fileImports", + (ctx) => + ctx.outputs + ?.resolve({ field: "fileImports", allowPermanentAbsence: true }) + ?.getImportProgress(), + { isActive: true }, + ) + + .output( + "prerunFileImports", + (ctx) => + ctx.prerun + ?.resolve({ field: "fileImports", allowPermanentAbsence: true }) + ?.getImportProgress(), + { isActive: true }, + ) + + .output("identityCollisions", (ctx) => { + const raw = ctx.prerun + ?.resolve({ field: "identityCollisions", allowPermanentAbsence: true }) + ?.getDataAsString(); + if (raw === undefined) return undefined; + + // A one-column TSV: a header, then one colliding value per line. + const lines = raw + .split("\n") + .map((l) => l.trim()) + .filter((l) => l.length > 0); + return lines.slice(1); }) .retentiveOutput("datasetOptions", (ctx) => { @@ -121,13 +200,68 @@ export const model = BlockModel.create() ?.getDataAsJson(); }) - .retentiveOutput("headerColumns", (ctx) => { - return ctx.prerun + /** Every column of a directly-loaded file, profiled over the WHOLE file: its value type, and + * whether it holds amino-acid variable domains. Absent on the dataset door, where the pool + * supplies the headers instead. */ + .retentiveOutput("columnProfile", (ctx) => { + const raw = ctx.prerun + ?.resolve({ field: "columnProfile", allowPermanentAbsence: true }) + ?.getDataAsString(); + if (raw === undefined) return undefined; + try { + return JSON.parse(raw) as ColumnProfile; + } catch { + return undefined; + } + }) + + /** Headers whose values actually read as amino-acid variable domains. The chain dropdowns + * offer only these, so an identifier column cannot be mapped into a sequence slot. Empty + * means "not determined" — the UI falls back to every header rather than an empty dropdown. */ + .retentiveOutput("aminoAcidColumns", (ctx) => { + const raw = ctx.prerun + ?.resolve({ field: "columnProfile", allowPermanentAbsence: true }) + ?.getDataAsString(); + if (raw === undefined) return undefined; + try { + return (JSON.parse(raw) as ColumnProfile).aminoAcid ?? []; + } catch { + return undefined; + } + }) + + /** + * Headers of the file this block loaded itself. Absent on the dataset door. + * + * Separate from {@link datasetColumns} rather than one output answering for both doors. The + * two are discovered differently — a full profile of a file we hold, versus the pool's own + * inference over a dataset somebody else produced — and a single output made each door's + * mapping dropdowns read a value the other door could have written. + */ + .retentiveOutput("fileColumns", (ctx) => { + const raw = ctx.prerun + ?.resolve({ field: "columnProfile", allowPermanentAbsence: true }) + ?.getDataAsString(); + if (raw === undefined) return undefined; + try { + return ((JSON.parse(raw) as ColumnProfile).headers ?? []).filter((h) => h.trim().length > 0); + } catch { + return undefined; + } + }) + + /** Headers of the dataset selected from the pool. Absent on the file door. */ + .retentiveOutput("datasetColumns", (ctx) => { + const headers = ctx.prerun ?.resolve({ field: "headerColumns", allowPermanentAbsence: true, }) ?.getDataAsJson(); + if (headers === undefined) return undefined; + // A workbook with a trailing empty column yields an empty header, which would show up as a + // blank option in every mapping dropdown and cannot be mapped to anything. + return headers.filter((h) => h.trim().length > 0); }) .retentiveOutput("validationResult", (ctx) => { @@ -138,11 +272,11 @@ export const model = BlockModel.create() }) ?.getDataAsJson(); - if (!headerColumns || !ctx.args.format) { + if (!headerColumns || !ctx.data.format) { return undefined; } - const format = ctx.args.format; + const format = ctx.data.format; const headers = headerColumns; if (format === "qiagen") { @@ -277,23 +411,58 @@ export const model = BlockModel.create() }; }) + /** + * What the import actually emitted: one entry per exported p-column, with the axes and + * domain that give it its identity. + * + * Read from the workflow's own output rather than derived from the mapping, so it reports + * what was produced rather than what was intended — which is what makes it useful when a + * downstream block cannot see the dataset and the question is whether the column is missing + * or merely differently keyed. + */ + .output("importedColumns", (ctx) => { + const cols = ctx.outputs?.resolve("result")?.getPColumns(); + if (cols === undefined) return undefined; + return cols.map((c) => ({ + name: c.spec.name, + valueType: c.spec.valueType, + domain: c.spec.domain ?? {}, + annotations: c.spec.annotations ?? {}, + axes: (c.spec.axesSpec ?? []).map((a) => ({ name: a.name, domain: a.domain ?? {} })), + })); + }) + .outputWithStatus("stats", (ctx) => { const pCols = ctx.outputs?.resolve("stats")?.getPColumns(); if (pCols === undefined) { return undefined; } - const withLabels = new PColumnCollection().addColumns(pCols).getColumns(() => true) ?? []; + // Anchor on the annotated count. Every column here — the four counts and the chain label — + // keys on the single chain axis, so the choice does not affect the join; it decides what V3 + // discovers labels against and what stays permanently visible, since visibility rules are + // never applied to primary columns. The annotated count is emitted for every run. + const primary = pCols.find((c) => c.spec.name.endsWith("/annotatedCount")); + if (primary === undefined) { + return undefined; + } - return createPlDataTableV2(ctx, withLabels, ctx.uiState.tableState); + // V3 rather than V2 because it filters a saved sort or filter that names a column the + // current run does not emit, where V2 threw and failed the whole output. Changing the + // receptor set changes the emitted columns, so that state is reachable by ordinary use. + return createPlDataTableV3(ctx, { + primaryColumns: [DataColumn.fromColumn(primary)], + columns: pCols.filter((c) => c.id !== primary.id).map((c) => DataColumn.fromColumn(c)), + tableState: ctx.data.tableState, + }); }) .sections((_ctx) => [{ type: "link", href: "/", label: "Main" }]) .title(() => "Import V(D)J Data") - .subtitle((ctx) => ctx.args.customBlockLabel || ctx.args.defaultBlockLabel || "") + .subtitle((ctx) => ctx.data.customBlockLabel || ctx.data.defaultBlockLabel || "") - .done(2); + .done(); -export type BlockOutputs = InferOutputsType; +export type BlockOutputs = InferOutputsType; diff --git a/model/src/types.ts b/model/src/types.ts new file mode 100644 index 0000000..6ef71ee --- /dev/null +++ b/model/src/types.ts @@ -0,0 +1,305 @@ +import type { ImportFileHandle, PlDataTableStateV2, PlRef } from "@platforma-sdk/model"; + +export type ImportFormat = + | "immunoSeq" + | "qiagen" + | "mixcr" + | "mixcr-sc" + | "cellranger" + | "airr" + | "airr-sc" + | "custom"; + +export type CountType = "read" | "umi"; + +export type FileSource = { + handle: ImportFileHandle; + /** + * Minted in the UI at the moment the file is picked, not derived from the handle, so the + * sample keeps its identity across runs even if the same file is re-selected. + */ + sampleId: string; + /** The filename stem — exactly what samples-and-data would have labelled the sample. */ + label: string; + /** + * What kind of file this is. `xlsx` is converted to csv by the workflow before anything + * reads it, so the pipeline only ever sees csv or tsv. + */ + extension: "csv" | "tsv" | "xlsx"; +}; + +/** + * The mapping slots a scientist can assign a sequence column to. + * + * Named in the `pl7.app/vdj/chain` vocabulary the block's bulk path already uses, rather than + * the A/B of `pl7.app/vdj/scClonotypeChain`: a mapped chain is a locus, and one mapped chain is + * a bulk shape. The workflow translates to A/B where the paired-chain domain needs it. + */ +export type BareSetChain = "IGHeavy" | "IGLight" | "TCRBeta" | "TCRAlpha" | "TCRDelta" | "TCRGamma"; + +/** + * What the scientist declares they are importing — a receptor, or one of its chains. + * + * The declaration decides how many sequence columns the panel asks for, and it is a statement + * rather than an inference. Before this, "paired or single-chain" was read off how many slots + * happened to be filled, so a paired panel with the light column not yet mapped was + * indistinguishable from a deliberately heavy-only one — and the two emit different shapes. + */ +export type ChainSelection = + | "IG" + | "IGHeavy" + | "IGLight" + | "TCRAB" + | "TCRBeta" + | "TCRAlpha" + | "TCRGD" + | "TCRDelta" + | "TCRGamma"; + +/** Numbering conventions the block offers. */ +export type BareSetScheme = "imgt" | "kabat" | "chothia"; + +/** The sequence columns each selection asks for, in emission order. */ +export const CHAIN_SLOTS: Record = { + IG: ["IGHeavy", "IGLight"], + IGHeavy: ["IGHeavy"], + IGLight: ["IGLight"], + // The more diverse chain first, matching MiXCR's receptorInfos order. + TCRAB: ["TCRBeta", "TCRAlpha"], + TCRBeta: ["TCRBeta"], + TCRAlpha: ["TCRAlpha"], + TCRGD: ["TCRDelta", "TCRGamma"], + TCRDelta: ["TCRDelta"], + TCRGamma: ["TCRGamma"], +}; + +/** + * The numbering schemes each selection can be numbered under. + * + * IMGT is position-unified and chain-agnostic — ANARCI's `number_imgt` takes no chain type at + * all. Kabat, Chothia, Martin and Wolfguy were defined on antibody structures and ANARCI + * implements them for `H`/`K`/`L` only, raising "Unimplemented numbering scheme" for a TCR chain + * (anarci.py:558-592). So a TCR selection can only be numbered under IMGT, and offering the + * others would hand the scientist a choice that fails the run. + */ +export const SCHEMES_FOR_SELECTION: Record = { + IG: ["imgt", "kabat", "chothia"], + IGHeavy: ["imgt", "kabat", "chothia"], + IGLight: ["imgt", "kabat", "chothia"], + TCRAB: ["imgt"], + TCRBeta: ["imgt"], + TCRAlpha: ["imgt"], + TCRGD: ["imgt"], + TCRDelta: ["imgt"], + TCRGamma: ["imgt"], +}; + +/** + * What to call each slot in front of the scientist — the same words the receptor/chain list + * uses, so the slot that appears after a choice is named the way the choice was. + * + * No alphabet in the name. Every sequence a bare set takes is amino acid today, and when that + * stops being true it will be a control of its own rather than a suffix on six labels. + */ +export const CHAIN_SLOT_LABELS: Record = { + IGHeavy: "IG Heavy", + IGLight: "IG Light", + TCRBeta: "TCR-β", + TCRAlpha: "TCR-α", + TCRDelta: "TCR-δ", + TCRGamma: "TCR-ɣ", +}; + +/** What a column can hold, decided by profiling every row of the file. */ +export type ColumnValueType = "Long" | "Double" | "String"; + +/** + * Every column of a directly-loaded file, profiled over the whole file. + * + * `types` widens monotonically as rows are read, so one non-numeric value anywhere settles the + * column as `String` — the same rule samples-and-data applies to an imported metadata table. + */ +export type ColumnProfile = { + headers: string[]; + types: Record; + aminoAcid: string[]; +}; + +export type ImportedProperty = { + /** The source header, exactly as the file wrote it. It becomes the column's label. */ + header: string; + /** + * Detected, never chosen. Written when the scientist accepts the column, from the profile the + * whole-file scan produced — so the panel asks no type question and the answer cannot be + * wrong about a value it never saw. + */ + valueType: ColumnValueType; +}; + +export type BareSetMapping = { + /** + * The column whose value identifies the record. Required, never inferred: the record key + * is its hash and the record label is its value, so a set without one has nothing to key on. + */ + identity: string; + /** + * What is being imported. Decides which sequence slots the panel offers, and therefore + * whether the emitted set is paired or bulk-shaped. + */ + chainSelection: ChainSelection; + /** + * Amino-acid variable domain per chain, keyed by the slot the column was assigned to — so the + * file needs no chain column and nothing is matched against a locus map. A row carrying both + * chains is unpivoted into one record, not split into two. + */ + sequences: Partial>; + /** The numbering convention ANARCI is asked for, and the one recorded on every region. */ + scheme: BareSetScheme; + /** + * Non-sequence columns the scientist accepted as record properties. Offered rather than + * discarded: a column holding anything the canonical vocabulary never anticipated has no slot + * to be given, however ordinary the value is. + * + * Each carries the type the whole-file profile detected for it. + */ + properties?: ImportedProperty[]; +}; + +export type ColumnDescription = { + label: string; + description: string; +}; + +/** + * What the workflow consumes. Strictly smaller than {@link BlockData}: the block's labels and + * the secondary count type never reach it, and the door that is not in use is stripped. + * + * Kept as a named type rather than inlined because the args lambda's job is to produce exactly + * this — a reader comparing the two shapes can see at a glance what is UI-only. + */ +export type BlockArgs = { + datasetRef?: PlRef; + fileSource?: FileSource; + format?: ImportFormat; + chains: string[]; + customMapping?: Record; + primaryCountType?: CountType; + bareSet?: BareSetMapping; +}; + +/** + * Everything the scientist can edit, in the shape the panel wants it. + * + * Three channels come out of this (see `model.md`): the workflow's `args`, the auto-rerunning + * `prerunArgs`, and the fields that stay here and never leave the UI. The last group is the + * point of V3 for this block — under V1 the two labels lived in `args`, so renaming a block + * marked it stale and asked for a re-import. + */ +export type BlockData = { + // --- naming. UI-only: the workflow reads neither, and projecting them would mean a rename + // --- stales the block. + defaultBlockLabel: string; + customBlockLabel: string; + + // --- the two doors. Exactly one is set; the args lambda enforces it. + /** A dataset somebody already loaded into the project. */ + datasetRef?: PlRef; + /** A file this block imports itself. */ + fileSource?: FileSource; + + // --- dataset-door mapping + format?: ImportFormat; + chains: string[]; + customMapping?: Record; + primaryCountType?: CountType; + /** + * UI-only, despite looking like a mapping field: the workflow never reads it. It decides + * which count columns the panel offers, and its effect reaches the workflow through + * `customMapping`. Projecting it would stale the block on a choice that changes nothing. + */ + secondaryCountType?: CountType; + + // --- bare set. Its presence is what selects the bare path in the workflow. + bareSet?: BareSetMapping; + + // --- view state. None of this is projected anywhere. + tableState: PlDataTableStateV2; + settingsOpen: boolean; + qiagenColumnsPresent: boolean; + immunoSeqColumnsPresent: boolean; + mixcrColumnsPresent: boolean; + crColumnsPresent: boolean; + airrColumnsPresent: boolean; +}; + +/** The V1 `args` bucket, as it sits in projects saved before the V3 migration. */ +export type LegacyBlockArgs = { + defaultBlockLabel?: string; + customBlockLabel?: string; + datasetRef?: PlRef; + format?: ImportFormat; + chains?: string[]; + customMapping?: Record; + primaryCountType?: CountType; + secondaryCountType?: CountType; + bareSet?: BareSetMapping; + fileSource?: FileSource; +}; + +/** The V1 `uiState` bucket. */ +export type LegacyUiState = { + tableState?: PlDataTableStateV2; + settingsOpen?: boolean; + qiagenColumnsPresent?: boolean; + immunoSeqColumnsPresent?: boolean; + mixcrColumnsPresent?: boolean; + crColumnsPresent?: boolean; + airrColumnsPresent?: boolean; +}; + +/** + * The SDK's `substituteSpecialCharacters` class, mirrored so the model can refuse a collision + * without a round trip to the workflow. Kept in step with + * `sdk/workflow-tengo/src/strings.lib.tengo:4`. + */ +const SPECIAL_CHARACTERS = /[-_,.:; +()!<>[\]}{"\\/:$%^#@*&]+/g; + +export function sanitizeHeader(header: string): string { + return header.replace(SPECIAL_CHARACTERS, "_"); +} + +/** Headers that sanitize to the same token, grouped by that token. */ +export function propertyCollisions(properties: ImportedProperty[]): Record { + const byToken: Record = {}; + for (const p of properties) { + const token = sanitizeHeader(p.header); + (byToken[token] ??= []).push(p.header); + } + return Object.fromEntries(Object.entries(byToken).filter(([, hs]) => hs.length > 1)); +} + +/** + * Whether a bare-set mapping is complete enough to run. + * + * The identity-uniqueness refusal is NOT here, and that is a constraint rather than a choice: + * the args lambda is a pure function of `data` and cannot reach prerun's collision report. The + * verdict is surfaced by the `identityCollisions` output instead, and the refusal that actually + * protects the data has to live in the workflow. Until it does, a colliding set can be run and + * will merge records. + */ +export function bareSetValid(bare: BareSetMapping | undefined): boolean { + if (bare === undefined) return false; + if (!bare.identity) return false; + if (!bare.chainSelection) return false; + // Every slot the declaration asks for must be filled. Declaring IG and mapping only the heavy + // column is an unfinished mapping, not a heavy-only set: the scientist said there are two + // chains, and emitting one of them instead would be answering a question they did not ask. + const slots = CHAIN_SLOTS[bare.chainSelection] ?? []; + if (slots.length === 0) return false; + if (slots.some((slot) => !bare.sequences?.[slot])) return false; + if (!bare.scheme) return false; + // Two headers that sanitize alike would produce identical specs and dedupe into one column, + // losing a column the scientist explicitly chose. Refused rather than disambiguated: a + // generated suffix would leave names matching nothing in their file. + return Object.keys(propertyCollisions(bare.properties ?? [])).length === 0; +} diff --git a/package.json b/package.json index 6304a89..0c9b6c0 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,8 @@ "index.js" ], "scripts": { - "build": "turbo run build", - "build:dev": "env PL_PKG_DEV=local turbo run build", - "test": "env PL_PKG_DEV=local turbo run test --concurrency 1", - "test:dry-run": "env PL_PKG_DEV=local turbo run test --dry-run=json", + "test": "env PL_PKG_DEV=local PL_BUILD_CHANNEL=dev PL_BUILD_VARIANT=binary PL_BUILD_LOCATION=local turbo run test --concurrency 1", + "test:dry-run": "env PL_BUILD_CHANNEL=dev PL_BUILD_VARIANT=binary PL_BUILD_LOCATION=local turbo run test --dry-run=json", "mark-stable": "turbo run mark-stable", "watch": "turbo watch build", "changeset": "changeset", @@ -16,7 +14,12 @@ "fmt": "turbo run fmt", "check": "turbo run check", "do-pack": "turbo run do-pack", - "upgrade-sdk": "block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm i && pnpm fmt" + "upgrade-sdk": "block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm i && pnpm fmt", + "build:dev-local": "env PL_PKG_DEV=local PL_BUILD_CHANNEL=dev PL_BUILD_VARIANT=all PL_BUILD_LOCATION=local turbo run build", + "build:dev-remote": "env PL_BUILD_CHANNEL=dev PL_BUILD_VARIANT=all PL_BUILD_LOCATION=remote turbo run build", + "build:dev-no-software": "env PL_BUILD_CHANNEL=dev PL_BUILD_VARIANT=none turbo run build", + "build:dev-binary-existing": "env PL_BUILD_CHANNEL=dev PL_BUILD_USE_PUBLISHED=true turbo run build", + "build:release": "env PL_BUILD_CHANNEL=release PL_BUILD_VARIANT=all PL_BUILD_LOCATION=remote turbo run build" }, "devDependencies": { "@changesets/cli": "catalog:", @@ -33,4 +36,4 @@ "pnpm": { "overrides": {} } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96e90cc..6ff0e3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,38 +10,59 @@ catalogs: specifier: ^2.29.6 version: 2.29.8 '@milaboratories/helpers': - specifier: 1.14.2 - version: 1.14.2 + specifier: 1.14.5 + version: 1.14.5 '@milaboratories/ts-builder': + specifier: 1.6.2 + version: 1.6.2 + '@milaboratories/ts-configs': + specifier: 1.4.0 + version: 1.4.0 + '@platforma-open/milaboratories.runenv-python-3': + specifier: ^1.1.16 + version: 1.11.6 + '@platforma-open/milaboratories.samples-and-data': + specifier: 1.18.1 + version: 1.18.1 + '@platforma-open/milaboratories.sequence-properties': specifier: 1.5.2 version: 1.5.2 - '@milaboratories/ts-configs': - specifier: 1.2.3 - version: 1.2.3 + '@platforma-open/milaboratories.software-anarci': + specifier: ^0.0.3 + version: 0.0.3 '@platforma-sdk/block-tools': - specifier: 2.11.0 - version: 2.11.0 + specifier: 2.14.3 + version: 2.14.3 '@platforma-sdk/model': - specifier: 1.79.14 - version: 1.79.14 + specifier: 1.81.1 + version: 1.81.1 + '@platforma-sdk/package-builder': + specifier: 3.15.0 + version: 3.15.0 '@platforma-sdk/tengo-builder': - specifier: 4.0.8 - version: 4.0.8 + specifier: 4.0.22 + version: 4.0.22 '@platforma-sdk/test': - specifier: 1.79.14 - version: 1.79.14 + specifier: 1.81.3 + version: 1.81.3 '@platforma-sdk/ui-vue': - specifier: 1.79.14 - version: 1.79.14 + specifier: 1.81.1 + version: 1.81.1 '@platforma-sdk/workflow-tengo': - specifier: 6.6.3 - version: 6.6.3 + specifier: 6.8.2 + version: 6.8.2 + canonicalize: + specifier: ~2.1.0 + version: 2.1.0 shx: specifier: ^0.4.0 version: 0.4.0 turbo: specifier: ^2.5.8 version: 2.6.3 + typescript: + specifier: ~5.6.3 + version: 5.6.3 vitest: specifier: ~4.0.18 version: 4.0.18 @@ -65,10 +86,10 @@ importers: version: 2.29.8(@types/node@25.0.1) '@milaboratories/ts-builder': specifier: 'catalog:' - version: 1.5.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2) + version: 1.6.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2) '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.11.0(@types/node@25.0.1) + version: 2.14.3(@types/node@25.0.1) shx: specifier: 'catalog:' version: 0.4.0 @@ -77,7 +98,13 @@ importers: version: 2.6.3 block: - dependencies: + devDependencies: + '@milaboratories/ts-builder': + specifier: 'catalog:' + version: 1.6.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.6.3))(yaml@2.8.2) + '@milaboratories/ts-configs': + specifier: 'catalog:' + version: 1.4.0 '@platforma-open/milaboratories.import-vdj.model': specifier: workspace:* version: link:../model @@ -87,25 +114,27 @@ importers: '@platforma-open/milaboratories.import-vdj.workflow': specifier: workspace:* version: link:../workflow - '@platforma-sdk/model': - specifier: 'catalog:' - version: 1.79.14 - devDependencies: '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.11.0(@types/node@25.0.1) + version: 2.14.3(@types/node@25.0.1) + '@platforma-sdk/model': + specifier: 'catalog:' + version: 1.81.1 shx: specifier: 'catalog:' version: 0.4.0 + typescript: + specifier: 'catalog:' + version: 5.6.3 model: dependencies: '@milaboratories/helpers': specifier: 'catalog:' - version: 1.14.2 + version: 1.14.5 '@platforma-sdk/model': specifier: 'catalog:' - version: 1.79.14 + version: 1.81.1 '@types/node': specifier: '*' version: 25.0.1 @@ -115,13 +144,40 @@ importers: devDependencies: '@milaboratories/ts-builder': specifier: 'catalog:' - version: 1.5.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2) + version: 1.6.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2) '@milaboratories/ts-configs': specifier: 'catalog:' - version: 1.2.3 + version: 1.4.0 '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.11.0(@types/node@25.0.1) + version: 2.14.3(@types/node@25.0.1) + + software/column-profile: + devDependencies: + '@platforma-open/milaboratories.runenv-python-3': + specifier: 'catalog:' + version: 1.11.6 + '@platforma-sdk/package-builder': + specifier: 'catalog:' + version: 3.15.0 + + software/region-annotation: + devDependencies: + '@platforma-open/milaboratories.runenv-python-3': + specifier: 'catalog:' + version: 1.11.6 + '@platforma-sdk/package-builder': + specifier: 'catalog:' + version: 3.15.0 + + software/xlsx-to-csv: + devDependencies: + '@platforma-open/milaboratories.runenv-python-3': + specifier: 'catalog:' + version: 1.11.6 + '@platforma-sdk/package-builder': + specifier: 'catalog:' + version: 3.15.0 test: dependencies: @@ -134,13 +190,25 @@ importers: devDependencies: '@milaboratories/ts-builder': specifier: 'catalog:' - version: 1.5.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2) + version: 1.6.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.24(typescript@5.9.3))(yaml@2.8.2) '@milaboratories/ts-configs': specifier: 'catalog:' - version: 1.2.3 + version: 1.4.0 + '@platforma-open/milaboratories.import-vdj.model': + specifier: workspace:* + version: link:../model + '@platforma-open/milaboratories.samples-and-data': + specifier: 'catalog:' + version: 1.18.1 + '@platforma-open/milaboratories.sequence-properties': + specifier: 'catalog:' + version: 1.5.2(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.2)(@platforma-sdk/ui-vue@1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3))(@types/node@25.0.1)(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))(vitest@4.0.18(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))(vue@3.5.24(typescript@5.9.3)) + '@platforma-sdk/model': + specifier: 'catalog:' + version: 1.81.1 '@platforma-sdk/test': specifier: 'catalog:' - version: 1.79.14(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1)(vite@7.2.7(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2)) + version: 1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1)(vite@7.2.7(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2)) vitest: specifier: 'catalog:' version: 4.0.18(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2) @@ -152,13 +220,16 @@ importers: version: link:../model '@platforma-sdk/model': specifier: 'catalog:' - version: 1.79.14 + version: 1.81.1 '@platforma-sdk/ui-vue': specifier: 'catalog:' - version: 1.79.14(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3) + version: 1.81.1(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3) '@types/node': specifier: '*' version: 25.0.1 + canonicalize: + specifier: 'catalog:' + version: 2.1.0 typescript: specifier: '*' version: 5.9.3 @@ -168,32 +239,47 @@ importers: devDependencies: '@milaboratories/helpers': specifier: 'catalog:' - version: 1.14.2 + version: 1.14.5 '@milaboratories/ts-builder': specifier: 'catalog:' - version: 1.5.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.24(typescript@5.9.3))(yaml@2.8.2) + version: 1.6.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.24(typescript@5.9.3))(yaml@2.8.2) '@milaboratories/ts-configs': specifier: 'catalog:' - version: 1.2.3 + version: 1.4.0 workflow: dependencies: + '@platforma-open/milaboratories.import-vdj.column-profile': + specifier: workspace:* + version: link:../software/column-profile + '@platforma-open/milaboratories.import-vdj.region-annotation': + specifier: workspace:* + version: link:../software/region-annotation + '@platforma-open/milaboratories.import-vdj.xlsx-to-csv': + specifier: workspace:* + version: link:../software/xlsx-to-csv + '@platforma-open/milaboratories.software-anarci': + specifier: 'catalog:' + version: 0.0.3 '@platforma-sdk/workflow-tengo': specifier: 'catalog:' - version: 6.6.3 + version: 6.8.2 devDependencies: '@platforma-sdk/tengo-builder': specifier: 'catalog:' - version: 4.0.8 + version: 4.0.22 '@platforma-sdk/test': specifier: 'catalog:' - version: 1.79.14(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1)(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2)) + version: 1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1)(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2)) shx: specifier: 'catalog:' version: 0.4.0 packages: + '@ag-grid-community/core@32.3.9': + resolution: {integrity: sha512-oZeAEPgaJVMzfKqbAPCyadcN5+iy+tjvhRLqEYJdBxtLgW/s2s0qXcXQvnrz7eUMD3Z7h3BQRVt2h/p0T6Ox/w==} + '@ast-grep/napi-darwin-arm64@0.36.3': resolution: {integrity: sha512-uM0Hrm5gcHqaBL64ktmPBFMTorTlPKWsUfi0E2Cg09GJfeYWvZmicCqgd7qVtjURmQvFQdb4JSqHIkJvws6Uqw==} engines: {node: '>= 10'} @@ -275,6 +361,10 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + '@aws-sdk/client-ecr-public@3.859.0': + resolution: {integrity: sha512-pPY85lrGBNWynofNC6Er49W6aA4JvOOKC9RDbS8rWR8pBPEG6p0B82VQKFMR+3JYRogpfQf5hzU47um96EslFA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/client-s3@3.859.0': resolution: {integrity: sha512-oFLHZX1X6o54ZlweubtSVvQDz15JiNrgDD7KeMZT2MwxiI3axPcHzTo2uizjj5mgNapmYjRmQS5c1c63dvruVA==} engines: {node: '>=18.0.0'} @@ -315,6 +405,12 @@ packages: resolution: {integrity: sha512-8iULWsH83iZDdUuiDsRb83M0NqIlXjlDbJUIddVsIrfWp4NmanKw77SV6yOZ66nuJjPsn9j7RDb9bfEPCy5SWA==} engines: {node: '>=18.0.0'} + '@aws-sdk/lib-storage@3.859.0': + resolution: {integrity: sha512-VfaEhih4MMxD6llibXEnrS4HyExhLpIFAvy1nq490IGO/Z6JCI81kmA3rB376XahMhoS9CVN0eAoeryTYHFHGw==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@aws-sdk/client-s3': ^3.859.0 + '@aws-sdk/middleware-bucket-endpoint@3.840.0': resolution: {integrity: sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==} engines: {node: '>=18.0.0'} @@ -419,9 +515,9 @@ packages: resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} - '@babel/generator@8.0.0-rc.3': - resolution: {integrity: sha512-em37/13/nR320G4jab/nIIHZgc2Wz2y/D39lxnTyxB4/D/omPQncl/lSdlnJY1OhQcRGugTSIF2l/69o31C9dA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@babel/generator@8.0.0': + resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-compilation-targets@7.29.7': resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} @@ -445,17 +541,17 @@ packages: resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@8.0.0-rc.3': - resolution: {integrity: sha512-AmwWFx1m8G/a5cXkxLxTiWl+YEoWuoFLUCwqMlNuWO1tqAYITQAbCRPUkyBHv1VOFgfjVOqEj6L3u15J5ZCzTA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@babel/helper-string-parser@8.0.0': + resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@8.0.0-rc.3': - resolution: {integrity: sha512-8AWCJ2VJJyDFlGBep5GpaaQ9AAaE/FjAcrqI7jyssYhtL7WGV0DOKpJsQqM037xDbpRLHXsY8TwU7zDma7coOw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@babel/helper-validator-identifier@8.0.4': + resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-validator-option@7.29.7': resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} @@ -470,9 +566,9 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@8.0.0-rc.3': - resolution: {integrity: sha512-B20dvP3MfNc/XS5KKCHy/oyWl5IA6Cn9YjXRdDlCjNmUFrjvLXMNUfQq/QUy9fnG2gYkKKcrto2YaF9B32ToOQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@babel/parser@8.0.4': + resolution: {integrity: sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==} + engines: {node: ^22.18.0 || >=24.11.0} hasBin: true '@babel/runtime@7.28.4': @@ -491,9 +587,9 @@ packages: resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} - '@babel/types@8.0.0-rc.3': - resolution: {integrity: sha512-mOm5ZrYmphGfqVWoH5YYMTITb3cDXsFgmvFlvkvWDMsR9X8RFnt7a0Wb6yNIdoFsiMO9WjYLq+U/FMtqIYAF8Q==} - engines: {node: ^20.19.0 || >=22.12.0} + '@babel/types@8.0.4': + resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==} + engines: {node: ^22.18.0 || >=24.11.0} '@bufbuild/protobuf@2.10.1': resolution: {integrity: sha512-ckS3+vyJb5qGpEYv/s1OebUHDi/xSNtfgw1wqKZo7MR9F2z+qXr0q5XagafAG/9O0QPVIUfST0smluYSTpYFkg==} @@ -563,6 +659,56 @@ packages: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} + '@d3fc/d3fc-axis@3.0.7': + resolution: {integrity: sha512-S4pILxkQUkD7WQmimWxIEHfXUYEonlXWuWvMP6iq3KXL3d+cj4flvwNqLYZvSVaQDdK990cKkjrK/ZAKnReGlg==} + peerDependencies: + d3-scale: '*' + d3-selection: '*' + d3-shape: '*' + + '@d3fc/d3fc-chart@5.1.9': + resolution: {integrity: sha512-xFO9lDUi2wAkjfyWlVZuFwSWEgnk0WOEagR2R9KzQ+uxeg3oZOPzwE+AZbpALyQbjjQ2uIxcOk56xnmnnayk3w==} + peerDependencies: + d3-scale: '*' + d3-selection: '*' + + '@d3fc/d3fc-data-join@6.0.3': + resolution: {integrity: sha512-fd1D2Cl4YGjzl3gBhcrvTl/VxaSncY0ZcokWsN8ahtmk9DZK4DnAgHGrdecnXVLkOx+ANDcqxqscYz6MWXLbcA==} + peerDependencies: + d3-selection: '*' + + '@d3fc/d3fc-element@6.2.0': + resolution: {integrity: sha512-AvdZ3V4mVxF9dGYLiDCoqr3GhrFOUQEc1FcP20QEhQ3fJ3qYRwx7/uhL7G/L2xbe6k4delPgnLOvtoaDenhpZw==} + + '@d3fc/d3fc-pointer@3.0.3': + resolution: {integrity: sha512-hXY7LqliDEJBH/do4YZusdLoikLYlWoN7efPC7YKYJ8igoEQFa48BqEHcANLs1qH+r7vzL2SS8V39MzgnJ1yQA==} + peerDependencies: + d3-dispatch: '*' + d3-selection: '*' + + '@d3fc/d3fc-rebind@6.0.1': + resolution: {integrity: sha512-+ryBZ53ALMffbADwnFAtTYQJcT7PE5BwpducGYS0X6Jux6ESnp+fP+cDQvBGbDBOVqaziGnfeLeJXjtMnZujmQ==} + + '@d3fc/d3fc-series@6.1.3': + resolution: {integrity: sha512-OSbt60SohTIib1xihX9ufneyJY7s9Feg9hvXVyEBZEBkwNE1NaeesZJ4nkmslu39RWuwsvpK3apL/XuBw7i5WA==} + peerDependencies: + d3-array: '*' + d3-scale: '*' + d3-scale-chromatic: '*' + d3-selection: '*' + d3-shape: '*' + + '@d3fc/d3fc-shape@6.0.1': + resolution: {integrity: sha512-/dD3S8BWrOjO2mSptUmwe38V7KG4Kw6liIE5NXZJjX/XidfZhuDu7WWuya3i90HeNYDZNcs6Z+4qM3FnvlZf8g==} + peerDependencies: + d3-path: '*' + + '@d3fc/d3fc-webgl@3.2.1': + resolution: {integrity: sha512-yNYHW/tC05rrJs5fpVM5zdmInL8NH6UP09ZJ2tmKw62ELYHWySV8vuXOVZN3V/3WihPa60p2w23H0Hrp2b5qeg==} + peerDependencies: + d3-scale: '*' + d3-shape: '*' + '@dabh/diagnostics@2.0.8': resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} @@ -731,12 +877,12 @@ packages: cpu: [x64] os: [win32] - '@grpc/grpc-js@1.13.4': - resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + '@grpc/grpc-js@1.14.4': + resolution: {integrity: sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==} engines: {node: '>=12.10.0'} - '@grpc/proto-loader@0.7.15': - resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + '@grpc/proto-loader@0.8.1': + resolution: {integrity: sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==} engines: {node: '>=6'} hasBin: true @@ -894,20 +1040,20 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jitl/quickjs-ffi-types@0.31.0': - resolution: {integrity: sha512-1yrgvXlmXH2oNj3eFTrkwacGJbmM0crwipA3ohCrjv52gBeDaD7PsTvFYinlAnqU8iPME3LGP437yk05a2oejw==} + '@jitl/quickjs-ffi-types@0.32.0': + resolution: {integrity: sha512-v9T+GQpmk43VDJ7d72sf0Nexhk+ArvtUihW27dy7lqAl0zBObFKtSBBIm5RBjwIhE8VwsPPm9PNuvPvNqLWUEg==} - '@jitl/quickjs-wasmfile-debug-asyncify@0.31.0': - resolution: {integrity: sha512-YkdzQdr1uaftFhgEnTRjTTZHk2SFZdpWO7XhOmRVbi6CEVsH9g5oNF8Ta1q3OuSJHRwwT8YsuR1YzEiEIJEk6w==} + '@jitl/quickjs-wasmfile-debug-asyncify@0.32.0': + resolution: {integrity: sha512-EX8zbXwGqCgAE764M+qvkHtyXDi/FUoMBea0JnES7vCM3P7a2+EOZOjGv85wtZ2sJhI1oJ+nekmqpOODFDY+hw==} - '@jitl/quickjs-wasmfile-debug-sync@0.31.0': - resolution: {integrity: sha512-8XvloaaWBONqcHXYs5tWOjdhQVxzULilIfB2hvZfS6S+fI4m2+lFiwQy7xeP8ExHmiZ7D8gZGChNkdLgjGfknw==} + '@jitl/quickjs-wasmfile-debug-sync@0.32.0': + resolution: {integrity: sha512-LeYWrPGC1uNCTBWvibo3ZLJj0CSVNYUXvJpXMCmuQ5Sap2cCACc3uvGvYV4homHHBAzfw5akoTqMMS4YFRtw+Q==} - '@jitl/quickjs-wasmfile-release-asyncify@0.31.0': - resolution: {integrity: sha512-uz0BbQYTxNsFkvkurd7vk2dOg57ElTBLCuvNtRl4rgrtbC++NIndD5qv2+AXb6yXDD3Uy1O2PCwmoaH0eXgEOg==} + '@jitl/quickjs-wasmfile-release-asyncify@0.32.0': + resolution: {integrity: sha512-3oSwPfja12ICz4aIblB58cuY8JlEq5Txt8Cut4VLo+LH47QN+mzCnSgnbB03hWzg1LBcc+VyyI9UOag7a1NF+Q==} - '@jitl/quickjs-wasmfile-release-sync@0.31.0': - resolution: {integrity: sha512-hYduecOByj9AsAfsJhZh5nA6exokmuFC8cls39+lYmTCGY51bgjJJJwReEu7Ff7vBWaQCL6TeDdVlnp2WYz0jw==} + '@jitl/quickjs-wasmfile-release-sync@0.32.0': + resolution: {integrity: sha512-BKNDI/TPBfGlLNGYpLrhcDGXmIk4xHm4MRAisOBnOzpXVn9HZWsfmMAc9WMBrAHjvvds6HOikKeaOBKdPdpVrg==} '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -952,88 +1098,143 @@ packages: '@microsoft/tsdoc@0.16.0': resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} - '@milaboratories/computable@2.9.5': - resolution: {integrity: sha512-rzLJ6fjXcNL8jb6vexGR4d8wUGvrwC2CyjkMLU5GFy+7Q6lg1wTrJnu8fzDVhS2OjEEVbD+RTE7AGvK5pYYSMQ==} + '@milaboratories/columns-collection-driver@0.2.3': + resolution: {integrity: sha512-3rNWmuQGvEaBEzGMHIWeOi1p8j8sMDpnPKNUQvT0Ji7/ArvnfM5HK8dywxB+n3mLK8c11lW16+auM5xuydJXGw==} + + '@milaboratories/computable@2.9.8': + resolution: {integrity: sha512-X0ZtxOnIJlAd9Y7CyBtWSKHgVuTKXbIryMwJaoYSEz0gY3JZVnsD0f59J/lwe3Key0/lSYh3EbL/pP5jACIzfQ==} engines: {node: '>=22.19.0'} + '@milaboratories/graph-maker@1.4.8': + resolution: {integrity: sha512-Fo3wjr5lqSciVJddD+GbdzecK7+Oqab1d1SMWcDmS5Vr5j0djpPkG9pPpOUn1aQlrYV9Lj9yWte6pkzHJ1+1+Q==} + peerDependencies: + '@platforma-sdk/model': 1.79.14 + '@platforma-sdk/ui-vue': 1.79.14 + '@milaboratories/helpers@1.14.2': resolution: {integrity: sha512-zOkD4aWNbembwI+AsPTz7nmWC1VPA4rwGBc+Nd5jPpKVh7rCtZwQrlOP5mVqRVMKIAjb1nU8kzzCGfqNPqfJjA==} engines: {node: '>=22'} - '@milaboratories/pf-driver@1.7.11': - resolution: {integrity: sha512-p9dANGg5VfSMIM3ysEUjQ86IfoPRqnww0kmhuaPI4h98kb+7CGbUz/XM0DFq4jALua1fTC3TxuMIY8JV8SJT8Q==} + '@milaboratories/helpers@1.14.5': + resolution: {integrity: sha512-Kiy0g7sEmFQxDwtnmTrdJ8XdUK0IDAB5ZnPCNEbK7lPGHIa+xG3kzfeR4y44QBdrYaK0NwG63D8Fc7dlv9KItg==} + engines: {node: '>=22'} + + '@milaboratories/miplots4@1.2.3': + resolution: {integrity: sha512-rhoF7iRcJWKUqJMQq8y84vlkqZn4Yk7tOV8Zef+W+GqVt9UYgV1XLJu/+Wp1GcsUVtPP8Xs5CRgfA/YfV+a4Hg==} + + '@milaboratories/pf-driver@1.9.0': + resolution: {integrity: sha512-OhMsf1jNMp31wRCrXHMU75WQj48Nc/lDeYTo4/6R6+FLYBYkK9yWgsSH+02V4WCKbUqsyF1Xy0+O+qsYjpqUDA==} engines: {node: '>=22.19.0'} - '@milaboratories/pf-spec-driver@1.4.13': - resolution: {integrity: sha512-1ylUmz0AgPSRE5DfcNxydv4JVaj4hwCQ1VCW+BWElSIRvlL9IaS4FWSckechQVDb7El9vSTRkrJE5IPx9T2z7A==} + '@milaboratories/pf-plots@1.4.6': + resolution: {integrity: sha512-NxUr9fFW1CP9CrV3osd2mjPNor2REawnwNuOLfCOJZvIqZj9hcoWJl8V76Zz6U8ruT7xo3od/rYMf0VUfsCktQ==} + peerDependencies: + '@milaboratories/pl-model-common': 1.46.1 + '@platforma-sdk/model': 1.79.14 + + '@milaboratories/pf-spec-driver@1.4.16': + resolution: {integrity: sha512-x6SQVUU3fl+1fFavCSzc1DNMB08HKoo0PT5dpXJWAi6oEw77yueoe1StZJVY0Kgj1BpVhlmuuC87PJu8s4eFRw==} - '@milaboratories/pframes-rs-node@1.1.50': - resolution: {integrity: sha512-XshCE3Z9+tAKszlWCSDYJnpYRTIsag8v3YcjPmP6//W3dXDDrqi6gBqaGI0u58V9C3PLCjP3zC85vmtI5L26BQ==} + '@milaboratories/pf-spec-driver@1.5.0': + resolution: {integrity: sha512-XWXrKCyCwcqS8EcukuyDqvMq0D6qt61zrkb3qGpWKyy0SVQNzXC2JL0ThCM2uGI7QQelgV0aagcg8xU5pGKWPw==} - '@milaboratories/pframes-rs-serv@1.1.50': - resolution: {integrity: sha512-XFWRsTGLCfQZhpRlWAmmBfznWyKL72dXY8UFTK+gmI2SOFdxQb8CJc0v/6LgNohwTKRTZZr59K9eRP3v8gCK6A==} + '@milaboratories/pf-spec@1.0.0': + resolution: {integrity: sha512-JIOhJdDHcKDItjlxOT4wVmnjejoazM69qK5ylu+g5q65RIcH/R5MF2OGiu9nV7QbLEXszll+EVnvx6jYhuE44w==} + peerDependencies: + '@bytecodealliance/preview2-shim': ^0.20.1 + + '@milaboratories/pframes-rs-node@1.1.56': + resolution: {integrity: sha512-H6qltcR+HHb2kAy0U0zP90rqmv/MZGGkdXIyf89FUZTpoHOlXG4Ahxq7wXp9vviUczci4cLl2L0Q+dL2XGcsUA==} + + '@milaboratories/pframes-rs-serv@1.1.56': + resolution: {integrity: sha512-Pi0CRuvkfL+PqdgQ8im0MW5tqVjUvJ8hJbOG7v5pS45adg8tuq4TyrAoWN7un9ZWQ6KRLypUD+7eXCwhjOwADg==} hasBin: true - '@milaboratories/pframes-rs-wasip2@1.1.50': - resolution: {integrity: sha512-FHv6Cksyl9q9plIhRUzNP0cQ03aZVltNh+haZ5KGVNHh9e5PgP9ndnTP06bQ1JRyQ/6Thf1NF5yw1lBXp6J+uw==} + '@milaboratories/pframes-rs-wasip2@1.1.52': + resolution: {integrity: sha512-0rb0We6Q/aqrHJ062dayvLb4RExODZdqfsVWdzeHq23alY5TjJRMWsO9aKQpPnOuUKjAimdjlp+Ldq9TVhbEtg==} + + '@milaboratories/pframes-rs-wasip2@1.1.56': + resolution: {integrity: sha512-54bhC6XCAVO09J/sqVwEKA4hhTa27BDDNdH8BE+6+LvjBVkg/qq2/f0MzdrVijrmagbr97F1zgj5wIgUqwCSoA==} - '@milaboratories/pframes-rs-wasm@1.1.50': - resolution: {integrity: sha512-D7YvFltjAk+OLCC/5/U741Hipxof4v/t0cJbk+y38MJjx6PyGQhAyVP/J4XfbJgdFdTGdDidRCNGYLt/Jn8l3w==} + '@milaboratories/pframes-rs-wasm@1.1.52': + resolution: {integrity: sha512-Wn8/LJxcsvWSSpdymdebWrBnmgu9wAbzvOiHCtXz7Aqt1M2T8Xp9a7CprzCYx+EvhSuAuoxbq6naxkPsQrbkvg==} peerDependencies: '@bytecodealliance/preview2-shim': 0.17.9 - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/pl-model-middle-layer': 1.30.5 + '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/pl-model-middle-layer': 1.30.7 + + '@milaboratories/pl-client@3.14.6': + resolution: {integrity: sha512-IPzh5bSibr02DMKpwlCW6TuHVxaDe2o6tjaEJ4P2y5lshRbe5SBR/ne/G/N7E7KEKxmpWq7ZapOCLkLyvqFFDw==} + engines: {node: '>=22.19.0'} - '@milaboratories/pl-client@3.11.4': - resolution: {integrity: sha512-tsbZLVBC3qr3bcJ1mAvkKSJSjrOkh+OzI4EACOZ8V9eS1M08ooDF5L2JkhUPceCsNr78vgkffZFwwHIbPMtHrA==} + '@milaboratories/pl-client@3.14.7': + resolution: {integrity: sha512-HIjPfGAYRRD0hbq5YSTkWt5XgBiv+yYtw73EjWLxui8eUEeB2ffdgsvH7IhVx2oXjUOL4p7M4i8PBnmdJ3830w==} engines: {node: '>=22.19.0'} - '@milaboratories/pl-config@1.8.2': - resolution: {integrity: sha512-FG9rlAKDf1rwlg+3G9OG2bCKISNp6ajM27W7ODDSsWE4MSCVxhYB172UusbohY2RDmaD9GI5pDKO5O9uoHQCCA==} + '@milaboratories/pl-config@1.8.5': + resolution: {integrity: sha512-XnfYXSSkRxeImQ21k6I8y5apisvagcSgMGfEeyRxNdSGwUVJbbI8TwJk+XBEDQ4lErW8oqtLxKjFQuHJMzRUoQ==} - '@milaboratories/pl-deployments@3.0.7': - resolution: {integrity: sha512-llf3PeNr7/+t7I4LDwgSzqt+fcrV8YWbzv1LWJXUXOL2VF3wArBoSLmzFr3SiRD5hIUcCDEA3QHWXwXTzth0kQ==} + '@milaboratories/pl-deployments@3.0.15': + resolution: {integrity: sha512-+i3bdvfPCXLZ789f5fRdtrbil3/RFyzSBNMkULcnyKY5u6GRZLjWDBC5aSE75PRTWx3Fxf743Fj9L3B6loMSWw==} engines: {node: '>=22.19.0'} - '@milaboratories/pl-drivers@1.16.0': - resolution: {integrity: sha512-9yAJ8YhE4fxFgqEllrHCsXCBdGNSF7c0SCQ2PIi2tYRR3++Dll7g+zOA0WDaOB+8eBAxYiqFvhsdfbCizwCCqw==} + '@milaboratories/pl-drivers@1.16.15': + resolution: {integrity: sha512-mVKIEHVOeAPdwSZZk+URAFD6zoyPiAARinpDfihDvkFcrlTLIzeoOvnQNPG5a8jqc0GiW+a9mnTrfjG7+n82Ww==} engines: {node: '>=22'} '@milaboratories/pl-error-like@1.12.10': resolution: {integrity: sha512-iHmnLG5lxJqcymUmEL8onCDGEADk1S/5RNACQ5yfTCNcCkUc+7hYrDHQpFmWXPPGC9sG+NTBxt4wr5m8UsLm2g==} - '@milaboratories/pl-errors@1.4.22': - resolution: {integrity: sha512-A4jEhyXEeHb03aRpUGWxILGTfNwYii/BgmoZ3TVv5q0iWnApoiVUoy/MXtaed4QeUs8FZlOhZfOO5AKq1yaXrQ==} + '@milaboratories/pl-errors@1.4.35': + resolution: {integrity: sha512-rq5Lg9G7ax+LtMPdrkZg+Pdqk28JViiS/KIcQfk0Cg1ttZoAnhDhFIh6rAFy2eGybPtlzXqM32/ODKUSMawc8Q==} - '@milaboratories/pl-healthcheck@1.0.1': - resolution: {integrity: sha512-eiYd/TFm18SW4EY8vkI3c+fcPnjUu3Hd1GnPLWCN8U+dNmp/tnrzfeCgaY4xO/s0vkHNX9E7IrsQiMg2Ioz4rw==} + '@milaboratories/pl-healthcheck@1.0.5': + resolution: {integrity: sha512-ZkQti4VU2FapJBFRtZGfR5NDPXEAEFgTf/NfemypgY0aA75fFPi4/c3BpXX5K7dht+JOgHqkMrBHxKIuE2T+fA==} engines: {node: '>=22.19.0'} '@milaboratories/pl-http@1.2.4': resolution: {integrity: sha512-QKmhx+WEvJCV9dUy/SBdQk/ApaJ5ewBFgm/b+XPlS10SusAdqUUTGvK5+hq8YSuUMXlHb/dk++UtI5YlDuDl2Q==} - '@milaboratories/pl-middle-layer@1.64.32': - resolution: {integrity: sha512-tBBTm3EsVfJQDTsaUbG/gD889etZGS2qmOS//51l+YCtWzEmPmnNDvMHlI5rmIYOtuQJH91ZmvFEPj3nGCweqw==} + '@milaboratories/pl-middle-layer@1.66.19': + resolution: {integrity: sha512-rFBmJDdBcIrdDHz730p3sL8+7uUs7VimXYGQo9IbayxmAlp5mnft1XlPUTuVbwx5QeRNGv4Cwya1T+7WL1wSmw==} engines: {node: '>=22.19.0'} - '@milaboratories/pl-model-backend@1.4.7': - resolution: {integrity: sha512-OSe9s7HJ5bVbggG9gF5/sPnvW3gqQsICeIQeT+pe2i/HvxNoL/YNvvJhcNaGc3D+TNKzu4GIlaWaRQfiYffzNQ==} + '@milaboratories/pl-model-backend@1.4.20': + resolution: {integrity: sha512-AkV+PhmQms6WPwR3E75THrkD9fFE7OpfsIUC297HvnFUoCFXR6GOMGPworA/qipXReTmv192AqBpuaLdgAngyg==} + + '@milaboratories/pl-model-backend@1.4.21': + resolution: {integrity: sha512-Z2z5J8bglslgXXoi1aySi1ho+/d+ylJiuEaRw9XTNuE5iBM3EQPe0rw095pXGOinTlMpmvUcCI2wkVCraUQ1dA==} + + '@milaboratories/pl-model-common@1.46.2': + resolution: {integrity: sha512-VEeauisApYScvCS8lnK3zpFJ520xuTAodKJmjR8ulHcMrWMyWMfHEdGb7j5OMD0mM/OwTgmQrrJ5eB7Xd+xoOQ==} + + '@milaboratories/pl-model-common@1.47.3': + resolution: {integrity: sha512-tXmKujm+6ru/Fh9hr9H3iRBWbS+JE0Q7FNualtzJpijaB3SNtScR4erLTamdANv5RYNn7kbYpDWr6wAjAOajrg==} + + '@milaboratories/pl-model-common@1.48.0': + resolution: {integrity: sha512-oCVrjFNmjQolb7YWnbSGHnp6GGVm1PhG1lnNABp9lqYjvA2ISjIPQLIo/vT2ca0mqwLrEvbuRqiqSFOg7sQ5tQ==} + + '@milaboratories/pl-model-middle-layer@1.30.7': + resolution: {integrity: sha512-rs9x3Ron4ujR/UOdEgB8WUB1SvZ8ZAScT1Av/e4or+iiQ/CzhmK9nqtYamHVwKV+JgwIFbXQwxGvIHDVz955dQ==} - '@milaboratories/pl-model-common@1.46.1': - resolution: {integrity: sha512-ABOz/w7dA4t2zUpZHXI74MTNW6LmPFSLxgfhOPFdO6vodIY8draVN+ag2U21WlYIoSgdJwSXJrXJWdu1cefrIg==} + '@milaboratories/pl-model-middle-layer@1.30.9': + resolution: {integrity: sha512-fnrCjWPR0HeytWC3rnHkY3bpNk3UOuED+lwmauhYBKRaF46cV1df46clJSkGNZHS9g439SYwclW4no2X/ALaFQ==} - '@milaboratories/pl-model-middle-layer@1.30.5': - resolution: {integrity: sha512-TSpemA65REZay1ObnuwV3QLIjN46Iluy0HUu/aiHMQ1d1BFAG2vrgvonQqTnxp7UKQYOr9RGJg/QDYG/+UNKMw==} + '@milaboratories/pl-model-middle-layer@1.31.0': + resolution: {integrity: sha512-D1vyGABBtCYyp2IhKd9eMoZtKUj1wUYpIzz4Xz5k+bfJWGEF8GmZGiOvO4oOvrsEsXlG4NyO249MnBKmHFcppQ==} - '@milaboratories/pl-model-middle-layer@1.30.6': - resolution: {integrity: sha512-x6cj1sNAayz80odDf6RbXnJDgj01Lc+NB+5IVyMk65o3cGt6ml0IbiqaDXGMJYUDkt1JSAj3EQpPha2YDDfYQg==} + '@milaboratories/pl-model-middle-layer@1.32.0': + resolution: {integrity: sha512-X1iLGgOwzkw8mQ/GfTxfOTJakBJ26np85h5HqUziMbVkFL0SR7wpd7xpgUs6TKVkYNM8viAv3iA2k63Yc5SahQ==} - '@milaboratories/pl-tree@1.12.12': - resolution: {integrity: sha512-IREZbJZ1F7QerUyzcfPg0HQCae/FPGXoNbxwsecLC+JiPAVaRdcz+uNTpBlPVNEeI9BT88fJmDhfjts5bbeE7A==} + '@milaboratories/pl-tree@1.13.6': + resolution: {integrity: sha512-R3wnMjbCNfAsyGJe3FQOqEyrNePd9ZCwkjDj2ps7d9oeiJ7QX6hYkIVuMlq8IQNYOJybfHc/dFEvWeYE3uAAZg==} engines: {node: '>=22.19.0'} - '@milaboratories/ptabler-expression-js@1.2.30': - resolution: {integrity: sha512-6yRo0T6rpt14WEC++F+uuFGunnGF8ApCeKnvkysTsKxo+hALGPIQbobcTFN1gtQADnK6DI6huWQ6MxQpjBgbuQ==} + '@milaboratories/ptabler-expression-js@1.2.31': + resolution: {integrity: sha512-VB3fxuVqc0Beb+3/ge9uZ39uU8YqAhck9pTIxTpNZ5hOfMtPGJEI98YxoJQ8BuYhyyx5SM5qMU04NNs/vdk46A==} + + '@milaboratories/ptabler-expression-js@1.2.37': + resolution: {integrity: sha512-urVRk4b5Jse555euNNITlOJ437McZVtBnC5h/E6O+iHm+hfNIi6OP1aAD5ai4jOpHllm85zW5Ne7hVyyd71bJw==} '@milaboratories/resolve-helper@1.1.3': resolution: {integrity: sha512-38/dW/XRZQREOxAOOKtO0lzEWPCP/DH0qhB3q1kYcGoN++5V92/zbVwbYrMDeDcjTyo+D62iIep+sKXeWHa7Uw==} @@ -1046,22 +1247,22 @@ packages: os: [darwin, linux, win32] hasBin: true - '@milaboratories/ts-builder@1.5.2': - resolution: {integrity: sha512-aSqGW/3JdlQrnIYJVQR2z9bO+iYSGHg84xzXW0kfVo15dewvlfckhVs/4YVhTTZdO5xbgfhEsk370q1FcOgNaw==} + '@milaboratories/ts-builder@1.6.2': + resolution: {integrity: sha512-6pS36U5EL2IBLIpoP0/5oSFA9jzjcJmYhgEODzt5kglovTzJuh15nEmJMeChr0OpFtGFjQT6o37qHerDGETIpA==} hasBin: true - '@milaboratories/ts-configs@1.2.3': - resolution: {integrity: sha512-NALtuzTbSzAz2Uk7X1sWq3rBo4XAV/vAQ1Mf7IfiNiv1euZ+0+TF0NDJMNiEcU6BT/Q55dATSKhIY2r680ljXw==} - - '@milaboratories/ts-helpers-oclif@1.1.42': - resolution: {integrity: sha512-qbhoxfOXG3SeODsgEcedf4WMHVJVFXdgBgK2zIvkB+vC5OTBjZKo0MSo1ILRXovR5C319BCo0no7SNZY8l+3vw==} + '@milaboratories/ts-configs@1.4.0': + resolution: {integrity: sha512-VzU9D+RiggsG4VYteJSBN4o8IjYae9GbZ8MofikMJQLOI1Ir9/pVyPXXGnG/TAGvmcjbK/psAiZVGSvI5MBPGg==} - '@milaboratories/ts-helpers@1.8.3': - resolution: {integrity: sha512-HK3AmNZl2fOzMHot2+ihKsOC+fluwhl5261VTn1zGS3LRpmC9bCk/po8SzsVmg79ccI5nESFTdz+BRaLsXncmQ==} + '@milaboratories/ts-helpers@1.8.6': + resolution: {integrity: sha512-ef01tARUl+0Urt3x8HHAByrhYHg4Rnn7WiFyJ+joZFZl1T1pUKTgfB7Zxc8Cn06HIl4i6H7s5OSymjZePIGqfQ==} engines: {node: '>=22.19.0'} - '@milaboratories/uikit@2.15.8': - resolution: {integrity: sha512-kyG9VJI7zeX6XQIu+93qFJFTvoOeoW7AqNdtkrTmSHet4FNCdYfp05DKA2lku6WuiYg/bHfpEhRLbu7US8Fs9g==} + '@milaboratories/uikit@2.15.11': + resolution: {integrity: sha512-oBQiPXpHEwg1dLptfCQNtpRrJ3stunjrTWiP5U90rAXl4c6Z/Ks7YU/fVvoqdBsoSBQ6nEcAG0Sk4sV8DVRlJQ==} + + '@milaboratories/uikit@2.15.23': + resolution: {integrity: sha512-FrZPJsa3jry4juVofR42IPCHv+oKPAcdBL+OidX0/S2lhIAsCIrEKBcAN3yzWd2yvyAPb3qzt0hbwpuTY0UVlw==} '@napi-rs/wasm-runtime@1.1.4': resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} @@ -1089,16 +1290,15 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oclif/core@4.8.0': - resolution: {integrity: sha512-jteNUQKgJHLHFbbz806aGZqf+RJJ7t4gwF4MYa8fCwCxQ8/klJNWc0MvaJiBebk7Mc+J39mdlsB4XraaCKznFw==} - engines: {node: '>=18.0.0'} - '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} '@oxc-project/types@0.132.0': resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} + '@oxc-project/types@0.144.0': + resolution: {integrity: sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==} + '@oxfmt/binding-android-arm-eabi@0.35.0': resolution: {integrity: sha512-BaRKlM3DyG81y/xWTsE6gZiv89F/3pHe2BqX2H4JbiB8HNVlWWtplzgATAE5IDSdwChdeuWLDTQzJ92Lglw3ZA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1405,15 +1605,91 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@platforma-open/milaboratories.software-ptabler.schema@1.15.14': - resolution: {integrity: sha512-BBbmfUi3fS40HmMbYKGuRNgSPo4kAk/vk+dUK3fyabbjGncKZTm9W4vZlqH2JJX0VECIROR4FrvGvF91yRyVwg==} + '@platforma-open/milaboratories.runenv-python-3.12.10-atls@1.2.7': + resolution: {integrity: sha512-vJiU68NKgyupW5meeWB/pZZ8y5wewPV6/EcRQ2BwUhSyikDQrn83XzBlc/nTu9UmbYmBqQTrt59x0qKtcC0ILw==} + + '@platforma-open/milaboratories.runenv-python-3.12.10-clustering@0.1.1': + resolution: {integrity: sha512-hnr1tf0dwoqTyjtUVZcwQm13O0V8kz4jCUz+yvOgdvWMrbg4o/h1KbghtM8HivI+tRoowc629QJWdy0bc7inQA==} + + '@platforma-open/milaboratories.runenv-python-3.12.10-h5ad@1.1.5': + resolution: {integrity: sha512-cuGk6NMBocvNePoMTnDW4z8eIF5RQdDcgwuPHg9atW9/veOOp02p5jk0EwxmnbMSVV0yDwRMd+0crQAQqW9bCA==} - '@platforma-open/milaboratories.software-ptabler@2.1.2': - resolution: {integrity: sha512-pCPA9oa4MPZ8mw7tJRjp4Zy9e/xJL9+tWKlSVXd+PbSkAqZoPTirf1izWV/NEZhhM7w8przq4jGhbqj6ukkCRQ==} + '@platforma-open/milaboratories.runenv-python-3.12.10-humanness@0.2.0': + resolution: {integrity: sha512-YjKFPXe+caABLre5oZTwAxFHvVCEb5K8rVTEIUBhFYMtfLipVIix0LXi6LxWoOYdhoEeKgIc4zlWFDKs1xaEoQ==} + + '@platforma-open/milaboratories.runenv-python-3.12.10-parapred@1.1.0': + resolution: {integrity: sha512-nEM4eEj7pFT6yi+P5028qtgK5v9A9H0XdVHDtrKX7xW5Jipc1RIliOEU3gzaH0E7UAzPFQGSqShlwakRcGXwdQ==} + + '@platforma-open/milaboratories.runenv-python-3.12.10-pgen@0.2.0': + resolution: {integrity: sha512-+4pEVwRZaBAm0716NoNdK9cfF4E7jtsRUpcAWYCuPbbZJ3Q7bgfgq8bEhcck8No97l9jWN2rAeJegA9UQy5FgQ==} + + '@platforma-open/milaboratories.runenv-python-3.12.10-rapids@1.7.2': + resolution: {integrity: sha512-rCG+R9WjdopEtEgJcSWNRIWhpo1ABGnA7rPn0BF6ufvLOtKXOGtaGENI7BJlkEaLb2Cbh2XUUgS5l2r5WGhIRw==} + + '@platforma-open/milaboratories.runenv-python-3.12.10-sccoda@1.3.6': + resolution: {integrity: sha512-NAacPe2uFxf5zqDAa70bblP4ZicvA52lVyzhV7IzlyeEIClAsGatLbitMnRghc2TepwYhQY4EbvElkKDFaSSGw==} + + '@platforma-open/milaboratories.runenv-python-3.12.10-scientific-slim@1.1.0': + resolution: {integrity: sha512-CSLEjBYUdHDf66QAfgQ9jo+MoW63Wr0ygdIncJE2siO2jMUzYCqgCNd8bMjaMfZa3YBC9bHca3Cjxbp4VYc54A==} + + '@platforma-open/milaboratories.runenv-python-3.12.10-torch-cuda@0.2.0': + resolution: {integrity: sha512-PRGkgsVY08tQvoucU8fJmeCF+x9XjiHHjNTbxWqddqx2EZpiUvmylkxtU8i8xJW13cesAI+xHv3NsVUXQaRDqA==} + + '@platforma-open/milaboratories.runenv-python-3.12.10@1.3.24': + resolution: {integrity: sha512-5ne8Fmlhu1YKB5RYgq4c/AvYzb+sUY4hzv/bKIj0E3aDgJdMYO6M6lMicDzQTMagrGRu9FIhDewIgo++TX3+Yw==} + + '@platforma-open/milaboratories.runenv-python-3@1.11.6': + resolution: {integrity: sha512-H3IR86pq0T4UOR66BZEYIkMmlhuyAiOnAP3O8y5M6A2C2UH/oCLGVYqrFF7XHWgjmacvZ7Qcz4KDtIxgJpFCMw==} + + '@platforma-open/milaboratories.samples-and-data@1.18.1': + resolution: {integrity: sha512-Zyo2Wjwiqyr//ULAgQGdNXsy/XFtw7kS8lpeCw2pypYaWwourYlU+wZ7k8VlB26UZDJxBXCZResFLYc2trmNEQ==} + + '@platforma-open/milaboratories.sequence-properties.model@1.3.2': + resolution: {integrity: sha512-lgLCa/cYagrzndprd9zij36zUyjQqxyKX8HTtVIeHSW9wwv9ePFqUpYM91ZquyT1VzRQJQjV7hjV5yYDo7FFrw==} + peerDependencies: + '@types/node': '*' + typescript: '*' + + '@platforma-open/milaboratories.sequence-properties.software@1.2.1': + resolution: {integrity: sha512-BwDEP6AUWQVvGYRTmH9eLdecrHvL8SPW83ZTaDiMEGQU/e2blMMBbGHTTqHdZULLwGvZHyAu7MsgtcN4NAvQGQ==} + + '@platforma-open/milaboratories.sequence-properties.ui@1.4.1': + resolution: {integrity: sha512-s0vrTVuXHmQ7eeQP3/rQMjhRC1o13wBk4v19MN+y3O4H4NZeOO70ld0VO1woaaklz0Esvpx4ZvyPhUDdQ3ljMw==} + peerDependencies: + typescript: '*' + vite: '*' + vitest: '*' + vue: '*' + + '@platforma-open/milaboratories.sequence-properties.workflow@1.3.3': + resolution: {integrity: sha512-Sj0cB3NyaTBWfMg3immQaEOSVQvQu/0aQ5alFKpV6Dg9weJ+iMMBIaoh2wGsZXPYTiphbxB63r49KVkNBBN6xQ==} + peerDependencies: + vitest: '*' + + '@platforma-open/milaboratories.sequence-properties@1.5.2': + resolution: {integrity: sha512-RsLYUzUbZbGcjpNSOV5xOzeqvITQsdAjlcKW9z/nwuvNCJXS3tnSQy9Z5s7PvDKyx1Q6POwGyEGwYv1AQY371w==} + + '@platforma-open/milaboratories.software-anarci@0.0.3': + resolution: {integrity: sha512-BtzWsu32K/V7Sw3uCS/lzkILoI+JVHYl7mE3PNf0UEj1ZImjlRFuMFbo/t8LpywYTAGdUIwR9cu2i6ayq/hDGQ==} + + '@platforma-open/milaboratories.software-ptabler.schema@1.15.15': + resolution: {integrity: sha512-zvPuRZgQyxjED+txJVgWHUOPeRp4TG1jOrJOtuw9WnwxFiHNjQHIB+Xe1j8f6skgMqZgRSQvEbhRvqbWjGmhKQ==} + + '@platforma-open/milaboratories.software-ptabler.schema@1.15.21': + resolution: {integrity: sha512-3EWO64poe5VcBIgVIdIFHwN7nPi000kPuaRmlVt3xnnQZqXUYDFNZfZ2Mc9/mE1Eq3FLwQxcy/5mng7LvgWnXg==} + + '@platforma-open/milaboratories.software-ptabler@2.1.3': + resolution: {integrity: sha512-4cikdkdJ5WYc0Nw3IoZxzlFNKvG1qCAqSjypq5b18pIK6LBDayzhFcuw5TDd8O3bAFhoHP+3cVTmoO9XUTYMRg==} + + '@platforma-open/milaboratories.software-ptabler@2.1.8': + resolution: {integrity: sha512-28dKwcKNIB/8OYH6l/li7Qa/aE2NgDVtNUmN8v6jZsLKT59ogFclz8ZrQ+OiQFzHQCLBlWBt5TdIHfHPxBaNFw==} '@platforma-open/milaboratories.software-ptexter@1.2.2': resolution: {integrity: sha512-I08YpKQ4+esLrfpVra5UJ+bznI9Zzba6OW0rKK407a1EUmanvYMVrCbM9gqnm6CHbv2vQxNGSaO8p1LoBh+9gA==} + '@platforma-open/milaboratories.software-ptexter@1.2.4': + resolution: {integrity: sha512-4ZqhqksSNVKWhEB9WwrL0rU89G+00ulzH1urYyNA4EdBVGA4mwbKbw0K/zcwce/oUYYMdRl+epXmr0w9wHyNzA==} + '@platforma-open/milaboratories.software-small-binaries.hello-world-py@1.0.10': resolution: {integrity: sha512-16BGRLIrsVW+YIaXwWLX6Nbm80PS5mQJEclHhjNbRrRTLHPaKI4RygZfBC0lLNzvHBiTXU4Qkh1+WmdovkshDg==} @@ -1432,30 +1708,50 @@ packages: '@platforma-open/milaboratories.software-small-binaries@2.1.1': resolution: {integrity: sha512-KN1PR7YgUUfx1dxh/TtcoWpSZbOXbRxXzQuJ505qHuXuE0spYwC7bXnvJsEYbEwRcPMa0foTrjBnPNORE4yr+Q==} - '@platforma-sdk/block-tools@2.11.0': - resolution: {integrity: sha512-zJAPVOsgB/XvnlmrhiJUAHDl+MBSolo87nLIQVc+r6oQDDrpySUX4ztuOv/W9i9tnhjoeVeLtbySifmhdAn+Rg==} + '@platforma-sdk/block-tools@2.13.0': + resolution: {integrity: sha512-xKiTmNLjfxCnnHRr9Q4ct3HdjLfkbLztvxpU++/pek0R8Bj/Lezeoji+eLpxAAYYUxjMr8jLj935eLK5MqKrSg==} + hasBin: true + + '@platforma-sdk/block-tools@2.14.3': + resolution: {integrity: sha512-CD0NPfUoXiJhl6JArC057oCXbqKkJf5HJsmrlZShnh6lKRaIQlibF8VUqbpBi9+PopsGCQ4/s5HnLR7wQoWDzg==} hasBin: true '@platforma-sdk/blocks-deps-updater@2.2.0': resolution: {integrity: sha512-p9lBxhFXM9WoRsrJO7dfkiXSK+1m63yIn1sKhBO71eMbhrLMyVYHEOeNf3w5OCdbRF5QsNhXzWuiTmFK3zHFsA==} hasBin: true - '@platforma-sdk/model@1.79.14': - resolution: {integrity: sha512-ywF+pV3twqbZfuGv+fphE7HKZzYY9/xYIM9gvhM3Ps/qusIf98997C8Ickky1uHd6AHk8YUX78HCR4hJkD7FyQ==} + '@platforma-sdk/model@1.79.20': + resolution: {integrity: sha512-0ULETzwgo4E5rIddn/PoCAY5gSv9luDYAaSp66b8u3u1XTh43k7fgOpobu/rrfHJMiY9IGfzALDlo6jtvMLUyQ==} + + '@platforma-sdk/model@1.81.1': + resolution: {integrity: sha512-pyCcCzMu+L0ELnNQkpmYMNw+A70WWCXng29WxOVllMTvFvr6/BaH4OUOA2q8ocseUlKm6qFQiRxmZTe53AcvlQ==} + + '@platforma-sdk/package-builder-lib@1.3.0': + resolution: {integrity: sha512-CdBjmNo6E1fBxKYWaXa49L/L2WLURxs2f1TAqxLIZlHRE4DZ6E1TEj3jNNKESWp+/9rwtLkTAzmTzNPrDgz+2Q==} + + '@platforma-sdk/package-builder@3.15.0': + resolution: {integrity: sha512-YzRiBYAaKvwnUcJgl6JMB3XLJuhlH72L8RZE3CDt2GM8hYRH4zaDzomfC5IHYNodK63RMaduzcvE10ICruI1hQ==} + hasBin: true - '@platforma-sdk/tengo-builder@4.0.8': - resolution: {integrity: sha512-FOMj0LCBRWHKuKKOHUxqZX3uhaC4OayGzw0YBxbye0b7d7uwhH2KjdrkO70uHRy64z4U85pjIR2TrwAQC8qUgQ==} + '@platforma-sdk/tengo-builder@4.0.22': + resolution: {integrity: sha512-8+zDYDFFI2tQS7dplTcxgQdUwzt8+IO++sJiVbwBgwSg1Giyc2qMThEYPLK3QNFArgCsIDR6wQuS8t66pJsRPQ==} engines: {node: '>=22'} hasBin: true - '@platforma-sdk/test@1.79.14': - resolution: {integrity: sha512-YswflyuQRmZ6pgkR0+gL6YN38bt/MFuugnBG6NJpjkda/SSoXaiIb3HcBNw0Y+mpyAQPHMoSyHr7ZyZGpvZVDA==} + '@platforma-sdk/test@1.81.3': + resolution: {integrity: sha512-LSDJoQqpxX2G8W7ZshnYWroqNQiFoxXQlka4pEJTnPEO8YISW3lWknBhqsxMp2GyepQNoyl2WO1bfiQz+ssT5A==} + + '@platforma-sdk/ui-vue@1.79.20': + resolution: {integrity: sha512-VwBG8MKV1M2KMR2PgW+o6uxJJRCFGihaRsnkzLL8HGKM/Vr9k3FY/V929B1XAhU5y9wb1g7fKNJvy9JNEq5GiQ==} - '@platforma-sdk/ui-vue@1.79.14': - resolution: {integrity: sha512-KRc+4YOKKes1uwpKBgx9PeJozpGOS2uLt4XljgFupnoU4PyNZjw2I8ZTLtvq0Ld9o5T/ieUCRgiXgx4i4O+QBg==} + '@platforma-sdk/ui-vue@1.81.1': + resolution: {integrity: sha512-xFnehLOXDHYwDFrdtiU/NBjV0l6pEVLkthfnBjR+g2pSrHJGEL9JDrY3DdzoNUSxU4fal+Ak5aoAJR5v8mOeLg==} - '@platforma-sdk/workflow-tengo@6.6.3': - resolution: {integrity: sha512-2H83hEd+t8pIcSpz0anmWb0wesEcoXCYl9HSOcfQL9b0ro6EDf+PwyafXtmbXl2kMtkpccigbhDGZdDhoMpr7w==} + '@platforma-sdk/workflow-tengo@6.6.5': + resolution: {integrity: sha512-BIY0DongPruQ7e2EMYy2b0UtO5ziGcLvr2RWgJ8ki17VKNzW3esm/RBszGHMrTYmXM0Yw7mCSasor4vH560g7A==} + + '@platforma-sdk/workflow-tengo@6.8.2': + resolution: {integrity: sha512-AHR/Y+vbyfda17A7xY2uH9TlXiBpM8242tTO6+lj8phA4/KS6mez4GLu4ZEaASlZpX6YkQsUs5LUxYQU7pXeiQ==} '@protobuf-ts/grpc-transport@2.11.1': resolution: {integrity: sha512-l6wrcFffY+tuNnuyrNCkRM8hDIsAZVLA8Mn7PKdVyYxITosYh60qW663p9kL6TWXYuDCL3oxH8ih3vLKTDyhtg==} @@ -1482,29 +1778,26 @@ packages: '@protobufjs/base64@1.1.2': resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} '@protobufjs/float@1.0.2': resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - '@protobufjs/path@1.1.2': resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} '@protobufjs/pool@1.1.0': resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@protobufjs/utf8@1.1.2': + resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} '@rolldown/binding-android-arm64@1.0.2': resolution: {integrity: sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==} @@ -1512,72 +1805,144 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.2.4': + resolution: {integrity: sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.2': resolution: {integrity: sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.2.4': + resolution: {integrity: sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.2': resolution: {integrity: sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.2.4': + resolution: {integrity: sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.2': resolution: {integrity: sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.2.4': + resolution: {integrity: sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.2': resolution: {integrity: sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.2.4': + resolution: {integrity: sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.2': resolution: {integrity: sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.2.4': + resolution: {integrity: sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.2': resolution: {integrity: sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-musl@1.2.4': + resolution: {integrity: sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-ppc64-gnu@1.0.2': resolution: {integrity: sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + '@rolldown/binding-linux-ppc64-gnu@1.2.4': + resolution: {integrity: sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + '@rolldown/binding-linux-s390x-gnu@1.0.2': resolution: {integrity: sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + '@rolldown/binding-linux-s390x-gnu@1.2.4': + resolution: {integrity: sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.2': resolution: {integrity: sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-gnu@1.2.4': + resolution: {integrity: sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.2': resolution: {integrity: sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-musl@1.2.4': + resolution: {integrity: sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-openharmony-arm64@1.0.2': resolution: {integrity: sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.2.4': + resolution: {integrity: sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.2': resolution: {integrity: sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1589,12 +1954,24 @@ packages: cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.2.4': + resolution: {integrity: sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.2': resolution: {integrity: sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.2.4': + resolution: {integrity: sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-rc.2': resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} @@ -1975,6 +2352,1646 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@stdlib/array-base-accessor-getter@0.2.3': + resolution: {integrity: sha512-/2tQbhLpgBMfAafB9I8MWFkn3dYUUGcUUiZcbPHaAloV22G6W2HU+gUk0l4i++w/34Y9HzxjF1pevMi9wPizMQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-accessor-setter@0.2.3': + resolution: {integrity: sha512-NMvp8JNmvI9mCWmenPX749j28IBvUflsQ9WVhCRwmzrBDgf1FMUvvFFyWpcjnZI+8luwW97o9e3EzWBUIxeLEA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-arraylike2object@0.2.2': + resolution: {integrity: sha512-k5dDtnpL33vgSuHkIJjsMcNWT75SCD3daeU+S9Ucwb8GW9UJh8iWRmm1/F4OLD0dRlQx1Jrkf7Z3fUxIb8aaqA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-assert-contains@0.2.3': + resolution: {integrity: sha512-0SFOYk9DozEa/8zzKIds78ubLHP1bnL6RuqXi5Af167N8BmSUFzkl3dI/CYhGOjxOyBUIZxe38AsngkVCNYtCQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-assert-is-accessor-array@0.2.3': + resolution: {integrity: sha512-crAa2IZOPCqQMLRfIVkFMX6tJFnzTKfhCNzRXOGBmx7tOfoZoI/KHHVct1yZLv6uBD7v6hvegKdJcGk1BgMTEw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-assert-is-booleanarray@0.0.3': + resolution: {integrity: sha512-10sn1QJMZUahwCy2QTujv6Mwx+fikqVhO7m1uywozBRALltEIq04r0CKhXPWxJS7HjQ+CYg9Lx2f0l19avR91w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-assert-is-complex-typed-array@0.1.3': + resolution: {integrity: sha512-Rx9edezX8Suxh2+zQ3JtuJSiXKWTvS9drj8zWUhbdOBodtMSiqWH4UH9YM8N7BcZiYXWL99cnnIKDPXxz5wPfQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-assert-is-complex128array@0.2.3': + resolution: {integrity: sha512-C2B/mcZ9S1I2KSsWkAwIIoW0ekDXcMao0Eoa8moS6xlpX5sgDVhmB/DkL0sb+z0E3GRp6/axiqyNTmEl1dhKeA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-assert-is-complex64array@0.2.3': + resolution: {integrity: sha512-CtI7sc1pcXB2yqQxHbz6mglOHK243HV+/hO2jAqDBPpaRiY+/z6+NHuhd1lrynJBSJdFzDyTatQaLTsfhLPDfw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-filled@0.2.3': + resolution: {integrity: sha512-+npZqPn297Gv+D6B/OUkDT/3JGFdrr31+d/SGTeCzm7JQ22tGCUDmixDXwqVp9fWwB+LbjrOWrXMKluUTLcNWg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-getter@0.2.3': + resolution: {integrity: sha512-guM8IURCdDGEo71vvk4S0ZZUWVP3GvzdtYhWLJnDQPW4axLdfWTIUf13qcrUV5TRSMpfMOftSuQZf7dBGAOE2Q==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-incrspace@0.2.3': + resolution: {integrity: sha512-uzaxYUiYd8bk/wJdSBuE/Mx/jc1vr/7CtnVu9522QRq/cE3ZUPqLW12pBYo+oEoBOfHNA4CGBtdK2yNMI3zrbQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-index-of-same-value@0.1.1': + resolution: {integrity: sha512-Eyn/DU1tmb/LOTdTahIB1fEUGX50UzTNW2dzmwTVBbjHk1mN25vvjzkn0H1Eba5HF+bHdVrKXS6X+/Jt/28JcA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-resolve-getter@0.2.3': + resolution: {integrity: sha512-nkaDnhbUYe53FZYxITFaxXLgn0WELnhjvspi2XvExuSa2h+chqVKlOKj4hvzffYaYtiONlpBzURpa8Mu19AQPQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-setter@0.2.3': + resolution: {integrity: sha512-jq27dgj4h9YyT4ZUubG7jP0KrNQP1MY2aLyieHGXv9Yx+1ysf8FLBRkekbOl1MJXXE7o0bOGAsiywS+olCgBGA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-base-zeros@0.2.3': + resolution: {integrity: sha512-C+eo5MFy37TR7BJ5EDK/5O83/x1n4pozCRj3fcL3ZrURTwUHq0nwRCVCmym/DrmZuxb7MM4xHyYto/suoQOm3A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-bool@0.1.2': + resolution: {integrity: sha512-u+e5+u/zCSNM6914c+3dVjfR3HWJzZvME84FyuETS1WkSIueHYYjbL/Y3Mwrrj8UufOdQCJEFDsNHUPBRWSqmQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-complex128@0.3.2': + resolution: {integrity: sha512-DPmQ8+MIxJBvusFNXDJMxqHCvMezhq0BGHcZoPeQYn5EDr6PN27VhyxgSWALzmHl72432e6ukeg+KQPKJQ1fcg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-complex64@0.3.2': + resolution: {integrity: sha512-gYh7d2yCq4EELHP/8PKNWz2NO+x6ln5VPXbd4logAVZg4EhYW3rl9jkU6W0KGPncwEDIw+QuHcIAogYmPFnFDQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-dtype@0.3.1': + resolution: {integrity: sha512-D/tBahfw2W0gVKPX89YbUA52SYOeGS2kqdOMgf2lJD/U1vuJehLq145dajQEGhjc60wdigM2VMjfCrME2MGfSQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-float32@0.2.3': + resolution: {integrity: sha512-LxdKGrpsCehFDgU+nw7r3/NL+g8pe9zcDn/6fvNwiuy0AiunX/+c8lin9qUy/FEhrbU6aFXepFM2Ql/9YQD+TA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-float64@0.2.3': + resolution: {integrity: sha512-LtQOcxfE2zX5QnYfLNfptSV9q3JUGkOvGhvtO94iPXEvYTvJSEWLK7G97AJR9MK3rdL1+USjGQzUPiUd1/kAbw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-int16@0.2.3': + resolution: {integrity: sha512-yNoSOvDGUwHlO5g3wyEM5KYIRaHB5N/PNQHhOTbuvjdsvBhPgmyJr/TQABnSipKsS6hOEveI1SxyONfZGD2QkQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-int32@0.2.3': + resolution: {integrity: sha512-m+uRYfsP2XDMCgCN0EMsxUNha4SQ29htPqFC9KZPgnVvvmjr5gsTHiZ95Io/ErgLxFCjRajpi9stjZ7f9Xeiug==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-int8@0.2.3': + resolution: {integrity: sha512-RZFDdqpFwNrIUob38519AL6tNWGQb/Nqo5TnocCgLPRVFa722DF2MI/DMjhQBbp9RhI2gHAz/gtqfa3CIhsM7Q==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-uint16@0.2.3': + resolution: {integrity: sha512-ceDGvNGOxR2kUO30USUWL8ezKw+R6wBwQNJmPOfT1HJRmCxio+eRMBygmxoRmWwoj2pj8IHC/GlC3N2kSNN0Iw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-uint32@0.2.3': + resolution: {integrity: sha512-zZGjkJjPsgp3WyKOCICOGaJ3OoVyzwgyZgyEHl3wlEqfPhUPpVJGLhy9mFx8WIoTGHsCWHs1COWZfh88bL/pSA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-uint8@0.2.3': + resolution: {integrity: sha512-+UVsdR94Qe1zXEbpE+rpXFxp/VB8+zGxH3d7RH2cUpy5eFeqcSQNvxaxfqZnbmqk2Gu5tJEv/ZBcTXkpeKH7HA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/array-uint8c@0.2.3': + resolution: {integrity: sha512-bTK5NJeXPo3bpiSu7qebFjGogu9CJKCNmmooAjPcq1Kj/S5C+vVamJjHx/C32euvlynwRiF0fJjcerSVvggsZQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-contains@0.3.1': + resolution: {integrity: sha512-CDAVa9BxxFN3XfcgNDlbZj/sY3AyWmX0oz/5xFj/V9SRgHeOn/NeDu+CAW/Ph6GW1xKNVMeva6tSFjNWdsG6Xg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-float32array-support@0.2.3': + resolution: {integrity: sha512-nNRO8I4dp3CtxFXCD901IBmVc+/otaFMr/Mx1jN956nkaXaL3GZR6p12IGgN535Nj3QILoKPmOG7gOjts+uQOA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-float64array-support@0.2.3': + resolution: {integrity: sha512-BbHjShic68woFydK2s8ECn4uKM+Cr3lB6kBP+9wK7wkUGVzq4lo7n+Twt0cBbgwJOGLlQayJQOQAVVq/nu/wDg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-generator-support@0.2.3': + resolution: {integrity: sha512-wr4w9/ufSBHSj+x3WNGK2WdEA9u+itVeY2Tx6ExN7w5avBAFe5EF8/ndeta4iQd8Su6YKJCqCUXNVJ3Dq4gl5g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-int16array-support@0.2.3': + resolution: {integrity: sha512-b/2LkEPpg4jmrZZYVF0kmjsThEolINpj7TkKLQORxWeFKlULHX+rEVBwnUxGqW7Z3P6xwklbSlzzhlCU0xXc4w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-int32array-support@0.2.3': + resolution: {integrity: sha512-FjGlpOYwUV/DbWpX14ZirgxMRgkwe6KKsN+/DEllu/w0bLIR4uBVBOQk8XDnExSVd72CiOH9+HOx6QTjHlhnMg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-int8array-support@0.2.3': + resolution: {integrity: sha512-DYq1D2vpVO9NnRQa+BQ6JeZy4SX4yps2Tusalnri7M9s9BNzgzH2rqB1gdcUmSLQ8vLLaHNVsHPGoiPqh9tJBw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-iterator-symbol-support@0.2.3': + resolution: {integrity: sha512-m06tXK3ErFF3O3pFrgfbCmtH7UpGDspqAoE260Gw+75JY7LkX6cl/uGoGOmxq0WZPyom/R4UJCdDkB7J15DKYQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-own-property@0.2.3': + resolution: {integrity: sha512-BnX1Lpvd9YaucQLokQrf7ppLwa3V+nTUQ9qoys5SloYhjwbYWtO61SJVT2JK+cfsCxUAx/HAh3dN1qTKxx1PIg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-symbol-support@0.2.3': + resolution: {integrity: sha512-yNsJnCb7HWye5xhZ/eRIpp28HwOVFF5gUCKeT1p4haoDJOn+3YEPYaXMn4mYK6kRN96tUhovlJQv9H/9jwnLpA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-to-primitive-symbol-support@0.1.1': + resolution: {integrity: sha512-nobeU8aB76XlDtKCC4DZWRdWSbPCoOGOOwEuVoyJ058gNacR4lRPoCA/7cxAVl3UqqLwhX3E1MSOMxNTnMyTGA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-tostringtag-support@0.2.3': + resolution: {integrity: sha512-9sULfRKYneF/Mq6F96xqeQrf0a9wdJc1lNZf2wfs1EtRwQHQfx5+QlYl7hp3gWI/iid5M4Npme86T0413eaBfA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-uint16array-support@0.2.3': + resolution: {integrity: sha512-7PjQTyXmpIczUz7Vx8c7BcdroJmMmQjyNQDF9a46Ya+nZxqH7g9jRsxmvzqVrSyXhkIyAbw1Ao2QyKocz+hZhg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-uint32array-support@0.2.3': + resolution: {integrity: sha512-xa/0yWs+fhp/yUZPD3/ZmQCXqv7haJGGJE75HBX9tw9CHgmqpgAihD4yGy982CtQaxEltH8icNOX8CQzZZS31w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-uint8array-support@0.2.3': + resolution: {integrity: sha512-cgXcNtv5PS+LEV0tj8VOZ8WVjLJuvSzG0GolF+2M0u5le2hHk7BfKH9bqmrk0AzpipAEEdQgp4CGc/Mmji5s8g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-has-uint8clampedarray-support@0.2.3': + resolution: {integrity: sha512-Lp2sWfsU5Saqm4IQ+ARuUFc3o6qOJoYxzhyI9nAHC1yy8bgvwNkjFiGs+fJcfrtFxeNDC8WIs+IbzuiT3HSoJw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-accessor-array@0.2.3': + resolution: {integrity: sha512-Ll7rZqXnwT5v5ys01rnUxfJFxtqVprJtb0NMyF3Rw9QXJtPsVcaWMOeL5FDZhBqlw8d6Lq+VkVA6WabgtPQuzA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-arguments@0.2.3': + resolution: {integrity: sha512-J3cf5pEZmJkjUi2MV/uldPe+rOpC9Y7pLAtJHY7BkCTKxZCyn16KpX9PuqeMXp+H04GdD9wxuhESGdqoXPa7pg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-array-like-object@0.2.3': + resolution: {integrity: sha512-Vu+ekWIc3srgjwWZSUl7FK+kj0HVwWdcAHNDsUon6mcvzltkTm+fYS9q/233L9U8BanhfORMtVcQ6hLX0Cnnkw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-array-like@0.2.3': + resolution: {integrity: sha512-HXjWVOiyYwjSOAhq5LDXWcZDuUwHRcOWKY9s0PqeMS7/15smJJCMc6y1yg/aXae0qzHdex4UmCB4zIxXOftJvA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-array@0.2.3': + resolution: {integrity: sha512-ayRsLGmssNO+8SR63tPP2+LZCxFVsSXtdN0ToSdm0kAOaGT4e0FoQus+AlFdhW5xWtvoxL8r5WKTVqJ514/rvQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-arraybuffer@0.2.3': + resolution: {integrity: sha512-1uNY2fnLP1bsHDqydcuxhj3SdJrMMvKdZvGVCSoT8H0HRMoStED3FS/zXzSLTGHXcExYYSHXWyOrvieLWNIfQg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-big-endian@0.2.3': + resolution: {integrity: sha512-+/X7ZcXFdboHIKDtxnx25fKmf9EhPRyp37qp9H9tUb0RnPT8SgmQKtYZxovp7EeBbESZOKSousg0jZKLbPqRAg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-boolean@0.2.3': + resolution: {integrity: sha512-36BETlRDrBeCOBLowW1/vqk9wD+OA3Wp9eQxFij/7icKiMDURH+Fiw2hfbhaZ3c3Y9uEN0rAdOT7AJlwWhXc7Q==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-buffer@0.2.3': + resolution: {integrity: sha512-ppnL0sC5XHSk221AYjT4zD33TDB/XuSkhbbbr5sviTH5+88KAqy7SjFlvcpqpvB2BvEVzqRE1fgVso8SjGQD+A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-collection@0.2.3': + resolution: {integrity: sha512-mAL86cRZhTeqCHiLDynOFm2S3DRUaB9NWPbUSFELmoWZ9wV0JeCIfNRYRyzWRPthMsyTYACAhLx8UV8IGJjsmQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-complex-like@0.2.4': + resolution: {integrity: sha512-BTrhcwlCRb/6NRqlB6Ap5WpniqaawCZOWnJuAJy16lbrvYvFP09f7UNNmxrxFl8BCg9hhyZQTIfdaF9CMgN9wQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-enumerable-property@0.2.3': + resolution: {integrity: sha512-UtqsBVUEAnPjfbOduQ8CT/YwUFLiXiapjSnKaGeLX000qBHCW07uOL1nIuE/vN61SMB+yvZuTZl9xUux/Adtew==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-float32array@0.2.3': + resolution: {integrity: sha512-fHPem8taZPd1YoYIB1lqju9HEPDUuY/UFKG0/PquCZtA/g32TEyMM7tb/GCcDQuxno9jnH4+6r7CTfHaa9758w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-float64array@0.2.3': + resolution: {integrity: sha512-GEuYmjWDT2PY530fIO4qBDr4xO9vYWTjyszkyma0RWKzyGBdCV6GYdMj8qO+W7bOVsqeuoYNTCNebOYfpgZbSQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-function@0.2.3': + resolution: {integrity: sha512-6EdSkdJ1KtILdGb84MhherNtitGgzHH+u6rs1gGj+294wg/9IzLYaaHDktJVRN/viD3XLEQjPGzSTq5x5DzPbQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-int16array@0.2.3': + resolution: {integrity: sha512-H5OohxNtQJ/i6esWE5R01TmXl0M5gCdvHP3+02ahiXbq6PBOJ5bJQVvw2M/j0jO93tS6d+5OcVGAKGazSn76RQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-int32array@0.2.3': + resolution: {integrity: sha512-ATPkqHYsQnOYs2Vz3KudJd/N79GFsiKzEOiTMzl5ILcN6bdW28ZNjfh2eIJ/o8NR22rfPQOiUCvxJHw2hpAYKw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-int8array@0.2.3': + resolution: {integrity: sha512-eK9SvSUVTTQ0yGgWF9BI/hvqs6pu77NoVRwfQLLvjzcpI3hRm5RyzhHyoNe6Q7FQ1obxvVYsCjysRmC+xmV36Q==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-integer@0.2.3': + resolution: {integrity: sha512-HfJg0x6YWW6aP3JSONoI5bNXFGqtiNqWj0L0ex+oDpzrVbXQOu9GNlRKP5P5cDgfI+3rpZMCINX52IGKyCiUJw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-little-endian@0.2.3': + resolution: {integrity: sha512-TvKdQhKwrWf0rik5iiurlI1hpJru+bbYGByoSJ6SScTvZIgf54MTYEsWgVyoNqMw8AQFxOyDbMRee+je65ZbMA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-nan@0.2.3': + resolution: {integrity: sha512-gFTy7KCz0/bqf0pnEBihtpVz8QYZHiYDuv8wvTZsybMz8tDOE5LnNPJ1klCsWgRLgCy9MA7uec3xwfst9n+71A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-nonnegative-integer@0.2.3': + resolution: {integrity: sha512-3Goiu4Kum1Xm9NbvC23GZOj1a6aVrGF1D8CkZkKDNp8kiYgKSKonvcbf3JeVrr/fLxsdfjnprbzrPOYsMOsRYw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-number-array@0.2.3': + resolution: {integrity: sha512-jpodfINEvUe6lQWxurZduf2aiaAoBD+KZsXq4Pn8sas6XDjPRmHkqth6dJFz8QcyzDdCmq6CbyPOEs7e/q192g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-number@0.2.3': + resolution: {integrity: sha512-6i2RoG5TYn7mfKnPmvAA1Gdhn3PxvQegb2bh2pi5k/+xXgEHoubpqBSVxZBTZ70GIkPwNFJQDRWqwOwHet6enQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-object-like@0.2.3': + resolution: {integrity: sha512-K6G58h5euEVSEZvFZSHADoYL7sixNTRy+ezHl/I3byJpC9PJdvTO0XWYD0CT0yVXIaqmCYU2NsPpgGdcPLELFg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-object@0.2.3': + resolution: {integrity: sha512-H9NaVGuPl4qA3J4gDAzy+sHCkTImVycoNd7izPF63JuAlEO6KTdpVK7stQBXgcWf1pyRHem7ZTJCzht2UMLzcA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-plain-object@0.2.3': + resolution: {integrity: sha512-MRdn9kuzC4Hf/2Z/911yZUso6s6f048Ck3dO1j9scHk9EKnU404XrC5NJHeZ9OaI/689Fs+JKDWyKyqyHYRV8A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-positive-integer@0.2.3': + resolution: {integrity: sha512-lGd068beyzC9O1cAlyI5vKlCEUyJwwTrSdLkfVqNdqppiX64lOngjoAhu4BmHScuWSiJz9Zz39YnQ/mA6cH/kg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-regexp@0.2.3': + resolution: {integrity: sha512-+QlQMHrmSmF++7gK0Jjgy7W5aa91gAfpFWPyY4gUwkrSc+mY+JPPYW4peAf+v6dXABOgfKH/JOaFPSv227SSTQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-same-value@0.2.3': + resolution: {integrity: sha512-YC69SQUS5RJ4gjYrgzBTV42VLNm4geENhA5dHfS3JfdwruzG+AGBbhupG+DLRQII9Mpv8qui2ik4EXQCKU99bQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-string-array@0.2.3': + resolution: {integrity: sha512-OZhH3sJ4xUP1iGEvpG4IGIr9B9pWWv1CsvK1bSsNunvCEa5fi6XPJvXeP5NbgTIgT4JhmM5fxgaoT74S/CW3Cw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-string@0.2.3': + resolution: {integrity: sha512-KC2sHwnIo775uEPRG7miERHb3DMABf37jS6o2bmcMHyME+gl+HC/bnqgwYTfgOsM0YOvYMSgA1HJo6iPDXdFrw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-typed-array-like@0.2.3': + resolution: {integrity: sha512-TOb9CCwNGikBm2KD6cpiAJSq7FoD0amdt9zsBMRQUJEgfjKxcRGORx5i73GmkJUoFT0uJa2pnRRlGJp+4bZmoA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-uint16array@0.2.3': + resolution: {integrity: sha512-gHnj9FpIpyiIgsDfA7exvfqqn91THgGJD6BAWqiBgQQccK++K5q3ARc31ysTBuIea1FqYfpy30vt2ZW46lIMcw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-uint32array@0.2.3': + resolution: {integrity: sha512-Jt9hp3iolCoQC6zC/yisTvxcuxhZ9jyiYwNzyEzgoY4GdV/WETuTpQKwTKbgQkJdUbcl/3VIQaVopEJSUaoV5w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-uint8array@0.2.3': + resolution: {integrity: sha512-a+CzS7ffk2D8oFsswqGJk3L8zpqcnzuB5rwolilRVQtrWjQT/s2ydv5b1HbMB2rEcT6h64rYJDNAITeetGmzBA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-is-uint8clampedarray@0.2.3': + resolution: {integrity: sha512-tGyJ74IqIFczWUZAAaR/xlGSzh6vO8t8SYV33ruNPjah/d69uijXHRVohx/aO3xaQ7bbVapk/WbGosmILI7sIw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-napi-equal-typedarray-types@0.2.3': + resolution: {integrity: sha512-eBfODSc+zsPnsIXuO1cmWZ6AgGFXPpx0YEApBFzG6akllcPssYuOIJHuE9xBdgL2c8NAGKl91tMitlkmEulG8w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-napi-equal-types@0.2.3': + resolution: {integrity: sha512-JfESREBknrUOorPQp6y0vQicG5oSrzopRs2/Uas4tXRWRWe8J+WI60W/HTNAbfow03a5k30M9b7Vg81N6zf2mw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-napi-is-type@0.2.3': + resolution: {integrity: sha512-EajA0tANjWepz0MVE0zZU45CXLA12/uuRpQ+680ZBfULsVc0plipSQfIMePBgHueJe9YMgyqm3r25RXzf98i7g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-napi-is-typedarray@0.2.3': + resolution: {integrity: sha512-szTmOUQmxi7wi+sJjOpmqBeKdaTHXJAYaBAlrT4Lm8KPjIGr+RP2Fvi2CfFqQu4faekHEM/AXuKbujZnc/P7Xw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-napi-status-ok@0.2.3': + resolution: {integrity: sha512-rA+0Vo1ULn4uBHQ+FfagPAcikFT3W/t9I7HdP7SMjz71IZpkWyuxVFZi5MTv2+7hGMYA8be5FibLz20uzbZ9pA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-tools-array-function@0.2.3': + resolution: {integrity: sha512-z2a2G6f9Exz/V0UfE00TLm1sp6W+pOdYltekRRgdEgFNPPP66WxaJfFLkXwqZv0X75U6TuQ0pp7tFq6Ac0lf5A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/assert-tools-array-like-function@0.2.3': + resolution: {integrity: sha512-OjU5pTqnG5vVLQnQNhbtuENciUJHOo8KO3QiUPUcvEY72bkF9ONNthYUl4VmKEEeHZnyrHIeIpjOQk18JNTKeA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/blas-base-gcopy@0.2.3': + resolution: {integrity: sha512-W1vwLtEIfty7iCJZZ3OhcpNw6o0HwGMXdLWLEDlhYpQ+eBKPBpa8FQducrGSbYDI0sys+ZBMq/oRv9dGIyH2IA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/blas-ext-base-gapxsumpw@0.3.1': + resolution: {integrity: sha512-PAe5tuC7LtUdCpa3w2Up7n8axhavCsRjrgB+GUcpyW5CwhjahTqqve4QAkcdZt6Y530dlh31q50I5IQG80RDiw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/blas-ext-base-gsumpw@0.3.1': + resolution: {integrity: sha512-LARELhFnqFuAQiJVsg2MxXTQvR74+SCu56kzsBK3Wxrc8KQKzmzmWHPJ2y9beZNkzPLmpWNPiCyQUULvmUd8lQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/boolean-ctor@0.2.3': + resolution: {integrity: sha512-JmVu1SdJHYK5ubLl8nqi0gfYX5kAcSRRJYNQ7JuG8oU6WtkIMsC0ahQ8+3G673czRaQ7HGE+pL0IZiH/s8HSrQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/complex-float32-ctor@0.1.1': + resolution: {integrity: sha512-P5aJ7kJ3VkOCvtwIipYH2t/vENK8XnwQGDChQiZAgkJadrF2dKYOXa8t1vWEsy/AMVujAjamHlCXQffhafYm8A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/complex-float32-imag@0.1.2': + resolution: {integrity: sha512-RwwHXMocm0/1wMB3NI7oJR2MNA1avqisqh58oFR95Kq35leSIrevSHw2HbW3P1QG1uyYCbOTp5V2zv1alwXAzg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/complex-float32-real@0.1.2': + resolution: {integrity: sha512-KyUfN8nm9zyfNwi9O37u1oq3hsAi8uG1sQX+lI49PGxqkxfIEoMwHclYrs2lgQ02EWD6t/Coj+8dbzKwuj21ug==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/complex-float32-reim@0.1.4': + resolution: {integrity: sha512-PXnims1rRAVGARrpoeiwxkYcThjCoXv3iLhUhz8oyulcHteGkJuBAmhnrLANfkh2ro+bFlk6lC9znLt13SOM2g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/complex-float64-base-assert-is-same-value@0.0.3': + resolution: {integrity: sha512-Arz1sXdgWNUY9Fl5FWpGM/4KPU7xH/1vEPjf2DlnESsHOuNXjPfaox5Lw9BcAHqVs/Va34HO2LA9XLcbXVI9zA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/complex-float64-ctor@0.1.2': + resolution: {integrity: sha512-xCVE2Lv1/I7A/2mDloT3hDCpA9NP9XOqZKpyKhg3D/9D/vJnh1rnn9CK8+xzVfRborsyQbJF7OI+Ijc3szDI1A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/complex-float64-imag@0.1.2': + resolution: {integrity: sha512-uYmpvw8723pXVMaPIyoDWh53OLBk3F5HQyCFrgJsFCfuM0e718yd778ltMOyl7kem3M87ealSuxBwFX5SLFxcA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/complex-float64-real@0.1.2': + resolution: {integrity: sha512-m8kJIckqStBS7WzmGe5X8A1CCooGmLToXRo1qq4EydA976FFMFuYrsI4XuByt1e9zp9HEGeoywyelaqyeeWtHw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/complex-float64-reim@0.1.4': + resolution: {integrity: sha512-5IxS+GqkVezTGh57Gp7pIyAHS+obDqUpq5y7KpAjrH0s6gp6oN/m+tmPh7K6Yz8yX+7FLVn5b9lZxY1otBBEJQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-array-max-array-length@0.2.3': + resolution: {integrity: sha512-f6X1YlF9RnN5HkeFZFr8V4iSpV5968/4V5j6RFKY7gwr3jxjiIBar4CFja8W0f5eRUsuAlxf3HQ+Y0syYKpLuQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-array-max-typed-array-length@0.2.3': + resolution: {integrity: sha512-Npc2GG28d1+dgdb2akvzDNZZpiGTIAEe1vvJzBLfmVnDkqxYSuTu55N9jcXtTvrPOLqxwWy7K8AMAKboMFEFVA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float16-eps@0.2.3': + resolution: {integrity: sha512-gdDE9eYNuJqIxmpWFfFsTx24uJv3BV/S+MKi3vj/TgWFeGMnsqHP+xIf46Hby2OwRbr6yYzsVwfJMAzF7ItCQQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float16-exponent-bias@0.3.1': + resolution: {integrity: sha512-fUqcun9eGniI8sqsZf06qa064cKcp6cARfX9dXuGnCQWSWEwn8Q/LKr8zEgUVEu6cJCVyCMHgm8VPpkTpnFPAQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float16-exponent-mask@0.1.1': + resolution: {integrity: sha512-5J38bgxW+UlF9AHG+C9Z7ilx25aPSOr3ECyK0LThG9H8Kw2zL+9cNbt72vRnVr0BSCv3NKvgxPza+B/bB7IJpg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float16-max@0.2.3': + resolution: {integrity: sha512-M1Hgv/fUdnuV6uw9yyXXOAf7Bzf7I/8naaYolXGX4h7B6XSuCT6Of/0BRxXlU9D+V6zPniGo2zdBaXUGfek28g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float16-num-significand-bits@0.0.2': + resolution: {integrity: sha512-qml2Wmm1/gHOGmEfrR1w5G2wYsBHKfCLBaJ8idZ4IMcBfmR8Ez4I9K3uQ3EZ6mW8QU2nUIgp0Fc99lnzLoH+7A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float16-sign-mask@0.1.1': + resolution: {integrity: sha512-LpLyCmkhzwotXb1mAAkAZ4sTk5lh5lW3Q1pOp6jtepEFT/marQsoeTe+0r0mIwSncGbym/eEB455qUZQsdiTBg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float16-significand-mask@0.1.1': + resolution: {integrity: sha512-+IA0fHkBV7X00ZTqAo0ZZSSuh9fjLGB8+4ot8iR0irC0YxPLkvyPzFHujnWFu8UD1Eu3SZcyaCY20CLcgsGr9Q==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float16-smallest-normal@0.2.3': + resolution: {integrity: sha512-u/EzlthAeRba4TePLQzTyivIAp4GB9jLdOwE9FdxSYmqUwAbEIODkd7vft1ArzuCILRHM4NNNESJeaLlv9Qd7w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-abs-mask@0.2.3': + resolution: {integrity: sha512-owGGn8KvmHmne0u5ItTvOpHL6lUJP+tuUe2wzrKYiZuoUTg+7cOhNW4fPWCK8AFYxs11Ha3qPA7oAzjqlq+Log==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-eps@0.2.3': + resolution: {integrity: sha512-yJY7ipPOriceMh2zQvNVDYRrBJlQoBN+7cejox5DxTTn5zytyJn9sfdBQs2buGBqT7BiV+RJE7iE1vQdhuslcQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-exponent-bias@0.2.3': + resolution: {integrity: sha512-AdJFdh75o8cBwT/zjRebtZGGz0lYY2P/ITKrxHo4snqinm+DoMFRChkYM2s0QYn8ZgFBHQ1iEPB0cYzxTLk3tg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-exponent-mask@0.2.3': + resolution: {integrity: sha512-mkSAIakaixXJy45Ss8G7QbrS6eQemGjfIZhwmwlWDHxCJEVcfpuIijO/N0gtlF/MnGSOACwgn3Qkt1t3Eg30IQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-max@0.2.3': + resolution: {integrity: sha512-b+G9qRNbN4/Ke1BKK3fP7+nWahbWJhcCpbieaiAsbdJyucx7oIaHyzcnNDSmPYhVP57iGEqL9RzhVRd0u4+u4w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-ninf@0.2.3': + resolution: {integrity: sha512-X0t2gw6UKfzDRRjYH8k8dqRv2C6iI2sn3UrunRIzCL4WYYR+QWn1UwjZWG4fviIE+QuEGTyoKKb4wG6gTiS8yw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-num-significand-bits@0.1.1': + resolution: {integrity: sha512-pb5IMIdVb22DP6yJc1PmsqTc3mmn02ze4P1oE5aZY/0v4bPUf9yegUmYIyCEWPfM1HX/xnW4GwXDZ3QptSgLqg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-pinf@0.2.3': + resolution: {integrity: sha512-ofzg0/NDAjALtXw0GPGzsfwpTEziENlSNln2PqoPphno6u7yfCD7BWblIinvDALFwbpsUVWuxAvarL8XnXl4mA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-sign-mask@0.2.3': + resolution: {integrity: sha512-CdGdK5nHesLEkS6TeQ/jdl3iThAZYrNCysRVshkpz15ORgvbFyHiXaYFIGkwt0a5RnA4i11e3nioHBNWxITGxQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-significand-mask@0.2.4': + resolution: {integrity: sha512-6oBi94bfEEqEPHyzgS3YNBK0fjCRsh/8A6xyaPuHBP+ltGmGfNsZmsZ5vQ+vChszKVyJG1/Bd/j4wif7GGJ/3A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float32-smallest-normal@0.2.3': + resolution: {integrity: sha512-NHUPJr9+Bwcr0lMZ2goX7T5jWpel9AQcv4fZfnlabQ3HSYDkAhLBmoCUJh2jxjItR4SbWXzpIEKL3RNDeiKEeQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-e@0.2.3': + resolution: {integrity: sha512-8nQCMqyeLPdNN2Kzc+tSeoksZbvyfRpqUgB2xCujfWIxdsPKvAXclWpMQ0EZuk19MBpNPSOEbiXbUiAIrk1Ksg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-eps@0.2.3': + resolution: {integrity: sha512-TB4+YU9vc9RwMmSrCt9+UuFeXp+a29Q1KrzcBTcxU8uB/2totg6yYAFwhs8+48Vr5T/bQOsTQpuxXA5KEaThrg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-eulergamma@0.2.3': + resolution: {integrity: sha512-8scw10W2H/rgE2gSmW3Ubp310dsxW0UGppUoDcm5aJNOu/KgCUMqStoPLU653f5AbPZ//hSBpRh2+Nv31WCieg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-exponent-bias@0.2.3': + resolution: {integrity: sha512-GjhdDNlHP96WooqvgEvsCPcK64ZsfpU6DlAsjRMJAPuh/QJ+Ut4WC7vMxuLp/Qio/N3AEsRvCOWIqa5jTvEWUw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-fourth-pi@0.2.3': + resolution: {integrity: sha512-Ib/W5K0Pf/sDLjnGclxigJkGQJ/1Jtb+id4kuyRrf1qrlQwiP7tZq60prd+czL14r+1r2y3MYE/7ow4Fc1chUA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-gamma-lanczos-g@0.2.3': + resolution: {integrity: sha512-bAC0FhhxMDeU6UsCGsAzVZXjnJOc65StXINkvIzhKTw8SjrlQGifNNcanOVtrwKMnpq13MLsVcG+m0R7BmiUZA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-half-ln-two@0.2.3': + resolution: {integrity: sha512-5FcB6dmhWYNSvCRIukJ3fdd5kNH2eTbpgKo1pYqksp3dwMD6GKR3i/832maewutCvcT72Baj95Si1bqX037AXQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-half-pi@0.2.3': + resolution: {integrity: sha512-JBDU7c03I5H0kvmOM0ZyxwVxK6kZTLogYSXAS8ho3jkHU8P+DFHXxn6X9DhGKKlTaCTHCAEYQ7zSmV8H886TMA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-high-word-abs-mask@0.2.3': + resolution: {integrity: sha512-AXa286EisR1y71U71M18QvzldmIWsh1TNimoBjrUdCQn5jELOJAQPriTKt0H8kngfOUYfy/+EJwCpuQEL/VWrg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-high-word-exponent-mask@0.2.3': + resolution: {integrity: sha512-/q5YMZwugOvQGCXp2kusJY04/KHDzAKMv/QEFBB98fDhN6Ux2VWbVyBESJzn55zVGQvb9XhULwkBy/KdB6YuqQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-high-word-sign-mask@0.2.1': + resolution: {integrity: sha512-Fep/Ccgvz5i9d5k96zJsDjgXGno8HJfmH7wihLmziFmA2z9t7NSacH4/BH4rPJ5yXFHLkacNLDxaF1gO1XpcLA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-high-word-significand-mask@0.2.3': + resolution: {integrity: sha512-SGQfHBnS71PFGQt7Tv6ptAHStJy0sTXmUEjOOXoJlnlClizsgdHXwkeho4xIvycxyNe7L4nT34cFPDMRFguT7w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-ln-sqrt-two-pi@0.2.3': + resolution: {integrity: sha512-+VE4Z3OoPmyVzYJ7mbQUkKdkT7+uHeSG821U0hZLtUQAD2AmPWQNUzKk+G6IF8FUQv03Ly6U4lLL9aoXxXjz0A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-ln-two@0.2.3': + resolution: {integrity: sha512-pCNVc7Cmr56sg+jOrN2yLSWNHdN0UECAZIJ79sDaLBpF2FqeL6EI52EJesLmD64oGSNUC4yZNdGBe+DpKc1ZXw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-max-base10-exponent@0.2.3': + resolution: {integrity: sha512-hM5h/ZFk/XM9bpb5NZcpsRcVQLL5PRdXveVise/FS6NbKEkOvvFqZ0FBXeAYkA1mvnGSPE90gKFvF32/3kv83A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-max-base2-exponent-subnormal@0.2.1': + resolution: {integrity: sha512-D1wBNn54Hu2pK6P/yBz0FtPBI3/7HdgK8igYjWDKWUKzC92R/6PHZ9q5NzedcGxoBs8MUk1zNpP0tZyYj9Y4YQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-max-base2-exponent@0.2.3': + resolution: {integrity: sha512-DXOhw/QF63NCeB7o7zAgq2g6IeT7jGDT5kBoRP67qbOeHm+NpZdrFdHXo7acH+pwLJXf5iECnVdyQ/axDLQ5mQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-max-ln@0.2.3': + resolution: {integrity: sha512-M/qzo1CWhgX84vCuF6Nba/Jf+doaQKxQHNXr3yXKL7BEatz7MWweEMaU2pxfKWa5wADMDvLttskYm5jLWnkiNg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-max-nth-factorial@0.1.1': + resolution: {integrity: sha512-krwhCczEOQQDllianEG3LMR7m887BBMZV/udK1/0bYhXJPA2joOEp3RNz3F+IOMJZgPwMnK/x5P66Yp44jeydg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-max-safe-integer@0.2.3': + resolution: {integrity: sha512-T1CHYahzAHGLEIS5NMiHjOkGzvgZ0KFtBvFB62shkfMbnkc2gHxVuUzmbxaIm8jQO9X4qafQkRpHFg8AE/e4kg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-max@0.2.3': + resolution: {integrity: sha512-UiN+AZ8FuWCq0vXjTYRzQVpMA5Dnx5lBGaYP46/XiT9DY5v4I4ooJiSGcRpnMa/AcFvM+ZLVq/K/2c1VdL8h3g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-min-base10-exponent-subnormal@0.2.1': + resolution: {integrity: sha512-AghpVQcTuhPiLE1IAk+e8HNU+wce/132Sg3MsL60CQaRVnG8X/VdivzEJGt2Nw9uH5rctvVINFrNnM0gxtmzJg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-min-base10-exponent@0.2.3': + resolution: {integrity: sha512-IECHt7a8dZloMWBzs8/05OC09K6Fi5J4rkNnayWVZbfHUHpls8bMqibcjgHPmebGWHCFkHcyKYCL73Sb0+Lang==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-min-base2-exponent-subnormal@0.2.1': + resolution: {integrity: sha512-fTXfvctXWj/48gK+gbRBrHuEHEKY4QOJoXSGp414Sz6vUxHusHJJ686p8ze3XqM7CY6fmL09ZgdGz/uhJl/7lw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-min-base2-exponent@0.2.3': + resolution: {integrity: sha512-N6Xh+ZCnSCMC+ImkgmYAPHFn4V+94pA5KM2ekhNUC3as1pZVJRkJVacogGnqJ9vnoAbZ0QgZpkJpap8Jy7Pldw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-min-ln@0.2.3': + resolution: {integrity: sha512-xiA2KS0yVt69fPehhEgl2glBJJrMLH/0q6eornMRkrZuG+o03wLKaqAqTcrkm2nhIMmhNXEVm+gQU0nfiI8Cmw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-ninf@0.2.3': + resolution: {integrity: sha512-1yBmgdNkvxWR0IfebDnhS4KOHPNgTpe3j6CCRt3qUW98l45tUkjuqyKKu8jNvjJCq+qKaNHNNk8xAl+/eDuABg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-num-high-word-significand-bits@0.1.1': + resolution: {integrity: sha512-qyZWHlGYIS6Hjxnt8TTBWlvkGQlFJT2UVQhaoBrQfp456YF8aghgiwHiaUTXzngMH1llcEq2tyPjCxBdTLs6Hg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-pi@0.2.3': + resolution: {integrity: sha512-1s/4TBYzAj+tOgi2yRX6Iecos8SUn968Vymsl8U7+5pDpJzicfBpB9ZIbWNVMQVkBRWFnMx/T3BUzW1+g/dEsA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-pinf@0.2.3': + resolution: {integrity: sha512-8kRy0XOvW7QiJlxdy8MXx7rM3S4H/ZsUI+q9dNoarKVDBtWzkqnEG/u5QYouVjGHaSVL8C7b7qwL1FdpSD+24g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-smallest-normal@0.2.3': + resolution: {integrity: sha512-z2IDWJD7s6QwrfzI5o4q3OnZ7mEzUIs1V1PdTuHDofyWkpFGEr7GgwGI/0cZbuhW3aY3xydvM3rZ5SxT+6KQoQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-smallest-subnormal@0.2.3': + resolution: {integrity: sha512-NcXOJRA9vuhWcPPvwQf+c86Oab8UtJ3P8Y2DwKt9eRzjRdFFMw73pDmYXEOHSwczn/mGaTHG4HxmVBTugh/ezw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-sqrt-eps@0.2.3': + resolution: {integrity: sha512-N6ga0XNLkDgrGCs1cgajXzTYFgl6gDrgWOJW3AQhZPaFEswTtD+yMmcw3p4ye1LZpU3JyDr8hcY2iwL8whX+nA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-sqrt-two-pi@0.2.3': + resolution: {integrity: sha512-XVCJ0voDf2U/MMqqnLOo9CB8IEC4odQoercGolrJBud6MXmWp1eVrRYM6y0ocJuyaAPgsYSoPKp0+Gc907InTQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-sqrt-two@0.2.3': + resolution: {integrity: sha512-vehmaN+P1IYJ6HhbH70ebhLAZOYnuTm1ezWpFBm/IEC9NGiKKmyrtO+z1xp6iWGl1VrAAhWJE+bBQEP4wVQsCw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-float64-two-pi@0.2.3': + resolution: {integrity: sha512-KoNeAgq+jSDT0lYYHAYosZJwRSH9VlykKjI7BK8TVox7z5QqlXG4Sa94NeGwP8qhp+g4N3Mb7BqXlol3t4vPfg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-int16-max@0.2.3': + resolution: {integrity: sha512-mPHYy0jMD8ALGd5QDOAYU8mO57sbYsivYUVZq7+/mJDXldVprD+fUJFX8QOkuRW1LIsVSqHA1F4oGrnjFM+lVA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-int16-min@0.2.3': + resolution: {integrity: sha512-FZrIJecQGw5qEYSrd4inQgx9xe5igDb+UmZZDKccv39xwWpPPfprt7Sr+zholUdcGGpoJdftBI9QbbLQRTOqcw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-int32-max@0.3.1': + resolution: {integrity: sha512-ZAhWfNaBhVzDatkha1q0vu7tO6XRbP6kxJk/Erh4emgE/4JpC9WPlXfkZvhOoCWQ1Rsll7tevxN3rfu6oGN7OA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-int32-min@0.2.3': + resolution: {integrity: sha512-xXa5t+tlRuwi+cHru4p8gFPnXqa2hI1bn+K6IoTd8Pj+ySKTkR0evSgNIrO6kcEf+kj2YuNXZZM3sqK33SH9vw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-int8-max@0.2.3': + resolution: {integrity: sha512-TD5BzgiZshK/LD/3Ya4fp2mI0j/XGm+XH7TOWLjMWrH3JYbW/GIQfTTDsXTEu52Te0M64Xy5WBmvrXoObFkqSw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-int8-min@0.2.3': + resolution: {integrity: sha512-sD5yCZIujDG0DKLBSj+r3UzxQ04yTyQ4yT/umQrtTHMHAGmZnNZ0Jab8VmxBxfZUC2PAVc841hS/XKQglw5Fsg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-uint16-max@0.2.3': + resolution: {integrity: sha512-QLqt85JMBnL8ozliswgAeR9oWrsmWeaeWjr10P0zbGV1dKhM2HoRK3VXjO4SCtNWUwiV4w8Wa5ylSYdJhORDjA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-uint32-max@0.2.3': + resolution: {integrity: sha512-NYQIGMA3Z8+1gp2qUfmr90whvZJLDq737ipNeujrFm98/RcbBlCRmXCLlj0WMwxniw2T35ysfclAcFSE7caUCA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/constants-uint8-max@0.2.3': + resolution: {integrity: sha512-B4VzHho0T43dJk3m1x9V3GZ1OOK9AKNojo3jOweixBLLlofaEIe0E9f4Gihc2ef7+M4azYptsJdPY1jPy7kK2g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/error-tools-fmtprodmsg@0.2.3': + resolution: {integrity: sha512-mt4YRp52oCkNWhxkUIJkeGaFnSvZkyfl4rOJX8Drz99xFiIdanXcSacckhrXXu6NQvMDKidCGr6DvrhHHx15LQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/fs-exists@0.2.3': + resolution: {integrity: sha512-kfHok9sKxvCftgWriVtNjqezNZA72Q/rJh78lcrGCLPvSHGIAL460olzl7D1OgAgQvM3Cwdoupay0o3dBCCwVQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/fs-resolve-parent-path@0.2.3': + resolution: {integrity: sha512-bof7pQQewv8LLaSi2Ut77mkEv4v45Z/w/hYocG0UUzmXhu4lXIiCcXz9ZAMJC4tdN5hwBReJGfJ0mQryddhGGA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/function-ctor@0.2.3': + resolution: {integrity: sha512-/Ny143oEz3YAwauaPZ+J9A3IGFdE+0dam5/ATJPGLcl2nDj8P2shAsMp30coyEyzKDoMZqYSKTFFTV5rxyChAA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-even@0.2.5': + resolution: {integrity: sha512-EtCGbIAnrhgYpCrCrYNQC6aqOPviTdU2Ui1t9grPG2e1eE8cMjzSpTg1TJmcZeMShzlWl9BcgeCS2GQPaYhkCQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-finite@0.2.3': + resolution: {integrity: sha512-PqqxkiubjHe9jdIfAf/PTHZLbYIk1wcFwPGALM+PR3kjRngEkti7NbbkTQX3sByZCCfRwOf7VxLPWDlGo3EmLw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-finitef@0.2.3': + resolution: {integrity: sha512-FiP4w+PjwD6zapXgrD0hLEtnUMi+uCcBQw+tU9cAGyB+7NrhnUoKSWgHsjtLGLMD08gWsFOIjZzZRavx4PocfA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-infinite@0.2.3': + resolution: {integrity: sha512-tWQoN9z7j56DIop5cBnbdkP/o1MGQ0K8bX4v6Nxsgqngk7YBXYlxGRVw+46FVyxNButJY20VwxpMhrv4fQg35g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-integer@0.2.7': + resolution: {integrity: sha512-rsxiM7N9Y5kd9elTEJpx1kAcHBeHETH46vn2s5FoKyNt7oZLqv9iE5oKF3oNznA3H47o7SNyQSdcJpUDqS1W3w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-nan@0.2.3': + resolution: {integrity: sha512-mj1p+JUSfbsiBI3+hwRV7bS0qgI2nWdzrFtBJUSLk+17MJSdA4aboUsXM12wIV1kg5JNfEAn+5eh4NF/sMvaoQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-nanf@0.2.3': + resolution: {integrity: sha512-sWMMFhTrkeYu/t5bv7KZ8Rm7H4pD+O1+wYYNu1CsJ4y1Q6HwSDeHBNIH7Z4zHOOSFiOidb04jnqMGSsL5UCFRg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-negative-zero@0.2.3': + resolution: {integrity: sha512-5XzTwloDrG60ZRd5vgbw/lXKn794s2q8Hb0pT2LUy0WG2j98LhAQNEv0f0a7brhHlGOMTX5Hmg1DZXw+ve2u5Q==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-odd@0.3.2': + resolution: {integrity: sha512-AVtda9LMQ7WgracZDygZzh7rBDys8KKn4qzAIVv2hWG3ns8X8btQ46plekP44iRyGjYagXMzLJn2jo/Irkf71Q==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-positive-integer@0.3.2': + resolution: {integrity: sha512-+FLU8JowmOzk2wiUI/PJzKXXPj2F2BFiNhJihpYv7mm3SCoSyCgRgPG3wzVmPieOY1T3TFBF0ITZy1eqQQCC1Q==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-assert-is-positive-zero@0.2.3': + resolution: {integrity: sha512-V+f8enSK2dEk2V/nHMezyJaUfSC0QJNUD8+mQYON7JtFaxq/+xURnPMllF9h84cFqQ9SAuxWXP+Y7MoE+ENORw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-napi-binary@0.3.3': + resolution: {integrity: sha512-rLBojVTK0GRhy5v0MEKLmamggOrosEMaDcMS5ITuUe6Jgz4DM3lsiB/EHhd0TamPdqo+5HPjqSo10zpFVbLZbA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-napi-ternary@0.3.2': + resolution: {integrity: sha512-DUu7zbd692l86VnUaav4dgIVIkYnxklDMMKpmGT+mi30QH959324tjl3dsthYy5iySnKWg/V0z54opu0FC8jXA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-napi-unary@0.2.7': + resolution: {integrity: sha512-eEu0nAq8WzCGe15ppGJWtLGhKOoG4OcMJQpsfbjwaa3sZ9h1sREmV1iiAFWyi/mHy8C0y6PiG2szx4D/F0ywmg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-abs@0.2.3': + resolution: {integrity: sha512-0n2Jb1NQv/siPL5EJFf6/cCuK63zqgqFjQwPujJI8B+dDizlHJKF4jR6yOtavrB5RvVf37/3Ibpdjf8UPf3uzA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-absf@0.2.3': + resolution: {integrity: sha512-lUEEnIo6jpR397bn4mphlihPBMncdgKYQQYZ8nwnL/wGNE9InwqLqrO6otM+CO2nkG/kOyt0dSAhSSffqBZU6g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-acos@0.2.4': + resolution: {integrity: sha512-lidI9Q1No+jYM7glXFXMPzxQKwrzqV/QuAp4hVDmidDTL1d6NW0jPBAiaRL7RLcqXqd8oYVirTrQIga8RhMatQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-asin@0.2.4': + resolution: {integrity: sha512-HM/x7n25umG0plZrAil2wq21m6+9rA9TDTXErYXAv27HEM5NZGCZn9i+kpTog5/IDSdM58OkTsEB5FOfaBCjuw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-beta@0.3.1': + resolution: {integrity: sha512-DabfQZifUcNF529IYtj/9A5oAmZD6g4JhQt1drx8sMMLUJ89r8TZLIyMZU/bgp4cpzSkRGRSPjfXWL/98y5Y7w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-betainc@0.2.3': + resolution: {integrity: sha512-yTGYcCptTWVFxL9hv4Uc221kb7tULU5JkRp5oklPhZmg2uj/eRIvaGYtYvzuTnEU2HpdgWcTVwdDaWsG68F6NQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-binomcoef@0.3.1': + resolution: {integrity: sha512-ywcno89Y7ntRdj3NdAVfVzYoIrJb5lILhq+K+NqhgrJBOcrE8ZF+/yPhyVwjUvksfGy990tBnyhx+06VLVFAQg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-ceil@0.2.3': + resolution: {integrity: sha512-QJsGAxftN8RLjDkqKqyOcWh8tGFauyXMvqLxoq4C22tm+1ABJ+1rU5wEATOgvOHaDVc7HvHA7fakHTB0UsDUyw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-copysign@0.2.3': + resolution: {integrity: sha512-kOPVuWHQht53FcFXO4L1yqXSZy4emdI6qITJAWRENDuW9YZ6QRTONBqOaDC5uU/dRZg3LcMUpQ7iuqYqa/pbeQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-cos@0.3.1': + resolution: {integrity: sha512-efthz58G0wf8rXh4+jbYeRuRCagNlYb8AL3es1GxwV9P9/8ZpKAlkQiRPY3AI3ZJMB17aR/KHpVw7Pz+rw4Fhg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-erfc@0.2.5': + resolution: {integrity: sha512-qA2iPLKr8SjYpI9TCT7LoQCbUrbx17kmiRidDewWk/aHL0pcpSm8KITCjBUtsmletSEUNUS+8MyAPqisXT3N1g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-erfcinv@0.2.4': + resolution: {integrity: sha512-oF/3UXs2zZFAOKe19rRcWg2SFZFHQbnFJ4ucbSzYykM79pDnvVtSP/dRPtDy3uevUix6BzeloFyK0dLbQsYt+w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-exp@0.2.5': + resolution: {integrity: sha512-1xZWUc+uDQHRD/mHJMsAjenRq7w6ZZqAUc8Jtxwcd5Ccv23CckP0TvDNkC6RqVWWPJploxoxDArQ+BUXgHbpeA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-expm1@0.2.4': + resolution: {integrity: sha512-/2HSORRdM0vAdiEEILreYV8cKtnUfW2OrxKLc5dbkCMHe895gURlrpTA507lF3x02uAnHh8PiasMsYTOXcGeCA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-factorial@0.3.2': + resolution: {integrity: sha512-YOqPZBtZPP+Pa6jQn/IY0JjGx1sShxQ27XYbpgupg9yZCvabLzhHg+J6/mnjqf4eti6UcVtCITFUZOZ671GyOQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-floor@0.2.4': + resolution: {integrity: sha512-YSDt9gHSp8SeVBVzHfpZZ1HFEQDPihHUF92zTDCRGKeKBC4BTFlw9Q4/fNWqS1mtuBGli1zgpRbiTv3atQ5EjQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-fmod@0.1.1': + resolution: {integrity: sha512-pW0Jn1S9D8Eh34tEmEJUzZlkfN2nhOmi0dCO8xDWhgdit3+qG/U85t0bULT+/5kRezy8SspnTFkGOoopHztzQQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-gamma-delta-ratio@0.3.1': + resolution: {integrity: sha512-Tekp7Flw36nZPZ8fQilkPRiGyMbYyzWjRV/HZWuBaqqDWE3+J2W68qflGFCad0M6qkWDxLV65TJ9E8yJiTYxAQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-gamma-lanczos-sum-expg-scaled@0.2.2': + resolution: {integrity: sha512-P8exugMuGijA+9FzG1krmfPIHWqRolFm9xws+H1OGTw9lq6c+sPAny/1KNLo/QbL/UaKrjhbeUDVHOjN3wj2Hw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-gamma-lanczos-sum@0.3.2': + resolution: {integrity: sha512-wIH23KUPBKhu0nCraZ3aY882ICDtLIDxeiiBY4F1hNeBBrMeODcCWJc3+jwXvzjigBXPRFHWJqjOyL57FyoGBQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-gamma1pm1@0.3.1': + resolution: {integrity: sha512-cZ6m+qn350Hi6nBXoqH/4WLRInDRJ4cZLVgfzuP/49waT9iOGX+kszKAVnMjvp4AYe96ZEBJ1DwUcMYDrX3S1A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-gamma@0.3.1': + resolution: {integrity: sha512-WONtgh00BdeBbgvhjjmn4kviBXb2ybFa4IDOhknxvKS3m8mIVJU59tzLHVa9XiGcomq1H7Mm6CeGPmjmkD+Rpw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-gammainc@0.3.1': + resolution: {integrity: sha512-w9R2wnk+5gvZaWiPsnlpZVELYvQ+6ZccgBY2JmRmwBLbvj5t/u8M0jC7MM3CaMCIt5jBmocCD4kCtconzx4WuQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-gammaincinv@0.2.3': + resolution: {integrity: sha512-eH3TCXZdH4WvtgKc+jI3ATeaYq87eKcActfSpV0ZZE6Otc326vmNzhv7dXnjVxgSY81bKgKeBzfaTW/fGyXT7w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-gammaln@0.3.1': + resolution: {integrity: sha512-ptzVz18xkfxzgekgAbk6ytMoDc7MYAUY4xZuAW/SyFGO6sCPVbwU4GH1/1IQAGLrDKYizKeVoTsO5NGK5Zpvyw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-gcd@0.3.2': + resolution: {integrity: sha512-eQKqRFOlHGw5Ce4mo91uilqywONEp/7L4d/bDEUqL1sRj3bTAIZeCa6ap7wl8vnMXCHLGI0ve7xp6wxVHo4Bdg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-kernel-betainc@0.2.3': + resolution: {integrity: sha512-ho7hVn2GAnHsoj+SKJxrgo5rvftmIinE2H2J9/NWXYU6ubjQJ1EmJAzZ6fMSED++lK+eARS1kUl8hUeKRuIbDQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-kernel-betaincinv@0.2.3': + resolution: {integrity: sha512-k93/sg4xC/eIsUUw1OD3Rwb8Y2Bl5moTMuOoKeSo5aogqpP6mFwSKOkoW9VS4iAHFUHkjPLgpaN7eRStm1/Deg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-kernel-cos@0.2.4': + resolution: {integrity: sha512-DFaoDJCFhPXiOuiGPSU1tmlUQ2UzRWMMB7lKKARjUoxbFpNLwB1TAqAnlx/rguQcCMf7uSZYALpTfxYlJHDPyg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-kernel-sin@0.2.4': + resolution: {integrity: sha512-mMXh47MXZd4gB45747Y+6Z5G4oQW0Uaqo5sx+HmJ7JPol/Sp3B6JSqahT+OtAf7oZVBAJ7qWmNlmib6IiueosQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-ldexp@0.2.5': + resolution: {integrity: sha512-ZbuCayeY8zsmptOxDsTnDmRGmEt10wjOXOdsKTCNGZwLP7h7e0ImTRbJ8wpKiLWv8JKef/xE+rp61wQrjZHS3A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-ln@0.2.5': + resolution: {integrity: sha512-ki+/tyoi767DsNyaw95O5NDMt1MbmRp5PI5ZfZo11AE6yUDKeS1H5cm3N3SE2GdwtuKyT3ZBc5/d8MtWzTPObA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-log1p@0.2.4': + resolution: {integrity: sha512-x7YYsmM3NqfcZlDwZ4x88e5MtkXHTtUAroPhuDgDk2Ez9J/ZWQY4/t3RHb+wwEYtZU1WG4PQ7VMDlHOJUvEhBQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-log1pmx@0.2.4': + resolution: {integrity: sha512-CrF4ucxzA1hkR4zSHaXWZGhfFuHS9A80nZP8cvIBvrtU8Dl21fHqCegOSSZBNvzL7WPssCXNzgkfdf5GUGvwlw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-max@0.3.1': + resolution: {integrity: sha512-TV4GK3gt5BCy4se6Rn59zSbcL2EQBYynJ4g15KeniZWrQbvpm7WdjdJRJk/Ly78ESAoM6Qd2KEaP/bTGukGTqA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-maxabs@0.3.1': + resolution: {integrity: sha512-nvlh0Pkwrmh3E6Nva+o0dbAksJ7BErsp9v3Q783TGNlwsRNovOc8FmrkqvmuDhWkSoUUuYtefYyxz1HZ+CzvDg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-min@0.2.4': + resolution: {integrity: sha512-RjwMYI+CqdD8Pg41RBsvv0g50nl3d2a5SJBXDcjzHIs0Lj4+qdOXSYQYbn2IQH0dVCNlZrBwaGX3L8O9tu5umQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-minabs@0.2.4': + resolution: {integrity: sha512-aRQBXaoSBj026u90ZTreKa88GAF8SWSqm2WD43v22TFJVJ0qhjtSmQXRLs+tD2ug7LDUHa8Bf1Ui2DYuVw41uQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-pow@0.3.1': + resolution: {integrity: sha512-8i5zbz0KfhnNeACMsT+94/iv1/zCNj5JurXvrNHfLg3eLwvKIvwI28G+anpaqGZdPX3aJq66M5+dKDMSWvUvyw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-powm1@0.3.2': + resolution: {integrity: sha512-GwjXuzaKy4uO+DDFirt1HIKlvL5359ssx4AgMhYuPnwcHvq+B8NSo8gld/jgcshTXelzkSHvupOcgZrBO8gZVQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-rempio2@0.3.1': + resolution: {integrity: sha512-tHqU2T0ewJKOUhlAqV5hc1iQzPC2KoBn88ahOBndQqfJUKUG0vg/sDPfi6LF35RVo+yW03pDMzeZlAmCi4bSzg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-round@0.3.1': + resolution: {integrity: sha512-YoFhBJb0J21QLG1sEHoC8Pxnb+eMfu+pAeT40jF1vlC6p18MFEDVgcX/iBpJg52jPal7CHJF86X6XxlbJCh3Yg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-roundn@0.2.3': + resolution: {integrity: sha512-u3G0ZUNJJzG8BFHmy+YhJpBFklTzF7I+Jz502bhv84GBjfwaaFOaJP1/RADmjcZsWU+ZuH/5G/kmFSwMFtKc8A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-signum@0.2.3': + resolution: {integrity: sha512-a4Ar0QsFqsie6dOAvJQyb7OWpIZKIbaa6EVn/ZF+B/CPfczQvqrv7UujeH5tfwZYOXqFbKXAOXv//nQm8/4yHQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-sin@0.3.1': + resolution: {integrity: sha512-t1mU2N6muFdXaafeYtxB3NQ9udxzL7gwFtKyph+GaMWJKLg1EAZ9G31StMFh5dqxmY0IjHLdkDUhwwh3pXxgPQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-sinpi@0.3.1': + resolution: {integrity: sha512-IHBiUy9KmG0pR6nqCaVktw/7j0IestUk6gIqMIQtQSyC11sgByhNJFKEBbIwqLgPGnLJ10B8Y3iN5jgBC7lRpQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-sqrt@0.2.3': + resolution: {integrity: sha512-Pdgq9Imx4lxsmM4jouu4b2ynB1osgrKLkJtdsaNUjrA3kTxc16FALkAJVEdKA9/7FxEFLji9CvJ0VBOWXzoyTQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-special-trunc@0.2.3': + resolution: {integrity: sha512-ga3rqr82G7Q3eqpF/aFR4v2Bj3meKhbuWRiEWrJwWARTqQa0e8aWTI7p9qYeQ0mFsKVoXH21oESjAHuJ1WfsQg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-tools-continued-fraction@0.2.3': + resolution: {integrity: sha512-EyzelNGzuL7wFfzbpuDFbf7//a3Z9iSRtIEbVbulduXQ8uYbB3YGMbbuKES2nG+WBeawpKFAgMDTC6siPdo1Vw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-tools-evalpoly@0.2.3': + resolution: {integrity: sha512-SJFnTcVUeDqVp+wJIZe9yj6Ddxn7kaf+aCepbmnxqdJLtvOtCsEyvOYX5q26x6Ik/JJULTNiOMQqWm2VInNAzQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/math-base-tools-sum-series@0.2.3': + resolution: {integrity: sha512-2Tc5fjKCXizXLb266n+AxNu0tTXau3DLd2lVPDhyBSqXoCqT0N/PZBmxWujaRuTpr7WxmEMzoMTxegwz487oaA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/napi-argv-bool@0.1.1': + resolution: {integrity: sha512-xW+BJ8wYeJAs3GPhu8SdlZur9WgzfKwFESJR8gzsaKkUy9+1POMs3jZA++I+Ote7CNY0AmFgC3/5v+qLNcb+Xw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/napi-argv-double@0.2.2': + resolution: {integrity: sha512-QJrnt4CTS8x7WHny4s8eHvGT2u5x8BSH6RWVaPg6ZrnHwqz9Jz48JGTawFKLgcyvZyeE9kCwKDkPIN7MbXcHKQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/napi-argv-float64array@0.2.3': + resolution: {integrity: sha512-0uZaYZC/sV6UN/rDNJxQVn5U4CsdjPGztT2c0D7i0bPPwLscv4THKyLge6x41acHx1kjPuEvq03l+Wg94/DL+A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/napi-argv-float@0.2.3': + resolution: {integrity: sha512-2hNFgenY7M5iVfIbRw+xccutxtKfk89VQb1RMGbSAOrRcR53J5OENAaddohrCp1zT1FKe14LCG/k+LlZR5jEdA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/napi-argv-int32@0.2.3': + resolution: {integrity: sha512-Set5AdSIUePU/Y0gT+WC4lerzahwaAQJd1USCgnKQD55xmDfXAPMyJliZnZPNUyjQ6SsWN6PaiOfJluq+oVcVQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/napi-argv@0.2.3': + resolution: {integrity: sha512-JQe8cqcCmxVhAMZ6z7Ysx0hmY8DtIGEXcM7Ymmjxl5VNaVXq/grw3HEQm5Fcb+TdqJIb7xEbsRHCiowRzvk0Pg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/napi-create-double@0.0.3': + resolution: {integrity: sha512-6JcSG40t8HQGOgRaaxpxMWKrkqqZbSnUIKi9qx8R4g1gWWzbP5/aRMmMcLpanmXP61PjryfpnjhtUC27WMFNfQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/napi-create-int32@0.0.3': + resolution: {integrity: sha512-tIT9BWA3jmOjzz4XTwVplkKETI3dyTK4BZoMtbQGnTxfsHz+pNdgepbp8hEx7wJADHKO2L8YTqddTHij4H3Ptw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/napi-export@0.3.1': + resolution: {integrity: sha512-JQaR2FYyIGprLgjg02JwgGGbjaYgRsWJpF72T748AiUQMd8SEN/mjUkqPq4zYLRjYATpKxnDUQNvP642z9JnIg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-ctor@0.2.3': + resolution: {integrity: sha512-T4xeLGny/gBRe4ZJcS5ugluT8E7Y/LCEHycTQingYWqbBK+5XJED7zJrcawkneewXd7CgqypCtVuI0BOxBBzcQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float16-base-to-float32@0.1.2': + resolution: {integrity: sha512-OClMQYz6GJEiSxrzhNp2LK4K8j75Rq6HCk+ReRBNQjXYdvNfzzaYoqnv3ZSzrXdvqUoGz+19XaVTLLzkKT1GCg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float16-base-to-float64@0.1.2': + resolution: {integrity: sha512-1MNdMfThDFEIMeJHKmum343x9sbiRplRmsjEHojVGyMQNuxOamzbzw+Gw3xl04GrfOIUG673KZEljwUwDFgtUA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float16-ctor@0.1.2': + resolution: {integrity: sha512-bdBhgwgtRClxBU9Ef8puY/WQ+DMqUr0oXfkfCrYKUATmqVQghv3bDw/dMggz01AguJo2ZtdjGp3PjQwNZlmHcg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float32-base-exponent@0.2.4': + resolution: {integrity: sha512-JUuSZCPD6yWA2jJhtS5MIYSZGerJJCXfwStz0Mqsh76x166mSkiZ4dH3VpDz2OMrZk6rvt35UB2HhAZecTqFAw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float32-base-to-float16@0.1.1': + resolution: {integrity: sha512-phYWBtfheX0c/pXtbiK/xr6lVwU5HKYVNgmol8y0HE8NvwXG3oCXLySa2p0jr+Xi7G9xtMdXW4Eq0rShs4lTmQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float32-base-to-word@0.2.3': + resolution: {integrity: sha512-E42KOQ+jqVDElwvFtrDMEkXYl03btIPan3g/YAScCibfmYDkYRDT9iuaydyYS/O3+m/MPM1Jhn+U/B8+f+C1HQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-assert-is-same-value@0.2.2': + resolution: {integrity: sha512-kE5uKSaMeE/V/zJf3B1jd1OOZ4biwXOp3hPuaOYm4s9J53Kq+53Hbq0wLLAVta/KZ1cbTp72nOjdufiMefyABQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-exponent@0.2.3': + resolution: {integrity: sha512-KRicBsOMrVCIB2veebT+mPpTrxyXCP6eknJTs8A59E/ATU2/gKYbMKzkdEX/FzxSBcdw5thvuuqmmwJKGZYSkA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-from-words@0.2.3': + resolution: {integrity: sha512-7v0bOW1AjsoWqkiVFqljLxCWmGA+iZ3OA/NwuIFBsYOEOpZqMIevu6TkJkWYaP6YYUJUrSG0w6t7b1P9JuzBgw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-get-high-word@0.2.3': + resolution: {integrity: sha512-yyJJR8+8BK88ldB5rM3GaM6S7vfUXZ3ib2VPse7Jb/ecd9r9gE6ojJv9v7N/M4STmKVrWWcggFEHzAVe/KMhrQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-get-low-word@0.2.3': + resolution: {integrity: sha512-e2OcnZ8wAYU5w/sFXY5d8bOFyjWYHW4UxdxLUsf24nVKyBPvS2Rhib8NbOETPeT8WYqFN6yrL2L4VlXO3Mz6ig==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-normalize@0.2.4': + resolution: {integrity: sha512-WVtJYkAt1zZXRlcjmbGEYVlZUd6dpSsOKACmVLEWyI9kMlegRAwibAKGMRtAcuYFSOyRVONwJbYar35McmabHg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-set-high-word@0.2.3': + resolution: {integrity: sha512-tWyEAJlbINvxcGMK5wgOlfFcZP9ILpqdBWLrc9HCpbUul41pmWEZi7+zI7dwe5zWIlACzguykdY0cEe7raceIw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-set-low-word@0.2.3': + resolution: {integrity: sha512-lmZvzkVlPqM+viBpmI0lBzArRb2+ifBMhuZ/Rtla+O91bcXgBtx/+L4UuqofAfQ5PRRnCW82r3kzILEKsxSoaw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-to-float16@0.1.2': + resolution: {integrity: sha512-d+ZJYGoykrzI3H0GRCI3qqyjspgNcIvECQ4OjyC1qdy1haT3cgoj1rwWkJS9uFKD/QgWlFGMrcmRzf0MVj17zg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-to-float32@0.2.3': + resolution: {integrity: sha512-+Lu8vk1oLCxO8RaRzw8pEY+BP2TWROweNFiML0w7TP4i9ZyG5E6EJdxZ2J3c29LVPfsf+oLOOxyySHH2kjwIsw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-float64-base-to-words@0.2.3': + resolution: {integrity: sha512-G63YuysfTKRP3Tkn19zBxTseS+uYnnOYZSN9VRTWrx5iNE8IYDzanAJIolSBZ7PuFMoE+HmjEZ0E9SX3NsLKvg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/number-uint32-base-to-int32@0.2.3': + resolution: {integrity: sha512-C6jGEzdnoiy9Er7mTwWO34r+6DVPRRVKRGVtxSQW3yAiQOnLS1ZvimqvgZtl0PYu1OnE02ReegpOMkpqSGO3vQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/object-ctor@0.2.2': + resolution: {integrity: sha512-3zkUkzZ9LdX+J5fEyU/D7I2c+0qG+ejNI3tCtSFek35bezdqWs9tOAAUiU6HeQJcGgqOmkakB4apIxvN+eehCA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/os-byte-order@0.2.3': + resolution: {integrity: sha512-QU4JY7WN4inoLVz+ML92TOevgyxZa+d2RcA1EmaDC0y0TNrXez1GmIn1t7+L7UTJEdf39IUm6VfdMmYdcDwFTw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/os-float-word-order@0.2.3': + resolution: {integrity: sha512-5dLZBCNn9Fge3kq7uHIh7S1qshfe5L7pjLYLSUGxxKa7gecAbsaQBPLxDkFiFwMytr6tnGGjWQfyVbhq/+RjlQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/process-cwd@0.2.3': + resolution: {integrity: sha512-T/sYVJjs9iHAOK9B8yGymGY+59eAz20G7eL/G4cObT6sWssAF7s/2+KgzAvWB0maE9qX6qnP4zBg2msCsWwvVg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/regexp-extended-length-path@0.2.3': + resolution: {integrity: sha512-3HYXiSzBpKz4nSOCtrYtMw9/OXN4EmTvq0owXv6HMvvDweFskieBcdNlVcOl0ViezjvUuvUL0DHJHdGp6SQEIw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/regexp-function-name@0.2.3': + resolution: {integrity: sha512-ER1C2rUW5Kzu5w4W0gbrJdIj5STNO5RfNy4GeiqycezeiXT99G393QeN4irqcOItYkeZhwbpY2ZzwlLxQvod1A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-anova1@0.2.3': + resolution: {integrity: sha512-UuDnctJuggfwuFmFJS0XGVN8x9S+lXCov7CvqkBaCThJH0k8iqOD7aLKR1L7qP9O+jSxuyNkk9CYtLqQ0J2rxA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-base-dists-chisquare-cdf@0.3.1': + resolution: {integrity: sha512-j0X9V9FO0kwpdmhaa38+JuEjkHws1b3SWJUGuCx9C/eUdTY4soi9EwjdXheDRu0ww9qRhrECpXobHUiLJEdnTw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-base-dists-degenerate-cdf@0.3.1': + resolution: {integrity: sha512-i6qu8JegKFJ/xJcnJH4x+wMTxKbHtMG2bOVjdFswxt5MHGEob0bmpZMCPaUQ99KDXx1ntntbAzqURt8Bwhi12g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-base-dists-f-cdf@0.2.3': + resolution: {integrity: sha512-wl74kdmaGjUlFkb2VI5ml/VyZsUB89EkHJi+tTvr281MyM9D0JYd0xaDKai7OnJ4R3S5YhFueQ2hkAjnIDwEkg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-base-dists-gamma-cdf@0.3.1': + resolution: {integrity: sha512-L+S2aLWixmdF+hHDt+R72yduF+jvDljTU1tpcevBD1CxMNuGliShgsbU9/w10odi30SW1HtaS9cRA99kWJmm/A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-base-dists-normal-cdf@0.3.1': + resolution: {integrity: sha512-a4xGRE5ZKaB1J9wGEXu7gforIA9mGkR3BqlHPaaUuasDBdYxsI6NH7mZr/zeWaT4c176iiZzJjYMPWUAdV4aFQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-base-dists-signrank-cdf@0.2.3': + resolution: {integrity: sha512-i6XUeuXXjCw9WIabx1wouBJ4RDxmkH85hYT3JrQWJwUxvDRUypYaI4V5abjeNYwlFByo2wiKhhjYe4nCXKg6hg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-base-dists-t-cdf@0.2.3': + resolution: {integrity: sha512-Y6LUuwknLaewhjnJgMwcZuiD4adx1hzEkbnnrwlqh7Qz+CFyh1D5Ov7ZoyHkcs5djAZcOTaVbn8Ktc+EQ6A7mA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-base-dists-t-quantile@0.2.3': + resolution: {integrity: sha512-HT6cfDL8EKt7H5rpA5x4YHOfXNAOyxToijTBiQSEvHoGnRoULcc0RFm+KF3kI85HP55AVkg6/KIuukdpRICxUg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-incr-stdev@0.2.3': + resolution: {integrity: sha512-vjYynYt2/phYnn05EWQeVCXpssy+aE9rIeYpwNtiu24yR3BZ4scAYoxn/O6toG/hnmxAW/DZl4qAvhuTUq7hiQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-kruskal-test@0.2.3': + resolution: {integrity: sha512-T9fgDFwGS0R7BCCi9Gp+AKGX8F3vHWOw4zp24d35XlD35trl7eYtrg35kYxBD6khsmP0Fd3oioYCWbj+eYzJHw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-ranks@0.2.3': + resolution: {integrity: sha512-SoXELH42IHmW8gdpqLGnMt6PNCH3A9CqXcXojh5Ff/RGhZMrRTdQphTjNfqfNdwjmM8eqlI7SbOG93Alx7QoHg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-strided-mean@0.1.1': + resolution: {integrity: sha512-45UdxpAPbb3d+8obiaHOeUBie0GlB6J0xV+vMhkGR71AO5UaEPLxFnIRgx9dz1KLuThw8Ms/TQXTvXV3Z8YnvQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-strided-meanpn@0.1.1': + resolution: {integrity: sha512-Mu6bByEITlud9K/nrO7ICA0o5K+CP09GhWJoXS8BJWi2qmw/h/3O3RzBKkinKkUhoW9LVNSI+wmng4fU+rsXOQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-strided-variance@0.1.1': + resolution: {integrity: sha512-nrO5mvyRUV8Ta4Y4HsTGY8uQ97+e0QZyt+T6ASjqvqKe6B+KC1yBGXKAcxxa698Pyhx2eFHTrvpm39GGI7SQUQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-strided-variancepn@0.1.1': + resolution: {integrity: sha512-F2GPQSda5jxsZ0kZhYXLc/RJ4uMknWJqYx420/Ed5Du1NIDMLxy4mCleJxgJ/zVLS9t8AgAq/EOAx/QOY78l2g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-ttest2@0.2.3': + resolution: {integrity: sha512-CJIrZTDmyJi0TrscYO2qiE9M+rsWcKEa2a0nwh1e4VD6glJxO5q53t4y1Yr0D3OyI17ZMIhS7o1zJZnxD3mDVg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-ttest@0.2.3': + resolution: {integrity: sha512-sbwGkIvLNTi77qJ2fwscQH+wT7XGv5gM2MmE6HTJsDk4XTmhyPTlSsE4mbuGKz5UXlnVCrL2qAp5KaW+TlTHlg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/stats-wilcoxon@0.2.3': + resolution: {integrity: sha512-w0+WZ8TDbM9jW1ASnjDSYFHSO3xJZuGkr1ojt/DUufB0KMNjhrsoiQmljPN4QhKI4d/DRHU+ZR9MrxSBn123XQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/strided-base-reinterpret-boolean@0.0.3': + resolution: {integrity: sha512-co8rBbg9FYbz4X2ZGMMlt/+MpC4gq/JhxaSYMby2n92hvK57Ru62L35Kq1nngBHFb6hshhCRbnFXMyVzL6OYwQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/strided-base-reinterpret-complex128@0.2.3': + resolution: {integrity: sha512-7y/Phr1B+d2GBnyv9a0DQBwsZIvDstLXNuEfQ+Y9NOzl0NG7pQvzlTkm6MTtxIbsYoQO44GTpIHEK8ag/cpa/A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/strided-base-reinterpret-complex64@0.2.2': + resolution: {integrity: sha512-BgbLBqLqoc0GfdyHPI2xYuTOqQkAB2ivBw7rN35ev0J2GN0X9rnUtRKvl5V2H3WFqsvujieS6HwGZ+fmF2Tocg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/strided-base-reinterpret-complex@0.1.3': + resolution: {integrity: sha512-3mG3Uqyvvr1NXQ/EAg3Yy5V5VAWLBuZ4K3/cbaxXJTl4DL5r+Uh1Taus4pgy4j5Z2FVkK/4iqjpnRWx8sj0q6g==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/strided-base-stride2offset@0.1.1': + resolution: {integrity: sha512-c5GkXFQOKEbfWM3f8db1AyDCWswazdgTKJrIj7DZZJSBUUECmg5avHPJy0juFHn1Sp3JfzQUx6ViQXqm6VoarQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/string-base-format-interpolate@0.2.4': + resolution: {integrity: sha512-POG725+DPEmzEJbMFTFPdKM4vA5i+t7juNYs+H2cQz5JXiPV1+5+P3epnO+/DqHWzLhiMlsKDCZq03C3WcBkSA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/string-base-format-tokenize@0.2.4': + resolution: {integrity: sha512-qYHSmqFv7vloLFvjBAbZCn5qtxj7M+Qru3VqBooJTxWMcUeZOEBZg18/PFgfUrZhji5MVWDXbRTAx5Bu5M5nQA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/string-base-lowercase@0.4.1': + resolution: {integrity: sha512-3NcDy2j6HtvKrC2GRCt5mKiYaWWHLLSQRSbuu28WEzA98/2izmiHYkR0i9IeEd4Tqrxqof/FXP4gWj1f14RXTQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/string-base-repeat@0.2.3': + resolution: {integrity: sha512-Cd9shcpBgwM0MsYCcE3sLmtEhph1tQDK+JsfvMmUpdAOdR4fIVtbT7W+6LT/dSXxCqCsrdDypBY148lITzZ8zA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/string-base-replace@0.2.3': + resolution: {integrity: sha512-FJdh2GzIkgMlr0v/ZZKD5cWRs+SMOhBTWxAexmWoYFL3WL1YMDgwI5hRtYh/ySyOy94MjJmYwRMpIVdxeclrAw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/string-format@0.2.3': + resolution: {integrity: sha512-uE0LHUUnWKfxFeipyfb9yWbs+iczz6dHaolSGC1WBzMVyeHqx8xvq+yP3f2POYWgEcknmxNgU21WSqToSNrxdA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/string-repeat@0.2.3': + resolution: {integrity: sha512-6Bh4BCnldYilcc0uwX2CK3ujuBQNI9uoAPgEHVI012hTpsT610o5Zxcis3JLsDgG/IWG/Ig+vYnmIt989nn6Gw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/string-replace@0.2.3': + resolution: {integrity: sha512-CXJhl/L2TfRrkVUNVp8OfNsKeuUzOZXzJLUDoopHtQalbWBww1fDSDj1fwGpzgZV4IODs8LCsiIxLBnLRP6emg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/symbol-ctor@0.2.3': + resolution: {integrity: sha512-wnuFrxnmhg2p6QQP0B/j97LD5ys2d1bHuwVvh9yuUSCLoX/GankaVyGSufk2ROlsxrcm2HPhSDB/ILBHeUmamA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/symbol-iterator@0.2.3': + resolution: {integrity: sha512-HN609e5u8+O3VtiHbQeuGeKMgR1/bZ0E/qwObihTA5Yca5ATDJsTZOxY463JNU41x+6xlptO24l4OJE+t3IBAA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/symbol-to-primitive@0.1.2': + resolution: {integrity: sha512-//r52ighL35HprZrK5Pdiz1L27l47X9o+0LOJ84mTk5eB89i9shVRjOpHauKyx/uy9VkDoxUkMY0PwPrAIp4aw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/types@0.4.3': + resolution: {integrity: sha512-9GCqS2eni2VSwa5/CCniAJ4I1eWLtvior1z6hoPJp6VTNMgW9Lh4BiI84IO0xun/0qAclJ+mTGTiCTZxZLK13A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-constant-function@0.2.3': + resolution: {integrity: sha512-mQ6606O8JKq4tgL508it1ro7hx+RK6j36URSjbRI7Dje72YYpdQJGnN6UJ183Im5TT0fN2s4oOCM6+SAGcQi2w==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-constructor-name@0.2.3': + resolution: {integrity: sha512-/ApogDUIFxndcmnEeI6ctsqWt66c40g1T7R0nS9aOoYgnDOdmpUFSflzf++MDWksBycGsqgm1UD7IU54m4u7jg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-convert-path@0.2.3': + resolution: {integrity: sha512-fmqJ6Qvce0HV7D+uYrram/+iAHB3u2gMys9zeh0uc/h411sB8Hw9X7i1w2cJevCpouMzqTnpzp75C+swkoQlKA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-count-by@0.2.3': + resolution: {integrity: sha512-cK/P0JXJHFC8jrONRnedhSJhHTlvG641Ay5Q1kpjum+R2ryBkVcgxNAfpfrSaiLOTDKRmj9dFuNv1cXN1h2S4Q==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-define-nonenumerable-read-only-accessor@0.2.4': + resolution: {integrity: sha512-ZxHDIuA6d1Wr10Nkav5ejS53LS0eAwXV9IijQLQ/vD/rCRMNnLYT1hC2a0ZpDRc+lHQ0xsyHQvmYQJy9GBFkpg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-define-nonenumerable-read-only-property@0.2.3': + resolution: {integrity: sha512-W0rqnRsXgW3GjcwEcOMi0mI/CXn3TVqmFvcxItLUZPJNYmwrU6+t+9kGldhMw845DyOtv8uYASrnNoVE/VfiDw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-define-property@0.2.5': + resolution: {integrity: sha512-WpbXc2uq8vtSqmWFzVrFifNj6HGoGHIZHolxX5GfRFbj4RNme1u/wtklmiOvcHE0s6SwPX764tuFXIgHBR5Vag==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-define-read-only-property@0.2.3': + resolution: {integrity: sha512-3sGMpmmSlErHup+Y6YwIgN075GW3t1FD8ARS+zHaU1U1IKEaiOVKMH49WfBGiSsVfV7sfieoZC5B//MrSWQjaA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-escape-regexp-string@0.2.3': + resolution: {integrity: sha512-ZQAq5HHF+C1fmK+RvqeMO0iIQf5kGl2Ofx9LYloURUPZD2zVMX+2hxDLFBTPAusqYxffQAjj3ap4LE/J0+YiRQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-eval@0.2.3': + resolution: {integrity: sha512-T9rL6lEX58My6GcZ0bXD7reJoBEzoO/r5i3U/lj6dC94immyQtbqoz0djHfpCVrCnoK4Mzbq3t813cBQS7yfRg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-get-prototype-of@0.2.3': + resolution: {integrity: sha512-unEoKhhAnV4AbQ87oPo1v+4xLjd00nQxJLSvl43PkdoBn/GKNv/B6SMnQWmM5b62esWTbxBu/uWCYoglbprxkA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-global@0.2.3': + resolution: {integrity: sha512-e8gyuENhSeF8udH7vlZMDbNVQ/ZxZ4vWOcpB2iw06z1HSFZWc31Coh19ScfgagLfofo2GQYPJI3tJtZQYsUS6A==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-identity-function@0.2.3': + resolution: {integrity: sha512-XZNW1j/mWbRTP8WeIVCQX9o/2HOudrCIgRjte5EJsDjZp2fKW6mTjm96s3P9NGd4YQi3jzDm36VWPjLRQziJRg==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-index-of@0.2.3': + resolution: {integrity: sha512-R5lBztlvTWiH0CFFSYsSDGDexQH5y9UVIAHNevp/uS3jE0+nMHREWEkIwCHxkAsYlbi1Dlbyq8+vapswxgBSNw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-keys@0.2.3': + resolution: {integrity: sha512-pH7orA2LGYVQ/uTDtNFPocdpF8AfiZIcJpGR1178OhoaMv7lXa4avVHCNY5TT+GHZebJxIWJum1zmi8onYuVwQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-library-manifest@0.2.4': + resolution: {integrity: sha512-sNzEclCbpRRa35DBv8ZOcOjCesBLczkOFX8o7mMrG9VWhyZuJUCBtgSPmzGIIBLAsVEYJuguEk4iYoMqFnCwnw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-memoize@0.2.3': + resolution: {integrity: sha512-H8OGqss0lsbTAFKxbaQ+xywRgtcn9WV4w6p59tjMVmsDqQNGGrwvf6TuljUJY3Wc21E5VK4Vcs2O/MxBIAJsZw==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-native-class@0.2.3': + resolution: {integrity: sha512-UGXCPhgmOjwMpEQ5fFiifcqrhUnP8ICyWzEkHphUrh2/0pHyK0zilZvcODfROgzoy6L9ivUUuR6NjrAI+j14hA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-noop@0.2.3': + resolution: {integrity: sha512-kZQWwUwq+RwmKBZZD+6dnRwhjfut5fBgbEappugvVjFGp12wDKXCj6D6Y/xTmBdKFRumO8/gzkj9n6DKNDchpA==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-tabulate@0.2.3': + resolution: {integrity: sha512-00HL6s5KPcAqwobAjmaTlsGK7i6FVb1IFqivaKoIhn8rGPuFTYmeo4Kc2ZyXGitteQJjXABl0qjF+yei813OVQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + + '@stdlib/utils-type-of@0.2.3': + resolution: {integrity: sha512-2KmDUfqIv0g4lrWtnyR5xw82NvdsEwUHON43JAe55XRlLWnk1V1troiyJiM9fccENtl524kVRBnD7RMohmUyyQ==} + engines: {node: '>=0.10.0', npm: '>2.7.0'} + os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -1993,6 +4010,9 @@ packages: '@types/d3-format@3.0.4': resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + '@types/d3-scale@4.0.9': resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} @@ -2271,6 +4291,10 @@ packages: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -2288,6 +4312,9 @@ packages: ag-charts-locale@12.1.2: resolution: {integrity: sha512-GFAq4KZit3CHT3Br/LGruas75HqsvV+VZV6qz5hLrmiovJSSVfzPirzf/hUGDTCHqIOS7CdxmpdKUu8pKv1LGw==} + ag-charts-types@10.3.9: + resolution: {integrity: sha512-drcRiJVencliC8LnRwk4MmeQDNNBg5GzmOoLFihO3/k0CUK0VF/N+2nc7iFozwaNG0btSB9vAhYuJLjqHMtRrQ==} + ag-charts-types@12.1.2: resolution: {integrity: sha512-B5IEMzaDxpJRko9sREIBEZOn44tlMX353tMJ1RGYHZrjDFx4on/p6q3YxBvway3nViAM2POmFOS45+1fF9YC8g==} @@ -2338,10 +4365,6 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2358,9 +4381,13 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansis@3.17.0: - resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} - engines: {node: '>=14'} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2383,9 +4410,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-kit@3.0.0-beta.1: - resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} - engines: {node: '>=20.19.0'} + ast-kit@3.0.0: + resolution: {integrity: sha512-8OG92q3R35qjC/4i6BLBMg8IB+fClWu/1PEwg2Z9Rn+BuNaiEgJzpzn+pxWOdHJWDCAwu2JP0wCDTozAM4QirQ==} + engines: {node: ^22.18.0 || >=24.11.0} async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -2500,12 +4527,22 @@ packages: buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-fill@1.0.0: resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + buffer@5.6.0: + resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buildcheck@0.0.7: resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==} engines: {node: '>=10.0.0'} @@ -2555,14 +4592,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - clean-stack@3.0.1: - resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} - engines: {node: '>=10'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -2597,24 +4626,31 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + comlink@4.4.2: + resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2641,6 +4677,15 @@ packages: resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} engines: {node: '>=10.0.0'} + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + cross-spawn@6.0.6: resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} @@ -2664,14 +4709,50 @@ packages: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + d3-format@3.1.0: resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} engines: {node: '>=12'} + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + d3-interpolate@3.0.1: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} engines: {node: '>=12'} + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + d3-scale@4.0.2: resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} engines: {node: '>=12'} @@ -2680,6 +4761,10 @@ packages: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + d3-time-format@4.1.0: resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} engines: {node: '>=12'} @@ -2688,9 +4773,31 @@ packages: resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} engines: {node: '>=12'} + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -2752,9 +4859,9 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dts-resolver@2.1.3: - resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} - engines: {node: '>=20.19.0'} + dts-resolver@3.0.0: + resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} + engines: {node: ^22.18.0 || >=24.0.0} peerDependencies: oxc-resolver: '>=11.0.0' peerDependenciesMeta: @@ -2773,11 +4880,6 @@ packages: engines: {node: '>=14'} hasBin: true - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} @@ -2831,10 +4933,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -2846,9 +4944,17 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} @@ -2917,9 +5023,6 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2977,10 +5080,6 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -2993,8 +5092,9 @@ packages: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + get-tsconfig@5.0.0-beta.5: + resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} + engines: {node: '>=20.20.0'} github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -3079,10 +5179,6 @@ packages: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -3109,11 +5205,6 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3157,10 +5248,6 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -3185,11 +5272,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jake@10.9.4: - resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} - engines: {node: '>=10'} - hasBin: true - jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} @@ -3238,12 +5320,19 @@ packages: jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + kdbush@4.1.0: + resolution: {integrity: sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ==} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -3314,10 +5403,6 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - local-pkg@1.1.2: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} @@ -3434,6 +5519,9 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -3489,6 +5577,10 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} @@ -3500,6 +5592,10 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3681,11 +5777,15 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + protobufjs@7.6.5: + resolution: {integrity: sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==} engines: {node: '>=12.0.0'} pump@3.0.3: @@ -3708,17 +5808,32 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quickjs-emscripten-core@0.31.0: - resolution: {integrity: sha512-oQz8p0SiKDBc1TC7ZBK2fr0GoSHZKA0jZIeXxsnCyCs4y32FStzCW4d1h6E1sE0uHDMbGITbk2zhNaytaoJwXQ==} + quickjs-emscripten-core@0.32.0: + resolution: {integrity: sha512-QFnPfjFey8EqknSrSxe1hZrf1/8z7/6s1QzGOmKo6++02r7QRRX7ZoyNaZh7JuVjWsVW87KnQrbZqnHkOAzUyg==} - quickjs-emscripten@0.31.0: - resolution: {integrity: sha512-K7Yt78aRPLjPcqv3fIuLW1jW3pvwO21B9pmFOolsjM/57ZhdVXBr51GqJpalgBlkPu9foAvhEAuuQPnvIGvLvQ==} + quickjs-emscripten@0.32.0: + resolution: {integrity: sha512-So0Sqw869y/S2oE3Nuc0uT3Dhqgvsj8FSrwBdsuTosVsG8ME5/OcudU1GxsrIFdFABgy17GHnTVO9TYV/bLQcA==} engines: {node: '>=16.0.0'} + quickselect@3.0.0: + resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + + rbush@4.0.1: + resolution: {integrity: sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ==} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + peerDependencies: + react: ^19.2.8 + + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + engines: {node: '>=0.10.0'} + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -3730,6 +5845,13 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} @@ -3764,15 +5886,15 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown-plugin-dts@0.23.2: - resolution: {integrity: sha512-PbSqLawLgZBGcOGT3yqWBGn4cX+wh2nt5FuBGdcMHyOhoukmjbhYAl8NT9sE4U38Cm9tqLOIQeOrvzeayM0DLQ==} - engines: {node: '>=20.19.0'} + rolldown-plugin-dts@0.26.0: + resolution: {integrity: sha512-e+kEPtUiDES0htk5iqkSeF4EzAV7R+vugGB44iPDuw1Kw9E+WyL1VG7PaV0IIjGHLiacztMBcMTyrr8ON9CT1Q==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: '@ts-macro/tsc': ^0.3.6 '@typescript/native-preview': '>=7.0.0-dev.20260325.1' - rolldown: ^1.0.0-rc.12 + rolldown: ^1.0.0 typescript: ^5.0.0 || ^6.0.0 - vue-tsc: ~3.2.0 + vue-tsc: ~3.2.0 || ~3.3.0 peerDependenciesMeta: '@ts-macro/tsc': optional: true @@ -3788,6 +5910,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.2.4: + resolution: {integrity: sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-copy@3.5.0: resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} engines: {node: '>=8.3'} @@ -3823,6 +5950,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + seek-bzip@1.0.6: resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} hasBin: true @@ -3932,6 +6062,9 @@ packages: std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + streamx@2.23.0: resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} @@ -4122,10 +6255,6 @@ packages: tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -4140,6 +6269,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} @@ -4438,10 +6572,6 @@ packages: engines: {node: '>=8'} hasBin: true - widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - winston-transport@4.9.0: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} @@ -4450,9 +6580,6 @@ packages: resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} engines: {node: '>= 12.0.0'} - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -4506,11 +6633,20 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: + '@ag-grid-community/core@32.3.9': + dependencies: + ag-charts-types: 10.3.9 + tslib: 2.8.1 + '@ast-grep/napi-darwin-arm64@0.36.3': optional: true @@ -4597,6 +6733,50 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 + '@aws-sdk/client-ecr-public@3.859.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.858.0 + '@aws-sdk/credential-provider-node': 3.859.0 + '@aws-sdk/middleware-host-header': 3.840.0 + '@aws-sdk/middleware-logger': 3.840.0 + '@aws-sdk/middleware-recursion-detection': 3.840.0 + '@aws-sdk/middleware-user-agent': 3.858.0 + '@aws-sdk/region-config-resolver': 3.840.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.848.0 + '@aws-sdk/util-user-agent-browser': 3.840.0 + '@aws-sdk/util-user-agent-node': 3.858.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.7 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.14 + '@smithy/middleware-retry': 4.4.14 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.13 + '@smithy/util-defaults-mode-node': 4.2.16 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-s3@3.859.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 @@ -4810,6 +6990,17 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/lib-storage@3.859.0(@aws-sdk/client-s3@3.859.0)': + dependencies: + '@aws-sdk/client-s3': 3.859.0 + '@smithy/abort-controller': 4.2.5 + '@smithy/middleware-endpoint': 4.3.14 + '@smithy/smithy-client': 4.9.10 + buffer: 5.6.0 + events: 3.3.0 + stream-browserify: 3.0.0 + tslib: 2.8.1 + '@aws-sdk/middleware-bucket-endpoint@3.840.0': dependencies: '@aws-sdk/types': 3.840.0 @@ -5037,7 +7228,7 @@ snapshots: '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5052,10 +7243,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@8.0.0-rc.3': + '@babel/generator@8.0.0': dependencies: - '@babel/parser': 8.0.0-rc.3 - '@babel/types': 8.0.0-rc.3 + '@babel/parser': 8.0.4 + '@babel/types': 8.0.4 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 '@types/jsesc': 2.5.1 @@ -5089,11 +7280,11 @@ snapshots: '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-string-parser@8.0.0-rc.3': {} + '@babel/helper-string-parser@8.0.0': {} '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-identifier@8.0.0-rc.3': {} + '@babel/helper-validator-identifier@8.0.4': {} '@babel/helper-validator-option@7.29.7': {} @@ -5106,9 +7297,9 @@ snapshots: dependencies: '@babel/types': 7.29.7 - '@babel/parser@8.0.0-rc.3': + '@babel/parser@8.0.4': dependencies: - '@babel/types': 8.0.0-rc.3 + '@babel/types': 8.0.4 '@babel/runtime@7.28.4': {} @@ -5126,7 +7317,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.7 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -5135,10 +7326,10 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/types@8.0.0-rc.3': + '@babel/types@8.0.4': dependencies: - '@babel/helper-string-parser': 8.0.0-rc.3 - '@babel/helper-validator-identifier': 8.0.0-rc.3 + '@babel/helper-string-parser': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 '@bufbuild/protobuf@2.10.1': {} @@ -5298,6 +7489,67 @@ snapshots: '@colors/colors@1.6.0': {} + '@d3fc/d3fc-axis@3.0.7(d3-scale@4.0.2)(d3-selection@3.0.0)(d3-shape@3.2.0)': + dependencies: + '@d3fc/d3fc-data-join': 6.0.3(d3-selection@3.0.0) + '@d3fc/d3fc-rebind': 6.0.1 + d3-scale: 4.0.2 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + + '@d3fc/d3fc-chart@5.1.9(d3-array@3.2.4)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(d3-scale@4.0.2)(d3-selection@3.0.0)(d3-shape@3.2.0)': + dependencies: + '@d3fc/d3fc-axis': 3.0.7(d3-scale@4.0.2)(d3-selection@3.0.0)(d3-shape@3.2.0) + '@d3fc/d3fc-data-join': 6.0.3(d3-selection@3.0.0) + '@d3fc/d3fc-element': 6.2.0 + '@d3fc/d3fc-rebind': 6.0.1 + '@d3fc/d3fc-series': 6.1.3(d3-array@3.2.4)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(d3-scale@4.0.2)(d3-selection@3.0.0)(d3-shape@3.2.0) + d3-scale: 4.0.2 + d3-selection: 3.0.0 + transitivePeerDependencies: + - d3-array + - d3-path + - d3-scale-chromatic + - d3-shape + + '@d3fc/d3fc-data-join@6.0.3(d3-selection@3.0.0)': + dependencies: + d3-selection: 3.0.0 + + '@d3fc/d3fc-element@6.2.0': {} + + '@d3fc/d3fc-pointer@3.0.3(d3-dispatch@3.0.1)(d3-selection@3.0.0)': + dependencies: + '@d3fc/d3fc-rebind': 6.0.1 + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + '@d3fc/d3fc-rebind@6.0.1': {} + + '@d3fc/d3fc-series@6.1.3(d3-array@3.2.4)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(d3-scale@4.0.2)(d3-selection@3.0.0)(d3-shape@3.2.0)': + dependencies: + '@d3fc/d3fc-data-join': 6.0.3(d3-selection@3.0.0) + '@d3fc/d3fc-rebind': 6.0.1 + '@d3fc/d3fc-shape': 6.0.1(d3-path@3.1.0) + '@d3fc/d3fc-webgl': 3.2.1(d3-scale@4.0.2)(d3-shape@3.2.0) + d3-array: 3.2.4 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + transitivePeerDependencies: + - d3-path + + '@d3fc/d3fc-shape@6.0.1(d3-path@3.1.0)': + dependencies: + d3-path: 3.1.0 + + '@d3fc/d3fc-webgl@3.2.1(d3-scale@4.0.2)(d3-shape@3.2.0)': + dependencies: + '@d3fc/d3fc-rebind': 6.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + '@dabh/diagnostics@2.0.8': dependencies: '@so-ric/colorspace': 1.1.6 @@ -5398,16 +7650,16 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@grpc/grpc-js@1.13.4': + '@grpc/grpc-js@1.14.4': dependencies: - '@grpc/proto-loader': 0.7.15 + '@grpc/proto-loader': 0.8.1 '@js-sdsl/ordered-map': 4.4.2 - '@grpc/proto-loader@0.7.15': + '@grpc/proto-loader@0.8.1': dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.4 + protobufjs: 7.6.5 yargs: 17.7.2 '@inquirer/ansi@1.0.2': {} @@ -5556,23 +7808,23 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jitl/quickjs-ffi-types@0.31.0': {} + '@jitl/quickjs-ffi-types@0.32.0': {} - '@jitl/quickjs-wasmfile-debug-asyncify@0.31.0': + '@jitl/quickjs-wasmfile-debug-asyncify@0.32.0': dependencies: - '@jitl/quickjs-ffi-types': 0.31.0 + '@jitl/quickjs-ffi-types': 0.32.0 - '@jitl/quickjs-wasmfile-debug-sync@0.31.0': + '@jitl/quickjs-wasmfile-debug-sync@0.32.0': dependencies: - '@jitl/quickjs-ffi-types': 0.31.0 + '@jitl/quickjs-ffi-types': 0.32.0 - '@jitl/quickjs-wasmfile-release-asyncify@0.31.0': + '@jitl/quickjs-wasmfile-release-asyncify@0.32.0': dependencies: - '@jitl/quickjs-ffi-types': 0.31.0 + '@jitl/quickjs-ffi-types': 0.32.0 - '@jitl/quickjs-wasmfile-release-sync@0.31.0': + '@jitl/quickjs-wasmfile-release-sync@0.32.0': dependencies: - '@jitl/quickjs-ffi-types': 0.31.0 + '@jitl/quickjs-ffi-types': 0.32.0 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -5660,23 +7912,92 @@ snapshots: '@microsoft/tsdoc@0.16.0': {} - '@milaboratories/computable@2.9.5': + '@milaboratories/columns-collection-driver@0.2.3': + dependencies: + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-model-common': 1.47.3 + + '@milaboratories/computable@2.9.8': dependencies: '@milaboratories/pl-error-like': 1.12.10 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/ts-helpers': 1.8.6 '@types/node': 24.5.2 utility-types: 3.11.0 + '@milaboratories/graph-maker@1.4.8(@milaboratories/pl-model-common@1.46.2)(@platforma-sdk/model@1.79.20)(@platforma-sdk/ui-vue@1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3))(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(typescript@5.9.3)': + dependencies: + '@ag-grid-community/core': 32.3.9 + '@milaboratories/helpers': 1.14.5 + '@milaboratories/miplots4': 1.2.3(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0) + '@milaboratories/pf-plots': 1.4.6(@milaboratories/pl-model-common@1.46.2)(@platforma-sdk/model@1.79.20) + '@platforma-sdk/model': 1.79.20 + '@platforma-sdk/ui-vue': 1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3) + '@types/d3-hierarchy': 3.1.7 + '@types/d3-scale': 4.0.9 + '@vueuse/core': 13.9.0(vue@3.5.25(typescript@5.9.3)) + ag-grid-vue3: 34.1.2(vue@3.5.25(typescript@5.9.3)) + canonicalize: 2.1.0 + d3-hierarchy: 3.1.2 + d3-scale: 4.0.2 + vue: 3.5.25(typescript@5.9.3) + transitivePeerDependencies: + - '@milaboratories/pl-model-common' + - d3-dispatch + - d3-path + - d3-scale-chromatic + - supports-color + - typescript + '@milaboratories/helpers@1.14.2': {} - '@milaboratories/pf-driver@1.7.11(@bytecodealliance/preview2-shim@0.17.8)': + '@milaboratories/helpers@1.14.5': {} + + '@milaboratories/miplots4@1.2.3(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)': + dependencies: + '@d3fc/d3fc-chart': 5.1.9(d3-array@3.2.4)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(d3-scale@4.0.2)(d3-selection@3.0.0)(d3-shape@3.2.0) + '@d3fc/d3fc-pointer': 3.0.3(d3-dispatch@3.0.1)(d3-selection@3.0.0) + '@d3fc/d3fc-series': 6.1.3(d3-array@3.2.4)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(d3-scale@4.0.2)(d3-selection@3.0.0)(d3-shape@3.2.0) + '@d3fc/d3fc-webgl': 3.2.1(d3-scale@4.0.2)(d3-shape@3.2.0) + '@stdlib/stats-anova1': 0.2.3 + '@stdlib/stats-base-dists-f-cdf': 0.2.3 + '@stdlib/stats-kruskal-test': 0.2.3 + '@stdlib/stats-ttest': 0.2.3 + '@stdlib/stats-ttest2': 0.2.3 + '@stdlib/stats-wilcoxon': 0.2.3 + comlink: 4.4.2 + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-color: 3.1.0 + d3-drag: 3.0.0 + d3-format: 3.1.0 + d3-hierarchy: 3.1.2 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-zoom: 3.0.0 + kdbush: 4.1.0 + lodash: 4.17.21 + rbush: 4.0.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + zod: 3.25.76 + transitivePeerDependencies: + - d3-dispatch + - d3-path + - d3-scale-chromatic + - supports-color + + '@milaboratories/pf-driver@1.9.0(@bytecodealliance/preview2-shim@0.17.8)': dependencies: - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pframes-rs-node': 1.1.50 - '@milaboratories/pframes-rs-wasm': 1.1.50(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.1)(@milaboratories/pl-model-middle-layer@1.30.6) - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/pl-model-middle-layer': 1.30.6 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pf-spec': 1.0.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pframes-rs-node': 1.1.56 + '@milaboratories/pl-model-common': 1.47.3 + '@milaboratories/pl-model-middle-layer': 1.31.0 + '@milaboratories/ts-helpers': 1.8.6 es-toolkit: 1.43.0 lru-cache: 11.2.4 transitivePeerDependencies: @@ -5684,52 +8005,95 @@ snapshots: - encoding - supports-color - '@milaboratories/pf-spec-driver@1.4.13(@bytecodealliance/preview2-shim@0.17.8)': + '@milaboratories/pf-plots@1.4.6(@milaboratories/pl-model-common@1.46.2)(@platforma-sdk/model@1.79.20)': + dependencies: + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-model-common': 1.46.2 + '@platforma-sdk/model': 1.79.20 + canonicalize: 2.1.0 + lodash: 4.17.21 + + '@milaboratories/pf-spec-driver@1.4.16(@bytecodealliance/preview2-shim@0.17.8)': dependencies: '@milaboratories/helpers': 1.14.2 - '@milaboratories/pframes-rs-wasm': 1.1.50(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.1)(@milaboratories/pl-model-middle-layer@1.30.6) - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/pl-model-middle-layer': 1.30.6 + '@milaboratories/pframes-rs-wasm': 1.1.52(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.2)(@milaboratories/pl-model-middle-layer@1.30.9) + '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/pl-model-middle-layer': 1.30.9 + '@noble/hashes': 2.2.0 + transitivePeerDependencies: + - '@bytecodealliance/preview2-shim' + + '@milaboratories/pf-spec-driver@1.5.0(@bytecodealliance/preview2-shim@0.17.8)': + dependencies: + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pf-spec': 1.0.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pl-model-common': 1.47.3 '@noble/hashes': 2.2.0 transitivePeerDependencies: - '@bytecodealliance/preview2-shim' - '@milaboratories/pframes-rs-node@1.1.50': + '@milaboratories/pf-spec@1.0.0(@bytecodealliance/preview2-shim@0.17.8)': + dependencies: + '@bytecodealliance/preview2-shim': 0.17.8 + '@milaboratories/pl-model-common': 1.47.3 + '@milaboratories/pl-model-middle-layer': 1.31.0 + + '@milaboratories/pframes-rs-node@1.1.56': dependencies: '@mapbox/node-pre-gyp': 2.0.3 '@milaboratories/helpers': 1.14.2 - '@milaboratories/pframes-rs-serv': 1.1.50 - '@milaboratories/pl-model-common': 1.46.1 + '@milaboratories/pframes-rs-serv': 1.1.56 + '@milaboratories/pl-model-common': 1.46.2 ulid: 3.0.2 transitivePeerDependencies: - encoding - supports-color - '@milaboratories/pframes-rs-serv@1.1.50': + '@milaboratories/pframes-rs-serv@1.1.56': dependencies: '@milaboratories/helpers': 1.14.2 - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/pl-model-middle-layer': 1.30.5 + '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/pl-model-middle-layer': 1.30.7 better-sqlite3: 12.10.0 commander: 14.0.3 selfsigned: 5.5.0 - '@milaboratories/pframes-rs-wasip2@1.1.50': {} + '@milaboratories/pframes-rs-wasip2@1.1.52': {} - '@milaboratories/pframes-rs-wasm@1.1.50(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.1)(@milaboratories/pl-model-middle-layer@1.30.6)': + '@milaboratories/pframes-rs-wasip2@1.1.56': {} + + '@milaboratories/pframes-rs-wasm@1.1.52(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.2)(@milaboratories/pl-model-middle-layer@1.30.9)': dependencies: '@bytecodealliance/preview2-shim': 0.17.8 - '@milaboratories/pframes-rs-wasip2': 1.1.50 - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/pl-model-middle-layer': 1.30.6 + '@milaboratories/pframes-rs-wasip2': 1.1.52 + '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/pl-model-middle-layer': 1.30.9 - '@milaboratories/pl-client@3.11.4': + '@milaboratories/pl-client@3.14.6': dependencies: - '@grpc/grpc-js': 1.13.4 + '@grpc/grpc-js': 1.14.4 '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/ts-helpers': 1.8.3 - '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.13.4) + '@milaboratories/pl-model-common': 1.47.3 + '@milaboratories/ts-helpers': 1.8.6 + '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) + '@protobuf-ts/runtime': 2.11.1 + '@protobuf-ts/runtime-rpc': 2.11.1 + canonicalize: 2.1.0 + denque: 2.1.0 + long: 5.3.2 + lru-cache: 11.2.4 + openapi-fetch: 0.15.0 + undici: 7.16.0 + utility-types: 3.11.0 + yaml: 2.8.2 + + '@milaboratories/pl-client@3.14.7': + dependencies: + '@grpc/grpc-js': 1.14.4 + '@milaboratories/pl-http': 1.2.4 + '@milaboratories/pl-model-common': 1.48.0 + '@milaboratories/ts-helpers': 1.8.6 + '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) '@protobuf-ts/runtime': 2.11.1 '@protobuf-ts/runtime-rpc': 2.11.1 canonicalize: 2.1.0 @@ -5741,19 +8105,19 @@ snapshots: utility-types: 3.11.0 yaml: 2.8.2 - '@milaboratories/pl-config@1.8.2': + '@milaboratories/pl-config@1.8.5': dependencies: - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/ts-helpers': 1.8.6 upath: 2.0.1 yaml: 2.8.2 - '@milaboratories/pl-deployments@3.0.7': + '@milaboratories/pl-deployments@3.0.15': dependencies: - '@milaboratories/pl-config': 1.8.2 - '@milaboratories/pl-healthcheck': 1.0.1 + '@milaboratories/pl-config': 1.8.5 + '@milaboratories/pl-healthcheck': 1.0.5 '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/pl-model-common': 1.47.3 + '@milaboratories/ts-helpers': 1.8.6 decompress: 4.2.1 ssh2: 1.17.0 tar: 7.5.2 @@ -5762,16 +8126,16 @@ snapshots: yaml: 2.8.2 zod: 3.25.76 - '@milaboratories/pl-drivers@1.16.0': + '@milaboratories/pl-drivers@1.16.15': dependencies: - '@grpc/grpc-js': 1.13.4 - '@milaboratories/computable': 2.9.5 - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pl-client': 3.11.4 - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/pl-tree': 1.12.12 - '@milaboratories/ts-helpers': 1.8.3 - '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.13.4) + '@grpc/grpc-js': 1.14.4 + '@milaboratories/computable': 2.9.8 + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-model-common': 1.47.3 + '@milaboratories/pl-tree': 1.13.6 + '@milaboratories/ts-helpers': 1.8.6 + '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) '@protobuf-ts/plugin': 2.11.1 '@protobuf-ts/runtime': 2.11.1 '@protobuf-ts/runtime-rpc': 2.11.1 @@ -5793,17 +8157,17 @@ snapshots: json-stringify-safe: 5.0.1 zod: 3.25.76 - '@milaboratories/pl-errors@1.4.22': + '@milaboratories/pl-errors@1.4.35': dependencies: - '@milaboratories/pl-client': 3.11.4 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/ts-helpers': 1.8.6 zod: 3.25.76 - '@milaboratories/pl-healthcheck@1.0.1': + '@milaboratories/pl-healthcheck@1.0.5': dependencies: - '@grpc/grpc-js': 1.13.4 - '@milaboratories/ts-helpers': 1.8.3 - '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.13.4) + '@grpc/grpc-js': 1.14.4 + '@milaboratories/ts-helpers': 1.8.6 + '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) '@protobuf-ts/runtime': 2.11.1 '@protobuf-ts/runtime-rpc': 2.11.1 @@ -5811,33 +8175,33 @@ snapshots: dependencies: undici: 7.16.0 - '@milaboratories/pl-middle-layer@1.64.32(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1)': - dependencies: - '@milaboratories/computable': 2.9.5 - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pf-driver': 1.7.11(@bytecodealliance/preview2-shim@0.17.8) - '@milaboratories/pf-spec-driver': 1.4.13(@bytecodealliance/preview2-shim@0.17.8) - '@milaboratories/pframes-rs-node': 1.1.50 - '@milaboratories/pframes-rs-wasm': 1.1.50(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.1)(@milaboratories/pl-model-middle-layer@1.30.6) - '@milaboratories/pl-client': 3.11.4 - '@milaboratories/pl-deployments': 3.0.7 - '@milaboratories/pl-drivers': 1.16.0 - '@milaboratories/pl-errors': 1.4.22 + '@milaboratories/pl-middle-layer@1.66.19(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1)': + dependencies: + '@milaboratories/columns-collection-driver': 0.2.3 + '@milaboratories/computable': 2.9.8 + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pf-driver': 1.9.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pf-spec-driver': 1.5.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pframes-rs-node': 1.1.56 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-deployments': 3.0.15 + '@milaboratories/pl-drivers': 1.16.15 + '@milaboratories/pl-errors': 1.4.35 '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-backend': 1.4.7 - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/pl-model-middle-layer': 1.30.6 - '@milaboratories/pl-tree': 1.12.12 + '@milaboratories/pl-model-backend': 1.4.20 + '@milaboratories/pl-model-common': 1.47.3 + '@milaboratories/pl-model-middle-layer': 1.31.0 + '@milaboratories/pl-tree': 1.13.6 '@milaboratories/resolve-helper': 1.1.3 - '@milaboratories/ts-helpers': 1.8.3 - '@platforma-sdk/block-tools': 2.11.0(@types/node@25.0.1) - '@platforma-sdk/model': 1.79.14 - '@platforma-sdk/workflow-tengo': 6.6.3 + '@milaboratories/ts-helpers': 1.8.6 + '@platforma-sdk/block-tools': 2.13.0(@types/node@25.0.1) + '@platforma-sdk/model': 1.81.1 + '@platforma-sdk/workflow-tengo': 6.8.2 canonicalize: 2.1.0 denque: 2.1.0 es-toolkit: 1.43.0 lru-cache: 11.2.4 - quickjs-emscripten: 0.31.0 + quickjs-emscripten: 0.32.0 semver: 7.7.3 undici: 7.16.0 utility-types: 3.11.0 @@ -5853,48 +8217,90 @@ snapshots: - react-native-b4a - supports-color - '@milaboratories/pl-model-backend@1.4.7': + '@milaboratories/pl-model-backend@1.4.20': + dependencies: + '@milaboratories/pl-client': 3.14.6 + canonicalize: 2.1.0 + zod: 3.25.76 + + '@milaboratories/pl-model-backend@1.4.21': dependencies: - '@milaboratories/pl-client': 3.11.4 + '@milaboratories/pl-client': 3.14.7 canonicalize: 2.1.0 zod: 3.25.76 - '@milaboratories/pl-model-common@1.46.1': + '@milaboratories/pl-model-common@1.46.2': dependencies: '@milaboratories/helpers': 1.14.2 '@milaboratories/pl-error-like': 1.12.10 canonicalize: 2.1.0 zod: 3.25.76 - '@milaboratories/pl-model-middle-layer@1.30.5': + '@milaboratories/pl-model-common@1.47.3': + dependencies: + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-error-like': 1.12.10 + canonicalize: 2.1.0 + es-toolkit: 1.43.0 + zod: 3.25.76 + + '@milaboratories/pl-model-common@1.48.0': + dependencies: + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-error-like': 1.12.10 + canonicalize: 2.1.0 + es-toolkit: 1.43.0 + zod: 3.25.76 + + '@milaboratories/pl-model-middle-layer@1.30.7': dependencies: '@milaboratories/helpers': 1.14.2 - '@milaboratories/pl-model-common': 1.46.1 + '@milaboratories/pl-model-common': 1.46.2 es-toolkit: 1.43.0 utility-types: 3.11.0 zod: 3.25.76 - '@milaboratories/pl-model-middle-layer@1.30.6': + '@milaboratories/pl-model-middle-layer@1.30.9': dependencies: '@milaboratories/helpers': 1.14.2 - '@milaboratories/pl-model-common': 1.46.1 + '@milaboratories/pl-model-common': 1.46.2 + es-toolkit: 1.43.0 + utility-types: 3.11.0 + zod: 3.25.76 + + '@milaboratories/pl-model-middle-layer@1.31.0': + dependencies: + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-model-common': 1.47.3 + es-toolkit: 1.43.0 + utility-types: 3.11.0 + zod: 3.25.76 + + '@milaboratories/pl-model-middle-layer@1.32.0': + dependencies: + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-model-common': 1.48.0 es-toolkit: 1.43.0 utility-types: 3.11.0 zod: 3.25.76 - '@milaboratories/pl-tree@1.12.12': + '@milaboratories/pl-tree@1.13.6': dependencies: - '@milaboratories/computable': 2.9.5 - '@milaboratories/pl-client': 3.11.4 - '@milaboratories/pl-errors': 1.4.22 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/computable': 2.9.8 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-errors': 1.4.35 + '@milaboratories/ts-helpers': 1.8.6 denque: 2.1.0 utility-types: 3.11.0 zod: 3.25.76 - '@milaboratories/ptabler-expression-js@1.2.30': + '@milaboratories/ptabler-expression-js@1.2.31': + dependencies: + '@platforma-open/milaboratories.software-ptabler.schema': 1.15.15 + + '@milaboratories/ptabler-expression-js@1.2.37': dependencies: - '@platforma-open/milaboratories.software-ptabler.schema': 1.15.14 + '@platforma-open/milaboratories.software-ptabler.schema': 1.15.21 '@milaboratories/resolve-helper@1.1.3': {} @@ -5902,17 +8308,58 @@ snapshots: '@milaboratories/tengo-tester@1.6.4': {} - '@milaboratories/ts-builder@1.5.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.24(typescript@5.9.3))(yaml@2.8.2)': + '@milaboratories/ts-builder@1.6.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.24(typescript@5.9.3))(yaml@2.8.2)': dependencies: - '@milaboratories/ts-configs': 1.2.3 + '@milaboratories/ts-configs': 1.4.0 '@vitejs/plugin-vue': 6.0.5(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2))(vue@3.5.24(typescript@5.9.3)) - commander: 12.1.0 + commander: 15.0.0 jsonc-parser: 3.3.1 oxfmt: 0.35.0 oxlint: 1.63.0 oxlint-plugin-eslint: 1.63.0 - rolldown: 1.0.2 - rolldown-plugin-dts: 0.23.2(rolldown@1.0.2)(typescript@5.9.3)(vue-tsc@3.3.5(typescript@5.9.3)) + rolldown: 1.2.4 + rolldown-plugin-dts: 0.26.0(rolldown@1.2.4)(typescript@5.9.3)(vue-tsc@3.3.5(typescript@5.9.3)) + rollup-plugin-copy: 3.5.0 + rollup-plugin-sourcemaps2: 0.5.6(@types/node@25.0.1)(rollup@4.53.3) + typescript: 5.9.3 + vite: 8.0.14(@types/node@25.0.1)(yaml@2.8.2) + vite-plugin-commonjs: 0.10.4 + vite-plugin-dts: 4.5.4(@types/node@25.0.1)(rollup@4.53.3)(typescript@5.9.3)(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2)) + vite-plugin-externalize-deps: 0.10.0(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2)) + vite-plugin-lib-inject-css: 2.2.2(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2)) + vue-tsc: 3.3.5(typescript@5.9.3) + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@types/node' + - '@typescript/native-preview' + - '@vitejs/devtools' + - esbuild + - jiti + - less + - oxc-resolver + - oxlint-tsgolint + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - vue + - yaml + + '@milaboratories/ts-builder@1.6.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.6.3))(yaml@2.8.2)': + dependencies: + '@milaboratories/ts-configs': 1.4.0 + '@vitejs/plugin-vue': 6.0.5(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.6.3)) + commander: 15.0.0 + jsonc-parser: 3.3.1 + oxfmt: 0.35.0 + oxlint: 1.63.0 + oxlint-plugin-eslint: 1.63.0 + rolldown: 1.2.4 + rolldown-plugin-dts: 0.26.0(rolldown@1.2.4)(typescript@5.9.3)(vue-tsc@3.3.5(typescript@5.9.3)) rollup-plugin-copy: 3.5.0 rollup-plugin-sourcemaps2: 0.5.6(@types/node@25.0.1)(rollup@4.53.3) typescript: 5.9.3 @@ -5943,17 +8390,17 @@ snapshots: - vue - yaml - '@milaboratories/ts-builder@1.5.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2)': + '@milaboratories/ts-builder@1.6.2(@types/node@25.0.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2)': dependencies: - '@milaboratories/ts-configs': 1.2.3 + '@milaboratories/ts-configs': 1.4.0 '@vitejs/plugin-vue': 6.0.5(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) - commander: 12.1.0 + commander: 15.0.0 jsonc-parser: 3.3.1 oxfmt: 0.35.0 oxlint: 1.63.0 oxlint-plugin-eslint: 1.63.0 - rolldown: 1.0.2 - rolldown-plugin-dts: 0.23.2(rolldown@1.0.2)(typescript@5.9.3)(vue-tsc@3.3.5(typescript@5.9.3)) + rolldown: 1.2.4 + rolldown-plugin-dts: 0.26.0(rolldown@1.2.4)(typescript@5.9.3)(vue-tsc@3.3.5(typescript@5.9.3)) rollup-plugin-copy: 3.5.0 rollup-plugin-sourcemaps2: 0.5.6(@types/node@25.0.1)(rollup@4.53.3) typescript: 5.9.3 @@ -5984,23 +8431,52 @@ snapshots: - vue - yaml - '@milaboratories/ts-configs@1.2.3': {} + '@milaboratories/ts-configs@1.4.0': {} - '@milaboratories/ts-helpers-oclif@1.1.42': + '@milaboratories/ts-helpers@1.8.6': dependencies: - '@milaboratories/ts-helpers': 1.8.3 - '@oclif/core': 4.8.0 + '@milaboratories/helpers': 1.14.5 + canonicalize: 2.1.0 + denque: 2.1.0 - '@milaboratories/ts-helpers@1.8.3': + '@milaboratories/uikit@2.15.11(typescript@5.9.3)': dependencies: '@milaboratories/helpers': 1.14.2 + '@platforma-sdk/model': 1.79.20 + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-scale': 4.0.9 + '@types/d3-selection': 3.0.11 + '@types/sortablejs': 1.15.9 + '@vue/test-utils': 2.4.6 + '@vueuse/core': 13.9.0(vue@3.5.24(typescript@5.9.3)) + '@vueuse/integrations': 13.9.0(sortablejs@1.15.6)(vue@3.5.24(typescript@5.9.3)) canonicalize: 2.1.0 - denque: 2.1.0 + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-scale: 4.0.2 + d3-selection: 3.0.0 + resize-observer-polyfill: 1.5.1 + sortablejs: 1.15.6 + vue: 3.5.24(typescript@5.9.3) + transitivePeerDependencies: + - async-validator + - axios + - change-case + - drauu + - focus-trap + - fuse.js + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - typescript + - universal-cookie - '@milaboratories/uikit@2.15.8(typescript@5.9.3)': + '@milaboratories/uikit@2.15.23(typescript@5.9.3)': dependencies: - '@milaboratories/helpers': 1.14.2 - '@platforma-sdk/model': 1.79.14 + '@milaboratories/helpers': 1.14.5 + '@platforma-sdk/model': 1.81.1 '@types/d3-array': 3.2.2 '@types/d3-axis': 3.0.6 '@types/d3-scale': 4.0.9 @@ -6054,31 +8530,12 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@oclif/core@4.8.0': - dependencies: - ansi-escapes: 4.3.2 - ansis: 3.17.0 - clean-stack: 3.0.1 - cli-spinners: 2.9.2 - debug: 4.4.3(supports-color@8.1.1) - ejs: 3.1.10 - get-package-type: 0.1.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - lilconfig: 3.1.3 - minimatch: 9.0.5 - semver: 7.7.3 - string-width: 4.2.3 - supports-color: 8.1.1 - tinyglobby: 0.2.16 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - '@one-ini/wasm@0.1.1': {} '@oxc-project/types@0.132.0': {} + '@oxc-project/types@0.144.0': {} + '@oxfmt/binding-android-arm-eabi@0.35.0': optional: true @@ -6310,14 +8767,146 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@platforma-open/milaboratories.software-ptabler.schema@1.15.14': + '@platforma-open/milaboratories.runenv-python-3.12.10-atls@1.2.7': {} + + '@platforma-open/milaboratories.runenv-python-3.12.10-clustering@0.1.1': {} + + '@platforma-open/milaboratories.runenv-python-3.12.10-h5ad@1.1.5': {} + + '@platforma-open/milaboratories.runenv-python-3.12.10-humanness@0.2.0': {} + + '@platforma-open/milaboratories.runenv-python-3.12.10-parapred@1.1.0': {} + + '@platforma-open/milaboratories.runenv-python-3.12.10-pgen@0.2.0': {} + + '@platforma-open/milaboratories.runenv-python-3.12.10-rapids@1.7.2': {} + + '@platforma-open/milaboratories.runenv-python-3.12.10-sccoda@1.3.6': {} + + '@platforma-open/milaboratories.runenv-python-3.12.10-scientific-slim@1.1.0': {} + + '@platforma-open/milaboratories.runenv-python-3.12.10-torch-cuda@0.2.0': {} + + '@platforma-open/milaboratories.runenv-python-3.12.10@1.3.24': {} + + '@platforma-open/milaboratories.runenv-python-3@1.11.6': dependencies: - '@milaboratories/pl-model-common': 1.46.1 + '@platforma-open/milaboratories.runenv-python-3.12.10': 1.3.24 + '@platforma-open/milaboratories.runenv-python-3.12.10-atls': 1.2.7 + '@platforma-open/milaboratories.runenv-python-3.12.10-clustering': 0.1.1 + '@platforma-open/milaboratories.runenv-python-3.12.10-h5ad': 1.1.5 + '@platforma-open/milaboratories.runenv-python-3.12.10-humanness': 0.2.0 + '@platforma-open/milaboratories.runenv-python-3.12.10-parapred': 1.1.0 + '@platforma-open/milaboratories.runenv-python-3.12.10-pgen': 0.2.0 + '@platforma-open/milaboratories.runenv-python-3.12.10-rapids': 1.7.2 + '@platforma-open/milaboratories.runenv-python-3.12.10-sccoda': 1.3.6 + '@platforma-open/milaboratories.runenv-python-3.12.10-scientific-slim': 1.1.0 + '@platforma-open/milaboratories.runenv-python-3.12.10-torch-cuda': 0.2.0 + + '@platforma-open/milaboratories.samples-and-data@1.18.1': {} + + '@platforma-open/milaboratories.sequence-properties.model@1.3.2(@milaboratories/pl-model-common@1.46.2)(@platforma-sdk/ui-vue@1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3))(@types/node@25.0.1)(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(typescript@5.9.3)': + dependencies: + '@milaboratories/graph-maker': 1.4.8(@milaboratories/pl-model-common@1.46.2)(@platforma-sdk/model@1.79.20)(@platforma-sdk/ui-vue@1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3))(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(typescript@5.9.3) + '@milaboratories/helpers': 1.14.2 + '@platforma-sdk/model': 1.79.20 + '@types/node': 25.0.1 + typescript: 5.9.3 + transitivePeerDependencies: + - '@milaboratories/pl-model-common' + - '@platforma-sdk/ui-vue' + - d3-dispatch + - d3-path + - d3-scale-chromatic + - supports-color + + '@platforma-open/milaboratories.sequence-properties.software@1.2.1': {} + + '@platforma-open/milaboratories.sequence-properties.ui@1.4.1(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.2)(@types/node@25.0.1)(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))(vitest@4.0.18(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))(vue@3.5.24(typescript@5.9.3))': + dependencies: + '@milaboratories/graph-maker': 1.4.8(@milaboratories/pl-model-common@1.46.2)(@platforma-sdk/model@1.79.20)(@platforma-sdk/ui-vue@1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3))(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(typescript@5.9.3) + '@platforma-open/milaboratories.sequence-properties.model': 1.3.2(@milaboratories/pl-model-common@1.46.2)(@platforma-sdk/ui-vue@1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3))(@types/node@25.0.1)(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(typescript@5.9.3) + '@platforma-sdk/model': 1.79.20 + '@platforma-sdk/ui-vue': 1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3) + typescript: 5.9.3 + vite: 7.2.7(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2) + vitest: 4.0.18(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2) + vue: 3.5.24(typescript@5.9.3) + transitivePeerDependencies: + - '@bytecodealliance/preview2-shim' + - '@milaboratories/pl-model-common' + - '@types/node' + - async-validator + - axios + - change-case + - d3-dispatch + - d3-path + - d3-scale-chromatic + - drauu + - focus-trap + - fuse.js + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - supports-color + - universal-cookie + + '@platforma-open/milaboratories.sequence-properties.workflow@1.3.3(vitest@4.0.18(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))': + dependencies: + '@platforma-open/milaboratories.sequence-properties.software': 1.2.1 + '@platforma-sdk/workflow-tengo': 6.6.5 + vitest: 4.0.18(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2) + + '@platforma-open/milaboratories.sequence-properties@1.5.2(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.2)(@platforma-sdk/ui-vue@1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3))(@types/node@25.0.1)(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))(vitest@4.0.18(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))(vue@3.5.24(typescript@5.9.3))': + dependencies: + '@platforma-open/milaboratories.sequence-properties.model': 1.3.2(@milaboratories/pl-model-common@1.46.2)(@platforma-sdk/ui-vue@1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3))(@types/node@25.0.1)(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(typescript@5.9.3) + '@platforma-open/milaboratories.sequence-properties.ui': 1.4.1(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.2)(@types/node@25.0.1)(d3-dispatch@3.0.1)(d3-path@3.1.0)(d3-scale-chromatic@3.1.0)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))(vitest@4.0.18(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))(vue@3.5.24(typescript@5.9.3)) + '@platforma-open/milaboratories.sequence-properties.workflow': 1.3.3(vitest@4.0.18(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2)) + '@platforma-sdk/model': 1.79.20 + transitivePeerDependencies: + - '@bytecodealliance/preview2-shim' + - '@milaboratories/pl-model-common' + - '@platforma-sdk/ui-vue' + - '@types/node' + - async-validator + - axios + - change-case + - d3-dispatch + - d3-path + - d3-scale-chromatic + - drauu + - focus-trap + - fuse.js + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - supports-color + - typescript + - universal-cookie + - vite + - vitest + - vue + + '@platforma-open/milaboratories.software-anarci@0.0.3': {} + + '@platforma-open/milaboratories.software-ptabler.schema@1.15.15': + dependencies: + '@milaboratories/pl-model-common': 1.46.2 + + '@platforma-open/milaboratories.software-ptabler.schema@1.15.21': + dependencies: + '@milaboratories/pl-model-common': 1.47.3 + + '@platforma-open/milaboratories.software-ptabler@2.1.3': {} - '@platforma-open/milaboratories.software-ptabler@2.1.2': {} + '@platforma-open/milaboratories.software-ptabler@2.1.8': {} '@platforma-open/milaboratories.software-ptexter@1.2.2': {} + '@platforma-open/milaboratories.software-ptexter@1.2.4': {} + '@platforma-open/milaboratories.software-small-binaries.hello-world-py@1.0.10': {} '@platforma-open/milaboratories.software-small-binaries.hello-world@1.1.7': {} @@ -6336,20 +8925,48 @@ snapshots: '@platforma-open/milaboratories.software-small-binaries.mnz-client': 1.6.5 '@platforma-open/milaboratories.software-small-binaries.table-converter': 1.3.5 - '@platforma-sdk/block-tools@2.11.0(@types/node@25.0.1)': + '@platforma-sdk/block-tools@2.13.0(@types/node@25.0.1)': dependencies: + '@aws-sdk/client-ecr-public': 3.859.0 '@aws-sdk/client-s3': 3.859.0 '@inquirer/prompts': 7.10.1(@types/node@25.0.1) '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-backend': 1.4.7 - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/pl-model-middle-layer': 1.30.6 + '@milaboratories/pl-model-backend': 1.4.20 + '@milaboratories/pl-model-common': 1.47.3 + '@milaboratories/pl-model-middle-layer': 1.31.0 + '@milaboratories/resolve-helper': 1.1.3 + '@milaboratories/ts-helpers': 1.8.6 + '@platforma-sdk/blocks-deps-updater': 2.2.0 + '@platforma-sdk/package-builder-lib': 1.3.0 + canonicalize: 2.1.0 + commander: 15.0.0 + lru-cache: 11.2.4 + mime-types: 2.1.35 + tar: 7.5.2 + undici: 7.16.0 + yaml: 2.8.2 + zod: 3.25.76 + transitivePeerDependencies: + - '@types/node' + - aws-crt + - bare-abort-controller + - react-native-b4a + + '@platforma-sdk/block-tools@2.14.3(@types/node@25.0.1)': + dependencies: + '@aws-sdk/client-ecr-public': 3.859.0 + '@aws-sdk/client-s3': 3.859.0 + '@inquirer/prompts': 7.10.1(@types/node@25.0.1) + '@milaboratories/pl-http': 1.2.4 + '@milaboratories/pl-model-backend': 1.4.21 + '@milaboratories/pl-model-common': 1.48.0 + '@milaboratories/pl-model-middle-layer': 1.32.0 '@milaboratories/resolve-helper': 1.1.3 - '@milaboratories/ts-helpers': 1.8.3 - '@milaboratories/ts-helpers-oclif': 1.1.42 - '@oclif/core': 4.8.0 + '@milaboratories/ts-helpers': 1.8.6 '@platforma-sdk/blocks-deps-updater': 2.2.0 + '@platforma-sdk/package-builder-lib': 1.3.0 canonicalize: 2.1.0 + commander: 15.0.0 lru-cache: 11.2.4 mime-types: 2.1.35 tar: 7.5.2 @@ -6359,40 +8976,81 @@ snapshots: transitivePeerDependencies: - '@types/node' - aws-crt + - bare-abort-controller + - react-native-b4a '@platforma-sdk/blocks-deps-updater@2.2.0': dependencies: yaml: 2.8.2 - '@platforma-sdk/model@1.79.14': + '@platforma-sdk/model@1.79.20': dependencies: '@milaboratories/helpers': 1.14.2 '@milaboratories/pl-error-like': 1.12.10 - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/pl-model-middle-layer': 1.30.6 - '@milaboratories/ptabler-expression-js': 1.2.30 + '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/pl-model-middle-layer': 1.30.9 + '@milaboratories/ptabler-expression-js': 1.2.31 + canonicalize: 2.1.0 + es-toolkit: 1.43.0 + fast-json-patch: 3.1.1 + utility-types: 3.11.0 + zod: 3.25.76 + + '@platforma-sdk/model@1.81.1': + dependencies: + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-error-like': 1.12.10 + '@milaboratories/pl-model-common': 1.47.3 + '@milaboratories/pl-model-middle-layer': 1.31.0 + '@milaboratories/ptabler-expression-js': 1.2.37 canonicalize: 2.1.0 es-toolkit: 1.43.0 fast-json-patch: 3.1.1 + lru-cache: 11.2.4 utility-types: 3.11.0 zod: 3.25.76 - '@platforma-sdk/tengo-builder@4.0.8': + '@platforma-sdk/package-builder-lib@1.3.0': + dependencies: + '@aws-sdk/client-s3': 3.859.0 + '@aws-sdk/lib-storage': 3.859.0(@aws-sdk/client-s3@3.859.0) + '@milaboratories/resolve-helper': 1.1.3 + archiver: 7.0.1 + undici: 7.16.0 + winston: 3.19.0 + yaml: 2.8.2 + zod: 3.25.76 + transitivePeerDependencies: + - aws-crt + - bare-abort-controller + - react-native-b4a + + '@platforma-sdk/package-builder@3.15.0': + dependencies: + '@platforma-sdk/package-builder-lib': 1.3.0 + commander: 15.0.0 + winston: 3.19.0 + transitivePeerDependencies: + - aws-crt + - bare-abort-controller + - react-native-b4a + + '@platforma-sdk/tengo-builder@4.0.22': dependencies: - '@milaboratories/pl-model-backend': 1.4.7 + '@milaboratories/pl-model-backend': 1.4.20 '@milaboratories/resolve-helper': 1.1.3 '@milaboratories/tengo-tester': 1.6.4 - '@milaboratories/ts-helpers': 1.8.3 - '@oclif/core': 4.8.0 + '@milaboratories/ts-helpers': 1.8.6 + commander: 15.0.0 winston: 3.19.0 - '@platforma-sdk/test@1.79.14(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1)(vite@7.2.7(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))': + '@platforma-sdk/test@1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1)(vite@7.2.7(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2))': dependencies: - '@milaboratories/computable': 2.9.5 - '@milaboratories/pl-client': 3.11.4 - '@milaboratories/pl-middle-layer': 1.64.32(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1) - '@milaboratories/pl-tree': 1.12.12 - '@platforma-sdk/model': 1.79.14 + '@milaboratories/computable': 2.9.8 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-middle-layer': 1.66.19(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1) + '@milaboratories/pl-tree': 1.13.6 + '@platforma-sdk/model': 1.81.1 '@vitest/coverage-istanbul': 4.1.7(vitest@4.0.18(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2)) vitest: 4.1.7(@types/node@25.0.1)(@vitest/coverage-istanbul@4.1.7)(vite@7.2.7(@types/node@25.0.1)(lightningcss@1.32.0)(yaml@2.8.2)) transitivePeerDependencies: @@ -6416,13 +9074,13 @@ snapshots: - supports-color - vite - '@platforma-sdk/test@1.79.14(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1)(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2))': + '@platforma-sdk/test@1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1)(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2))': dependencies: - '@milaboratories/computable': 2.9.5 - '@milaboratories/pl-client': 3.11.4 - '@milaboratories/pl-middle-layer': 1.64.32(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1) - '@milaboratories/pl-tree': 1.12.12 - '@platforma-sdk/model': 1.79.14 + '@milaboratories/computable': 2.9.8 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-middle-layer': 1.66.19(@bytecodealliance/preview2-shim@0.17.8)(@types/node@25.0.1) + '@milaboratories/pl-tree': 1.13.6 + '@platforma-sdk/model': 1.81.1 '@vitest/coverage-istanbul': 4.1.7(vitest@4.1.7) vitest: 4.1.7(@types/node@25.0.1)(@vitest/coverage-istanbul@4.1.7)(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2)) transitivePeerDependencies: @@ -6446,12 +9104,49 @@ snapshots: - supports-color - vite - '@platforma-sdk/ui-vue@1.79.14(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3)': + '@platforma-sdk/ui-vue@1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3)': dependencies: - '@milaboratories/pf-spec-driver': 1.4.13(@bytecodealliance/preview2-shim@0.17.8) - '@milaboratories/pl-model-common': 1.46.1 - '@milaboratories/uikit': 2.15.8(typescript@5.9.3) - '@platforma-sdk/model': 1.79.14 + '@milaboratories/pf-spec-driver': 1.4.16(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/uikit': 2.15.11(typescript@5.9.3) + '@platforma-sdk/model': 1.79.20 + '@types/d3-format': 3.0.4 + '@types/node': 24.5.2 + '@types/semver': 7.7.1 + '@vueuse/core': 13.9.0(vue@3.5.24(typescript@5.9.3)) + '@zip.js/zip.js': 2.8.11 + ag-grid-enterprise: 34.1.2 + ag-grid-vue3: 34.1.2(vue@3.5.24(typescript@5.9.3)) + canonicalize: 2.1.0 + d3-format: 3.1.0 + es-toolkit: 1.43.0 + fast-json-patch: 3.1.1 + immer: 11.1.4 + lru-cache: 11.2.4 + vue: 3.5.24(typescript@5.9.3) + zod: 3.25.76 + transitivePeerDependencies: + - '@bytecodealliance/preview2-shim' + - async-validator + - axios + - change-case + - drauu + - focus-trap + - fuse.js + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - typescript + - universal-cookie + + '@platforma-sdk/ui-vue@1.81.1(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.9.3)': + dependencies: + '@milaboratories/columns-collection-driver': 0.2.3 + '@milaboratories/pf-spec-driver': 1.5.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pl-model-common': 1.47.3 + '@milaboratories/uikit': 2.15.23(typescript@5.9.3) + '@platforma-sdk/model': 1.81.1 '@types/d3-format': 3.0.4 '@types/node': 24.5.2 '@types/semver': 7.7.1 @@ -6482,17 +9177,25 @@ snapshots: - typescript - universal-cookie - '@platforma-sdk/workflow-tengo@6.6.3': + '@platforma-sdk/workflow-tengo@6.6.5': dependencies: - '@milaboratories/pframes-rs-wasip2': 1.1.50 + '@milaboratories/pframes-rs-wasip2': 1.1.52 '@milaboratories/software-pframes-conv': 2.2.9 - '@platforma-open/milaboratories.software-ptabler': 2.1.2 + '@platforma-open/milaboratories.software-ptabler': 2.1.3 '@platforma-open/milaboratories.software-ptexter': 1.2.2 '@platforma-open/milaboratories.software-small-binaries': 2.1.1 - '@protobuf-ts/grpc-transport@2.11.1(@grpc/grpc-js@1.13.4)': + '@platforma-sdk/workflow-tengo@6.8.2': + dependencies: + '@milaboratories/pframes-rs-wasip2': 1.1.56 + '@milaboratories/software-pframes-conv': 2.2.9 + '@platforma-open/milaboratories.software-ptabler': 2.1.8 + '@platforma-open/milaboratories.software-ptexter': 1.2.4 + '@platforma-open/milaboratories.software-small-binaries': 2.1.1 + + '@protobuf-ts/grpc-transport@2.11.1(@grpc/grpc-js@1.14.4)': dependencies: - '@grpc/grpc-js': 1.13.4 + '@grpc/grpc-js': 1.14.4 '@protobuf-ts/runtime': 2.11.1 '@protobuf-ts/runtime-rpc': 2.11.1 @@ -6519,61 +9222,94 @@ snapshots: '@protobufjs/base64@1.1.2': {} - '@protobufjs/codegen@2.0.4': {} + '@protobufjs/codegen@2.0.5': {} - '@protobufjs/eventemitter@1.1.0': {} + '@protobufjs/eventemitter@1.1.1': {} - '@protobufjs/fetch@1.1.0': + '@protobufjs/fetch@1.1.1': dependencies: '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 '@protobufjs/float@1.0.2': {} - '@protobufjs/inquire@1.1.0': {} - '@protobufjs/path@1.1.2': {} '@protobufjs/pool@1.1.0': {} - '@protobufjs/utf8@1.1.0': {} + '@protobufjs/utf8@1.1.2': {} '@rolldown/binding-android-arm64@1.0.2': optional: true + '@rolldown/binding-android-arm64@1.2.4': + optional: true + '@rolldown/binding-darwin-arm64@1.0.2': optional: true + '@rolldown/binding-darwin-arm64@1.2.4': + optional: true + '@rolldown/binding-darwin-x64@1.0.2': optional: true + '@rolldown/binding-darwin-x64@1.2.4': + optional: true + '@rolldown/binding-freebsd-x64@1.0.2': optional: true + '@rolldown/binding-freebsd-x64@1.2.4': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.2': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.2.4': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.2': optional: true + '@rolldown/binding-linux-arm64-gnu@1.2.4': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.2': optional: true + '@rolldown/binding-linux-arm64-musl@1.2.4': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.0.2': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.2.4': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.0.2': optional: true + '@rolldown/binding-linux-s390x-gnu@1.2.4': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.2': optional: true + '@rolldown/binding-linux-x64-gnu@1.2.4': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.2': optional: true + '@rolldown/binding-linux-x64-musl@1.2.4': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.2': optional: true + '@rolldown/binding-openharmony-arm64@1.2.4': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.2': dependencies: '@emnapi/core': 1.10.0 @@ -6584,9 +9320,15 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.2': optional: true + '@rolldown/binding-win32-arm64-msvc@1.2.4': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.2': optional: true + '@rolldown/binding-win32-x64-msvc@1.2.4': + optional: true + '@rolldown/pluginutils@1.0.0-rc.2': {} '@rolldown/pluginutils@1.0.1': {} @@ -6931,125 +9673,2531 @@ snapshots: '@smithy/util-stream': 4.5.6 tslib: 2.8.1 - '@smithy/types@4.9.0': - dependencies: - tslib: 2.8.1 + '@smithy/types@4.9.0': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.2.5': + dependencies: + '@smithy/querystring-parser': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-base64@4.3.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.13': + dependencies: + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.16': + dependencies: + '@smithy/config-resolver': 4.4.3 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.2.5': + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-retry@4.2.5': + dependencies: + '@smithy/service-error-classification': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.6': + dependencies: + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/node-http-handler': 4.4.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-waiter@4.2.5': + dependencies: + '@smithy/abort-controller': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 + + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + + '@standard-schema/spec@1.0.0': {} + + '@standard-schema/spec@1.1.0': {} + + '@stdlib/array-base-accessor-getter@0.2.3': {} + + '@stdlib/array-base-accessor-setter@0.2.3': {} + + '@stdlib/array-base-arraylike2object@0.2.2': + dependencies: + '@stdlib/array-base-accessor-getter': 0.2.3 + '@stdlib/array-base-accessor-setter': 0.2.3 + '@stdlib/array-base-assert-is-accessor-array': 0.2.3 + '@stdlib/array-base-getter': 0.2.3 + '@stdlib/array-base-setter': 0.2.3 + '@stdlib/array-dtype': 0.3.1 + transitivePeerDependencies: + - supports-color + + '@stdlib/array-base-assert-contains@0.2.3': + dependencies: + '@stdlib/array-base-accessor-getter': 0.2.3 + '@stdlib/array-base-assert-is-accessor-array': 0.2.3 + '@stdlib/array-base-getter': 0.2.3 + '@stdlib/array-dtype': 0.3.1 + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/array-base-assert-is-accessor-array@0.2.3': {} + + '@stdlib/array-base-assert-is-booleanarray@0.0.3': {} + + '@stdlib/array-base-assert-is-complex-typed-array@0.1.3': {} + + '@stdlib/array-base-assert-is-complex128array@0.2.3': {} + + '@stdlib/array-base-assert-is-complex64array@0.2.3': {} + + '@stdlib/array-base-filled@0.2.3': {} + + '@stdlib/array-base-getter@0.2.3': {} + + '@stdlib/array-base-incrspace@0.2.3': + dependencies: + '@stdlib/math-base-special-ceil': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/array-base-index-of-same-value@0.1.1': + dependencies: + '@stdlib/array-base-assert-is-booleanarray': 0.0.3 + '@stdlib/array-base-assert-is-complex-typed-array': 0.1.3 + '@stdlib/array-base-resolve-getter': 0.2.3 + '@stdlib/assert-is-accessor-array': 0.2.3 + '@stdlib/assert-is-boolean': 0.2.3 + '@stdlib/assert-is-complex-like': 0.2.4 + '@stdlib/assert-is-same-value': 0.2.3 + '@stdlib/complex-float64-imag': 0.1.2 + '@stdlib/complex-float64-real': 0.1.2 + '@stdlib/strided-base-reinterpret-boolean': 0.0.3 + '@stdlib/strided-base-reinterpret-complex': 0.1.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/array-base-resolve-getter@0.2.3': + dependencies: + '@stdlib/array-base-accessor-getter': 0.2.3 + '@stdlib/array-base-assert-is-accessor-array': 0.2.3 + '@stdlib/array-base-getter': 0.2.3 + '@stdlib/array-dtype': 0.3.1 + transitivePeerDependencies: + - supports-color + + '@stdlib/array-base-setter@0.2.3': {} + + '@stdlib/array-base-zeros@0.2.3': + dependencies: + '@stdlib/array-base-filled': 0.2.3 + + '@stdlib/array-bool@0.1.2': + dependencies: + '@stdlib/array-base-accessor-getter': 0.2.3 + '@stdlib/array-base-getter': 0.2.3 + '@stdlib/array-uint8': 0.2.3 + '@stdlib/assert-has-iterator-symbol-support': 0.2.3 + '@stdlib/assert-is-arraybuffer': 0.2.3 + '@stdlib/assert-is-boolean': 0.2.3 + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/assert-is-function': 0.2.3 + '@stdlib/assert-is-integer': 0.2.3 + '@stdlib/assert-is-nonnegative-integer': 0.2.3 + '@stdlib/assert-is-object': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/assert-is-string-array': 0.2.3 + '@stdlib/boolean-ctor': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/string-format': 0.2.3 + '@stdlib/symbol-iterator': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-accessor': 0.2.4 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/array-complex128@0.3.2': + dependencies: + '@stdlib/array-base-accessor-getter': 0.2.3 + '@stdlib/array-base-assert-is-complex128array': 0.2.3 + '@stdlib/array-base-assert-is-complex64array': 0.2.3 + '@stdlib/array-base-getter': 0.2.3 + '@stdlib/array-float64': 0.2.3 + '@stdlib/assert-has-iterator-symbol-support': 0.2.3 + '@stdlib/assert-is-array': 0.2.3 + '@stdlib/assert-is-array-like-object': 0.2.3 + '@stdlib/assert-is-arraybuffer': 0.2.3 + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/assert-is-complex-like': 0.2.4 + '@stdlib/assert-is-function': 0.2.3 + '@stdlib/assert-is-nonnegative-integer': 0.2.3 + '@stdlib/assert-is-object': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/assert-is-string-array': 0.2.3 + '@stdlib/complex-float64-ctor': 0.1.2 + '@stdlib/complex-float64-imag': 0.1.2 + '@stdlib/complex-float64-real': 0.1.2 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/math-base-assert-is-even': 0.2.5 + '@stdlib/math-base-assert-is-integer': 0.2.7 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/strided-base-reinterpret-complex128': 0.2.3 + '@stdlib/strided-base-reinterpret-complex64': 0.2.2 + '@stdlib/string-format': 0.2.3 + '@stdlib/symbol-iterator': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-accessor': 0.2.4 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/array-complex64@0.3.2': + dependencies: + '@stdlib/array-base-accessor-getter': 0.2.3 + '@stdlib/array-base-assert-is-complex128array': 0.2.3 + '@stdlib/array-base-assert-is-complex64array': 0.2.3 + '@stdlib/array-base-getter': 0.2.3 + '@stdlib/array-float32': 0.2.3 + '@stdlib/assert-has-iterator-symbol-support': 0.2.3 + '@stdlib/assert-is-array': 0.2.3 + '@stdlib/assert-is-array-like-object': 0.2.3 + '@stdlib/assert-is-arraybuffer': 0.2.3 + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/assert-is-complex-like': 0.2.4 + '@stdlib/assert-is-function': 0.2.3 + '@stdlib/assert-is-nonnegative-integer': 0.2.3 + '@stdlib/assert-is-object': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/assert-is-string-array': 0.2.3 + '@stdlib/complex-float32-ctor': 0.1.1 + '@stdlib/complex-float32-imag': 0.1.2 + '@stdlib/complex-float32-real': 0.1.2 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/math-base-assert-is-even': 0.2.5 + '@stdlib/math-base-assert-is-integer': 0.2.7 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/strided-base-reinterpret-complex128': 0.2.3 + '@stdlib/strided-base-reinterpret-complex64': 0.2.2 + '@stdlib/string-format': 0.2.3 + '@stdlib/symbol-iterator': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-accessor': 0.2.4 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/array-dtype@0.3.1': + dependencies: + '@stdlib/array-bool': 0.1.2 + '@stdlib/array-complex128': 0.3.2 + '@stdlib/array-complex64': 0.3.2 + '@stdlib/array-float32': 0.2.3 + '@stdlib/array-float64': 0.2.3 + '@stdlib/array-int16': 0.2.3 + '@stdlib/array-int32': 0.2.3 + '@stdlib/array-int8': 0.2.3 + '@stdlib/array-uint16': 0.2.3 + '@stdlib/array-uint32': 0.2.3 + '@stdlib/array-uint8': 0.2.3 + '@stdlib/array-uint8c': 0.2.3 + '@stdlib/assert-is-array': 0.2.3 + '@stdlib/assert-is-buffer': 0.2.3 + '@stdlib/utils-constructor-name': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/array-float32@0.2.3': + dependencies: + '@stdlib/assert-has-float32array-support': 0.2.3 + + '@stdlib/array-float64@0.2.3': + dependencies: + '@stdlib/assert-has-float64array-support': 0.2.3 + + '@stdlib/array-int16@0.2.3': + dependencies: + '@stdlib/assert-has-int16array-support': 0.2.3 + + '@stdlib/array-int32@0.2.3': + dependencies: + '@stdlib/assert-has-int32array-support': 0.2.3 + + '@stdlib/array-int8@0.2.3': + dependencies: + '@stdlib/assert-has-int8array-support': 0.2.3 + + '@stdlib/array-uint16@0.2.3': + dependencies: + '@stdlib/assert-has-uint16array-support': 0.2.3 + + '@stdlib/array-uint32@0.2.3': + dependencies: + '@stdlib/assert-has-uint32array-support': 0.2.3 + + '@stdlib/array-uint8@0.2.3': + dependencies: + '@stdlib/assert-has-uint8array-support': 0.2.3 + + '@stdlib/array-uint8c@0.2.3': + dependencies: + '@stdlib/assert-has-uint8clampedarray-support': 0.2.3 + + '@stdlib/assert-contains@0.3.1': + dependencies: + '@stdlib/array-base-index-of-same-value': 0.1.1 + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/assert-is-integer': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-has-float32array-support@0.2.3': + dependencies: + '@stdlib/assert-is-float32array': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + + '@stdlib/assert-has-float64array-support@0.2.3': + dependencies: + '@stdlib/assert-is-float64array': 0.2.3 + + '@stdlib/assert-has-generator-support@0.2.3': + dependencies: + '@stdlib/utils-eval': 0.2.3 + + '@stdlib/assert-has-int16array-support@0.2.3': + dependencies: + '@stdlib/assert-is-int16array': 0.2.3 + '@stdlib/constants-int16-max': 0.2.3 + '@stdlib/constants-int16-min': 0.2.3 + + '@stdlib/assert-has-int32array-support@0.2.3': + dependencies: + '@stdlib/assert-is-int32array': 0.2.3 + '@stdlib/constants-int32-max': 0.3.1 + '@stdlib/constants-int32-min': 0.2.3 + + '@stdlib/assert-has-int8array-support@0.2.3': + dependencies: + '@stdlib/assert-is-int8array': 0.2.3 + '@stdlib/constants-int8-max': 0.2.3 + '@stdlib/constants-int8-min': 0.2.3 + + '@stdlib/assert-has-iterator-symbol-support@0.2.3': + dependencies: + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/symbol-ctor': 0.2.3 + + '@stdlib/assert-has-own-property@0.2.3': {} + + '@stdlib/assert-has-symbol-support@0.2.3': {} + + '@stdlib/assert-has-to-primitive-symbol-support@0.1.1': + dependencies: + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/symbol-ctor': 0.2.3 + + '@stdlib/assert-has-tostringtag-support@0.2.3': + dependencies: + '@stdlib/assert-has-symbol-support': 0.2.3 + + '@stdlib/assert-has-uint16array-support@0.2.3': + dependencies: + '@stdlib/assert-is-uint16array': 0.2.3 + '@stdlib/constants-uint16-max': 0.2.3 + + '@stdlib/assert-has-uint32array-support@0.2.3': + dependencies: + '@stdlib/assert-is-uint32array': 0.2.3 + '@stdlib/constants-uint32-max': 0.2.3 + + '@stdlib/assert-has-uint8array-support@0.2.3': + dependencies: + '@stdlib/assert-is-uint8array': 0.2.3 + '@stdlib/constants-uint8-max': 0.2.3 + + '@stdlib/assert-has-uint8clampedarray-support@0.2.3': + dependencies: + '@stdlib/assert-is-uint8clampedarray': 0.2.3 + + '@stdlib/assert-is-accessor-array@0.2.3': + dependencies: + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/assert-is-function': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-arguments@0.2.3': + dependencies: + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-array': 0.2.3 + '@stdlib/assert-is-enumerable-property': 0.2.3 + '@stdlib/constants-uint32-max': 0.2.3 + '@stdlib/math-base-assert-is-integer': 0.2.7 + '@stdlib/utils-native-class': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-array-like-object@0.2.3': + dependencies: + '@stdlib/constants-array-max-array-length': 0.2.3 + '@stdlib/math-base-assert-is-integer': 0.2.7 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-array-like@0.2.3': + dependencies: + '@stdlib/constants-array-max-array-length': 0.2.3 + '@stdlib/math-base-assert-is-integer': 0.2.7 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-array@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-arraybuffer@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-big-endian@0.2.3': + dependencies: + '@stdlib/array-uint16': 0.2.3 + '@stdlib/array-uint8': 0.2.3 + + '@stdlib/assert-is-boolean@0.2.3': + dependencies: + '@stdlib/assert-has-tostringtag-support': 0.2.3 + '@stdlib/boolean-ctor': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-buffer@0.2.3': + dependencies: + '@stdlib/assert-is-object-like': 0.2.3 + + '@stdlib/assert-is-collection@0.2.3': + dependencies: + '@stdlib/constants-array-max-typed-array-length': 0.2.3 + '@stdlib/math-base-assert-is-integer': 0.2.7 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-complex-like@0.2.4': + dependencies: + '@stdlib/complex-float32-ctor': 0.1.1 + '@stdlib/complex-float64-ctor': 0.1.2 + + '@stdlib/assert-is-enumerable-property@0.2.3': + dependencies: + '@stdlib/assert-is-integer': 0.2.3 + '@stdlib/assert-is-nan': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-float32array@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-float64array@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-function@0.2.3': + dependencies: + '@stdlib/utils-type-of': 0.2.3 + + '@stdlib/assert-is-int16array@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-int32array@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-int8array@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-integer@0.2.3': + dependencies: + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-integer': 0.2.7 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-little-endian@0.2.3': + dependencies: + '@stdlib/array-uint16': 0.2.3 + '@stdlib/array-uint8': 0.2.3 + + '@stdlib/assert-is-nan@0.2.3': + dependencies: + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-nonnegative-integer@0.2.3': + dependencies: + '@stdlib/assert-is-integer': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-number-array@0.2.3': + dependencies: + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/assert-tools-array-like-function': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-number@0.2.3': + dependencies: + '@stdlib/assert-has-tostringtag-support': 0.2.3 + '@stdlib/number-ctor': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-object-like@0.2.3': + dependencies: + '@stdlib/assert-tools-array-function': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + + '@stdlib/assert-is-object@0.2.3': + dependencies: + '@stdlib/assert-is-array': 0.2.3 + + '@stdlib/assert-is-plain-object@0.2.3': + dependencies: + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-function': 0.2.3 + '@stdlib/assert-is-object': 0.2.3 + '@stdlib/utils-get-prototype-of': 0.2.3 + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-positive-integer@0.2.3': + dependencies: + '@stdlib/assert-is-integer': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-regexp@0.2.3': + dependencies: + '@stdlib/assert-has-tostringtag-support': 0.2.3 + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-same-value@0.2.3': + dependencies: + '@stdlib/assert-is-complex-like': 0.2.4 + '@stdlib/complex-float64-base-assert-is-same-value': 0.0.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-string-array@0.2.3': + dependencies: + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/assert-tools-array-function': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + + '@stdlib/assert-is-string@0.2.3': + dependencies: + '@stdlib/assert-has-tostringtag-support': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-typed-array-like@0.2.3': + dependencies: + '@stdlib/assert-is-nonnegative-integer': 0.2.3 + '@stdlib/constants-array-max-typed-array-length': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-is-uint16array@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-uint32array@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-uint8array@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-is-uint8clampedarray@0.2.3': + dependencies: + '@stdlib/utils-native-class': 0.2.3 + + '@stdlib/assert-napi-equal-typedarray-types@0.2.3': + dependencies: + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-napi-equal-types@0.2.3': + dependencies: + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-napi-is-type@0.2.3': + dependencies: + '@stdlib/assert-napi-equal-types': 0.2.3 + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-napi-is-typedarray@0.2.3': + dependencies: + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/assert-napi-status-ok@0.2.3': {} + + '@stdlib/assert-tools-array-function@0.2.3': + dependencies: + '@stdlib/assert-is-array': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 + + '@stdlib/assert-tools-array-like-function@0.2.3': + dependencies: + '@stdlib/assert-is-array-like': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/blas-base-gcopy@0.2.3': + dependencies: + '@stdlib/array-base-arraylike2object': 0.2.2 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/blas-ext-base-gapxsumpw@0.3.1': + dependencies: + '@stdlib/blas-ext-base-gsumpw': 0.3.1 + '@stdlib/strided-base-stride2offset': 0.1.1 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/blas-ext-base-gsumpw@0.3.1': + dependencies: + '@stdlib/array-base-arraylike2object': 0.2.2 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/strided-base-stride2offset': 0.1.1 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/boolean-ctor@0.2.3': {} + + '@stdlib/complex-float32-ctor@0.1.1': + dependencies: + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/number-float64-base-to-float32': 0.2.3 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-define-read-only-property': 0.2.3 + + '@stdlib/complex-float32-imag@0.1.2': + dependencies: + '@stdlib/complex-float32-ctor': 0.1.1 + + '@stdlib/complex-float32-real@0.1.2': + dependencies: + '@stdlib/complex-float32-ctor': 0.1.1 + + '@stdlib/complex-float32-reim@0.1.4': + dependencies: + '@stdlib/array-float32': 0.2.3 + '@stdlib/complex-float32-ctor': 0.1.1 + + '@stdlib/complex-float64-base-assert-is-same-value@0.0.3': + dependencies: + '@stdlib/complex-float64-ctor': 0.1.2 + '@stdlib/complex-float64-reim': 0.1.4 + '@stdlib/number-float64-base-assert-is-same-value': 0.2.2 + transitivePeerDependencies: + - supports-color + + '@stdlib/complex-float64-ctor@0.1.2': + dependencies: + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/complex-float32-ctor': 0.1.1 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-define-read-only-property': 0.2.3 + + '@stdlib/complex-float64-imag@0.1.2': + dependencies: + '@stdlib/complex-float64-ctor': 0.1.2 + + '@stdlib/complex-float64-real@0.1.2': + dependencies: + '@stdlib/complex-float64-ctor': 0.1.2 + + '@stdlib/complex-float64-reim@0.1.4': + dependencies: + '@stdlib/array-float64': 0.2.3 + '@stdlib/complex-float64-ctor': 0.1.2 + + '@stdlib/constants-array-max-array-length@0.2.3': {} + + '@stdlib/constants-array-max-typed-array-length@0.2.3': {} + + '@stdlib/constants-float16-eps@0.2.3': {} + + '@stdlib/constants-float16-exponent-bias@0.3.1': {} + + '@stdlib/constants-float16-exponent-mask@0.1.1': {} + + '@stdlib/constants-float16-max@0.2.3': {} + + '@stdlib/constants-float16-num-significand-bits@0.0.2': {} + + '@stdlib/constants-float16-sign-mask@0.1.1': {} + + '@stdlib/constants-float16-significand-mask@0.1.1': {} + + '@stdlib/constants-float16-smallest-normal@0.2.3': {} + + '@stdlib/constants-float32-abs-mask@0.2.3': {} + + '@stdlib/constants-float32-eps@0.2.3': + dependencies: + '@stdlib/number-float64-base-to-float32': 0.2.3 + + '@stdlib/constants-float32-exponent-bias@0.2.3': {} + + '@stdlib/constants-float32-exponent-mask@0.2.3': {} + + '@stdlib/constants-float32-max@0.2.3': {} + + '@stdlib/constants-float32-ninf@0.2.3': + dependencies: + '@stdlib/array-float32': 0.2.3 + '@stdlib/array-uint32': 0.2.3 + + '@stdlib/constants-float32-num-significand-bits@0.1.1': {} + + '@stdlib/constants-float32-pinf@0.2.3': + dependencies: + '@stdlib/array-float32': 0.2.3 + '@stdlib/array-uint32': 0.2.3 + + '@stdlib/constants-float32-sign-mask@0.2.3': {} + + '@stdlib/constants-float32-significand-mask@0.2.4': {} + + '@stdlib/constants-float32-smallest-normal@0.2.3': {} + + '@stdlib/constants-float64-e@0.2.3': {} + + '@stdlib/constants-float64-eps@0.2.3': {} + + '@stdlib/constants-float64-eulergamma@0.2.3': {} + + '@stdlib/constants-float64-exponent-bias@0.2.3': {} + + '@stdlib/constants-float64-fourth-pi@0.2.3': {} + + '@stdlib/constants-float64-gamma-lanczos-g@0.2.3': {} + + '@stdlib/constants-float64-half-ln-two@0.2.3': {} + + '@stdlib/constants-float64-half-pi@0.2.3': {} + + '@stdlib/constants-float64-high-word-abs-mask@0.2.3': {} + + '@stdlib/constants-float64-high-word-exponent-mask@0.2.3': {} + + '@stdlib/constants-float64-high-word-sign-mask@0.2.1': {} + + '@stdlib/constants-float64-high-word-significand-mask@0.2.3': {} + + '@stdlib/constants-float64-ln-sqrt-two-pi@0.2.3': {} + + '@stdlib/constants-float64-ln-two@0.2.3': {} + + '@stdlib/constants-float64-max-base10-exponent@0.2.3': {} + + '@stdlib/constants-float64-max-base2-exponent-subnormal@0.2.1': {} + + '@stdlib/constants-float64-max-base2-exponent@0.2.3': {} + + '@stdlib/constants-float64-max-ln@0.2.3': {} + + '@stdlib/constants-float64-max-nth-factorial@0.1.1': {} + + '@stdlib/constants-float64-max-safe-integer@0.2.3': {} + + '@stdlib/constants-float64-max@0.2.3': {} + + '@stdlib/constants-float64-min-base10-exponent-subnormal@0.2.1': {} + + '@stdlib/constants-float64-min-base10-exponent@0.2.3': {} + + '@stdlib/constants-float64-min-base2-exponent-subnormal@0.2.1': {} + + '@stdlib/constants-float64-min-base2-exponent@0.2.3': {} + + '@stdlib/constants-float64-min-ln@0.2.3': {} + + '@stdlib/constants-float64-ninf@0.2.3': + dependencies: + '@stdlib/number-ctor': 0.2.3 + + '@stdlib/constants-float64-num-high-word-significand-bits@0.1.1': {} + + '@stdlib/constants-float64-pi@0.2.3': {} + + '@stdlib/constants-float64-pinf@0.2.3': {} + + '@stdlib/constants-float64-smallest-normal@0.2.3': {} + + '@stdlib/constants-float64-smallest-subnormal@0.2.3': {} + + '@stdlib/constants-float64-sqrt-eps@0.2.3': {} + + '@stdlib/constants-float64-sqrt-two-pi@0.2.3': {} + + '@stdlib/constants-float64-sqrt-two@0.2.3': {} + + '@stdlib/constants-float64-two-pi@0.2.3': {} + + '@stdlib/constants-int16-max@0.2.3': {} + + '@stdlib/constants-int16-min@0.2.3': {} + + '@stdlib/constants-int32-max@0.3.1': {} + + '@stdlib/constants-int32-min@0.2.3': {} + + '@stdlib/constants-int8-max@0.2.3': {} + + '@stdlib/constants-int8-min@0.2.3': {} + + '@stdlib/constants-uint16-max@0.2.3': {} + + '@stdlib/constants-uint32-max@0.2.3': {} + + '@stdlib/constants-uint8-max@0.2.3': {} + + '@stdlib/error-tools-fmtprodmsg@0.2.3': {} + + '@stdlib/fs-exists@0.2.3': + dependencies: + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + + '@stdlib/fs-resolve-parent-path@0.2.3': + dependencies: + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-function': 0.2.3 + '@stdlib/assert-is-plain-object': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/fs-exists': 0.2.3 + '@stdlib/process-cwd': 0.2.3 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + + '@stdlib/function-ctor@0.2.3': {} + + '@stdlib/math-base-assert-is-even@0.2.5': + dependencies: + '@stdlib/math-base-assert-is-integer': 0.2.7 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-double': 0.2.2 + '@stdlib/napi-create-int32': 0.0.3 + '@stdlib/napi-export': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-assert-is-finite@0.2.3': + dependencies: + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-double': 0.2.2 + '@stdlib/napi-create-int32': 0.0.3 + '@stdlib/napi-export': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-assert-is-finitef@0.2.3': + dependencies: + '@stdlib/constants-float32-ninf': 0.2.3 + '@stdlib/constants-float32-pinf': 0.2.3 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-float': 0.2.3 + '@stdlib/napi-create-int32': 0.0.3 + '@stdlib/napi-export': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-assert-is-infinite@0.2.3': + dependencies: + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-assert-is-integer@0.2.7': + dependencies: + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-double': 0.2.2 + '@stdlib/napi-create-int32': 0.0.3 + '@stdlib/napi-export': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-assert-is-nan@0.2.3': + dependencies: + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-assert-is-nanf@0.2.3': + dependencies: + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-float': 0.2.3 + '@stdlib/napi-create-int32': 0.0.3 + '@stdlib/napi-export': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-assert-is-negative-zero@0.2.3': + dependencies: + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-assert-is-odd@0.3.2': + dependencies: + '@stdlib/math-base-assert-is-even': 0.2.5 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-double': 0.2.2 + '@stdlib/napi-create-int32': 0.0.3 + '@stdlib/napi-export': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-assert-is-positive-integer@0.3.2': + dependencies: + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-assert-is-positive-zero@0.2.3': + dependencies: + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-napi-binary@0.3.3': + dependencies: + '@stdlib/complex-float32-ctor': 0.1.1 + '@stdlib/complex-float32-reim': 0.1.4 + '@stdlib/complex-float64-ctor': 0.1.2 + '@stdlib/complex-float64-reim': 0.1.4 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-napi-ternary@0.3.2': + dependencies: + '@stdlib/complex-float32-ctor': 0.1.1 + '@stdlib/complex-float32-reim': 0.1.4 + '@stdlib/complex-float64-ctor': 0.1.2 + '@stdlib/complex-float64-reim': 0.1.4 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-napi-unary@0.2.7': + dependencies: + '@stdlib/complex-float32-ctor': 0.1.1 + '@stdlib/complex-float32-reim': 0.1.4 + '@stdlib/complex-float64-ctor': 0.1.2 + '@stdlib/complex-float64-reim': 0.1.4 + '@stdlib/number-float16-base-to-float64': 0.1.2 + '@stdlib/number-float16-ctor': 0.1.2 + '@stdlib/number-float64-base-to-float16': 0.1.2 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-abs@0.2.3': + dependencies: + '@stdlib/constants-float64-high-word-abs-mask': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/number-float64-base-to-words': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-absf@0.2.3': + dependencies: + '@stdlib/constants-float32-abs-mask': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/number-float32-base-to-word': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-acos@0.2.4': + dependencies: + '@stdlib/constants-float64-fourth-pi': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-asin': 0.2.4 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-asin@0.2.4': + dependencies: + '@stdlib/constants-float64-fourth-pi': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-beta@0.3.1': + dependencies: + '@stdlib/constants-float64-e': 0.2.3 + '@stdlib/constants-float64-eps': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-exp': 0.2.5 + '@stdlib/math-base-special-log1p': 0.2.4 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-betainc@0.2.3': + dependencies: + '@stdlib/math-base-special-kernel-betainc': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-binomcoef@0.3.1': + dependencies: + '@stdlib/constants-float64-max-safe-integer': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-integer': 0.2.7 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-assert-is-odd': 0.3.2 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/math-base-special-gcd': 0.3.2 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-ceil@0.2.3': + dependencies: + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-copysign@0.2.3': + dependencies: + '@stdlib/constants-float64-high-word-abs-mask': 0.2.3 + '@stdlib/constants-float64-high-word-sign-mask': 0.2.1 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/number-float64-base-from-words': 0.2.3 + '@stdlib/number-float64-base-get-high-word': 0.2.3 + '@stdlib/number-float64-base-to-words': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-cos@0.3.1': + dependencies: + '@stdlib/constants-float64-high-word-abs-mask': 0.2.3 + '@stdlib/constants-float64-high-word-exponent-mask': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-kernel-cos': 0.2.4 + '@stdlib/math-base-special-kernel-sin': 0.2.4 + '@stdlib/math-base-special-rempio2': 0.3.1 + '@stdlib/number-float64-base-get-high-word': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-erfc@0.2.5': + dependencies: + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-exp': 0.2.5 + '@stdlib/number-float64-base-set-low-word': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-erfcinv@0.2.4': + dependencies: + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-ln': 0.2.5 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-exp@0.2.5': + dependencies: + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-ldexp': 0.2.5 + '@stdlib/math-base-special-trunc': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-expm1@0.2.4': + dependencies: + '@stdlib/constants-float64-exponent-bias': 0.2.3 + '@stdlib/constants-float64-half-ln-two': 0.2.3 + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/number-float64-base-from-words': 0.2.3 + '@stdlib/number-float64-base-get-high-word': 0.2.3 + '@stdlib/number-float64-base-set-high-word': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-factorial@0.3.2': + dependencies: + '@stdlib/constants-float64-max-nth-factorial': 0.1.1 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-integer': 0.2.7 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-gamma': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-floor@0.2.4': + dependencies: + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-fmod@0.1.1': + dependencies: + '@stdlib/constants-float64-exponent-bias': 0.2.3 + '@stdlib/constants-float64-high-word-abs-mask': 0.2.3 + '@stdlib/constants-float64-high-word-exponent-mask': 0.2.3 + '@stdlib/constants-float64-high-word-sign-mask': 0.2.1 + '@stdlib/constants-float64-high-word-significand-mask': 0.2.3 + '@stdlib/constants-float64-min-base2-exponent': 0.2.3 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/number-float64-base-from-words': 0.2.3 + '@stdlib/number-float64-base-to-words': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-gamma-delta-ratio@0.3.1': + dependencies: + '@stdlib/constants-float64-e': 0.2.3 + '@stdlib/constants-float64-eps': 0.2.3 + '@stdlib/constants-float64-gamma-lanczos-g': 0.2.3 + '@stdlib/constants-float64-max-nth-factorial': 0.1.1 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-exp': 0.2.5 + '@stdlib/math-base-special-factorial': 0.3.2 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/math-base-special-gamma': 0.3.1 + '@stdlib/math-base-special-gamma-lanczos-sum': 0.3.2 + '@stdlib/math-base-special-log1p': 0.2.4 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-gamma-lanczos-sum-expg-scaled@0.2.2': + dependencies: + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-gamma-lanczos-sum@0.3.2': + dependencies: + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-gamma1pm1@0.3.1': + dependencies: + '@stdlib/constants-float64-eps': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-expm1': 0.2.4 + '@stdlib/math-base-special-gamma': 0.3.1 + '@stdlib/math-base-special-ln': 0.2.5 + '@stdlib/math-base-special-log1p': 0.2.4 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-gamma@0.3.1': + dependencies: + '@stdlib/constants-float64-eulergamma': 0.2.3 + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pi': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/constants-float64-sqrt-two-pi': 0.2.3 + '@stdlib/math-base-assert-is-integer': 0.2.7 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-assert-is-negative-zero': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-exp': 0.2.5 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/math-base-special-sin': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-gammainc@0.3.1': + dependencies: + '@stdlib/constants-float32-smallest-normal': 0.2.3 + '@stdlib/constants-float64-e': 0.2.3 + '@stdlib/constants-float64-eps': 0.2.3 + '@stdlib/constants-float64-gamma-lanczos-g': 0.2.3 + '@stdlib/constants-float64-max': 0.2.3 + '@stdlib/constants-float64-max-ln': 0.2.3 + '@stdlib/constants-float64-max-nth-factorial': 0.1.1 + '@stdlib/constants-float64-min-ln': 0.2.3 + '@stdlib/constants-float64-pi': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/constants-float64-sqrt-eps': 0.2.3 + '@stdlib/constants-float64-sqrt-two-pi': 0.2.3 + '@stdlib/constants-float64-two-pi': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-erfc': 0.2.5 + '@stdlib/math-base-special-exp': 0.2.5 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/math-base-special-gamma': 0.3.1 + '@stdlib/math-base-special-gamma-lanczos-sum-expg-scaled': 0.2.2 + '@stdlib/math-base-special-gamma1pm1': 0.3.1 + '@stdlib/math-base-special-gammaln': 0.3.1 + '@stdlib/math-base-special-ln': 0.2.5 + '@stdlib/math-base-special-log1pmx': 0.2.4 + '@stdlib/math-base-special-max': 0.3.1 + '@stdlib/math-base-special-min': 0.2.4 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/math-base-special-powm1': 0.3.2 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/math-base-tools-continued-fraction': 0.2.3 + '@stdlib/math-base-tools-evalpoly': 0.2.3 + '@stdlib/math-base-tools-sum-series': 0.2.3 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-bool': 0.1.1 + '@stdlib/napi-argv-double': 0.2.2 + '@stdlib/napi-create-double': 0.0.3 + '@stdlib/napi-export': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-gammaincinv@0.2.3': + dependencies: + '@stdlib/constants-float32-max': 0.2.3 + '@stdlib/constants-float32-smallest-normal': 0.2.3 + '@stdlib/constants-float64-ln-sqrt-two-pi': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/constants-float64-sqrt-two-pi': 0.2.3 + '@stdlib/constants-float64-two-pi': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-erfcinv': 0.2.4 + '@stdlib/math-base-special-exp': 0.2.5 + '@stdlib/math-base-special-gamma': 0.3.1 + '@stdlib/math-base-special-gammainc': 0.3.1 + '@stdlib/math-base-special-gammaln': 0.3.1 + '@stdlib/math-base-special-ln': 0.2.5 + '@stdlib/math-base-special-min': 0.2.4 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/math-base-tools-evalpoly': 0.2.3 + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-gammaln@0.3.1': + dependencies: + '@stdlib/constants-float64-pi': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-infinite': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-ln': 0.2.5 + '@stdlib/math-base-special-sinpi': 0.3.1 + '@stdlib/math-base-special-trunc': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-gcd@0.3.2': + dependencies: + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/constants-int32-max': 0.3.1 + '@stdlib/math-base-assert-is-integer': 0.2.7 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/math-base-special-fmod': 0.1.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-kernel-betainc@0.2.3': + dependencies: + '@stdlib/constants-float64-e': 0.2.3 + '@stdlib/constants-float64-eps': 0.2.3 + '@stdlib/constants-float64-gamma-lanczos-g': 0.2.3 + '@stdlib/constants-float64-half-pi': 0.2.3 + '@stdlib/constants-float64-max': 0.2.3 + '@stdlib/constants-float64-max-ln': 0.2.3 + '@stdlib/constants-float64-min-ln': 0.2.3 + '@stdlib/constants-float64-pi': 0.2.3 + '@stdlib/constants-float64-smallest-normal': 0.2.3 + '@stdlib/constants-int32-max': 0.3.1 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-asin': 0.2.4 + '@stdlib/math-base-special-beta': 0.3.1 + '@stdlib/math-base-special-binomcoef': 0.3.1 + '@stdlib/math-base-special-exp': 0.2.5 + '@stdlib/math-base-special-expm1': 0.2.4 + '@stdlib/math-base-special-factorial': 0.3.2 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/math-base-special-gamma': 0.3.1 + '@stdlib/math-base-special-gamma-delta-ratio': 0.3.1 + '@stdlib/math-base-special-gamma-lanczos-sum-expg-scaled': 0.2.2 + '@stdlib/math-base-special-gammainc': 0.3.1 + '@stdlib/math-base-special-gammaln': 0.3.1 + '@stdlib/math-base-special-ln': 0.2.5 + '@stdlib/math-base-special-log1p': 0.2.4 + '@stdlib/math-base-special-max': 0.3.1 + '@stdlib/math-base-special-maxabs': 0.3.1 + '@stdlib/math-base-special-min': 0.2.4 + '@stdlib/math-base-special-minabs': 0.2.4 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/math-base-tools-continued-fraction': 0.2.3 + '@stdlib/math-base-tools-sum-series': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-kernel-betaincinv@0.2.3': + dependencies: + '@stdlib/constants-float64-eps': 0.2.3 + '@stdlib/constants-float64-half-pi': 0.2.3 + '@stdlib/constants-float64-max': 0.2.3 + '@stdlib/constants-float64-pi': 0.2.3 + '@stdlib/constants-float64-smallest-normal': 0.2.3 + '@stdlib/constants-float64-smallest-subnormal': 0.2.3 + '@stdlib/constants-float64-sqrt-two': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-acos': 0.2.4 + '@stdlib/math-base-special-asin': 0.2.4 + '@stdlib/math-base-special-beta': 0.3.1 + '@stdlib/math-base-special-betainc': 0.2.3 + '@stdlib/math-base-special-cos': 0.3.1 + '@stdlib/math-base-special-erfcinv': 0.2.4 + '@stdlib/math-base-special-exp': 0.2.5 + '@stdlib/math-base-special-expm1': 0.2.4 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/math-base-special-gamma-delta-ratio': 0.3.1 + '@stdlib/math-base-special-gammaincinv': 0.2.3 + '@stdlib/math-base-special-kernel-betainc': 0.2.3 + '@stdlib/math-base-special-ldexp': 0.2.5 + '@stdlib/math-base-special-ln': 0.2.5 + '@stdlib/math-base-special-log1p': 0.2.4 + '@stdlib/math-base-special-max': 0.3.1 + '@stdlib/math-base-special-min': 0.2.4 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/math-base-special-round': 0.3.1 + '@stdlib/math-base-special-signum': 0.2.3 + '@stdlib/math-base-special-sin': 0.3.1 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/math-base-tools-evalpoly': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-kernel-cos@0.2.4': + dependencies: + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-kernel-sin@0.2.4': + dependencies: + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-ldexp@0.2.5': + dependencies: + '@stdlib/constants-float64-exponent-bias': 0.2.3 + '@stdlib/constants-float64-max-base2-exponent': 0.2.3 + '@stdlib/constants-float64-max-base2-exponent-subnormal': 0.2.1 + '@stdlib/constants-float64-min-base2-exponent-subnormal': 0.2.1 + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-infinite': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-special-copysign': 0.2.3 + '@stdlib/number-float64-base-exponent': 0.2.3 + '@stdlib/number-float64-base-from-words': 0.2.3 + '@stdlib/number-float64-base-normalize': 0.2.4 + '@stdlib/number-float64-base-to-words': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-ln@0.2.5': + dependencies: + '@stdlib/constants-float64-exponent-bias': 0.2.3 + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/number-float64-base-get-high-word': 0.2.3 + '@stdlib/number-float64-base-set-high-word': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-log1p@0.2.4': + dependencies: + '@stdlib/constants-float64-exponent-bias': 0.2.3 + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/number-float64-base-get-high-word': 0.2.3 + '@stdlib/number-float64-base-set-high-word': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-log1pmx@0.2.4': + dependencies: + '@stdlib/constants-float64-eps': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-ln': 0.2.5 + '@stdlib/math-base-special-log1p': 0.2.4 + '@stdlib/math-base-tools-sum-series': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-max@0.3.1': + dependencies: + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-assert-is-positive-zero': 0.2.3 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-maxabs@0.3.1': + dependencies: + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-max': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-min@0.2.4': + dependencies: + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-assert-is-negative-zero': 0.2.3 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-minabs@0.2.4': + dependencies: + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-min': 0.2.4 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-pow@0.3.1': + dependencies: + '@stdlib/constants-float64-exponent-bias': 0.2.3 + '@stdlib/constants-float64-high-word-abs-mask': 0.2.3 + '@stdlib/constants-float64-high-word-significand-mask': 0.2.3 + '@stdlib/constants-float64-ln-two': 0.2.3 + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-num-high-word-significand-bits': 0.1.1 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-infinite': 0.2.3 + '@stdlib/math-base-assert-is-integer': 0.2.7 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-assert-is-odd': 0.3.2 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-copysign': 0.2.3 + '@stdlib/math-base-special-ldexp': 0.2.5 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/number-float64-base-get-high-word': 0.2.3 + '@stdlib/number-float64-base-set-high-word': 0.2.3 + '@stdlib/number-float64-base-set-low-word': 0.2.3 + '@stdlib/number-float64-base-to-words': 0.2.3 + '@stdlib/number-uint32-base-to-int32': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-powm1@0.3.2': + dependencies: + '@stdlib/math-base-assert-is-infinite': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-expm1': 0.2.4 + '@stdlib/math-base-special-fmod': 0.1.1 + '@stdlib/math-base-special-ln': 0.2.5 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/math-base-special-trunc': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-rempio2@0.3.1': + dependencies: + '@stdlib/array-base-zeros': 0.2.3 + '@stdlib/constants-float64-high-word-abs-mask': 0.2.3 + '@stdlib/constants-float64-high-word-exponent-mask': 0.2.3 + '@stdlib/constants-float64-high-word-significand-mask': 0.2.3 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/math-base-special-ldexp': 0.2.5 + '@stdlib/math-base-special-round': 0.3.1 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-double': 0.2.2 + '@stdlib/napi-argv-float64array': 0.2.3 + '@stdlib/napi-create-double': 0.0.3 + '@stdlib/napi-export': 0.3.1 + '@stdlib/number-float64-base-from-words': 0.2.3 + '@stdlib/number-float64-base-get-high-word': 0.2.3 + '@stdlib/number-float64-base-get-low-word': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-round@0.3.1': + dependencies: + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-assert-is-negative-zero': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-roundn@0.2.3': + dependencies: + '@stdlib/constants-float64-max-base10-exponent': 0.2.3 + '@stdlib/constants-float64-max-safe-integer': 0.2.3 + '@stdlib/constants-float64-min-base10-exponent': 0.2.3 + '@stdlib/constants-float64-min-base10-exponent-subnormal': 0.2.1 + '@stdlib/math-base-assert-is-infinite': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/math-base-special-round': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-signum@0.2.3': + dependencies: + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-sin@0.3.1': + dependencies: + '@stdlib/constants-float64-high-word-abs-mask': 0.2.3 + '@stdlib/constants-float64-high-word-exponent-mask': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-kernel-cos': 0.2.4 + '@stdlib/math-base-special-kernel-sin': 0.2.4 + '@stdlib/math-base-special-rempio2': 0.3.1 + '@stdlib/number-float64-base-get-high-word': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-sinpi@0.3.1': + dependencies: + '@stdlib/constants-float64-pi': 0.2.3 + '@stdlib/math-base-assert-is-infinite': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-copysign': 0.2.3 + '@stdlib/math-base-special-cos': 0.3.1 + '@stdlib/math-base-special-fmod': 0.1.1 + '@stdlib/math-base-special-sin': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-sqrt@0.2.3': + dependencies: + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-special-trunc@0.2.3': + dependencies: + '@stdlib/math-base-napi-unary': 0.2.7 + '@stdlib/math-base-special-ceil': 0.2.3 + '@stdlib/math-base-special-floor': 0.2.4 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-tools-continued-fraction@0.2.3': + dependencies: + '@stdlib/assert-has-generator-support': 0.2.3 + '@stdlib/constants-float32-smallest-normal': 0.2.3 + '@stdlib/constants-float64-eps': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/math-base-tools-evalpoly@0.2.3': + dependencies: + '@stdlib/function-ctor': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + + '@stdlib/math-base-tools-sum-series@0.2.3': + dependencies: + '@stdlib/assert-has-generator-support': 0.2.3 + '@stdlib/constants-float64-eps': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/napi-argv-bool@0.1.1': + dependencies: + '@stdlib/assert-napi-is-type': 0.2.3 + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/napi-argv-double@0.2.2': + dependencies: + '@stdlib/assert-napi-is-type': 0.2.3 + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/napi-argv-float64array@0.2.3': + dependencies: + '@stdlib/assert-napi-equal-typedarray-types': 0.2.3 + '@stdlib/assert-napi-is-typedarray': 0.2.3 + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/napi-argv-float@0.2.3': + dependencies: + '@stdlib/assert-napi-is-type': 0.2.3 + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/napi-argv-int32@0.2.3': + dependencies: + '@stdlib/assert-napi-is-type': 0.2.3 + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/napi-argv@0.2.3': + dependencies: + '@stdlib/assert-napi-status-ok': 0.2.3 + + '@stdlib/napi-create-double@0.0.3': + dependencies: + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-double': 0.2.2 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/napi-create-int32@0.0.3': + dependencies: + '@stdlib/assert-napi-status-ok': 0.2.3 + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-int32': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/napi-export@0.3.1': {} + + '@stdlib/number-ctor@0.2.3': {} + + '@stdlib/number-float16-base-to-float32@0.1.2': + dependencies: + '@stdlib/constants-float16-exponent-bias': 0.3.1 + '@stdlib/constants-float16-exponent-mask': 0.1.1 + '@stdlib/constants-float16-num-significand-bits': 0.0.2 + '@stdlib/constants-float16-sign-mask': 0.1.1 + '@stdlib/constants-float16-significand-mask': 0.1.1 + '@stdlib/constants-float32-exponent-bias': 0.2.3 + '@stdlib/constants-float32-exponent-mask': 0.2.3 + '@stdlib/constants-float32-num-significand-bits': 0.1.1 + '@stdlib/number-float16-ctor': 0.1.2 + '@stdlib/number-float32-base-to-float16': 0.1.1 + '@stdlib/number-float64-base-to-float16': 0.1.2 + '@stdlib/number-float64-base-to-float32': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float16-base-to-float64@0.1.2': + dependencies: + '@stdlib/number-float16-base-to-float32': 0.1.2 + '@stdlib/number-float16-ctor': 0.1.2 + '@stdlib/number-float64-base-to-float16': 0.1.2 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float16-ctor@0.1.2': + dependencies: + '@stdlib/assert-has-to-primitive-symbol-support': 0.1.1 + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/number-float64-base-to-float16': 0.1.2 + '@stdlib/string-format': 0.2.3 + '@stdlib/symbol-to-primitive': 0.1.2 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-define-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float32-base-exponent@0.2.4': + dependencies: + '@stdlib/constants-float32-exponent-bias': 0.2.3 + '@stdlib/constants-float32-exponent-mask': 0.2.3 + '@stdlib/number-float32-base-to-word': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float32-base-to-float16@0.1.1': + dependencies: + '@stdlib/constants-float16-eps': 0.2.3 + '@stdlib/constants-float16-max': 0.2.3 + '@stdlib/constants-float16-smallest-normal': 0.2.3 + '@stdlib/constants-float32-eps': 0.2.3 + '@stdlib/constants-float32-exponent-mask': 0.2.3 + '@stdlib/constants-float32-num-significand-bits': 0.1.1 + '@stdlib/constants-float32-pinf': 0.2.3 + '@stdlib/constants-float32-sign-mask': 0.2.3 + '@stdlib/constants-float32-significand-mask': 0.2.4 + '@stdlib/math-base-assert-is-finitef': 0.2.3 + '@stdlib/math-base-assert-is-nanf': 0.2.3 + '@stdlib/math-base-special-absf': 0.2.3 + '@stdlib/number-float16-ctor': 0.1.2 + '@stdlib/number-float32-base-exponent': 0.2.4 + '@stdlib/number-float64-base-to-float32': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float32-base-to-word@0.2.3': + dependencies: + '@stdlib/array-float32': 0.2.3 + '@stdlib/array-uint32': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float64-base-assert-is-same-value@0.2.2': + dependencies: + '@stdlib/napi-argv': 0.2.3 + '@stdlib/napi-argv-double': 0.2.2 + '@stdlib/napi-export': 0.3.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float64-base-exponent@0.2.3': + dependencies: + '@stdlib/constants-float64-exponent-bias': 0.2.3 + '@stdlib/constants-float64-high-word-exponent-mask': 0.2.3 + '@stdlib/number-float64-base-get-high-word': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float64-base-from-words@0.2.3': + dependencies: + '@stdlib/array-float64': 0.2.3 + '@stdlib/array-uint32': 0.2.3 + '@stdlib/assert-is-little-endian': 0.2.3 + '@stdlib/number-float64-base-to-words': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float64-base-get-high-word@0.2.3': + dependencies: + '@stdlib/array-float64': 0.2.3 + '@stdlib/array-uint32': 0.2.3 + '@stdlib/assert-is-little-endian': 0.2.3 + '@stdlib/number-float64-base-to-words': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float64-base-get-low-word@0.2.3': + dependencies: + '@stdlib/array-float64': 0.2.3 + '@stdlib/array-uint32': 0.2.3 + '@stdlib/assert-is-little-endian': 0.2.3 + '@stdlib/number-float64-base-to-words': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float64-base-normalize@0.2.4': + dependencies: + '@stdlib/constants-float64-smallest-normal': 0.2.3 + '@stdlib/math-base-assert-is-infinite': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float64-base-set-high-word@0.2.3': + dependencies: + '@stdlib/array-float64': 0.2.3 + '@stdlib/array-uint32': 0.2.3 + '@stdlib/assert-is-little-endian': 0.2.3 + '@stdlib/number-float64-base-to-words': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float64-base-set-low-word@0.2.3': + dependencies: + '@stdlib/array-float64': 0.2.3 + '@stdlib/array-uint32': 0.2.3 + '@stdlib/assert-is-little-endian': 0.2.3 + '@stdlib/number-float64-base-to-words': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float64-base-to-float16@0.1.2': + dependencies: + '@stdlib/constants-float16-eps': 0.2.3 + '@stdlib/constants-float16-max': 0.2.3 + '@stdlib/constants-float16-smallest-normal': 0.2.3 + '@stdlib/constants-float64-eps': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-finite': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/number-float16-ctor': 0.1.2 + '@stdlib/number-float32-base-to-float16': 0.1.1 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-float64-base-to-float32@0.2.3': + dependencies: + '@stdlib/array-float32': 0.2.3 + + '@stdlib/number-float64-base-to-words@0.2.3': + dependencies: + '@stdlib/array-float64': 0.2.3 + '@stdlib/array-uint32': 0.2.3 + '@stdlib/assert-is-little-endian': 0.2.3 + '@stdlib/os-byte-order': 0.2.3 + '@stdlib/os-float-word-order': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/number-uint32-base-to-int32@0.2.3': {} + + '@stdlib/object-ctor@0.2.2': {} + + '@stdlib/os-byte-order@0.2.3': + dependencies: + '@stdlib/assert-is-big-endian': 0.2.3 + '@stdlib/assert-is-little-endian': 0.2.3 + + '@stdlib/os-float-word-order@0.2.3': + dependencies: + '@stdlib/os-byte-order': 0.2.3 + + '@stdlib/process-cwd@0.2.3': {} + + '@stdlib/regexp-extended-length-path@0.2.3': + dependencies: + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + + '@stdlib/regexp-function-name@0.2.3': + dependencies: + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + + '@stdlib/stats-anova1@0.2.3': + dependencies: + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-array': 0.2.3 + '@stdlib/assert-is-boolean': 0.2.3 + '@stdlib/assert-is-nan': 0.2.3 + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/assert-is-number-array': 0.2.3 + '@stdlib/assert-is-plain-object': 0.2.3 + '@stdlib/assert-is-positive-integer': 0.2.3 + '@stdlib/assert-is-typed-array-like': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/math-base-special-max': 0.3.1 + '@stdlib/math-base-special-roundn': 0.2.3 + '@stdlib/stats-base-dists-f-cdf': 0.2.3 + '@stdlib/stats-incr-stdev': 0.2.3 + '@stdlib/string-format': 0.2.3 + '@stdlib/string-repeat': 0.2.3 + '@stdlib/utils-define-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-base-dists-chisquare-cdf@0.3.1': + dependencies: + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/stats-base-dists-gamma-cdf': 0.3.1 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-base-dists-degenerate-cdf@0.3.1': + dependencies: + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-binary': 0.3.3 + '@stdlib/utils-constant-function': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-base-dists-f-cdf@0.2.3': + dependencies: + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-special-betainc': 0.2.3 + '@stdlib/utils-constant-function': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-base-dists-gamma-cdf@0.3.1': + dependencies: + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-ternary': 0.3.2 + '@stdlib/math-base-special-gammainc': 0.3.1 + '@stdlib/stats-base-dists-degenerate-cdf': 0.3.1 + '@stdlib/utils-constant-function': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-base-dists-normal-cdf@0.3.1': + dependencies: + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-napi-ternary': 0.3.2 + '@stdlib/math-base-special-erfc': 0.2.5 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/stats-base-dists-degenerate-cdf': 0.3.1 + '@stdlib/utils-constant-function': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-library-manifest': 0.2.4 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-base-dists-signrank-cdf@0.2.3': + dependencies: + '@stdlib/constants-float64-ln-two': 0.2.3 + '@stdlib/math-base-assert-is-finite': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-assert-is-positive-integer': 0.3.2 + '@stdlib/math-base-special-exp': 0.2.5 + '@stdlib/math-base-special-round': 0.3.1 + '@stdlib/utils-constant-function': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-memoize': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-base-dists-t-cdf@0.2.3': + dependencies: + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-special-betainc': 0.2.3 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/utils-constant-function': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-base-dists-t-quantile@0.2.3': + dependencies: + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-special-kernel-betaincinv': 0.2.3 + '@stdlib/math-base-special-signum': 0.2.3 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/utils-constant-function': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-incr-stdev@0.2.3': + dependencies: + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/string-format': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-kruskal-test@0.2.3': + dependencies: + '@stdlib/array-base-incrspace': 0.2.3 + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-array': 0.2.3 + '@stdlib/assert-is-boolean': 0.2.3 + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/assert-is-nan': 0.2.3 + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/assert-is-plain-object': 0.2.3 + '@stdlib/assert-is-positive-integer': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/math-base-special-roundn': 0.2.3 + '@stdlib/stats-base-dists-chisquare-cdf': 0.3.1 + '@stdlib/stats-ranks': 0.2.3 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-count-by': 0.2.3 + '@stdlib/utils-define-read-only-property': 0.2.3 + '@stdlib/utils-identity-function': 0.2.3 + '@stdlib/utils-keys': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-ranks@0.2.3': + dependencies: + '@stdlib/array-base-assert-contains': 0.2.3 + '@stdlib/array-base-filled': 0.2.3 + '@stdlib/array-base-zeros': 0.2.3 + '@stdlib/assert-contains': 0.3.1 + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-array': 0.2.3 + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/assert-is-object': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-strided-mean@0.1.1': + dependencies: + '@stdlib/stats-strided-meanpn': 0.1.1 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-strided-meanpn@0.1.1': + dependencies: + '@stdlib/array-base-arraylike2object': 0.2.2 + '@stdlib/blas-ext-base-gapxsumpw': 0.3.1 + '@stdlib/blas-ext-base-gsumpw': 0.3.1 + '@stdlib/strided-base-stride2offset': 0.1.1 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-strided-variance@0.1.1': + dependencies: + '@stdlib/stats-strided-variancepn': 0.1.1 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-strided-variancepn@0.1.1': + dependencies: + '@stdlib/array-base-arraylike2object': 0.2.2 + '@stdlib/blas-ext-base-gsumpw': 0.3.1 + '@stdlib/strided-base-stride2offset': 0.1.1 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-ttest2@0.2.3': + dependencies: + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-boolean': 0.2.3 + '@stdlib/assert-is-nan': 0.2.3 + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/assert-is-number-array': 0.2.3 + '@stdlib/assert-is-plain-object': 0.2.3 + '@stdlib/assert-is-positive-integer': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/assert-is-typed-array-like': 0.2.3 + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-pow': 0.3.1 + '@stdlib/math-base-special-roundn': 0.2.3 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/stats-base-dists-t-cdf': 0.2.3 + '@stdlib/stats-base-dists-t-quantile': 0.2.3 + '@stdlib/stats-strided-mean': 0.1.1 + '@stdlib/stats-strided-variance': 0.1.1 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-define-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-ttest@0.2.3': + dependencies: + '@stdlib/array-float64': 0.2.3 + '@stdlib/assert-contains': 0.3.1 + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-boolean': 0.2.3 + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/assert-is-number-array': 0.2.3 + '@stdlib/assert-is-plain-object': 0.2.3 + '@stdlib/assert-is-positive-integer': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/assert-is-typed-array-like': 0.2.3 + '@stdlib/blas-base-gcopy': 0.2.3 + '@stdlib/constants-float64-ninf': 0.2.3 + '@stdlib/constants-float64-pinf': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/math-base-assert-is-nan': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-roundn': 0.2.3 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/stats-base-dists-t-cdf': 0.2.3 + '@stdlib/stats-base-dists-t-quantile': 0.2.3 + '@stdlib/stats-strided-mean': 0.1.1 + '@stdlib/stats-strided-variance': 0.1.1 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-define-read-only-property': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/stats-wilcoxon@0.2.3': + dependencies: + '@stdlib/array-base-assert-contains': 0.2.3 + '@stdlib/array-float64': 0.2.3 + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-boolean': 0.2.3 + '@stdlib/assert-is-nan': 0.2.3 + '@stdlib/assert-is-number': 0.2.3 + '@stdlib/assert-is-number-array': 0.2.3 + '@stdlib/assert-is-plain-object': 0.2.3 + '@stdlib/assert-is-positive-integer': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/assert-is-typed-array-like': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/math-base-special-abs': 0.2.3 + '@stdlib/math-base-special-roundn': 0.2.3 + '@stdlib/math-base-special-signum': 0.2.3 + '@stdlib/math-base-special-sqrt': 0.2.3 + '@stdlib/stats-base-dists-normal-cdf': 0.3.1 + '@stdlib/stats-base-dists-signrank-cdf': 0.2.3 + '@stdlib/stats-ranks': 0.2.3 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-define-read-only-property': 0.2.3 + '@stdlib/utils-tabulate': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/strided-base-reinterpret-boolean@0.0.3': + dependencies: + '@stdlib/array-uint8': 0.2.3 + + '@stdlib/strided-base-reinterpret-complex128@0.2.3': + dependencies: + '@stdlib/array-float64': 0.2.3 + + '@stdlib/strided-base-reinterpret-complex64@0.2.2': + dependencies: + '@stdlib/array-float32': 0.2.3 + + '@stdlib/strided-base-reinterpret-complex@0.1.3': + dependencies: + '@stdlib/array-base-assert-is-complex128array': 0.2.3 + '@stdlib/array-base-assert-is-complex64array': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/strided-base-reinterpret-complex128': 0.2.3 + '@stdlib/strided-base-reinterpret-complex64': 0.2.2 + '@stdlib/string-format': 0.2.3 + + '@stdlib/strided-base-stride2offset@0.1.1': {} + + '@stdlib/string-base-format-interpolate@0.2.4': {} + + '@stdlib/string-base-format-tokenize@0.2.4': {} - '@smithy/url-parser@4.2.5': + '@stdlib/string-base-lowercase@0.4.1': {} + + '@stdlib/string-base-repeat@0.2.3': {} + + '@stdlib/string-base-replace@0.2.3': {} + + '@stdlib/string-format@0.2.3': dependencies: - '@smithy/querystring-parser': 4.2.5 - '@smithy/types': 4.9.0 - tslib: 2.8.1 + '@stdlib/string-base-format-interpolate': 0.2.4 + '@stdlib/string-base-format-tokenize': 0.2.4 - '@smithy/util-base64@4.3.0': + '@stdlib/string-repeat@0.2.3': dependencies: - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 + '@stdlib/assert-is-nonnegative-integer': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-base-repeat': 0.2.3 + '@stdlib/string-format': 0.2.3 + transitivePeerDependencies: + - supports-color - '@smithy/util-body-length-browser@4.2.0': + '@stdlib/string-replace@0.2.3': dependencies: - tslib: 2.8.1 + '@stdlib/assert-is-function': 0.2.3 + '@stdlib/assert-is-regexp': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-base-replace': 0.2.3 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-escape-regexp-string': 0.2.3 - '@smithy/util-body-length-node@4.2.1': + '@stdlib/symbol-ctor@0.2.3': {} + + '@stdlib/symbol-iterator@0.2.3': dependencies: - tslib: 2.8.1 + '@stdlib/assert-has-iterator-symbol-support': 0.2.3 - '@smithy/util-buffer-from@2.2.0': + '@stdlib/symbol-to-primitive@0.1.2': dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.8.1 + '@stdlib/assert-has-to-primitive-symbol-support': 0.1.1 + '@stdlib/symbol-ctor': 0.2.3 - '@smithy/util-buffer-from@4.2.0': + '@stdlib/types@0.4.3': {} + + '@stdlib/utils-constant-function@0.2.3': {} + + '@stdlib/utils-constructor-name@0.2.3': dependencies: - '@smithy/is-array-buffer': 4.2.0 - tslib: 2.8.1 + '@stdlib/assert-is-buffer': 0.2.3 + '@stdlib/regexp-function-name': 0.2.3 + '@stdlib/utils-native-class': 0.2.3 - '@smithy/util-config-provider@4.2.0': + '@stdlib/utils-convert-path@0.2.3': dependencies: - tslib: 2.8.1 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/regexp-extended-length-path': 0.2.3 + '@stdlib/string-base-lowercase': 0.4.1 + '@stdlib/string-format': 0.2.3 + '@stdlib/string-replace': 0.2.3 - '@smithy/util-defaults-mode-browser@4.3.13': + '@stdlib/utils-count-by@0.2.3': dependencies: - '@smithy/property-provider': 4.2.5 - '@smithy/smithy-client': 4.9.10 - '@smithy/types': 4.9.0 - tslib: 2.8.1 + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/assert-is-function': 0.2.3 + '@stdlib/assert-is-plain-object': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 + transitivePeerDependencies: + - supports-color - '@smithy/util-defaults-mode-node@4.2.16': + '@stdlib/utils-define-nonenumerable-read-only-accessor@0.2.4': dependencies: - '@smithy/config-resolver': 4.4.3 - '@smithy/credential-provider-imds': 4.2.5 - '@smithy/node-config-provider': 4.3.5 - '@smithy/property-provider': 4.2.5 - '@smithy/smithy-client': 4.9.10 - '@smithy/types': 4.9.0 - tslib: 2.8.1 + '@stdlib/types': 0.4.3 + '@stdlib/utils-define-property': 0.2.5 - '@smithy/util-endpoints@3.2.5': + '@stdlib/utils-define-nonenumerable-read-only-property@0.2.3': dependencies: - '@smithy/node-config-provider': 4.3.5 - '@smithy/types': 4.9.0 - tslib: 2.8.1 + '@stdlib/types': 0.4.3 + '@stdlib/utils-define-property': 0.2.5 - '@smithy/util-hex-encoding@4.2.0': + '@stdlib/utils-define-property@0.2.5': dependencies: - tslib: 2.8.1 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 - '@smithy/util-middleware@4.2.5': + '@stdlib/utils-define-read-only-property@0.2.3': dependencies: - '@smithy/types': 4.9.0 - tslib: 2.8.1 + '@stdlib/utils-define-property': 0.2.5 - '@smithy/util-retry@4.2.5': + '@stdlib/utils-escape-regexp-string@0.2.3': dependencies: - '@smithy/service-error-classification': 4.2.5 - '@smithy/types': 4.9.0 - tslib: 2.8.1 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 - '@smithy/util-stream@4.5.6': + '@stdlib/utils-eval@0.2.3': {} + + '@stdlib/utils-get-prototype-of@0.2.3': dependencies: - '@smithy/fetch-http-handler': 5.3.6 - '@smithy/node-http-handler': 4.4.5 - '@smithy/types': 4.9.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 + '@stdlib/assert-is-function': 0.2.3 + '@stdlib/object-ctor': 0.2.2 + '@stdlib/utils-native-class': 0.2.3 - '@smithy/util-uri-escape@4.2.0': + '@stdlib/utils-global@0.2.3': dependencies: - tslib: 2.8.1 + '@stdlib/assert-is-boolean': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 - '@smithy/util-utf8@2.3.0': + '@stdlib/utils-identity-function@0.2.3': {} + + '@stdlib/utils-index-of@0.2.3': dependencies: - '@smithy/util-buffer-from': 2.2.0 - tslib: 2.8.1 + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/assert-is-integer': 0.2.3 + '@stdlib/assert-is-nan': 0.2.3 + '@stdlib/assert-is-string': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 + transitivePeerDependencies: + - supports-color - '@smithy/util-utf8@4.2.0': + '@stdlib/utils-keys@0.2.3': dependencies: - '@smithy/util-buffer-from': 4.2.0 - tslib: 2.8.1 + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-arguments': 0.2.3 + '@stdlib/assert-is-enumerable-property': 0.2.3 + '@stdlib/assert-is-object-like': 0.2.3 + '@stdlib/utils-index-of': 0.2.3 + '@stdlib/utils-noop': 0.2.3 + '@stdlib/utils-type-of': 0.2.3 + transitivePeerDependencies: + - supports-color - '@smithy/util-waiter@4.2.5': + '@stdlib/utils-library-manifest@0.2.4': dependencies: - '@smithy/abort-controller': 4.2.5 - '@smithy/types': 4.9.0 - tslib: 2.8.1 + '@stdlib/fs-resolve-parent-path': 0.2.3 + '@stdlib/utils-convert-path': 0.2.3 + debug: 2.6.9 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color - '@smithy/uuid@1.1.0': + '@stdlib/utils-memoize@0.2.3': dependencies: - tslib: 2.8.1 + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-is-function': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.3 + '@stdlib/utils-identity-function': 0.2.3 - '@so-ric/colorspace@1.1.6': + '@stdlib/utils-native-class@0.2.3': dependencies: - color: 5.0.3 - text-hex: 1.0.0 + '@stdlib/assert-has-own-property': 0.2.3 + '@stdlib/assert-has-tostringtag-support': 0.2.3 + '@stdlib/symbol-ctor': 0.2.3 - '@standard-schema/spec@1.0.0': {} + '@stdlib/utils-noop@0.2.3': {} - '@standard-schema/spec@1.1.0': {} + '@stdlib/utils-tabulate@0.2.3': + dependencies: + '@stdlib/assert-is-collection': 0.2.3 + '@stdlib/error-tools-fmtprodmsg': 0.2.3 + '@stdlib/string-format': 0.2.3 + '@stdlib/utils-index-of': 0.2.3 + transitivePeerDependencies: + - supports-color + + '@stdlib/utils-type-of@0.2.3': + dependencies: + '@stdlib/utils-constructor-name': 0.2.3 + '@stdlib/utils-global': 0.2.3 '@tybys/wasm-util@0.10.1': dependencies: @@ -7071,6 +12219,8 @@ snapshots: '@types/d3-format@3.0.4': {} + '@types/d3-hierarchy@3.1.7': {} + '@types/d3-scale@4.0.9': dependencies: '@types/d3-time': 3.0.4 @@ -7120,7 +12270,7 @@ snapshots: '@typescript/vfs@1.6.2(typescript@5.4.5)': dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -7131,6 +12281,12 @@ snapshots: vite: 8.0.14(@types/node@25.0.1)(yaml@2.8.2) vue: 3.5.24(typescript@5.9.3) + '@vitejs/plugin-vue@6.0.5(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.6.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.2 + vite: 8.0.14(@types/node@25.0.1)(yaml@2.8.2) + vue: 3.5.25(typescript@5.6.3) + '@vitejs/plugin-vue@6.0.5(vite@8.0.14(@types/node@25.0.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 @@ -7395,6 +12551,12 @@ snapshots: '@vue/shared': 3.5.24 vue: 3.5.24(typescript@5.9.3) + '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.6.3))': + dependencies: + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 + vue: 3.5.25(typescript@5.6.3) + '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))': dependencies: '@vue/compiler-ssr': 3.5.25 @@ -7417,6 +12579,13 @@ snapshots: '@vueuse/shared': 13.9.0(vue@3.5.24(typescript@5.9.3)) vue: 3.5.24(typescript@5.9.3) + '@vueuse/core@13.9.0(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.9.0 + '@vueuse/shared': 13.9.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) + '@vueuse/integrations@13.9.0(sortablejs@1.15.6)(vue@3.5.24(typescript@5.9.3))': dependencies: '@vueuse/core': 13.9.0(vue@3.5.24(typescript@5.9.3)) @@ -7431,12 +12600,20 @@ snapshots: dependencies: vue: 3.5.24(typescript@5.9.3) + '@vueuse/shared@13.9.0(vue@3.5.25(typescript@5.9.3))': + dependencies: + vue: 3.5.25(typescript@5.9.3) + '@zip.js/zip.js@2.8.11': {} abbrev@2.0.0: {} abbrev@3.0.1: {} + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + acorn@8.15.0: {} ag-charts-community@12.1.2: @@ -7460,6 +12637,8 @@ snapshots: ag-charts-locale@12.1.2: optional: true + ag-charts-types@10.3.9: {} + ag-charts-types@12.1.2: {} ag-grid-community@34.1.2: @@ -7478,6 +12657,11 @@ snapshots: ag-grid-community: 34.1.2 vue: 3.5.24(typescript@5.9.3) + ag-grid-vue3@34.1.2(vue@3.5.25(typescript@5.9.3)): + dependencies: + ag-grid-community: 34.1.2 + vue: 3.5.25(typescript@5.9.3) + agent-base@7.1.4: {} ajv-draft-04@1.0.0(ajv@8.13.0): @@ -7508,10 +12692,6 @@ snapshots: ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -7522,7 +12702,28 @@ snapshots: ansi-styles@6.2.3: {} - ansis@3.17.0: {} + archiver-utils@5.0.2: + dependencies: + glob: 10.5.0 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a argparse@1.0.10: dependencies: @@ -7544,9 +12745,9 @@ snapshots: assertion-error@2.0.1: {} - ast-kit@3.0.0-beta.1: + ast-kit@3.0.0: dependencies: - '@babel/parser': 8.0.0-rc.3 + '@babel/parser': 8.0.4 estree-walker: 3.0.3 pathe: 2.0.3 @@ -7663,13 +12864,25 @@ snapshots: buffer-crc32@0.2.13: {} + buffer-crc32@1.0.0: {} + buffer-fill@1.0.0: {} + buffer@5.6.0: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buildcheck@0.0.7: optional: true @@ -7708,12 +12921,6 @@ snapshots: ci-info@3.9.0: {} - clean-stack@3.0.1: - dependencies: - escape-string-regexp: 4.0.0 - - cli-spinners@2.9.2: {} - cli-width@4.1.0: {} cliui@8.0.1: @@ -7745,16 +12952,26 @@ snapshots: colorette@1.4.0: {} - commander@10.0.1: {} + comlink@4.4.2: {} - commander@12.1.0: {} + commander@10.0.1: {} commander@14.0.3: {} + commander@15.0.0: {} + commander@2.20.3: {} compare-versions@6.1.1: {} + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + concat-map@0.0.1: {} confbox@0.1.8: {} @@ -7778,6 +12995,13 @@ snapshots: nan: 2.24.0 optional: true + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 @@ -7802,12 +13026,36 @@ snapshots: d3-color@3.1.0: {} + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-ease@3.0.1: {} + d3-format@3.1.0: {} + d3-hierarchy@3.1.2: {} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + d3-scale@4.0.2: dependencies: d3-array: 3.2.4 @@ -7818,6 +13066,10 @@ snapshots: d3-selection@3.0.0: {} + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + d3-time-format@4.1.0: dependencies: d3-time: 3.1.0 @@ -7826,13 +13078,34 @@ snapshots: dependencies: d3-array: 3.2.4 + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + de-indent@1.0.2: {} - debug@4.4.3(supports-color@8.1.1): + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 decompress-response@6.0.0: dependencies: @@ -7896,7 +13169,7 @@ snapshots: dependencies: path-type: 4.0.0 - dts-resolver@2.1.3: {} + dts-resolver@3.0.0: {} dunder-proto@1.0.1: dependencies: @@ -7913,10 +13186,6 @@ snapshots: minimatch: 9.0.1 semver: 7.7.3 - ejs@3.1.10: - dependencies: - jake: 10.9.4 - electron-to-chromium@1.5.267: {} emoji-regex@8.0.0: {} @@ -7981,8 +13250,6 @@ snapshots: escalade@3.2.0: {} - escape-string-regexp@4.0.0: {} - esprima@4.0.1: {} estree-walker@2.0.2: {} @@ -7991,12 +13258,16 @@ snapshots: dependencies: '@types/estree': 1.0.8 + event-target-shim@5.0.1: {} + events-universal@1.0.1: dependencies: bare-events: 2.8.2 transitivePeerDependencies: - bare-abort-controller + events@3.3.0: {} + execa@1.0.0: dependencies: cross-spawn: 6.0.6 @@ -8059,10 +13330,6 @@ snapshots: file-uri-to-path@1.0.0: {} - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -8127,8 +13394,6 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 - get-package-type@0.1.0: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -8143,7 +13408,7 @@ snapshots: dependencies: pump: 3.0.3 - get-tsconfig@4.14.0: + get-tsconfig@5.0.0-beta.5: dependencies: resolve-pkg-maps: 1.0.0 @@ -8218,7 +13483,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -8236,8 +13501,6 @@ snapshots: import-lazy@4.0.0: {} - indent-string@4.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -8257,8 +13520,6 @@ snapshots: dependencies: hasown: 2.0.2 - is-docker@2.2.1: {} - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -8287,10 +13548,6 @@ snapshots: is-windows@1.0.2: {} - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - isarray@1.0.0: {} isarray@2.0.5: {} @@ -8316,12 +13573,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.4: - dependencies: - async: 3.2.6 - filelist: 1.0.4 - picocolors: 1.1.1 - jju@1.4.0: {} js-beautify@1.15.4: @@ -8365,10 +13616,16 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + kdbush@4.1.0: {} + kolorist@1.8.0: {} kuler@2.0.0: {} + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + lightningcss-android-arm64@1.32.0: optional: true @@ -8418,8 +13675,6 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 - lilconfig@3.1.3: {} - local-pkg@1.1.2: dependencies: mlly: 1.8.0 @@ -8533,6 +13788,8 @@ snapshots: mri@1.2.0: {} + ms@2.0.0: {} + ms@2.1.3: {} muggle-string@0.4.1: {} @@ -8568,6 +13825,8 @@ snapshots: dependencies: abbrev: 3.0.1 + normalize-path@3.0.0: {} + npm-run-path@2.0.2: dependencies: path-key: 2.0.1 @@ -8576,6 +13835,8 @@ snapshots: obug@2.1.1: {} + obug@2.1.4: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -8772,20 +14033,21 @@ snapshots: process-nextick-args@2.0.1: {} + process@0.11.10: {} + proto-list@1.2.4: {} - protobufjs@7.5.4: + protobufjs@7.6.5: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 + '@protobufjs/utf8': 1.1.2 '@types/node': 25.0.1 long: 5.3.2 @@ -8806,17 +14068,23 @@ snapshots: queue-microtask@1.2.3: {} - quickjs-emscripten-core@0.31.0: + quickjs-emscripten-core@0.32.0: + dependencies: + '@jitl/quickjs-ffi-types': 0.32.0 + + quickjs-emscripten@0.32.0: dependencies: - '@jitl/quickjs-ffi-types': 0.31.0 + '@jitl/quickjs-wasmfile-debug-asyncify': 0.32.0 + '@jitl/quickjs-wasmfile-debug-sync': 0.32.0 + '@jitl/quickjs-wasmfile-release-asyncify': 0.32.0 + '@jitl/quickjs-wasmfile-release-sync': 0.32.0 + quickjs-emscripten-core: 0.32.0 + + quickselect@3.0.0: {} - quickjs-emscripten@0.31.0: + rbush@4.0.1: dependencies: - '@jitl/quickjs-wasmfile-debug-asyncify': 0.31.0 - '@jitl/quickjs-wasmfile-debug-sync': 0.31.0 - '@jitl/quickjs-wasmfile-release-asyncify': 0.31.0 - '@jitl/quickjs-wasmfile-release-sync': 0.31.0 - quickjs-emscripten-core: 0.31.0 + quickselect: 3.0.0 rc@1.2.8: dependencies: @@ -8825,6 +14093,13 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 + react-dom@19.2.8(react@19.2.8): + dependencies: + react: 19.2.8 + scheduler: 0.27.0 + + react@19.2.8: {} + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -8848,6 +14123,18 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + rechoir@0.6.2: dependencies: resolve: 1.22.11 @@ -8872,19 +14159,17 @@ snapshots: reusify@1.1.0: {} - rolldown-plugin-dts@0.23.2(rolldown@1.0.2)(typescript@5.9.3)(vue-tsc@3.3.5(typescript@5.9.3)): + rolldown-plugin-dts@0.26.0(rolldown@1.2.4)(typescript@5.9.3)(vue-tsc@3.3.5(typescript@5.9.3)): dependencies: - '@babel/generator': 8.0.0-rc.3 - '@babel/helper-validator-identifier': 8.0.0-rc.3 - '@babel/parser': 8.0.0-rc.3 - '@babel/types': 8.0.0-rc.3 - ast-kit: 3.0.0-beta.1 + '@babel/generator': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 + '@babel/parser': 8.0.4 + ast-kit: 3.0.0 birpc: 4.0.0 - dts-resolver: 2.1.3 - get-tsconfig: 4.14.0 - obug: 2.1.1 - picomatch: 4.0.4 - rolldown: 1.0.2 + dts-resolver: 3.0.0 + get-tsconfig: 5.0.0-beta.5 + obug: 2.1.4 + rolldown: 1.2.4 optionalDependencies: typescript: 5.9.3 vue-tsc: 3.3.5(typescript@5.9.3) @@ -8912,6 +14197,26 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.2 '@rolldown/binding-win32-x64-msvc': 1.0.2 + rolldown@1.2.4: + dependencies: + '@oxc-project/types': 0.144.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.2.4 + '@rolldown/binding-darwin-arm64': 1.2.4 + '@rolldown/binding-darwin-x64': 1.2.4 + '@rolldown/binding-freebsd-x64': 1.2.4 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.4 + '@rolldown/binding-linux-arm64-gnu': 1.2.4 + '@rolldown/binding-linux-arm64-musl': 1.2.4 + '@rolldown/binding-linux-ppc64-gnu': 1.2.4 + '@rolldown/binding-linux-s390x-gnu': 1.2.4 + '@rolldown/binding-linux-x64-gnu': 1.2.4 + '@rolldown/binding-linux-x64-musl': 1.2.4 + '@rolldown/binding-openharmony-arm64': 1.2.4 + '@rolldown/binding-win32-arm64-msvc': 1.2.4 + '@rolldown/binding-win32-x64-msvc': 1.2.4 + rollup-plugin-copy@3.5.0: dependencies: '@types/fs-extra': 8.1.5 @@ -8967,6 +14272,8 @@ snapshots: safer-buffer@2.1.2: {} + scheduler@0.27.0: {} + seek-bzip@1.0.6: dependencies: commander: 2.20.3 @@ -9064,6 +14371,11 @@ snapshots: std-env@4.1.0: {} + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + streamx@2.23.0: dependencies: events-universal: 1.0.1 @@ -9268,8 +14580,6 @@ snapshots: tweetnacl@0.14.5: {} - type-fest@0.21.3: {} - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -9280,6 +14590,8 @@ snapshots: typescript@5.4.5: {} + typescript@5.6.3: {} + typescript@5.8.2: {} typescript@5.9.3: {} @@ -9334,7 +14646,7 @@ snapshots: '@volar/typescript': 2.4.28 '@vue/language-core': 2.2.0(typescript@5.9.3) compare-versions: 6.1.1 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 kolorist: 1.8.0 local-pkg: 1.1.2 magic-string: 0.30.21 @@ -9503,6 +14815,16 @@ snapshots: optionalDependencies: typescript: 5.9.3 + vue@3.5.25(typescript@5.6.3): + dependencies: + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-sfc': 3.5.25 + '@vue/runtime-dom': 3.5.25 + '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.6.3)) + '@vue/shared': 3.5.25 + optionalDependencies: + typescript: 5.6.3 + vue@3.5.25(typescript@5.9.3): dependencies: '@vue/compiler-dom': 3.5.25 @@ -9543,10 +14865,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - widest-line@3.1.0: - dependencies: - string-width: 4.2.3 - winston-transport@4.9.0: dependencies: logform: 2.7.0 @@ -9567,8 +14885,6 @@ snapshots: triple-beam: 1.4.1 winston-transport: 4.9.0 - wordwrap@1.0.0: {} - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -9620,4 +14936,10 @@ snapshots: yoctocolors-cjs@2.1.3: {} + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 + zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6387dde..c866dfa 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,22 +1,34 @@ packages: - block - model + - software/column-profile + - software/region-annotation + - software/xlsx-to-csv - test - ui - workflow catalog: - "@platforma-sdk/model": 1.79.14 - "@platforma-sdk/ui-vue": 1.79.14 - "@platforma-sdk/workflow-tengo": 6.6.3 - "@platforma-sdk/block-tools": 2.11.0 - "@platforma-sdk/test": 1.79.14 - "@platforma-sdk/tengo-builder": 4.0.8 - "@platforma-sdk/package-builder": 3.13.0 + canonicalize: ~2.1.0 + "@platforma-sdk/model": 1.81.1 + "@platforma-sdk/ui-vue": 1.81.1 + "@platforma-sdk/workflow-tengo": 6.8.2 + "@platforma-sdk/block-tools": 2.14.3 + "@platforma-sdk/test": 1.81.3 + "@platforma-sdk/tengo-builder": 4.0.22 + "@platforma-sdk/package-builder": 3.15.0 "@platforma-sdk/blocks-deps-updater": 2.2.0 - "@milaboratories/ts-builder": 1.5.2 - "@milaboratories/ts-configs": 1.2.3 - "@milaboratories/helpers": 1.14.2 + "@milaboratories/ts-builder": 1.6.2 + "@milaboratories/ts-configs": 1.4.0 + # Must match the version @platforma-sdk/model depends on, otherwise the model's + # inferred type references a non-direct copy and the build fails TS2742. + "@milaboratories/helpers": 1.14.5 + + # Region annotation. ANARCI is a shared, already-published artifact — reused rather + # than introduced here, per the spec's requirement that the instrument already exist + # in the workspace. Versions follow blocks/redefine-clonotypes, its other consumer. + "@platforma-open/milaboratories.runenv-python-3": ^1.1.16 + "@platforma-open/milaboratories.software-anarci": ^0.0.3 "vue": 3.5.24 @@ -27,3 +39,7 @@ catalog: 'shx': ^0.4.0 "@changesets/cli": ^2.29.6 + + # other blocks used in tests + "@platforma-open/milaboratories.samples-and-data": 1.18.1 + "@platforma-open/milaboratories.sequence-properties": 1.5.2 diff --git a/software/column-profile/package.json b/software/column-profile/package.json new file mode 100644 index 0000000..f626924 --- /dev/null +++ b/software/column-profile/package.json @@ -0,0 +1,42 @@ +{ + "name": "@platforma-open/milaboratories.import-vdj.column-profile", + "version": "1.0.0", + "description": "Profile a csv/tsv's columns: value type and whether they hold amino-acid variable domains", + "scripts": { + "build": "pl-pkg build", + "prepublishOnly": "pl-pkg prepublish", + "do-pack": "rm -f *.tgz && pl-pkg build && pnpm pack && mv platforma-open*.tgz package.tgz", + "changeset": "changeset", + "version-packages": "changeset version" + }, + "files": [ + "./dist/**/*" + ], + "dependencies": {}, + "devDependencies": { + "@platforma-sdk/package-builder": "catalog:", + "@platforma-open/milaboratories.runenv-python-3": "catalog:" + }, + "block-software": { + "entrypoints": { + "main": { + "binary": { + "artifact": { + "type": "python", + "registry": "platforma-open", + "environment": "@platforma-open/milaboratories.runenv-python-3:3.12.10", + "dependencies": { + "toolset": "pip", + "requirements": "requirements.txt" + }, + "root": "./src" + }, + "cmd": [ + "python", + "{pkg}/main.py" + ] + } + } + } + } +} diff --git a/software/column-profile/src/main.py b/software/column-profile/src/main.py new file mode 100644 index 0000000..cda42ec --- /dev/null +++ b/software/column-profile/src/main.py @@ -0,0 +1,116 @@ +"""Profile every column of a csv/tsv so the mapping panel can offer the right things. + +Two questions, one pass over the file: + + types — the value type each column can hold, for the record-property columns. + aminoAcid — which columns hold amino-acid variable domains, for the chain slots. + +Both are answered from ALL rows, not a sample. That is the whole point: a column that looks +numeric for twenty rows and holds "N/A" on row five hundred must come out String, and a sampled +answer cannot promise that. The type only ever widens as rows are read — the same monotonic rule +`samples-and-data` uses when it imports a metadata table (ui/src/dataimport.ts:85-101), so one +non-numeric value anywhere is enough to settle the column. + +Empty cells never decide a type. A column of numbers with gaps is still numeric; a column of +nothing but gaps has no type at all and is reported String. + +No polars: the whole point is to stream the file once, and the stdlib csv reader does that +without pulling a dataframe engine into a step that only counts characters. +""" + +import argparse +import csv +import json +import re +import sys + +# Ordered: a column's type is the maximum over its values, so one string settles it. +T_NONE, T_LONG, T_DOUBLE, T_STRING = 0, 1, 2, 3 +TYPE_NAMES = {T_NONE: "String", T_LONG: "Long", T_DOUBLE: "Double", T_STRING: "String"} + +INT_RE = re.compile(r"^[+-]?\d+$") + +# Standard 20 plus X (unknown) and * (stop), both of which appear in real exports. Deliberately +# excludes B, J, O, U and Z, which is what keeps antibody INNs — trastuzumab, adalimumab — from +# reading as sequences. +AA_RE = re.compile(r"^[ACDEFGHIKLMNPQRSTVWYXacdefghiklmnpqrstvwyx*]+$") + +# Shorter than this is not a variable domain. An scFv runs ~110-130 residues and a single domain +# ~110; the threshold sits far enough below to tolerate a truncated entry and far enough above an +# accession or a clone name to exclude one. +MIN_DOMAIN_LENGTH = 50 + +# Share of a column's non-empty values that must look like domains for it to be offered as one. +# Not all of them: one blank-ish or truncated entry in a real panel should not disqualify it. +MIN_DOMAIN_SHARE = 0.8 + + +def value_type(value: str) -> int: + if INT_RE.match(value): + return T_LONG + try: + float(value) + except ValueError: + return T_STRING + return T_DOUBLE + + +def profile(path: str, separator: str) -> dict: + with open(path, newline="", encoding="utf-8-sig") as f: + reader = csv.reader(f, delimiter=separator) + try: + headers = [h.strip() for h in next(reader)] + except StopIteration: + return {"headers": [], "types": {}, "aminoAcid": []} + + types = [T_NONE] * len(headers) + seen = [0] * len(headers) + domain_like = [0] * len(headers) + + for row in reader: + for i, raw in enumerate(row): + if i >= len(headers): + break + v = (raw or "").strip() + if not v: + # An empty cell decides nothing — neither the type nor the alphabet. + continue + + types[i] = max(types[i], value_type(v)) + + seen[i] += 1 + if len(v) >= MIN_DOMAIN_LENGTH and AA_RE.match(v): + domain_like[i] += 1 + + out_types = {} + amino_acid = [] + for i, name in enumerate(headers): + if not name: + continue + out_types[name] = TYPE_NAMES[types[i]] + if seen[i] and domain_like[i] / seen[i] >= MIN_DOMAIN_SHARE: + amino_acid.append(name) + + return {"headers": [h for h in headers if h], "types": out_types, "aminoAcid": amino_acid} + + +def main() -> None: + p = argparse.ArgumentParser(description="Profile a csv/tsv's columns") + p.add_argument("--input", required=True, help="Input csv or tsv") + p.add_argument("--separator", required=True, help="Field separator") + p.add_argument("--output", required=True, help="Output JSON") + args = p.parse_args() + + result = profile(args.input, args.separator) + with open(args.output, "w") as f: + json.dump(result, f, sort_keys=True) + + print( + f"Profiled {len(result['headers'])} columns:" + f" {sum(1 for t in result['types'].values() if t != 'String')} numeric," + f" {len(result['aminoAcid'])} amino-acid" + ) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/software/column-profile/src/requirements.txt b/software/column-profile/src/requirements.txt new file mode 100644 index 0000000..e69de29 diff --git a/software/region-annotation/package.json b/software/region-annotation/package.json new file mode 100644 index 0000000..a055bf8 --- /dev/null +++ b/software/region-annotation/package.json @@ -0,0 +1,60 @@ +{ + "name": "@platforma-open/milaboratories.import-vdj.region-annotation", + "version": "1.0.0", + "description": "Locate FR/CDR region boundaries in amino-acid antibody variable domains from ANARCI numbering", + "scripts": { + "build": "pl-pkg build", + "prepublishOnly": "pl-pkg prepublish", + "do-pack": "rm -f *.tgz && pl-pkg build && pnpm pack && mv platforma-open*.tgz package.tgz", + "changeset": "changeset", + "version-packages": "changeset version" + }, + "files": [ + "./dist/**/*" + ], + "dependencies": {}, + "devDependencies": { + "@platforma-sdk/package-builder": "catalog:", + "@platforma-open/milaboratories.runenv-python-3": "catalog:" + }, + "block-software": { + "entrypoints": { + "fasta": { + "binary": { + "artifact": { + "type": "python", + "registry": "platforma-open", + "environment": "@platforma-open/milaboratories.runenv-python-3:3.12.10", + "dependencies": { + "toolset": "pip", + "requirements": "requirements.txt" + }, + "root": "./src" + }, + "cmd": [ + "python", + "{pkg}/fasta.py" + ] + } + }, + "main": { + "binary": { + "artifact": { + "type": "python", + "registry": "platforma-open", + "environment": "@platforma-open/milaboratories.runenv-python-3:3.12.10", + "dependencies": { + "toolset": "pip", + "requirements": "requirements.txt" + }, + "root": "./src" + }, + "cmd": [ + "python", + "{pkg}/main.py" + ] + } + } + } + } +} diff --git a/software/region-annotation/src/chains.py b/software/region-annotation/src/chains.py new file mode 100644 index 0000000..1a083b7 --- /dev/null +++ b/software/region-annotation/src/chains.py @@ -0,0 +1,89 @@ +"""Chain vocabulary shared by both entrypoints. + +The block speaks `IGHeavy` / `IGLight`, the `pl7.app/vdj/chain` vocabulary its bulk path +already uses — a mapped chain is a locus, and one mapped chain is a bulk shape. ANARCI speaks +`H` / `KL` and writes one CSV per bucket. The two are related but not the same thing: the locus +is *declared* by the mapping slot the scientist assigned a column to, while `H` / `KL` is +*inferred* by ANARCI from the sequence itself. + +(The workflow separately emits `pl7.app/vdj/scClonotypeChain` as `A` / `B` on a paired set. That +is a different, positional vocabulary for chains sharing one frame; nothing here uses it.) + +Reconciling a declared chain against an inferred one is explicitly out of scope for this +spec, so this package never compares them. It records regions under the declared chain, +and takes the numbering (and therefore the range table) from whichever bucket ANARCI +actually put the sequence in. See `regions.py` for why. +""" + +# Declared chains, in emission order. +# Every locus a set can declare, in emission order per receptor. One set holds one receptor's +# chains — the A/B slot vocabulary cannot express more — but listing them all here costs nothing: +# only the ones with a sequence column present are processed. +CHAINS = [ + "IGHeavy", + "IGLight", + "TCRBeta", + "TCRAlpha", + "TCRDelta", + "TCRGamma", +] + +CHAIN_LABELS = { + "IGHeavy": "heavy", + "IGLight": "light", + "TCRBeta": "beta", + "TCRAlpha": "alpha", + "TCRDelta": "delta", + "TCRGamma": "gamma", +} + +# ANARCI's own buckets. It writes `_H.csv` and `_KL.csv`. +# ANARCI writes one CSV per chain type it found, named `_.csv`, over exactly this +# list — anarci.py:263. Kappa and lambda are written together as KL (`_lc = {'K':'KL','L':'KL'}`), +# which is why a light chain cannot be resolved to one or the other from the numbering. +ANARCI_BUCKETS = ["H", "KL", "A", "B", "G", "D"] + +# The bucket a declared chain is expected to land in, used *only* to count disagreements — +# never to choose a range table, and never to stop a run. ANARCI merges kappa and lambda into +# one KL bucket, and IGLight is light regardless of which, so the pairing is total. +EXPECTED_BUCKET = { + "IGHeavy": "H", + "IGLight": "KL", + "TCRBeta": "B", + "TCRAlpha": "A", + "TCRDelta": "D", + "TCRGamma": "G", +} + + +def sequence_column(chain: str) -> str: + """Input TSV column holding the amino-acid variable domain of `chain`.""" + return f"{chain}_sequence" + + +def region_column(chain: str, region: str) -> str: + """Output TSV column holding one located region of `chain`.""" + return f"{chain}_{region}_aa" + + +def status_column(chain: str) -> str: + """Output TSV column holding the region-annotation status of `chain`.""" + return f"{chain}_regionAnnotationStatus" + + +def fasta_id(key: str, chain: str) -> str: + """FASTA record id. + + The chain is part of the id, not just the bucket the record lands in. Keying the + lookup on the record key alone would collide the two chains of one paired record, + which is only safe if you already assume declared chain == ANARCI bucket. + """ + return f"{key}|{chain}" + + +def parse_fasta_id(record_id: str) -> tuple[str, str]: + """Inverse of `fasta_id`. Returns ("", "") for anything unparseable.""" + key, sep, chain = (record_id or "").strip().rpartition("|") + if not sep or not key or chain not in CHAINS: + return "", "" + return key, chain diff --git a/software/region-annotation/src/fasta.py b/software/region-annotation/src/fasta.py new file mode 100644 index 0000000..e5529a5 --- /dev/null +++ b/software/region-annotation/src/fasta.py @@ -0,0 +1,59 @@ +"""Turn the per-record sequence TSV into one FASTA for ANARCI. + +Input TSV: a key column plus one `_sequence` column per mapped chain. +Output FASTA: one record per (key, chain) that actually carries a sequence. + +Records with no sequence for a chain are simply not written. They are not an error — +that chain has nothing to number, and `main.py` reports them as `Not applicable` from +the same input TSV. +""" + +import argparse +import sys + +import polars as pl + +from chains import CHAINS, fasta_id, sequence_column + + +def to_fasta(input_tsv: str, key_column: str, output_fasta: str) -> None: + df = pl.read_csv(input_tsv, separator="\t", infer_schema_length=0) + + if key_column not in df.columns: + print(f"Key column '{key_column}' not found in {input_tsv}", file=sys.stderr) + sys.exit(2) + + present = [c for c in CHAINS if sequence_column(c) in df.columns] + if not present: + expected = ", ".join(sequence_column(c) for c in CHAINS) + print(f"No sequence column found in {input_tsv}; expected one of: {expected}", file=sys.stderr) + sys.exit(2) + + written = 0 + with open(output_fasta, "w") as out: + for row in df.iter_rows(named=True): + key = (row.get(key_column) or "").strip() + if not key: + continue + for chain in present: + seq = (row.get(sequence_column(chain)) or "").strip() + if not seq: + continue + out.write(f">{fasta_id(key, chain)}\n{seq}\n") + written += 1 + + print(f"Wrote {written} sequences for chains [{', '.join(present)}] to {output_fasta}") + + +def main() -> None: + p = argparse.ArgumentParser(description="Build a FASTA of variable domains for ANARCI") + p.add_argument("--input_tsv", required=True, help="Input TSV: key column + _sequence columns") + p.add_argument("--key_column", required=True, help="Name of the record key column") + p.add_argument("--output_fasta", required=True, help="Output FASTA path") + args = p.parse_args() + + to_fasta(args.input_tsv, args.key_column, args.output_fasta) + + +if __name__ == "__main__": + main() diff --git a/software/region-annotation/src/main.py b/software/region-annotation/src/main.py new file mode 100644 index 0000000..b44ef7d --- /dev/null +++ b/software/region-annotation/src/main.py @@ -0,0 +1,225 @@ +"""Build the region + status TSV from ANARCI's per-bucket CSVs. + +Input: + --input_tsv the same per-record TSV `fasta.py` consumed: key column plus one + `_sequence` column per mapped chain. + --csv_ ANARCI's `_.csv`, one flag per bucket. Any may be absent. + --scheme imgt | kabat | chothia — the convention the scientist chose. + +Output: one row per record, and for each mapped chain seven `__aa` columns +plus one `_regionAnnotationStatus`. Status is never empty; regions are empty for +any chain whose status is not `Annotated`. + +Why the lookup keys on `key|chain` rather than on the record key +--------------------------------------------------------------- +ANARCI decides for itself which chain type a sequence is and writes it to that bucket's CSV. +The chain this block emits under is the one the scientist *declared* by assigning a column +to a slot. Those can disagree, and reconciling them is out of scope for this spec — there +is no status value for it and no threshold has been agreed for how much disagreement should +stop a run. + +So this script does not *act* on the comparison. It finds the record by its full `key|chain` +id in either bucket, and uses the range table of the bucket it was found in, because that is +the numbering space ANARCI actually produced. Using the declared chain's table on numbering +from the other bucket would silently shift every boundary; dropping the record to `Failed` +would throw away a chain the instrument numbered perfectly well. + +It does *count* the disagreements, into `--out_stats`. Counting is not reconciling: nothing +here refuses a run or changes an output because of it. Without the count, mapping the two +sequence columns to the wrong slots produces a clean import in which every record is +annotated and every chain label is wrong, and nothing else in the output would reveal it. + +Keying on the record key alone — as the block this is forked from does — collapses the two +chains of one paired record onto one entry, which is only safe if declared chain and ANARCI +bucket are assumed to agree. +""" + +import argparse +import os +import sys +from typing import Dict, List, Optional, Tuple + +import polars as pl + +from chains import ( + ANARCI_BUCKETS, + CHAINS, + EXPECTED_BUCKET, + parse_fasta_id, + region_column, + sequence_column, + status_column, +) +from regions import ( + REGION_RANGES, + REGIONS, + SCHEMES, + STATUS_ANNOTATED, + STATUS_FAILED, + STATUS_NOT_APPLICABLE, + annotate, + parse_positions, +) + +# (key, chain) -> (bucket, residues) +Numbering = Dict[Tuple[str, str], Tuple[str, List[str]]] + + +def load_anarci_csv(path: Optional[str], bucket: str, into: Numbering, positions: Dict[str, List[str]]) -> None: + """Merge one ANARCI CSV into `into`, keyed by the (key, chain) parsed from its Id.""" + if not path or not os.path.exists(path): + return + + df = pl.read_csv(path, infer_schema_length=0) + if "Id" not in df.columns: + print(f"{path}: no 'Id' column, skipping", file=sys.stderr) + return + + pos_labels = parse_positions(df.columns) + if not pos_labels: + # Expected, not an anomaly: the workflow pre-creates both bucket CSVs with just an + # `Id` header so the exec can always save both, and ANARCI overwrites only the + # buckets it actually found. A header-only file means this bucket was empty. + print(f"{path}: no sequences in the {bucket} bucket") + return + positions[bucket] = pos_labels + + for row in df.select(["Id"] + pos_labels).iter_rows(named=True): + key, chain = parse_fasta_id(row.get("Id") or "") + if not key: + continue + entry = (key, chain) + if entry in into: + # First numbering wins. ANARCI can emit more than one domain hit per record; + # the first is the primary one, and a mapping assigning two sequences to one + # chain is refused upstream, so there is exactly one per (key, chain). + continue + into[entry] = (bucket, [(row.get(p) or "").strip() for p in pos_labels]) + + +def write_stats(path: str, chains: List[str], tally: Dict[str, Dict[str, int]]) -> None: + """One row per declared chain, counting outcomes and chain disagreements. + + `chainDisagreed` is the number of *annotated* records whose sequence ANARCI bucketed as + the other chain — a light chain in the slot declared heavy, or the reverse. It is a + subset of `annotated`: those records are annotated correctly, under their declared chain, + using the ranges of the bucket ANARCI chose. + + It is counted and reported, and nothing acts on it. Reconciling a declared chain against + an inferred one is out of scope for this spec, and the threshold at which disagreement + should stop a run turns on a rate nobody has measured. This is that measurement — the + missing input to that decision, not the decision. + + Reading it: a handful of disagreements is a few odd rows in the file. Nearly all of them, + on both chains, means the sequence columns were mapped to the wrong slots — in which case + every record is annotated consistently and labelled wrongly, and no other signal in the + output would show it. + + One row per declared chain, keyed on the chain. A scientist reading a paired set wants the + two chains side by side to compare them, which is a row each; folding them into one wide row + puts the same four numbers twice across the header instead. + """ + header = ["chain", "annotated", "notApplicable", "failed", "chainDisagreed"] + rows = [ + [ + chain, + str(tally[chain][STATUS_ANNOTATED]), + str(tally[chain][STATUS_NOT_APPLICABLE]), + str(tally[chain][STATUS_FAILED]), + str(tally[chain]["chainDisagreed"]), + ] + for chain in chains + ] + pl.DataFrame(rows, schema=header, orient="row").write_csv(path, separator="\t") + + +def main() -> None: + p = argparse.ArgumentParser(description="Locate FR/CDR regions from ANARCI numbering") + p.add_argument("--input_tsv", required=True, help="Per-record TSV: key column + _sequence columns") + p.add_argument("--key_column", required=True, help="Name of the record key column") + p.add_argument("--scheme", required=True, choices=SCHEMES, help="Numbering scheme") + # One flag per bucket rather than a directory: the workflow declares which files it saves + # up front, and naming them here keeps that list and this one impossible to disagree about. + for bucket in ANARCI_BUCKETS: + p.add_argument( + f"--csv_{bucket.lower()}", + required=False, + help=f"ANARCI {bucket}-bucket CSV", + ) + p.add_argument("--out_tsv", required=True, help="Output TSV path") + p.add_argument("--out_stats", required=False, help="Optional per-chain outcome counts TSV") + args = p.parse_args() + + df = pl.read_csv(args.input_tsv, separator="\t", infer_schema_length=0) + if args.key_column not in df.columns: + print(f"Key column '{args.key_column}' not found in {args.input_tsv}", file=sys.stderr) + sys.exit(2) + + chains = [c for c in CHAINS if sequence_column(c) in df.columns] + if not chains: + expected = ", ".join(sequence_column(c) for c in CHAINS) + print(f"No sequence column found in {args.input_tsv}; expected one of: {expected}", file=sys.stderr) + sys.exit(2) + + numbering: Numbering = {} + positions: Dict[str, List[str]] = {} + for bucket in ANARCI_BUCKETS: + load_anarci_csv(getattr(args, f"csv_{bucket.lower()}"), bucket, numbering, positions) + + columns = [args.key_column] + for chain in chains: + columns.extend(region_column(chain, region) for region in REGIONS) + columns.append(status_column(chain)) + + rows: List[List[str]] = [] + # Per declared chain: the three statuses, plus how many of the annotated ones ANARCI + # bucketed as the *other* chain. See `write_stats` for what that number is for. + tally: Dict[str, Dict[str, int]] = { + c: {STATUS_ANNOTATED: 0, STATUS_NOT_APPLICABLE: 0, STATUS_FAILED: 0, "chainDisagreed": 0} + for c in chains + } + + for row in df.iter_rows(named=True): + key = (row.get(args.key_column) or "").strip() + if not key: + continue + + out_row: List[str] = [key] + for chain in chains: + sequence = (row.get(sequence_column(chain)) or "").strip() + + found = numbering.get((key, chain)) + if found is None: + located, status = annotate(sequence, None, None) + else: + bucket, residues = found + located, status = annotate( + sequence, + (positions[bucket], residues), + REGION_RANGES[args.scheme][bucket], + ) + if status == STATUS_ANNOTATED and bucket != EXPECTED_BUCKET[chain]: + tally[chain]["chainDisagreed"] += 1 + + out_row.extend(located[region] for region in REGIONS) + out_row.append(status) + tally[chain][status] += 1 + + rows.append(out_row) + + pl.DataFrame(rows, schema=columns, orient="row").write_csv(args.out_tsv, separator="\t") + if args.out_stats: + write_stats(args.out_stats, chains, tally) + + for chain in chains: + t = tally[chain] + print( + f"chain {chain}: {t[STATUS_ANNOTATED]} annotated, " + f"{t[STATUS_NOT_APPLICABLE]} not applicable, {t[STATUS_FAILED]} failed, " + f"{t['chainDisagreed']} numbered as the other chain" + ) + print(f"Wrote {len(rows)} records to {args.out_tsv}") + + +if __name__ == "__main__": + main() diff --git a/software/region-annotation/src/regions.py b/software/region-annotation/src/regions.py new file mode 100644 index 0000000..fc7dcd5 --- /dev/null +++ b/software/region-annotation/src/regions.py @@ -0,0 +1,196 @@ +"""Pure region-location logic. No IO, no argparse — see `main.py` for the CLI. + +Everything here is a function of its arguments so it can be unit-tested directly. +""" + +import re +from typing import Dict, List, Optional, Tuple + +# All seven regions. FR4 is included deliberately: the region list is the thing that has +# historically been short in three different places, and a set imported without FR4 gets +# no FR4 liability scored downstream, silently. +REGIONS = ["FR1", "CDR1", "FR2", "CDR2", "FR3", "CDR3", "FR4"] + +# Closed status vocabulary. Exactly these three values, never null. +STATUS_ANNOTATED = "Annotated" +STATUS_NOT_APPLICABLE = "Not applicable" +STATUS_FAILED = "Failed" + +# Per-scheme, per-ANARCI-bucket region boundaries, inclusive, in the scheme's own +# numbering space. +# +# Copied verbatim from blocks/redefine-clonotypes/software/anarci-numbering/src/main.py. +# ANARCI supplies the numbering; the region *definitions* are this table, so numbering and +# region boundaries are one choice here rather than two. Kept as a copy rather than shared: +# the two callers want different outputs, and sharing would put a change to +# redefine-clonotypes on this block's critical path. Consolidation candidate — if you +# change a boundary here, change it there too. +REGION_RANGES: Dict[str, Dict[str, Dict[str, Tuple[int, int]]]] = { + "imgt": { + "H": { + "FR1": (1, 26), + "CDR1": (27, 38), + "FR2": (39, 55), + "CDR2": (56, 65), + "FR3": (66, 104), + "CDR3": (105, 117), + "FR4": (118, 129), + }, + "KL": { + "FR1": (1, 26), + "CDR1": (27, 38), + "FR2": (39, 55), + "CDR2": (56, 65), + "FR3": (66, 104), + "CDR3": (105, 117), + "FR4": (118, 129), + }, + # TCR buckets share the IG table verbatim, filled in below. IMGT numbering does not vary + # by chain — ANARCI's `number_imgt(state_vector, sequence)` takes no chain type at all — + # which is why H and KL above are already identical. Only imgt has TCR entries: ANARCI + # implements kabat and chothia for H/K/L only and raises for a TCR chain, so those + # schemes are never reached with a TCR bucket. + }, + "kabat": { + "H": { + "FR1": (1, 30), + "CDR1": (31, 35), + "FR2": (36, 49), + "CDR2": (50, 65), + "FR3": (66, 94), + "CDR3": (95, 102), + "FR4": (103, 113), + }, + "KL": { + "FR1": (1, 23), + "CDR1": (24, 34), + "FR2": (35, 49), + "CDR2": (50, 56), + "FR3": (57, 88), + "CDR3": (89, 97), + "FR4": (98, 107), + }, + }, + "chothia": { + "H": { + "FR1": (1, 25), + "CDR1": (26, 32), + "FR2": (33, 52), + "CDR2": (53, 55), + "FR3": (56, 94), + "CDR3": (95, 102), + "FR4": (103, 113), + }, + "KL": { + "FR1": (1, 23), + "CDR1": (24, 34), + "FR2": (35, 49), + "CDR2": (50, 56), + "FR3": (57, 88), + "CDR3": (89, 97), + "FR4": (98, 107), + }, + }, +} + +for _tcr_bucket in ("A", "B", "G", "D"): + REGION_RANGES["imgt"][_tcr_bucket] = dict(REGION_RANGES["imgt"]["H"]) + +SCHEMES = sorted(REGION_RANGES.keys()) + + +def parse_positions(fields: List[str]) -> List[str]: + """ANARCI's CSV carries metadata columns first, then one column per position. + + Position columns are the ones whose header starts with a digit (`1`, `2`, … `111A`). + Returns them in file order, which is numbering order. + """ + for i, field in enumerate(fields): + if re.match(r"^\d", field): + return fields[i:] + return [] + + +def position_number(label: str) -> Optional[int]: + """`"111A"` -> 111. Insertion codes share the number of the position they follow.""" + m = re.match(r"^(\d+)", label) + return int(m.group(1)) if m else None + + +def region_for_pos(num: int, ranges: Dict[str, Tuple[int, int]]) -> Optional[str]: + for region in REGIONS: + start, end = ranges[region] + if start <= num <= end: + return region + return None + + +def is_gap(residue: Optional[str]) -> bool: + return (residue or "").strip() in {"", "-", "."} + + +def build_regions( + pos_labels: List[str], + residues: List[str], + ranges: Dict[str, Tuple[int, int]], +) -> Dict[str, str]: + """Assemble one amino-acid string per region from ANARCI's aligned residues. + + Gaps are dropped, so the result is the ungapped subsequence of each region. Positions + outside every region range are dropped too. + + Amino acid only: a bare set carries no nucleotide variable domain, so there is no + nucleotide counterpart to project onto these boundaries. + """ + collected: Dict[str, List[str]] = {r: [] for r in REGIONS} + + for pos_label, residue in zip(pos_labels, residues): + if is_gap(residue): + continue + num = position_number(pos_label) + if num is None: + continue + region = region_for_pos(num, ranges) + if region is None: + continue + collected[region].append(residue.strip()) + + return {r: "".join(collected[r]) for r in REGIONS} + + +def annotate( + sequence: str, + numbering: Optional[Tuple[List[str], List[str]]], + ranges: Optional[Dict[str, Tuple[int, int]]], +) -> Tuple[Dict[str, str], str]: + """Locate one chain's regions and say what happened. + + `sequence` — the declared amino-acid variable domain, "" when the chain was not + supplied for this record. + `numbering` — (position labels, residues) from whichever ANARCI bucket contained this + record, or None if ANARCI did not number it. + `ranges` — the range table of that same bucket, or None alongside `numbering`. + + Returns (region -> value, status). A chain that is not `Annotated` carries **no + value** in any region — the empty string here becomes an absent cell in the TSV and a + null in the imported p-column. It is never an empty sequence presented as a result. + """ + empty = {r: "" for r in REGIONS} + + if not (sequence or "").strip(): + # Nothing was supplied for this chain, so there is nothing the input could have + # supported an answer for. Not a failure of the instrument. + return empty, STATUS_NOT_APPLICABLE + + if numbering is None or ranges is None: + # A sequence was supplied and ANARCI did not return numbering for it. + return empty, STATUS_FAILED + + pos_labels, residues = numbering + located = build_regions(pos_labels, residues, ranges) + + if not any(located.values()): + # Numbered, but nothing landed inside any region range. + return empty, STATUS_FAILED + + return located, STATUS_ANNOTATED diff --git a/software/region-annotation/src/requirements.txt b/software/region-annotation/src/requirements.txt new file mode 100644 index 0000000..bc3df6d --- /dev/null +++ b/software/region-annotation/src/requirements.txt @@ -0,0 +1 @@ +polars-lts-cpu==1.33.1 diff --git a/software/region-annotation/test_region_annotation.py b/software/region-annotation/test_region_annotation.py new file mode 100644 index 0000000..dd1e937 --- /dev/null +++ b/software/region-annotation/test_region_annotation.py @@ -0,0 +1,203 @@ +"""End-to-end check of both entrypoints against a synthetic ANARCI CSV. + +Not wired into `pnpm test`: it needs a python interpreter with polars, which the block's +node/turbo test lane does not provide. Run it by hand from this directory: + + uv venv .venv && uv pip install --python .venv/bin/python polars + .venv/bin/python test_region_annotation.py + +Residues are deterministic per position, so every region's expected content is computable +and the assertions pin the actual boundary arithmetic rather than just the shape. +""" + +import csv +import os +import subprocess +import sys +import tempfile + +HERE = os.path.dirname(os.path.abspath(__file__)) +SRC = os.path.join(HERE, "src") + +AAS = "ACDEFGHIKLMNPQRSTVWY" +MAXPOS = 130 +POSITIONS = [str(i) for i in range(1, MAXPOS + 1)] + +REGIONS = ["FR1", "CDR1", "FR2", "CDR2", "FR3", "CDR3", "FR4"] + +# kabat is used throughout because its H and KL ranges differ, which is what makes the +# "declared chain vs ANARCI bucket" assertion meaningful. Under imgt they are identical. +KABAT = { + "H": {"FR1": (1, 30), "CDR1": (31, 35), "FR2": (36, 49), "CDR2": (50, 65), + "FR3": (66, 94), "CDR3": (95, 102), "FR4": (103, 113)}, + "KL": {"FR1": (1, 23), "CDR1": (24, 34), "FR2": (35, 49), "CDR2": (50, 56), + "FR3": (57, 88), "CDR3": (89, 97), "FR4": (98, 107)}, +} + +ANARCI_META = ["domain_no", "hmm_species", "chain_type", "e-value", "score", + "seqstart_index", "seqend_index", "v_gene", "v_identity", "j_gene", "j_identity"] + + +def residue(i): + return AAS[(i - 1) % len(AAS)] + + +def expected(lo, hi): + return "".join(residue(i) for i in range(lo, hi + 1) if i <= MAXPOS) + + +def write_anarci_csv(path, ids, all_gaps=()): + """A stand-in for ANARCI's `--csv` output: metadata columns, then one per position.""" + with open(path, "w", newline="") as f: + w = csv.writer(f) + w.writerow(["Id"] + ANARCI_META + POSITIONS) + for rid in ids: + meta = ["1", "human", "H", "1e-60", "150.0", "0", "120", "IGHV3-23", "0.9", "IGHJ4", "0.9"] + res = ["-"] * len(POSITIONS) if rid in all_gaps else [residue(i) for i in range(1, MAXPOS + 1)] + w.writerow([rid] + meta + res) + + +def write_header_only_csv(path): + """What the workflow pre-creates, and what an empty ANARCI bucket leaves behind.""" + with open(path, "w") as f: + f.write("Id\n") + + +def run(*argv): + r = subprocess.run([sys.executable] + list(argv), capture_output=True, text=True) + if r.returncode != 0: + raise AssertionError(f"{argv[0]} failed:\n{r.stdout}\n{r.stderr}") + return r.stdout.strip() + + +def main(): + work = tempfile.mkdtemp(prefix="region-annotation-test-") + + in_tsv = os.path.join(work, "in.tsv") + with open(in_tsv, "w", newline="") as f: + w = csv.writer(f, delimiter="\t") + w.writerow(["variantKey", "IGHeavy_sequence", "IGLight_sequence"]) + w.writerow(["K1", "EVQLVQ", "DIQMTQ"]) # both chains numbered + w.writerow(["K2", "EVQLVQ", ""]) # B not supplied + w.writerow(["K3", "EVQLVQ", ""]) # A supplied, ANARCI returned nothing + w.writerow(["K4", "EVQLVQ", ""]) # A numbered, every position a gap + w.writerow(["K5", "DIQMTQ", ""]) # A declared, ANARCI bucketed it KL + w.writerow(["", "EVQLVQ", ""]) # blank key + + h_csv = os.path.join(work, "anarci.csv_H.csv") + kl_csv = os.path.join(work, "anarci.csv_KL.csv") + write_anarci_csv(h_csv, ["K1|IGHeavy", "K2|IGHeavy", "K4|IGHeavy"], all_gaps={"K4|IGHeavy"}) + write_anarci_csv(kl_csv, ["K1|IGLight", "K5|IGHeavy"]) + + fasta = os.path.join(work, "out.fasta") + print(run(os.path.join(SRC, "fasta.py"), "--input_tsv", in_tsv, + "--key_column", "variantKey", "--output_fasta", fasta)) + + ids = [line[1:].strip() for line in open(fasta) if line.startswith(">")] + assert ids == ["K1|IGHeavy", "K1|IGLight", "K2|IGHeavy", "K3|IGHeavy", "K4|IGHeavy", "K5|IGHeavy"], ids + print(" fasta: chain is in the id, unsupplied chains skipped, blank key dropped") + + # Only records. A bucket ANARCI never fills is handled by the workflow, which pre-creates + # both CSVs as writable header-only placeholders — nothing synthetic enters the FASTA. + assert not any(i.startswith("__") for i in ids), ids + print(" fasta: nothing but the scientist's own records") + + out_tsv = os.path.join(work, "out.tsv") + stats_tsv = os.path.join(work, "stats.tsv") + print(run(os.path.join(SRC, "main.py"), "--input_tsv", in_tsv, "--key_column", "variantKey", + "--scheme", "kabat", "--csv_h", h_csv, "--csv_kl", kl_csv, + "--out_tsv", out_tsv, "--out_stats", stats_tsv)) + + rows = list(csv.DictReader(open(out_tsv), delimiter="\t")) + by_key = {r["variantKey"]: r for r in rows} + assert [r["variantKey"] for r in rows] == ["K1", "K2", "K3", "K4", "K5"], list(by_key) + + want_header = (["variantKey"] + + [f"IGHeavy_{r}_aa" for r in REGIONS] + ["IGHeavy_regionAnnotationStatus"] + + [f"IGLight_{r}_aa" for r in REGIONS] + ["IGLight_regionAnnotationStatus"]) + assert list(rows[0].keys()) == want_header, list(rows[0].keys()) + print(" header: seven regions per chain including FR4, plus a status per chain") + + for chain, bucket in (("IGHeavy", "H"), ("IGLight", "KL")): + for region in REGIONS: + got = by_key["K1"][f"{chain}_{region}_aa"] + exp = expected(*KABAT[bucket][region]) + assert got == exp, f"K1 {chain} {region}: {got!r} != {exp!r}" + assert by_key["K1"][f"{chain}_regionAnnotationStatus"] == "Annotated" + print(" K1: both chains Annotated, all seven regions match their bucket's kabat ranges") + + assert by_key["K2"]["IGLight_regionAnnotationStatus"] == "Not applicable" + assert all(by_key["K2"][f"IGLight_{r}_aa"] == "" for r in REGIONS) + print(" K2: chain not supplied -> Not applicable, no region values") + + assert by_key["K3"]["IGHeavy_regionAnnotationStatus"] == "Failed" + assert all(by_key["K3"][f"IGHeavy_{r}_aa"] == "" for r in REGIONS) + print(" K3: supplied but unnumbered -> Failed, no region values (not empty strings)") + + assert by_key["K4"]["IGHeavy_regionAnnotationStatus"] == "Failed" + assert all(by_key["K4"][f"IGHeavy_{r}_aa"] == "" for r in REGIONS) + print(" K4: numbered but nothing located -> Failed, no region values") + + # The declared chain labels the column; the bucket ANARCI chose supplies the ranges. + assert by_key["K5"]["IGHeavy_regionAnnotationStatus"] == "Annotated" + for region in REGIONS: + assert by_key["K5"][f"IGHeavy_{region}_aa"] == expected(*KABAT["KL"][region]), region + assert by_key["K5"]["IGHeavy_FR1_aa"] != expected(*KABAT["H"]["FR1"]) + print(" K5: declared A, bucketed KL -> Annotated under A, with KL ranges") + + for key, row in by_key.items(): + for chain in ("IGHeavy", "IGLight"): + assert row[f"{chain}_regionAnnotationStatus"], f"{key} {chain}: empty status" + print(" status is never empty") + + # One row per declared chain, keyed on the locus — the workflow reads this with a chain axis. + stats = {r["chain"]: r for r in csv.DictReader(open(stats_tsv), delimiter="\t")} + assert list(stats) == ["IGHeavy", "IGLight"], list(stats) + # IGHeavy: K1 K2 K5 annotated, K3 K4 failed, none unsupplied. + assert stats["IGHeavy"] == {"chain": "IGHeavy", "annotated": "3", "notApplicable": "0", + "failed": "2", "chainDisagreed": "1"}, stats["IGHeavy"] + # IGLight: only K1 supplied and annotated; K2..K5 unsupplied. K1's light chain is in KL, + # which is where a declared IGLight belongs, so nothing disagrees. + assert stats["IGLight"] == {"chain": "IGLight", "annotated": "1", "notApplicable": "4", + "failed": "0", "chainDisagreed": "0"}, stats["IGLight"] + print(" stats: a row per chain, counts correct; K5 is the one chainDisagreed, and it is" + " counted without changing its status or its values") + + # The count must not leak into the dataset — K5 is a normal Annotated record. + assert by_key["K5"]["IGHeavy_regionAnnotationStatus"] == "Annotated" + print(" stats: disagreement is reported, not acted on") + + # A single-chain set, with the other bucket left header-only as the workflow creates it. + single_tsv = os.path.join(work, "single.tsv") + with open(single_tsv, "w", newline="") as f: + w = csv.writer(f, delimiter="\t") + w.writerow(["variantKey", "IGHeavy_sequence"]) + w.writerow(["S1", "EVQLVQ"]) + empty_kl = os.path.join(work, "empty_KL.csv") + write_header_only_csv(empty_kl) + single_out = os.path.join(work, "single_out.tsv") + print(run(os.path.join(SRC, "main.py"), "--input_tsv", single_tsv, "--key_column", "variantKey", + "--scheme", "imgt", "--csv_h", h_csv, "--csv_kl", empty_kl, "--out_tsv", single_out)) + single = list(csv.DictReader(open(single_out), delimiter="\t")) + assert list(single[0].keys()) == ["variantKey"] + [f"IGHeavy_{r}_aa" for r in REGIONS] + ["IGHeavy_regionAnnotationStatus"] + assert single[0]["IGHeavy_regionAnnotationStatus"] == "Failed" # S1 is not in the H csv + print(" single-chain set: only that chain's columns emitted, header-only bucket tolerated") + + # An id whose suffix is not a mapped slot must never become a record. Nothing writes such + # ids today, but the parser is what keeps a stray one out of the dataset. + pad_csv = os.path.join(work, "pad_H.csv") + write_anarci_csv(pad_csv, ["K9|H", "K1|IGHeavy"]) + pad_out = os.path.join(work, "pad_out.tsv") + run(os.path.join(SRC, "main.py"), "--input_tsv", in_tsv, "--key_column", "variantKey", + "--scheme", "imgt", "--csv_h", pad_csv, "--out_tsv", pad_out) + padded = list(csv.DictReader(open(pad_out), delimiter="\t")) + assert all(r["variantKey"] != "K9" for r in padded) + assert [r["variantKey"] for r in padded] == ["K1", "K2", "K3", "K4", "K5"] + print(" ids whose suffix is not a mapped slot never become records") + + print("\nALL ASSERTIONS PASSED") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/software/xlsx-to-csv/package.json b/software/xlsx-to-csv/package.json new file mode 100644 index 0000000..63c390c --- /dev/null +++ b/software/xlsx-to-csv/package.json @@ -0,0 +1,42 @@ +{ + "name": "@platforma-open/milaboratories.import-vdj.xlsx-to-csv", + "version": "1.0.0", + "description": "Convert the first worksheet of a workbook to CSV so the pipeline only ever sees csv/tsv", + "scripts": { + "build": "pl-pkg build", + "prepublishOnly": "pl-pkg prepublish", + "do-pack": "rm -f *.tgz && pl-pkg build && pnpm pack && mv platforma-open*.tgz package.tgz", + "changeset": "changeset", + "version-packages": "changeset version" + }, + "files": [ + "./dist/**/*" + ], + "dependencies": {}, + "devDependencies": { + "@platforma-sdk/package-builder": "catalog:", + "@platforma-open/milaboratories.runenv-python-3": "catalog:" + }, + "block-software": { + "entrypoints": { + "main": { + "binary": { + "artifact": { + "type": "python", + "registry": "platforma-open", + "environment": "@platforma-open/milaboratories.runenv-python-3:3.12.10", + "dependencies": { + "toolset": "pip", + "requirements": "requirements.txt" + }, + "root": "./src" + }, + "cmd": [ + "python", + "{pkg}/main.py" + ] + } + } + } + } +} diff --git a/software/xlsx-to-csv/src/main.py b/software/xlsx-to-csv/src/main.py new file mode 100644 index 0000000..edfa27c --- /dev/null +++ b/software/xlsx-to-csv/src/main.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +"""Convert the first worksheet of a workbook to CSV. + +A spreadsheet is a UI-boundary format: the platform's pipeline speaks csv/tsv and nothing +anywhere ingests a workbook as a data format. Converting here rather than in the browser means +no JavaScript xlsx dependency, and it means the header list, the identity-uniqueness check and +the import all read the same converted file rather than one of them re-parsing the original. + +Kept deliberately close to immune-assay-data's converter, which is the shipped precedent. +""" + +import argparse +import csv +import sys + +from openpyxl import load_workbook + + +def find_header_row(rows: list) -> int: + """Index of the first row that looks like a header. + + Workbooks routinely open with a title line or a blank one, and a naive read would make that + the header and lose the real one. "More than one non-empty cell" is the same heuristic the + precedent uses. + """ + for i, row in enumerate(rows): + non_empty = sum(1 for cell in row if cell is not None and str(cell).strip()) + if non_empty > 1: + return i + return 0 + + +def xlsx_to_csv(input_file: str, output_file: str) -> None: + wb = load_workbook(input_file, read_only=True, data_only=True) + # First worksheet only. A workbook with the data on a later sheet converts to the wrong + # thing silently, which is worth a picker eventually — the precedent carries the same TODO. + ws = wb[wb.sheetnames[0]] + + rows = list(ws.iter_rows(values_only=True)) + header_idx = find_header_row(rows) + + written = 0 + with open(output_file, "w", newline="") as f: + writer = csv.writer(f) + for row in rows[header_idx:]: + writer.writerow(["" if cell is None else cell for cell in row]) + written += 1 + + wb.close() + print(f"Converted worksheet '{ws.title}' ({written} rows from row {header_idx + 1}) to {output_file}") + + +def main() -> None: + p = argparse.ArgumentParser(description="Convert a workbook's first worksheet to CSV") + p.add_argument("-i", "--input", required=True, help="Input workbook path") + p.add_argument("-o", "--output", required=True, help="Output CSV path") + args = p.parse_args() + + try: + xlsx_to_csv(args.input, args.output) + except Exception as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/software/xlsx-to-csv/src/requirements.txt b/software/xlsx-to-csv/src/requirements.txt new file mode 100644 index 0000000..794cc3d --- /dev/null +++ b/software/xlsx-to-csv/src/requirements.txt @@ -0,0 +1 @@ +openpyxl diff --git a/test/.oxfmtrc.json b/test/.oxfmtrc.json index 7eff5e7..6f74854 100644 --- a/test/.oxfmtrc.json +++ b/test/.oxfmtrc.json @@ -1,4 +1,4 @@ { "extends": ["node_modules/@milaboratories/ts-builder/configs/oxfmt.json"], - "ignorePatterns": ["dist", "coverage", "CHANGELOG.md"] + "ignorePatterns": ["dist", "coverage", "CHANGELOG.md", ".test_auth.json"] } diff --git a/test/assets/bare-heavy-only.tsv b/test/assets/bare-heavy-only.tsv new file mode 100644 index 0000000..cbcda31 --- /dev/null +++ b/test/assets/bare-heavy-only.tsv @@ -0,0 +1,3 @@ +mAb ID VH +AB-101 EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS +AB-102 EVQLVESGGGLVQPGGSLRLSCAASGFTFTDYTMDWVRQAPGKGLEWVADVNPNSGGSIYNQRFKGRFTLSVDRSKNTLYLQMNSLRAEDTAVYYCARNLGPSFYFDYWGQGTLVTVSS diff --git a/test/assets/bare-paired-set-duplicate-id.tsv b/test/assets/bare-paired-set-duplicate-id.tsv new file mode 100644 index 0000000..4e444df --- /dev/null +++ b/test/assets/bare-paired-set-duplicate-id.tsv @@ -0,0 +1,5 @@ +mAb ID VH VL +AB-001 EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK +AB-001 EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS DIQMTQSPSSLSASVGDRVTITCKASQDVSIGVAWYQQKPGKAPKLLIYSASYRYTGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQYYIYPYTFGQGTKVEIK +AB-002 EVQLVESGGGLVQPGGSLRLSCAASGFTFTDYTMDWVRQAPGKGLEWVADVNPNSGGSIYNQRFKGRFTLSVDRSKNTLYLQMNSLRAEDTAVYYCARNLGPSFYFDYWGQGTLVTVSS DIQMTQSPSSLSASVGDRVTITCKASQDVSIGVAWYQQKPGKAPKLLIYSASYRYTGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQYYIYPYTFGQGTKVEIK +AB-002 EVQLVESGGGLVQPGGSLRLSCAASGFTFTDYTMDWVRQAPGKGLEWVADVNPNSGGSIYNQRFKGRFTLSVDRSKNTLYLQMNSLRAEDTAVYYCARNLGPSFYFDYWGQGTLVTVSS DIQMTQSPSSLSASVGDRVTITCKASQDVSIGVAWYQQKPGKAPKLLIYSASYRYTGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQYYIYPYTFGQGTKVEIK diff --git a/test/assets/bare-paired-set.tsv b/test/assets/bare-paired-set.tsv new file mode 100644 index 0000000..737cd4e --- /dev/null +++ b/test/assets/bare-paired-set.tsv @@ -0,0 +1,6 @@ +mAb ID VH VL Affinity (nM) +AB-001 EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK 0.8 +AB-002 EVQLVESGGGLVQPGGSLRLSCAASGFTFTDYTMDWVRQAPGKGLEWVADVNPNSGGSIYNQRFKGRFTLSVDRSKNTLYLQMNSLRAEDTAVYYCARNLGPSFYFDYWGQGTLVTVSS DIQMTQSPSSLSASVGDRVTITCKASQDVSIGVAWYQQKPGKAPKLLIYSASYRYTGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQYYIYPYTFGQGTKVEIK 1.4 +AB-003 EVQLVESGGGLVQPGGSLRLSCAASGYTFTNYGMNWVRQAPGKGLEWVGWINTYTGEPTYAADFKRRFTFSLDTSKSTAYLQMNSLRAEDTAVYYCAKYPHYYGSSHWYFDVWGQGTLVTVSS 12.0 +AB-004 AAAAAAAAAAAAAAA DIQMTQSPSSLSASVGDRVTITCSASQDISNYLNWYQQKPGKAPKVLIYFTSSLHSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQYSTVPWTFGQGTKVEIK 3.1 +AB-005 EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK 0.9 diff --git a/test/assets/bare-paired-set.xlsx b/test/assets/bare-paired-set.xlsx new file mode 100644 index 0000000..27ca89e Binary files /dev/null and b/test/assets/bare-paired-set.xlsx differ diff --git a/test/assets/bare-tcrab-set.tsv b/test/assets/bare-tcrab-set.tsv new file mode 100644 index 0000000..9dbc8b2 --- /dev/null +++ b/test/assets/bare-tcrab-set.tsv @@ -0,0 +1,5 @@ +TCR ID PDB beta alpha +A6-1AO7 1AO7 NAGVTQTPKFQVLKTGQSMTLQCAQDMNHEYMSWYRQDPGMGLRLIHYSVGAGITDQGEVPNGYNVSRSTTEDFPLRLLSAAPSQTSVYFCASRPGLAGGRPEQYFGPGTRLTVTEDLKNVFPPEVAVFEPSEAEISHTQKATLVCLATGFYPDHVELSWWVNGKEVHSGVSTDPQPLKEQPALNDSRYALSSRLRVSATFWQNPRNHFRCQVQFYGLSENDEWTQDRAKPVTQIVSAEAWGRAD KEVEQNSGPLSVPEGAIASLNCTYSDRGSQSFFWYRQYSGKSPELIMSIYSNGDKEDGRFTAQLNKASQYVSLLIRDSQPSDSATYLCAVTTDSWGKLQFGAGTQVVVTPDIQNPDPAVYQLRDSKSSDKSVCLFTDFDSQTNVSQSKDSDVYITDKTVLDMRSMDFKSNSAVAWSNKSDFACANAFNNSIIPEDTFFPSPESS +1G4-2BNR 2BNR GVTQTPKFQVLKTGQSMTLQCAQDMNHEYMSWYRQDPGMGLRLIHYSVGAGITDQGEVPNGYNVSRSTTEDFPLRLLSAAPSQTSVYFCASSYVGNTGELFFGEGSRLTVLEDLKNVFPPEVAVFEPSEAEISHTQKATLVCLATGFYPDHVELSWWVNGKEVHSGVCTDPQPLKEQPALNDSRYALSSRLRVSATFWQDPRNHFRCQVQFYGLSENDEWTQDRAKPVTQIVSAEAWGRAD QEVTQIPAALSVPEGENLVLNCSFTDSAIYNLQWFRQDPGKGLTSLLLIQSSQREQTSGRLNASLDKSSGRSTLYIAASQPGDSATYLCAVRPTSGGSYIPTFGRGTSLIVHPYIQNPDPAVYQLRDSKSSDKSVCLFTDFDSQTNVSQSKDSDVYITDKCVLDMRSMDFKSNSAVAWSNKSDFACANAFNNSIIPEDTFFPS +DMF5-3QDG 3QDG IAGITQAPTSQILAAGRRMTLRCTQDMRHNAMYWYRQDLGLGLRLIHYSNTAGTTGKGEVPDGYSVSRANTDDFPLTLASAVPSQTSVYFCASSLSFGTEAFFGQGTRLTVVEDLNKVFPPEVAVFEPSEAEISHTQKATLVCLATGFYPDHVELSWWVNGKEVHSGVCTDPQPLKEQPALNDSRYALSSRLRVSATFWQDPRNHFRCQVQFYGLSENDEWTQDRAKPVTQIVSAEAWGRAD KEVEQNSGPLSVPEGAIASLNCTYSDRGSQSFFWYRQYSGKSPELIMFIYSNGDKEDGRFTAQLNKASQYVSLLIRDSQPSDSATYLCAVNFGGGKLIFGQGTELSVKPNIQNPDPAVYQLRDSKSSDKSVCLFTDFDSQTNVSQSKDSDVYITDKCVLDMRSMDFKSNSAVAWSNKSDFACANAFNNSIIPEDTFFPS +JM22-1OGA 1OGA MVDGGITQSPKYLFRKEGQNVTLSCEQNLNHDAMYWYRQDPGQGLRLIYYSQIVNDFQKGDIAEGYSVSREKKESFPLTVTSAQKNPTAFYLCASSSRSSYEQYFGPGTRLTVTEDLKNVFPPEVAVFEPSEAEISHTQKATLVCLATGFYPDHVELSWWVNGKEVHSGVSTDPQPLKEQPALNDSRYSLSSRLRVSATFWQNPRNHFRCQVQFYGLSENDEWTQDRAKPVTQIVSAEAWGRADQDRGGGCD MQLLEQSPQFLSIQEGENLTVYCNSSSVFSSLQWYRQEPGEGPVLLVTVVTGGEVKKLKRLTFQFGDARKDSSLHITAAQPGDTGLYLCAGAGSQGNLIFGKGTKLSVKPNIQNPDPAVYQLRDSKSSDKSVCLFTDFDSQTNVSQSKDSDVYITDKTVLDMRSMDFKSNSAVAWSNKSDFACANAFNNSIIPEDTFFPSPENDGGGCKHHHHHH diff --git a/test/package.json b/test/package.json index 85730ef..db56528 100644 --- a/test/package.json +++ b/test/package.json @@ -17,6 +17,10 @@ "devDependencies": { "@milaboratories/ts-builder": "catalog:", "@milaboratories/ts-configs": "catalog:", + "@platforma-open/milaboratories.import-vdj.model": "workspace:*", + "@platforma-open/milaboratories.samples-and-data": "catalog:", + "@platforma-open/milaboratories.sequence-properties": "catalog:", + "@platforma-sdk/model": "catalog:", "@platforma-sdk/test": "catalog:", "vitest": "catalog:" }, diff --git a/test/src/model.test.ts b/test/src/model.test.ts new file mode 100644 index 0000000..8511cae --- /dev/null +++ b/test/src/model.test.ts @@ -0,0 +1,95 @@ +/* + Unit tests for the two pure functions the V3 migration turns on: the legacy upgrade that + reads a project saved under V1, and the args projection that replaces `argsValid`. + + These are here rather than in an integration test because neither is reachable from one. The + integration suite creates fresh projects, so it exercises `.init()` and never + `.upgradeLegacy()`; and a V1 project cannot be built against a V3 block to drive the upgrade, + because `setBlockArgs` refuses a modelAPIVersion 2 block. The field mapping is exactly the + part of a migration that goes wrong silently — a missed field reads as a setting the + scientist "lost" when they reopen an old project. +*/ + +import { upgradeLegacyData } from "@platforma-open/milaboratories.import-vdj.model"; +import type { PlRef } from "@platforma-sdk/model"; +import { describe, expect, test } from "vitest"; + +const ref = { __isRef: true, blockId: "b1", name: "out" } as unknown as PlRef; + +describe("upgradeLegacyData", () => { + test("carries every V1 args field across", () => { + const data = upgradeLegacyData({ + args: { + defaultBlockLabel: "my import", + customBlockLabel: "renamed", + datasetRef: ref, + format: "custom", + chains: ["IGHeavy"], + customMapping: { "cdr3-aa": "CDR3" }, + primaryCountType: "umi", + secondaryCountType: "read", + bareSet: { + identity: "id", + chainSelection: "IGHeavy", + sequences: { IGHeavy: "VH" }, + scheme: "kabat", + }, + }, + uiState: { settingsOpen: false, mixcrColumnsPresent: true }, + }); + + expect(data.defaultBlockLabel).toBe("my import"); + expect(data.customBlockLabel).toBe("renamed"); + expect(data.datasetRef).toBe(ref); + expect(data.format).toBe("custom"); + expect(data.chains).toEqual(["IGHeavy"]); + expect(data.customMapping).toEqual({ "cdr3-aa": "CDR3" }); + expect(data.primaryCountType).toBe("umi"); + expect(data.secondaryCountType).toBe("read"); + expect(data.bareSet?.scheme).toBe("kabat"); + + // uiState survives too, including a flag the defaults set the other way. + expect(data.settingsOpen).toBe(false); + expect(data.mixcrColumnsPresent).toBe(true); + }); + + test("fills view state a project saved before a flag existed has no value for", () => { + const data = upgradeLegacyData({ args: { format: "qiagen" }, uiState: {} }); + + // Every flag present and false rather than undefined: an undefined boolean reaching the + // args projection would read as "columns not present" by accident rather than by rule. + expect(data.qiagenColumnsPresent).toBe(false); + expect(data.immunoSeqColumnsPresent).toBe(false); + expect(data.mixcrColumnsPresent).toBe(false); + expect(data.crColumnsPresent).toBe(false); + expect(data.airrColumnsPresent).toBe(false); + expect(data.tableState).toBeDefined(); + expect(data.chains.length).toBe(6); + }); + + test("carries a fileSource across without a door flag", () => { + // V1 stored which door the panel showed. It is gone: the panel derives that from whether a + // file is loaded, so a stored flag could only disagree with the data. + const data = upgradeLegacyData({ + args: { + fileSource: { + handle: "index://x" as never, + sampleId: "S1", + label: "panel", + extension: "tsv", + }, + }, + uiState: {}, + }); + + expect(data.fileSource?.label).toBe("panel"); + expect("loadFromFile" in data).toBe(false); + }); + + test("survives a project with neither bucket populated", () => { + const data = upgradeLegacyData({}); + expect(data.chains.length).toBe(6); + expect(data.customBlockLabel).toBe(""); + expect(data.datasetRef).toBeUndefined(); + }); +}); diff --git a/test/src/wf.test.ts b/test/src/wf.test.ts new file mode 100644 index 0000000..61fa2b2 --- /dev/null +++ b/test/src/wf.test.ts @@ -0,0 +1,795 @@ +/* + End-to-end test of the bare-set import path. + + Builds a real project — Samples & Data -> this block — and asserts the things only an + integration run can reach: that a wide row carrying two chains becomes ONE record, that the + key comes from the identity column rather than the sequences, and that ANARCI actually runs + inside the import and lands its regions on the emitted columns. + + The fixture is five hand-authored rows of published INN reference sequences, not the + customer panel the acceptance run is measured on. It carries the four cases that matter: + a fully annotatable pair, a heavy-only row, a row whose "sequence" cannot be numbered, and + — the important one — two rows with IDENTICAL sequences under different names, which must + stay two records. That last case is the whole reason the key is the identity's hash: on the + real panel a sequence-derived key merges 119 of 1,243 antibodies. +*/ + +import { SamplesAndDataBlockPointer } from "@platforma-open/milaboratories.samples-and-data"; +import { blockSpec as sequencePropertiesSpec } from "@platforma-open/milaboratories.sequence-properties"; +import type { PTableHandle } from "@platforma-sdk/model"; +import { createPlDataTableStateV2, uniquePlId } from "@platforma-sdk/model"; +import { awaitStableState, blockTest } from "@platforma-sdk/test"; +import { ImportVdjBlockPointer } from "this-block"; + +/** + * A complete `BlockData` from the fields a test actually cares about. + * + * `update-block-data` replaces the whole data object rather than merging, so every view-state + * field has to be present or the model reads undefined where it expects a default — most + * visibly `tableState`, which the stats table is built from. + */ +function blockData(fields: Record): Record { + return { + defaultBlockLabel: "", + customBlockLabel: "", + chains: [], + tableState: createPlDataTableStateV2(), + settingsOpen: true, + qiagenColumnsPresent: false, + immunoSeqColumnsPresent: false, + mixcrColumnsPresent: false, + crColumnsPresent: false, + airrColumnsPresent: false, + ...fields, + }; +} + +const SCHEME = "imgt"; + +blockTest( + "imports a bare paired set as one record per row, annotated", + { timeout: 600000 }, + async ({ rawPrj: project, helpers, expect }) => { + // --- Samples & Data: one TSV, one sample -------------------------------------------- + const sndBlockId = await project.addBlock("Samples & Data", SamplesAndDataBlockPointer); + const sampleId = uniquePlId(); + const datasetId = uniquePlId(); + const fileHandle = await helpers.getLocalFileHandle("./assets/bare-paired-set.tsv"); + + // Samples & Data is V3 (modelAPIVersion 2), so it is driven through block data rather + // than setBlockArgs, which hardcodes version 1 and throws. + await project.mutateBlockStorage(sndBlockId, { + operation: "update-block-data", + value: { + suggestedImport: false, + h5adFilesToPreprocess: [], + seuratFilesToPreprocess: [], + metadata: [], + sampleIds: [sampleId], + sampleLabelColumnLabel: "Sample Name", + sampleLabels: { [sampleId]: "bare-paired-set" }, + datasets: [ + { + id: datasetId, + label: "Bare paired set", + content: { type: "Xsv", xsvType: "tsv", data: { [sampleId]: fileHandle } }, + }, + ], + }, + }); + + await project.runBlock(sndBlockId); + await helpers.awaitBlockDoneAndGetStableBlockState(sndBlockId, 200000); + + // --- this block ----------------------------------------------------------------------- + const blockId = await project.addBlock("Import V(D)J Data", ImportVdjBlockPointer); + + const beforePick = (await awaitStableState(project.getBlockState(blockId), 100000)) as { + outputs?: Record; + }; + // Outputs arrive wrapped as { ok, value, stable }, not bare. + const rawOptions = beforePick.outputs?.datasetOptions as + | { value?: { ref: unknown }[] } + | { ref: unknown }[] + | undefined; + const datasetOptions = (Array.isArray(rawOptions) ? rawOptions : (rawOptions?.value ?? [])) as { + ref: unknown; + }[]; + expect(datasetOptions.length).toBeGreaterThan(0); + + await project.mutateBlockStorage(blockId, { + operation: "update-block-data", + value: blockData({ + defaultBlockLabel: "bare-paired-set", + customBlockLabel: "", + datasetRef: datasetOptions[0].ref, + format: "custom", + chains: ["IGHeavy", "IGLight"], + bareSet: { + identity: "mAb ID", + chainSelection: "IG", + sequences: { IGHeavy: "VH", IGLight: "VL" }, + scheme: SCHEME, + // A column the canonical vocabulary never anticipated — offered, not dropped. + // The UI attaches the type the profile detected; this is what it would write. + properties: [{ header: "Affinity (nM)", valueType: "Double" }], + }, + }), + }); + + await project.runBlock(blockId); + await helpers.awaitBlockDoneAndGetStableBlockState(blockId, 600000); + + const state = (await awaitStableState(project.getBlockState(blockId), 100000)) as { + outputs?: Record; + }; + + type Emitted = { + name: string; + valueType: string; + domain: Record; + annotations: Record; + axes: { name: string; domain: Record }[]; + }; + const wrapped = state.outputs?.importedColumns as { value?: Emitted[] } | Emitted[] | undefined; + const columns = (Array.isArray(wrapped) ? wrapped : (wrapped?.value ?? [])) as Emitted[]; + expect(columns.length).toBeGreaterThan(0); + + const seq = (chain: string, feature: string) => + columns.find( + (c) => + c.name === "pl7.app/vdj/sequence" && + c.domain["pl7.app/vdj/feature"] === feature && + c.domain["pl7.app/vdj/scClonotypeChain"] === chain, + ); + + // The shape, and the reason downstream blocks can read this set unchanged. Consumers match + // axes positionally: a selector naming one axis is compared against the candidate column's + // axis 0. A property column carrying the sample axis first is invisible to them, and the + // failure surfaces there as "no sequence columns found" rather than here. So abundance is + // the ONLY column keeping the sample axis — it is a presence marker, one per sample — and + // everything else is a property of the record, on the record axis alone. Same split MiXCR + // makes. One frame, not one per chain. + for (const c of columns) { + if (c.name === "pl7.app/vdj/uniqueMoleculeCount") { + expect(c.axes.map((a) => a.name)).toEqual(["pl7.app/sampleId", "pl7.app/variantKey"]); + continue; + } + expect(c.axes.map((a) => a.name)).toEqual(["pl7.app/variantKey"]); + } + + // The label needs that shape for a second reason of its own: a pl7.app/label column only + // acts as an axis's label when it sits on that axis ALONE. Carrying the sample axis it is + // merely a per-record property, and the axis goes on showing the opaque hash. + const label = columns.find((c) => c.name === "pl7.app/label"); + expect(label).toBeDefined(); + expect(label!.axes.map((a) => a.name)).toEqual(["pl7.app/variantKey"]); + + // Modality rides on the run-id key, never on the axis name. Stamping another modality's + // key would not mislabel the dataset, it would make it that modality to every reader. + const keyAxis = columns[0].axes[1]; + expect(keyAxis.domain["pl7.app/vdj/clonotypingRunId"]).toBeTruthy(); + expect(keyAxis.domain["pl7.app/vdj/receptor"]).toBe("IG"); + expect(keyAxis.domain["pl7.app/peptide/extractionRunId"]).toBeUndefined(); + expect(keyAxis.domain["pl7.app/repertoire/extractionRunId"]).toBeUndefined(); + expect(keyAxis.domain["pl7.app/vdj/scClonotypeKey/structure"]).toBeUndefined(); + + // The amino-acid variable domain per chain, carrying the annotations Lead Selection needs. + for (const chain of ["A", "B"]) { + const main = seq(chain, "VDJRegionInFrame"); + expect(main, `main sequence for chain ${chain}`).toBeDefined(); + expect(main!.domain["pl7.app/vdj/scClonotypeChain/index"]).toBe("primary"); + expect(main!.annotations["pl7.app/vdj/isMainSequence"]).toBe("true"); + expect(main!.annotations["pl7.app/vdj/isAssemblingFeature"]).toBe("true"); + // A whole variable domain has no located boundary, so it carries no convention. + expect(main!.domain["pl7.app/vdj/numberingSchema"]).toBeUndefined(); + } + + // Seven regions per chain, fourteen in all — FR4 included, which is the one every region + // list in the workspace has historically been missing. + for (const chain of ["A", "B"]) { + for (const region of ["FR1", "CDR1", "CDR2", "FR2", "FR3", "FR4", "CDR3"]) { + const col = seq(chain, region); + expect(col, `${chain} ${region}`).toBeDefined(); + // Emitted twice: the domain copy buys distinct identity, the annotation copy is what + // Sequence Liabilities reads to choose its coordinate map. + expect(col!.domain["pl7.app/vdj/numberingSchema"]).toBe(SCHEME); + expect(col!.annotations["pl7.app/vdj/numberingSchema"]).toBe(SCHEME); + } + } + + // One status per chain, a closed three-member enum. + for (const chain of ["A", "B"]) { + const status = columns.find( + (c) => + c.name === "pl7.app/vdj/regionAnnotationStatus" && + c.domain["pl7.app/vdj/scClonotypeChain"] === chain, + ); + expect(status, `status for chain ${chain}`).toBeDefined(); + expect(status!.annotations["pl7.app/discreteValues"]).toBe( + '["Annotated","Not applicable","Failed"]', + ); + } + + // The synthetic abundance is the block's own umi-count spec adopted whole: exactly the + // triple Clustering's bundle queries, plus the anchor that makes the dataset selectable. + // The unit and the "Number of UMIs" label ride along with the adopted spec — the + // fabrication is confined to the value, not to what the value is called. + const presence = columns.find((c) => c.name === "pl7.app/vdj/uniqueMoleculeCount"); + expect(presence).toBeDefined(); + expect(presence!.valueType).toBe("Long"); + expect(presence!.annotations["pl7.app/isAbundance"]).toBe("true"); + expect(presence!.annotations["pl7.app/abundance/normalized"]).toBe("false"); + expect(presence!.annotations["pl7.app/abundance/isPrimary"]).toBe("true"); + expect(presence!.annotations["pl7.app/isAnchor"]).toBe("true"); + expect(presence!.annotations["pl7.app/abundance/unit"]).toBe("molecules"); + expect(presence!.annotations["pl7.app/label"]).toBe("Number of UMIs"); + + // Exactly one column may claim the anchor and the primary abundance. + expect(columns.filter((c) => c.annotations["pl7.app/isAnchor"] === "true")).toHaveLength(1); + + // A count of how often a record repeats is never presented as an abundance. + expect(columns.find((c) => c.name === "pl7.app/vdj/sampleCount")).toBeUndefined(); + + // A non-sequence column the scientist accepted: name sanitized, label the raw header, + // no domain key. + const affinity = columns.find((c) => c.name.startsWith("pl7.app/vdj/importedProperty/")); + expect(affinity).toBeDefined(); + expect(affinity!.name).toBe("pl7.app/vdj/importedProperty/Affinity_nM_"); + expect(affinity!.annotations["pl7.app/label"]).toBe("Affinity (nM)"); + // The detected type reaches the emitted column. The panel asks no type question — prerun + // profiles every row and the UI records the answer when the column is accepted. + expect(affinity!.valueType).toBe("Double"); + expect(Object.keys(affinity!.domain)).toHaveLength(0); + }, +); + +blockTest( + "refuses to start when the identity column repeats on rows that differ", + { timeout: 400000 }, + async ({ rawPrj: project, helpers, expect }) => { + // AB-001 appears twice with different light chains — a genuine conflict, because the key is + // the identity's hash and the two would merge. AB-002 also appears twice but the rows are + // identical, which states the same record twice and is not a conflict. + const sndBlockId = await project.addBlock("Samples & Data", SamplesAndDataBlockPointer); + const sampleId = uniquePlId(); + const datasetId = uniquePlId(); + const fileHandle = await helpers.getLocalFileHandle( + "./assets/bare-paired-set-duplicate-id.tsv", + ); + + await project.mutateBlockStorage(sndBlockId, { + operation: "update-block-data", + value: { + suggestedImport: false, + h5adFilesToPreprocess: [], + seuratFilesToPreprocess: [], + metadata: [], + sampleIds: [sampleId], + sampleLabelColumnLabel: "Sample Name", + sampleLabels: { [sampleId]: "duplicate-id" }, + datasets: [ + { + id: datasetId, + label: "Duplicate identity", + content: { type: "Xsv", xsvType: "tsv", data: { [sampleId]: fileHandle } }, + }, + ], + }, + }); + await project.runBlock(sndBlockId); + await helpers.awaitBlockDoneAndGetStableBlockState(sndBlockId, 200000); + + const blockId = await project.addBlock("Import V(D)J Data", ImportVdjBlockPointer); + const beforePick = (await awaitStableState(project.getBlockState(blockId), 100000)) as { + outputs?: Record; + }; + const rawOptions = beforePick.outputs?.datasetOptions as + | { value?: { ref: unknown }[] } + | { ref: unknown }[] + | undefined; + const datasetOptions = (Array.isArray(rawOptions) ? rawOptions : (rawOptions?.value ?? [])) as { + ref: unknown; + }[]; + expect(datasetOptions.length).toBeGreaterThan(0); + + await project.mutateBlockStorage(blockId, { + operation: "update-block-data", + value: blockData({ + defaultBlockLabel: "duplicate-id", + customBlockLabel: "", + datasetRef: datasetOptions[0].ref, + format: "custom", + chains: ["IGHeavy", "IGLight"], + bareSet: { + identity: "mAb ID", + chainSelection: "IG", + sequences: { IGHeavy: "VH", IGLight: "VL" }, + scheme: SCHEME, + }, + }), + }); + + const state = (await awaitStableState(project.getBlockState(blockId), 300000)) as { + outputs?: Record; + inputsValid?: boolean; + canRun?: boolean; + }; + + const wrapped = state.outputs?.identityCollisions as + | { value?: string[] } + | string[] + | undefined; + const collisions = (Array.isArray(wrapped) ? wrapped : (wrapped?.value ?? [])) as string[]; + + // The differing pair is reported, so the scientist is told which value to fix. + expect(collisions).toContain("AB-001"); + // The identical pair is not: repeating a record verbatim discards nothing. + expect(collisions).not.toContain("AB-002"); + + // GAP, verified here rather than assumed: `argsValid` disables Run in the interface, but + // the platform does not enforce it — `project.runBlock` resolves happily on an invalid + // block. So "the run does not start" holds for a scientist clicking Run and not for an API + // caller, and a colliding set driven through the API would still import and merge records. + // Closing that needs a workflow-side refusal, which is data-dependent and therefore a + // separate awaiting template. + await expect(project.runBlock(blockId)).resolves.toBeUndefined(); + }, +); + +blockTest( + "imports a heavy-only set, where ANARCI produces just one bucket", + { timeout: 600000 }, + async ({ rawPrj: project, helpers, expect }) => { + // The case that used to fail: with no light chains, ANARCI writes no `_KL.csv`, and the + // step cannot save a file the run never wrote. The FASTA now carries one reference domain + // per bucket so both always exist. + const sndBlockId = await project.addBlock("Samples & Data", SamplesAndDataBlockPointer); + const sampleId = uniquePlId(); + const datasetId = uniquePlId(); + const fileHandle = await helpers.getLocalFileHandle("./assets/bare-heavy-only.tsv"); + + await project.mutateBlockStorage(sndBlockId, { + operation: "update-block-data", + value: { + suggestedImport: false, + h5adFilesToPreprocess: [], + seuratFilesToPreprocess: [], + metadata: [], + sampleIds: [sampleId], + sampleLabelColumnLabel: "Sample Name", + sampleLabels: { [sampleId]: "heavy-only" }, + datasets: [ + { + id: datasetId, + label: "Heavy only", + content: { type: "Xsv", xsvType: "tsv", data: { [sampleId]: fileHandle } }, + }, + ], + }, + }); + await project.runBlock(sndBlockId); + await helpers.awaitBlockDoneAndGetStableBlockState(sndBlockId, 200000); + + const blockId = await project.addBlock("Import V(D)J Data", ImportVdjBlockPointer); + const beforePick = (await awaitStableState(project.getBlockState(blockId), 100000)) as { + outputs?: Record; + }; + const rawOptions = beforePick.outputs?.datasetOptions as + | { value?: { ref: unknown }[] } + | { ref: unknown }[] + | undefined; + const datasetOptions = (Array.isArray(rawOptions) ? rawOptions : (rawOptions?.value ?? [])) as { + ref: unknown; + }[]; + + await project.mutateBlockStorage(blockId, { + operation: "update-block-data", + value: blockData({ + defaultBlockLabel: "heavy-only", + customBlockLabel: "", + datasetRef: datasetOptions[0].ref, + format: "custom", + chains: ["IGHeavy"], + bareSet: { + identity: "mAb ID", + chainSelection: "IGHeavy", + sequences: { IGHeavy: "VH" }, + scheme: SCHEME, + }, + }), + }); + + await project.runBlock(blockId); + await helpers.awaitBlockDoneAndGetStableBlockState(blockId, 600000); + + const state = (await awaitStableState(project.getBlockState(blockId), 100000)) as { + outputs?: Record; + }; + const wrapped = state.outputs?.importedColumns as + | { + value?: { + name: string; + domain: Record; + annotations: Record; + }[]; + } + | undefined; + const columns = wrapped?.value ?? []; + expect(columns.length).toBeGreaterThan(0); + + // One mapped chain is a bulk shape, so no column carries pl7.app/vdj/scClonotypeChain at all. + // That key is how clonotype-clustering and antibody-sequence-liabilities recognise a dataset + // holding paired chains in one frame; stamping it here would make both treat this as paired. + expect( + columns.filter((c) => c.domain["pl7.app/vdj/scClonotypeChain"] !== undefined), + ).toHaveLength(0); + + // Seven regions plus the variable domain itself, and nothing invented for the chain the file + // never had. + const sequences = columns.filter((c) => c.name === "pl7.app/vdj/sequence"); + expect(sequences).toHaveLength(8); + + // The chain is still named for the reader, on the labels. + expect( + sequences.filter((c) => (c.annotations["pl7.app/label"] ?? "").startsWith("Heavy ")), + ).toHaveLength(8); + + // And the padding references never became records of their own. + expect(columns.find((c) => c.name === "pl7.app/vdj/uniqueMoleculeCount")).toBeDefined(); + }, +); + +blockTest( + "imports a file through the direct door, minting the sample itself", + { timeout: 600000 }, + async ({ rawPrj: project, helpers, expect, ml }) => { + // No Samples & Data at all. The block takes the file, mints pl7.app/sampleId for it and + // labels it with the filename stem, so the emitted shape is the same as through the pool. + const blockId = await project.addBlock("Import V(D)J Data", ImportVdjBlockPointer); + const handle = await helpers.getLocalFileHandle("./assets/bare-paired-set.tsv"); + + await project.mutateBlockStorage(blockId, { + operation: "update-block-data", + value: blockData({ + defaultBlockLabel: "direct", + customBlockLabel: "", + format: "custom", + chains: ["IGHeavy", "IGLight"], + fileSource: { + handle, + sampleId: "SDIRECT000000000000000001", + label: "bare-paired-set", + extension: "tsv", + }, + bareSet: { + identity: "mAb ID", + chainSelection: "IG", + sequences: { IGHeavy: "VH", IGLight: "VL" }, + scheme: SCHEME, + }, + }), + }); + + await project.runBlock(blockId); + await helpers.awaitBlockDoneAndGetStableBlockState(blockId, 600000); + + const state = (await awaitStableState(project.getBlockState(blockId), 100000)) as { + outputs?: Record; + }; + const wrapped = state.outputs?.importedColumns as + | { value?: { name: string; axes: { name: string }[] }[] } + | undefined; + const columns = wrapped?.value ?? []; + expect(columns.length).toBeGreaterThan(0); + + // The chain dropdowns offer only columns whose sampled values read as variable domains. + // The fixture's headers are "mAb ID", "VH", "VL", "Affinity (nM)" — a header alone cannot + // tell which two are sequences, so the workflow samples rows and reads the alphabet. Get + // this wrong and an antibody's name can be mapped into a sequence slot: it imports + // cleanly and every record comes back Failed after ANARCI declines to number it. + const aminoAcid = (state.outputs?.aminoAcidColumns as { value?: string[] } | undefined)?.value; + expect(aminoAcid).toEqual(["VH", "VL"]); + + // The file door's own column list, separate from the dataset door's, so neither offers + // columns discovered for the other. + const fileColumns = (state.outputs?.fileColumns as { value?: string[] } | undefined)?.value; + expect(fileColumns).toEqual(["mAb ID", "VH", "VL", "Affinity (nM)"]); + expect( + (state.outputs?.datasetColumns as { value?: string[] } | undefined)?.value, + ).toBeUndefined(); + + // The same pass types every column, over the whole file rather than a sample. "Affinity (nM)" + // holds 0.8 / 1.4 / 12.0 / 3.1 / 0.9, so it is Double; the identity and the domains are text. + const profile = ( + state.outputs?.columnProfile as { value?: { types: Record } } | undefined + )?.value; + expect(profile?.types).toEqual({ + "mAb ID": "String", + VH: "String", + VL: "String", + "Affinity (nM)": "Double", + }); + + // Indistinguishable from the pool door: same axes, same key, same columns — abundance + // alone on [sampleId, variantKey], every property of the record on the record axis. + for (const c of columns) { + if (c.name === "pl7.app/vdj/uniqueMoleculeCount") { + expect(c.axes.map((a) => a.name)).toEqual(["pl7.app/sampleId", "pl7.app/variantKey"]); + continue; + } + expect(c.axes.map((a) => a.name)).toEqual(["pl7.app/variantKey"]); + } + expect(columns.find((c) => c.name === "pl7.app/vdj/uniqueMoleculeCount")).toBeDefined(); + expect(columns.filter((c) => c.name === "pl7.app/vdj/regionAnnotationStatus")).toHaveLength(2); + + // A sort saved against a column the current run does not emit must not take the stats + // output down with it. createPlDataTableV2 throws on the stale reference — the block sees + // a failed output where a display preference should simply be ignored, and the scientist + // has no way to clear it from the UI. Reachable whenever the emitted column set changes + // under a saved sort, which is how the per-chain stats columns broke when the chain became + // an axis. The table state is view state, so writing it neither invalidates the run nor + // discards what was already imported. + await project.mutateBlockStorage(blockId, { + operation: "update-block-data", + value: blockData({ + defaultBlockLabel: "direct", + customBlockLabel: "", + format: "custom", + chains: ["IGHeavy", "IGLight"], + tableState: { + ...createPlDataTableStateV2(), + pTableParams: { + ...createPlDataTableStateV2().pTableParams, + sorting: [ + { + // The real id a project carries after the stats columns stopped being named per + // chain. It parses as a canonical column id and resolves to nothing, which is + // the case that must be tolerated. A malformed id is a different matter: V3 + // throws on one, and no gesture in the interface can produce it. + column: { + type: "column", + id: '{"name":"regionStatsIGHeavy-notApplicable","resolvePath":["main","stats"]}', + }, + ascending: true, + naAndAbsentAreLeastValues: true, + }, + ], + }, + }, + fileSource: { + handle, + sampleId: "SDIRECT000000000000000001", + label: "bare-paired-set", + extension: "tsv", + }, + bareSet: { + identity: "mAb ID", + chainSelection: "IG", + sequences: { IGHeavy: "VH", IGLight: "VL" }, + scheme: SCHEME, + }, + }), + }); + + const withStaleSort = (await awaitStableState(project.getBlockState(blockId), 100000)) as { + outputs?: Record; + }; + // One row per mapped chain, which is what the chain axis is for — before it existed the + // counts were per-chain columns on a single row. Measured through the driver rather than + // asserted on the model, because the model only carries handles and a table that renders + // no rows produces exactly the same ones. + const statsHandle = (state.outputs?.stats as { value?: { fullTableHandle?: PTableHandle } }) + ?.value?.fullTableHandle; + expect(statsHandle, "statistics table handle").toBeDefined(); + const shape = await ml.driverKit.pFrameDriver.getShape(statsHandle!); + expect(shape.rows, "a row per mapped chain").toBe(2); + const stats = withStaleSort.outputs?.stats as { ok?: boolean; value?: unknown } | undefined; + expect(stats?.ok).toBe(true); + expect(stats?.value).toBeDefined(); + }, +); + +// Runs against the PUBLISHED sequence-properties, deliberately. The bare set carries MiXCR's +// axis split precisely so that consumers need no change to read it, and a test against a local +// checkout could not tell the difference between that being true and a fix sitting unmerged +// next door. +blockTest( + "a bare set reaches and runs Sequence Properties", + { timeout: 900000 }, + async ({ rawPrj: project, helpers, expect }) => { + // The first real consumer. Sequence Properties has an `antibody_tcr_universal` branch that + // reads a variantKey axis carrying pl7.app/vdj/clonotypingRunId — the shape this block now + // emits — but no producer in the workspace has ever reached it and its own test suite is + // entirely `it.todo`, so the branch has never executed. This is its first execution. + const blockId = await project.addBlock("Import V(D)J Data", ImportVdjBlockPointer); + const handle = await helpers.getLocalFileHandle("./assets/bare-paired-set.tsv"); + + await project.mutateBlockStorage(blockId, { + operation: "update-block-data", + value: blockData({ + defaultBlockLabel: "chain", + customBlockLabel: "", + format: "custom", + chains: ["IGHeavy", "IGLight"], + fileSource: { + handle, + sampleId: "SCHAIN0000000000000000001", + label: "bare-paired-set", + extension: "tsv", + }, + bareSet: { + identity: "mAb ID", + chainSelection: "IG", + sequences: { IGHeavy: "VH", IGLight: "VL" }, + scheme: SCHEME, + }, + }), + }); + await project.runBlock(blockId); + await helpers.awaitBlockDoneAndGetStableBlockState(blockId, 600000); + + const propsId = await project.addBlock("Sequence Properties", sequencePropertiesSpec); + const propsState = (await awaitStableState(project.getBlockState(propsId), 200000)) as { + outputs?: Record; + }; + const options = + propsState.outputs?.inputOptions?.value ?? propsState.outputs?.inputOptions ?? []; + + // Reachability is its own condition: an analysis willing to run can simply never be + // offered the data, and no availability rule catches that. + expect(options.length).toBeGreaterThan(0); + + await project.mutateBlockStorage(propsId, { + operation: "update-block-data", + value: { inputAnchor: options[0].ref, customBlockLabel: "", title: "" }, + }); + await project.runBlock(propsId); + await helpers.awaitBlockDoneAndGetStableBlockState(propsId, 900000); + + const done = (await awaitStableState(project.getBlockState(propsId), 200000)) as { + outputs?: Record; + }; + const cols = done.outputs?.propertiesPfCols?.value ?? done.outputs?.propertiesPfCols ?? []; + console.log("sequence-properties emitted", cols.length, "columns"); + expect(cols.length).toBeGreaterThan(0); + }, +); + +// The only test that runs a non-antibody receptor end to end. Everything else about TCR support +// was established by reading — ANARCI's HMM library, its per-chain-type CSV naming, IMGT's +// chain-independence — and reading is not running: until this passed, "TCR works" rested on the +// claim that a _B.csv would appear and our range tables would fit it. +// +// The fixture is four published human αβ TCRs pulled from RCSB PDB — A6 (1AO7), 1G4 (2BNR), +// DMF5 (3QDG) and JM22 (1OGA) — as whole ectodomain chains, constant regions included, because +// that is the shape a real export has. ANARCI locates the variable domain within them. +blockTest( + "imports a TCR-alpha/beta set, numbered under IMGT", + { timeout: 600000 }, + async ({ rawPrj: project, helpers, expect }) => { + const blockId = await project.addBlock("Import V(D)J Data", ImportVdjBlockPointer); + const handle = await helpers.getLocalFileHandle("./assets/bare-tcrab-set.tsv"); + + await project.mutateBlockStorage(blockId, { + operation: "update-block-data", + value: blockData({ + format: "custom", + fileSource: { + handle, + sampleId: "STCR00000000000000000001", + label: "bare-tcrab-set", + extension: "tsv", + }, + bareSet: { + identity: "TCR ID", + chainSelection: "TCRAB", + // Beta is slot A — the more diverse chain, per MiXCR's rule. + sequences: { TCRBeta: "beta", TCRAlpha: "alpha" }, + scheme: "imgt", + }, + }), + }); + + await project.runBlock(blockId); + await helpers.awaitBlockDoneAndGetStableBlockState(blockId, 600000); + + const state = (await awaitStableState(project.getBlockState(blockId), 100000)) as { + outputs?: Record; + }; + const columns = + ( + state.outputs?.importedColumns as + | { + value?: { + name: string; + domain: Record; + annotations: Record; + }[]; + } + | undefined + )?.value ?? []; + expect(columns.length).toBeGreaterThan(0); + + // Both chains emitted, beta in slot A and alpha in slot B. + const sequences = columns.filter((c) => c.name === "pl7.app/vdj/sequence"); + const slotA = sequences.filter((c) => c.domain["pl7.app/vdj/scClonotypeChain"] === "A"); + const slotB = sequences.filter((c) => c.domain["pl7.app/vdj/scClonotypeChain"] === "B"); + expect(slotA).toHaveLength(8); + expect(slotB).toHaveLength(8); + expect(slotA.every((c) => (c.annotations["pl7.app/label"] ?? "").startsWith("Beta "))).toBe( + true, + ); + expect(slotB.every((c) => (c.annotations["pl7.app/label"] ?? "").startsWith("Alpha "))).toBe( + true, + ); + + // The axis says which receptor, and every region column records IMGT. + const abundance = columns.find((c) => c.name === "pl7.app/vdj/uniqueMoleculeCount"); + expect(abundance).toBeDefined(); + const regions = sequences.filter((c) => c.domain["pl7.app/vdj/numberingSchema"] !== undefined); + expect(regions.length).toBe(14); + expect(regions.every((c) => c.domain["pl7.app/vdj/numberingSchema"] === "imgt")).toBe(true); + + // The regions were located, not merely declared. Without this the test passes on a run where + // ANARCI numbered nothing: the columns would still be here and every status would read + // Failed. Verified against a throwaway project before this assertion existed — all four + // records annotated on both chains, and chainDisagreed 0, meaning beta landed in ANARCI's B + // bucket and alpha in A, which is what the slot assignment claims. + const status = columns.filter((c) => c.name === "pl7.app/vdj/regionAnnotationStatus"); + expect(status).toHaveLength(2); + expect(status.map((c) => c.domain["pl7.app/vdj/scClonotypeChain"]).sort()).toEqual(["A", "B"]); + }, +); + +blockTest( + "imports a workbook, converted before anything reads it", + { timeout: 600000 }, + async ({ rawPrj: project, helpers, expect }) => { + // The same panel as an .xlsx, with a title line above the header — which is what workbooks + // actually look like, and what the converter's header-row heuristic is for. Nothing + // downstream of the conversion knows the file was ever a workbook. + const blockId = await project.addBlock("Import V(D)J Data", ImportVdjBlockPointer); + const handle = await helpers.getLocalFileHandle("./assets/bare-paired-set.xlsx"); + + await project.mutateBlockStorage(blockId, { + operation: "update-block-data", + value: blockData({ + defaultBlockLabel: "workbook", + customBlockLabel: "", + format: "custom", + chains: ["IGHeavy", "IGLight"], + fileSource: { + handle, + sampleId: "SXLSX00000000000000000001", + label: "bare-paired-set", + extension: "xlsx", + }, + bareSet: { + identity: "mAb ID", + chainSelection: "IG", + sequences: { IGHeavy: "VH", IGLight: "VL" }, + scheme: SCHEME, + }, + }), + }); + + await project.runBlock(blockId); + await helpers.awaitBlockDoneAndGetStableBlockState(blockId, 600000); + + const state = (await awaitStableState(project.getBlockState(blockId), 100000)) as { + outputs?: Record; + }; + const wrapped = state.outputs?.importedColumns as + | { value?: { name: string; domain: Record }[] } + | undefined; + const columns = wrapped?.value ?? []; + + // Same emitted shape as the tsv of the same panel: the title row was skipped, the real + // header was used, and the mapping resolved against it. + expect(columns.length).toBeGreaterThan(0); + expect(columns.find((c) => c.name === "pl7.app/vdj/uniqueMoleculeCount")).toBeDefined(); + expect(columns.filter((c) => c.name === "pl7.app/vdj/regionAnnotationStatus")).toHaveLength(2); + expect(columns.find((c) => c.name.startsWith("pl7.app/vdj/importedProperty/"))).toBeUndefined(); + }, +); diff --git a/turbo.json b/turbo.json index a0530ea..ffeb950 100644 --- a/turbo.json +++ b/turbo.json @@ -12,13 +12,24 @@ "build": { "dependsOn": ["^build", "check"], "inputs": ["$TURBO_DEFAULT$"], - "env": ["PL_PKG_DEV", "PL_DOCKER_REGISTRY_PUSH_TO"], + "env": [ + "PL_DOCKER_REGISTRY_PUSH_TO", + "PL_PKG_DEV", + "PL_BUILD_CHANNEL", + "PL_BUILD_VARIANT", + "PL_BUILD_LOCATION", + "PL_BUILD_USE_PUBLISHED", + "PL_DEV_DOCKER_PUSH_URL", + "PL_DEV_DOCKER_PULL_URL", + "PL_DEV_BINARY_UPLOAD_URL", + "PL_RELEASE_DOCKER_PUSH_URL", + "PL_RELEASE_DOCKER_PULL_URL", + "PL_RELEASE_BINARY_UPLOAD_URL", + "PL_REGISTRY_PLATFORMA_OPEN_UPLOAD_URL" + ], + "passThroughEnv": ["AWS_*", "PL_AWS_*"], "outputs": ["./dist/**", "./block-pack/**", "./pkg-*.tgz"] }, - "build:dev": { - "dependsOn": ["build"], - "outputs": ["./dist/**"] - }, "do-pack": { "dependsOn": ["build"], "outputs": ["package.tgz"] diff --git a/ui/package.json b/ui/package.json index 204294f..59ae8e3 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,7 @@ { "name": "@platforma-open/milaboratories.import-vdj.ui", "version": "1.11.3", + "private": true, "type": "module", "scripts": { "dev": "ts-builder serve --target block-ui", @@ -14,6 +15,7 @@ "@platforma-open/milaboratories.import-vdj.model": "workspace:*", "@platforma-sdk/model": "catalog:", "@platforma-sdk/ui-vue": "catalog:", + "canonicalize": "catalog:", "vue": "catalog:" }, "devDependencies": { diff --git a/ui/src/app.ts b/ui/src/app.ts index c3b80e3..064ee1d 100644 --- a/ui/src/app.ts +++ b/ui/src/app.ts @@ -1,9 +1,9 @@ -import { model } from "@platforma-open/milaboratories.import-vdj.model"; -import { defineApp } from "@platforma-sdk/ui-vue"; +import { platforma } from "@platforma-open/milaboratories.import-vdj.model"; +import { defineAppV3 } from "@platforma-sdk/ui-vue"; import MainPage from "./pages/MainPage.vue"; import { watch } from "vue"; -export const sdkPlugin = defineApp(model, () => { +export const sdkPlugin = defineAppV3(platforma, () => { return { routes: { "/": () => MainPage, @@ -17,7 +17,7 @@ export const useApp = sdkPlugin.useApp; const unwatch = watch(sdkPlugin, ({ loaded }) => { if (!loaded) return; const app = useApp(); - app.model.args.customBlockLabel ??= ""; - app.model.args.defaultBlockLabel ??= "Select Dataset"; + app.model.data.customBlockLabel ??= ""; + app.model.data.defaultBlockLabel ??= "Select Dataset"; unwatch(); }); diff --git a/ui/src/pages/MainPage.vue b/ui/src/pages/MainPage.vue index 0f23e35..be25cb4 100644 --- a/ui/src/pages/MainPage.vue +++ b/ui/src/pages/MainPage.vue @@ -1,5 +1,20 @@