From 53ce7170ba2de8262137d8bcc21251a7cdf5bb93 Mon Sep 17 00:00:00 2001 From: nanguage Date: Tue, 16 Apr 2024 16:31:48 +0200 Subject: [PATCH 1/3] replace component with iframe --- src/components/TestRun.vue | 669 ++----------------------------------- src/imgProcess.js | 605 --------------------------------- 2 files changed, 21 insertions(+), 1253 deletions(-) delete mode 100644 src/imgProcess.js diff --git a/src/components/TestRun.vue b/src/components/TestRun.vue index 06d851a3..c749e246 100644 --- a/src/components/TestRun.vue +++ b/src/components/TestRun.vue @@ -9,187 +9,27 @@ Test the model
-
-
- - Load sample image - - - Run model - - - Show reference output - -
-
-
-
-

Settings for image tiling

-
-
- - - - - - -
-
- - - - - - -
-
-
- Advanced Options -
-
-
-
- 💡Tip: Drag and drop your own image file below to try out the - model. We support formats like .tiff, .png, and .jpg -
-
{{ this.info }}
-
+
diff --git a/src/imgProcess.js b/src/imgProcess.js deleted file mode 100644 index 619c9c9c..00000000 --- a/src/imgProcess.js +++ /dev/null @@ -1,605 +0,0 @@ -/** - * Functions for image processing. - * Used in the test run form. - */ - -import "@tensorflow/tfjs-backend-cpu"; -import * as tf from "@tensorflow/tfjs-core"; -import lodash from "lodash"; - -export function inferImgAxes(shape, order = "bcz") { - /** - * Infer the axes of an image. - * - * @param {Array} shape Shape of the image. - * @returns {string} Axes string. - */ - if (shape.length === 2) { - return "yx"; - } else if (shape.length <= 5) { - let minDimIdx = shape.indexOf(Math.min(...shape)); - let lowDimShape = shape.slice(); // Clone the shape array - lowDimShape.splice(minDimIdx, 1); // Remove the smallest dimension - let lowDimAxes = inferImgAxes(lowDimShape, order.slice(1)); - const insert = order[0]; - return insertCharAtPosition(lowDimAxes, insert, minDimIdx); - } else { - throw new Error(`Image shape [${shape.join(", ")}] is not supported.`); - } -} - -export function inferImgAxesViaSpec(shape, specAxes, fromIJ = false) { - let imgAxes; - if (fromIJ) { - if (shape.length === 2) { - imgAxes = "yx"; - } else if (shape.length === 3) { - imgAxes = "yxc"; - } else if (shape.length === 4) { - if (specAxes.includes("z")) { - imgAxes = "zyxc"; - } else { - imgAxes = "cyxb"; - } - } else { - throw new Error(`Image shape [${shape.join(", ")}] is not supported.`); - } - } else { - let order = "bcz"; - if (!specAxes.includes("c")) { - order = "bz"; - } else if (!specAxes.includes("z")) { - order = "bc"; - } else if (!specAxes.includes("b")) { - order = "cz"; - } - imgAxes = inferImgAxes(shape, order); - } - return imgAxes; -} - -export function insertCharAtPosition(originalString, charToInsert, position) { - return ( - originalString.substring(0, position) + - charToInsert + - originalString.substring(position) - ); -} - -function getConstructor(tpstr) { - /** -Int8Array int8 int8 -Int16Array int16 int16 -Int32Array int32 int32 -Uint8Array uint8 uint8 -Uint16Array uint16 uint16 -Uint32Array uint32 uint32 -Float32Array float32 float32 -Float64Array float64 float64 - */ - let Constructor; - if (tpstr == "uint8") { - Constructor = Uint8Array; - } else if (tpstr == "int8") { - Constructor = Int8Array; - } else if (tpstr == "uint16") { - Constructor = Uint16Array; - } else if (tpstr == "int16") { - Constructor = Int16Array; - } else if (tpstr == "uint32") { - Constructor = Uint32Array; - } else if (tpstr == "int32") { - Constructor = Int32Array; - } else if (tpstr == "float32") { - Constructor = Float32Array; - } else if (tpstr == "float64") { - Constructor = Float64Array; - } else if (tpstr == "bool") { - Constructor = Uint8Array; - } else { - throw new Error("Unsupported dtype: " + tpstr); - } - return Constructor; -} - -function reverseEndianness(arrayBuffer, bytesPerElement) { - let uint8Array = new Uint8Array(arrayBuffer); - for (let i = 0; i < uint8Array.length; i += bytesPerElement) { - for (let j = i, k = i + bytesPerElement - 1; j < k; j++, k--) { - [uint8Array[j], uint8Array[k]] = [uint8Array[k], uint8Array[j]]; - } - } - return arrayBuffer; -} - -export function ImjoyToTfJs(arr) { - let buffer = new ArrayBuffer(arr._rvalue.length); - let bufferView = new Uint8Array(buffer); - bufferView.set(arr._rvalue); - const Constructor = getConstructor(arr._rdtype); - let tarr = new Constructor(buffer); - if (arr._rdtype === "bool") { - // convert 1 to 255 - for (let i = 0; i < tarr.length; i++) { - if (tarr[i] === 1) { - tarr[i] = 255; - } - } - } - const tensor = tf.tensor(Array.from(tarr), arr._rshape); - tensor._rdtype = arr._rdtype; - return tensor; -} - -export function toImJoyArr(tensor, reverseEnd = false) { - const data = tensor.dataSync(); - const Constructor = getConstructor(tensor._rdtype); - let casted = new Constructor(data.length); - for (let i = 0; i < data.length; i++) { - casted[i] = data[i]; - } - if (reverseEnd) { - casted = new Constructor( - reverseEndianness(casted.buffer, Constructor.BYTES_PER_ELEMENT) - ); - } - const value = new Uint8Array(casted.buffer); - const ijarr = { - _rtype: "ndarray", - _rdtype: tensor._rdtype, - _rshape: tensor.shape, - _rvalue: value - }; - return ijarr; -} - -export function pick(tensor, idxes) { - const sliceBegin = []; - for (let i = 0; i < tensor.shape.length; i++) { - if (idxes[i] === null) { - sliceBegin.push(0); - } else { - sliceBegin.push(idxes[i]); - } - } - const sliceSize = []; - for (let i = 0; i < tensor.shape.length; i++) { - if (idxes[i] === null) { - sliceSize.push(tensor.shape[i]); - } else { - sliceSize.push(1); - } - } - const subTensor = tf.slice(tensor, sliceBegin, sliceSize); - const newShape = []; - for (let i = 0; i < tensor.shape.length; i++) { - if (idxes[i] === null) { - newShape.push(tensor.shape[i]); - } - } - return tf.reshape(subTensor, newShape); -} - -export function mapAxes(inputArray, inputAxes, outputAxes) { - if (inputAxes.length !== inputArray.shape.length) { - throw new Error( - `Number of axes ${inputAxes.length} and dimension of input ${inputArray.shape.length} don't match` - ); - } - - const pickIdxes = []; - inputAxes.split("").forEach((axName, axIdx) => { - const axLen = inputArray.shape[axIdx]; - if (!outputAxes.includes(axName)) { - let pickIdx = 0; - if ("zyx".includes(axName)) { - pickIdx = Math.floor(axLen / 2); - } - pickIdxes.push(pickIdx); - } else { - pickIdxes.push(null); - } - }); - let axes = inputAxes.split("").filter((name, idx) => pickIdxes[idx] === null); - - let newArray = pick(inputArray, pickIdxes); - - outputAxes.split("").forEach(axName => { - if (!inputAxes.includes(axName)) { - newArray = tf.reshape(newArray, newArray.shape.concat([1])); - axes.push(axName); - } - }); - - const transposeIdxes = []; - for (let i = 0; i < outputAxes.length; i++) { - const axName = outputAxes[i]; - const axIdx = axes.indexOf(axName); - transposeIdxes.push(axIdx); - } - - newArray = tf.transpose(newArray, transposeIdxes); - newArray._rdtype = inputArray._rdtype; - - return newArray; -} - -export const splitBy = (tensor, by, specAxes) => { - const byIdx = specAxes.indexOf(by); - const byLen = tensor.shape[byIdx]; - const splited = []; - for (let i = 0; i < byLen; i++) { - const pickIdx = []; - for (let j = 0; j < tensor.shape.length; j++) { - if (j === byIdx) { - pickIdx.push(i); - } else { - pickIdx.push(null); - } - } - const subArr = pick(tensor, pickIdx); - splited.push(subArr); - } - return splited; -}; - -export function splitForShow(tensor, specAxes) { - if (!specAxes.includes("x") || !specAxes.includes("y")) { - throw new Error("Unsupported axes: " + specAxes); - } - const hasC = specAxes.includes("c"); - const lenC = tensor.shape[specAxes.indexOf("c")]; - const hasZ = specAxes.includes("z"); - const lenZ = tensor.shape[specAxes.indexOf("z")]; - let newImgs = []; - if (specAxes.length === 2) { - newImgs.push(tensor); - } else if (specAxes.length === 3) { - if (hasC) { - if (lenC === 3) { - if (tensor._rdtype === "uint8") { - newImgs.push(mapAxes(tensor, specAxes, "yxc")); - } else { - newImgs.push(mapAxes(tensor, specAxes, "cyx")); - } - } else if (lenC === 1) { - newImgs.push(mapAxes(tensor, specAxes, "yx")); - } else { - newImgs.push(mapAxes(tensor, specAxes, "cyx")); - } - } else if (hasZ) { - newImgs.push(mapAxes(tensor, specAxes, "zyx")); - } else { - // b, y, x - newImgs = splitBy(tensor, "b", specAxes); - } - } else if (specAxes.length === 4) { - if (hasC && hasZ) { - if (lenC == 3) { - newImgs.push(mapAxes(tensor, specAxes, "zyxc")); - } else if (lenC == 1) { - newImgs.push(mapAxes(tensor, specAxes, "zyx")); - } else if (lenZ == 1) { - newImgs.push(mapAxes(tensor, specAxes, "cyx")); - } else { - // split by c - splitBy(tensor, "c", specAxes).map(arrs => { - const subAxes = specAxes.replace("c", ""); - newImgs = newImgs.concat(splitForShow(arrs, subAxes)); - }); - } - } else { - // b,c,y,x or b,z,y,x - // split by b - splitBy(tensor, "b", specAxes).map(arrs => { - const subAxes = specAxes.replace("b", ""); - newImgs = newImgs.concat(splitForShow(arrs, subAxes)); - }); - } - } else if (specAxes.length === 5) { - // b,c,z,y,x - // split by b - splitBy(tensor, "b", specAxes).map(arrs => { - const subAxes = specAxes.replace("b", ""); - newImgs = newImgs.concat(splitForShow(arrs, subAxes)); - }); - } else { - throw new Error("Unsupported axes: " + specAxes); - } - return newImgs; -} - -export function processForShow(tensor, specAxes) { - /** - Process the image for showing. - ImageJ.JS only supports: - [height, width] - [height, width, 1] - [height, width, 3] (will show as RGB image) - [z-stack, height, width] - [z-stack, height, width, 1] - [z-stack, height, width, 3] (will show as a stack of RGB image) - */ - const isImg2Img = specAxes.includes("x") && specAxes.includes("y"); - let splitedArrs; - if (isImg2Img) { - splitedArrs = splitForShow(tensor, specAxes); - } else { - if (specAxes.length > 2 && specAxes.includes("b")) { - splitedArrs = splitBy(tensor, "b", specAxes); - } else { - splitedArrs = [tensor]; - } - } - return splitedArrs.map(arr => { - arr._rdtype = tensor._rdtype; - return toImJoyArr(arr); - }); -} - -function getNpyDtype(buffer) { - const headerLength = new DataView(buffer.slice(8, 10)).getUint8(0); - const hcontents = new TextDecoder("utf-8").decode( - new Uint8Array(buffer.slice(10, 10 + headerLength)) - ); - const header = JSON.parse( - hcontents - .toLowerCase() // True -> true - .replace(/'/g, '"') - .replace("(", "[") - .replace(/,*\),*/g, "]") - ); - return header.descr; -} - -export async function getNpyEndianness(url) { - const resp = await fetch(url, { - headers: { - Range: "bytes=0-999" - } - }); - if (!resp.ok) { - console.error(resp); - return null; - } - const arrayBuffer = await resp.arrayBuffer(); - const npyDtype = getNpyDtype(arrayBuffer); - return npyDtype[0]; -} - -export class ImgPadder { - constructor(fixedPaddedShape, padMin, padStep, padValue = 0) { - this.fixedPaddedShape = fixedPaddedShape; - this.padMin = padMin; - this.padStep = padStep; - this.padValue = padValue; - } - - getPaddedShape(shape) { - let paddedShape = []; - if (this.fixedPaddedShape) { - // Explicit shape - paddedShape = this.fixedPaddedShape; - } else { - // Implicit shape - // infer from the min and step - const min = this.padMin; - const step = this.padStep; - for (let d = 0; d < shape.length; d++) { - if (step[d] === 0) { - paddedShape.push(shape[d]); - } else { - const pad = Math.max( - 0, - Math.ceil((shape[d] - min[d]) / step[d]) * step[d] - ); - paddedShape.push(pad + min[d]); - } - } - } - return paddedShape; - } - - pad(tensor, position = "center") { - const paddedShape = this.getPaddedShape(tensor.shape); - const pad = []; - for (let d = 0; d < tensor.shape.length; d++) { - if (paddedShape[d] < tensor.shape[d]) { - throw new Error( - `Invalid shape: ${tensor.shape} for ${this.inputSpec.shape}` - ); - } - const diff = paddedShape[d] - tensor.shape[d]; - if (position === "center") { - pad.push([Math.floor(diff / 2), Math.ceil(diff / 2)]); - } else if (position === "begin") { - pad.push([0, diff]); - } else if (position === "end") { - pad.push([diff, 0]); - } else { - throw new Error(`Invalid position: ${position}`); - } - } - const res = tf.pad(tensor, pad, this.padValue); - res._rdtype = tensor._rdtype; - return [res, pad]; - } - - crop(tensor, pad, halo = undefined) { - let res; - if (halo) { - res = tf.slice( - tensor, - pad.map((p, i) => p[0] + halo[i]), - tensor.shape.map((s, i) => s - pad[i][0] - pad[i][1] - halo[i] * 2) - ); - } else { - res = tf.slice( - tensor, - pad.map(p => p[0]), - tensor.shape.map((s, i) => s - pad[i][0] - pad[i][1]) - ); - } - res._rdtype = tensor._rdtype; - return res; - } -} - -export class ImgTile { - constructor(starts, ends, indexes) { - this.starts = starts; - this.ends = ends; - this.indexes = indexes; - this.shape = ends.map((e, i) => e - this.starts[i]); - this.data = null; - } - - slice(tensor) { - this.data = tf.slice(tensor, this.starts, this.shape); - this.data._rdtype = tensor._rdtype; - } - - merge(another, axis) { - const newStarts = this.starts.slice(); - const newEnds = this.ends.slice(); - newEnds[axis] = another.ends[axis]; - const overlap = this.ends[axis] - another.starts[axis]; - if (overlap < 0) { - throw new Error("Cannot merge tiles with negative overlap."); - } - let newData; - if (this.data === null || another.data === null) { - newData = null; - } else { - if (overlap === 0) { - newData = tf.concat([this.data, another.data], axis); - } else { - const size1 = this.data.shape.slice(); - size1[axis] -= Math.ceil(overlap / 2); - const starts1 = size1.map(() => 0); - const firstPart = tf.slice(this.data, starts1, size1); - const size2 = another.data.shape.slice(); - size2[axis] -= Math.floor(overlap / 2); - const starts2 = size2.map(() => 0); - starts2[axis] += Math.floor(overlap / 2); - const secondPart = tf.slice(another.data, starts2, size2); - newData = tf.concat([firstPart, secondPart], axis); - } - newData._rdtype = this.data._rdtype; - } - const newTile = new ImgTile(newStarts, newEnds, this.indexes); - newTile.data = newData; - return newTile; - } - - mergeMean(another) { - const newStarts = this.starts.slice(); - const newEnds = this.ends.slice(); - const newData = tf.add(this.data, another.data).div(2); - newData._rdtype = this.data._rdtype; - const newTile = new ImgTile(newStarts, newEnds, this.indexes); - newTile.data = newData; - return newTile; - } -} - -const cartesian = (...a) => - a.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat()))); - -export class ImgTiler { - constructor(imgShape, tileShape, overlap = undefined) { - this.imgShape = imgShape; - this.tileShape = tileShape; - if (overlap === undefined) { - overlap = tileShape.map(() => 0); - } - this.overlap = overlap; - } - - getNTiles() { - const overlap = this.overlap; - const tileShape = this.tileShape; - const imgShape = this.imgShape; - const nTiles = tileShape.map((s, i) => { - const n = Math.ceil(imgShape[i] / (s - overlap[i])); - return n; - }); - return nTiles; - } - - getTiles() { - const overlap = this.overlap; - const tileShape = this.tileShape; - const imgShape = this.imgShape; - const nTiles = this.getNTiles(); - const tileIndexes = cartesian( - ...nTiles.map(n => Array.from(Array(n).keys())) - ); - const starts = tileIndexes.map(idx => { - return idx.map((i, j) => { - return i * (tileShape[j] - overlap[j]); - }); - }); - const ends = starts.map(s => { - return s.map((v, i) => { - return Math.min(v + tileShape[i], imgShape[i]); - }); - }); - const tiles = starts.map((s, i) => { - return new ImgTile(s, ends[i], tileIndexes[i]); - }); - return tiles; - } -} - -export class TileMerger { - constructor(imgShape) { - this.imgShape = imgShape; - } - - mergeTiles(tiles) { - for (let d = 0; d < this.imgShape.length; d++) { - const newTiles = []; - const key = t => { - const res = []; - t.indexes.map((idx, j) => { - if (j !== d) { - res.push(idx); - } - }); - return res.join("-"); - }; - const groups = lodash.groupBy(tiles, key); - for (let k in groups) { - const v = groups[k]; - v.sort((a, b) => a.indexes[d] - b.indexes[d]); - if (v.length > 1) { - let merged = v[0]; - for (let i = 1; i < v.length; i++) { - merged = merged.merge(v[i], d); - } - newTiles.push(merged); - } else { - newTiles.push(v[0]); - } - } - tiles = newTiles; - } - const res = tiles[0]; - return res; - } -} - -export class MeanTileMerger extends TileMerger { - constructor(imgShape) { - super(imgShape); - } - - mergeTiles(tiles) { - const merged = tiles[0]; - for (let i = 1; i < tiles.length; i++) { - merged.mergeMean(tiles[i]); - } - return merged; - } -} From b124d1d6ec8f419489aa64483f73a8e04f6cd736 Mon Sep 17 00:00:00 2001 From: nanguage Date: Tue, 23 Apr 2024 15:15:07 +0200 Subject: [PATCH 2/3] fix display bugs --- src/bioEngine.js | 8 ++++++++ src/components/TestRun.vue | 7 +++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/bioEngine.js b/src/bioEngine.js index b4036c19..fca2351a 100644 --- a/src/bioEngine.js +++ b/src/bioEngine.js @@ -123,6 +123,14 @@ export async function setupBioEngine() { window.app.progress = progress; window.app.$forceUpdate(); }, + async resizeWindow(_plugin, width, height) { + console.log(_plugin, width, height); + const windowElem = _plugin.window_id; + if (windowElem) { + windowElem.style.width = width; + windowElem.style.height = height; + } + }, async showMessage(_plugin, msg, duration) { duration = duration || 5; if (_plugin && _plugin.config.namespace) { diff --git a/src/components/TestRun.vue b/src/components/TestRun.vue index c749e246..2a3bf952 100644 --- a/src/components/TestRun.vue +++ b/src/components/TestRun.vue @@ -10,6 +10,7 @@
+
💡Tip: Drag and drop your own image file below to try out the model. We support formats like .tiff, .png, and .jpg
@@ -21,6 +22,9 @@ height: 100%; margin-bottom: 10px; } +#ij-tips { + margin-bottom: 10px; +} #ij-container { width: 100%; height: 600px; @@ -86,8 +90,7 @@ export default { window_id: "ij-container" }); api.createWindow({ - //src: `https://bioimage-io.github.io/bioengine-web-client/?model=${this.resourceItem.id}`, - src: `http://localhost:5173/bioengine-web-client/?new_ij_window=true&model=${this.resourceItem.id}`, + src: `https://bioimage-io.github.io/bioengine-web-client/?model=${this.resourceItem.id}`, title: "Bioengine Web Client", window_id: "bioengine-web-client", }); From 80428fa64b367b05f58bd1499a6ce7133c2935f9 Mon Sep 17 00:00:00 2001 From: nanguage Date: Tue, 23 Apr 2024 15:20:43 +0200 Subject: [PATCH 3/3] remove unused dependency --- package-lock.json | 547 ++----------------------------------- package.json | 3 - src/components/TestRun.vue | 26 +- 3 files changed, 30 insertions(+), 546 deletions(-) diff --git a/package-lock.json b/package-lock.json index 650059f0..fd740174 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1023,20 +1023,6 @@ "to-fast-properties": "^2.0.0" } }, - "@d4c/numjs": { - "version": "0.17.34", - "resolved": "https://registry.npmjs.org/@d4c/numjs/-/numjs-0.17.34.tgz", - "integrity": "sha512-wPA61nUOFR1S7a40m3m9Ko+eHyRaKKE4Cha7/JR53jVL9VN6ljDUZX8x4G1k6DW3TCbtu0emn3c8yJvlyckpoA==", - "requires": { - "@types/ndarray": "^1.0.11", - "cwise": "^1.0.10", - "ndarray": "^1.0.19", - "ndarray-fft": "^1.0.3", - "ndarray-gemm": "^1.0.0", - "ndarray-ops": "^1.2.2", - "typedarray-pool": "^1.2.0" - } - }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -1238,29 +1224,6 @@ "integrity": "sha512-zeOomWIE52M9JpYXlsR3iOf7TXTTmNQHnSbqjMsQZ5phzfAenHzL/1+vQ0ZoJfagocK11LNf8vnn2JG0ufRMUQ==", "dev": true }, - "@tensorflow/tfjs-backend-cpu": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.17.0.tgz", - "integrity": "sha512-2VSCHnX9qhYTjw9HiVwTBSnRVlntKXeBlK7aSVsmZfHGwWE2faErTtO7bWmqNqw0U7gyznJbVAjlow/p+0RNGw==", - "requires": { - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" - } - }, - "@tensorflow/tfjs-core": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.17.0.tgz", - "integrity": "sha512-v9Q5430EnRpyhWNd9LVgXadciKvxLiq+sTrLKRowh26BHyAsams4tZIgX3lFKjB7b90p+FYifVMcqLTTHgjGpQ==", - "requires": { - "@types/long": "^4.0.1", - "@types/offscreencanvas": "~2019.7.0", - "@types/seedrandom": "^2.4.28", - "@webgpu/types": "0.1.38", - "long": "4.0.0", - "node-fetch": "~2.6.1", - "seedrandom": "^3.0.5" - } - }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -1290,22 +1253,12 @@ "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", "dev": true }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, - "@types/ndarray": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@types/ndarray/-/ndarray-1.0.14.tgz", - "integrity": "sha512-oANmFZMnFQvb219SSBIhI1Ih/r4CvHDOzkWyJS/XRqkMrGH5/kaPSA1hQhdIBzouaE+5KpE/f5ylI9cujmckQg==" - }, "@types/node": { "version": "14.0.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.10.tgz", @@ -1318,22 +1271,12 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, - "@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" - }, "@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", "dev": true }, - "@types/seedrandom": { - "version": "2.4.34", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.34.tgz", - "integrity": "sha512-ytDiArvrn/3Xk6/vtylys5tlY6eo7Ane0hvcx++TKo6RxQXuVfW0AF/oeWqAj9dN29SyhtawuXstgmPlwNcv/A==" - }, "@vue/babel-helper-vue-jsx-merge-props": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz", @@ -2273,11 +2216,6 @@ "@xtuc/long": "4.2.2" } }, - "@webgpu/types": { - "version": "0.1.38", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.38.tgz", - "integrity": "sha512-7LrhVKz2PRh+DD7+S+PVaFd5HxaWQvoMqBbsV9fNJO1pjUs1P8bM2vQVNfk+3URTqbuTI7gkXi0rfsN0IadoBA==" - }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -2380,38 +2318,12 @@ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "optional": true - }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", @@ -2903,11 +2815,6 @@ "file-uri-to-path": "1.0.0" } }, - "bit-twiddle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", - "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==" - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -3207,7 +3114,8 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, "buffer-indexof": { "version": "1.1.1", @@ -3460,15 +3368,6 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -4073,6 +3972,7 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -4745,79 +4645,6 @@ } } }, - "cwise": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/cwise/-/cwise-1.0.10.tgz", - "integrity": "sha512-4OQ6FXVTRO2bk/OkIEt0rNqDk63aOv3Siny6ZD2/WN9CH7k8X6XyQdcip4zKg1WG+L8GP5t2zicXbDb+H7Y77Q==", - "requires": { - "cwise-compiler": "^1.1.1", - "cwise-parser": "^1.0.0", - "static-module": "^1.0.0", - "uglify-js": "^2.6.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "cwise-compiler": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", - "integrity": "sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ==", - "requires": { - "uniq": "^1.0.0" - } - }, - "cwise-parser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cwise-parser/-/cwise-parser-1.0.3.tgz", - "integrity": "sha512-nAe238ctwjt9l5exq9CQkHS1Tj6YRGAQxqfL4VaN1B2oqG1Ss0VVqIrBG/vyOgN301PI22wL6ZIhe/zA+BO56Q==", - "requires": { - "esprima": "^1.0.3", - "uniq": "^1.0.0" - }, - "dependencies": { - "esprima": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", - "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==" - } - } - }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", @@ -4862,7 +4689,8 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decimal.js": { "version": "10.3.1", @@ -5342,48 +5170,12 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, - "dup": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", - "integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==" - }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - } - } - }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -6208,27 +6000,6 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "falafel": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", - "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", - "requires": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } - } - }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -6617,7 +6388,8 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "functional-red-black-tree": { "version": "1.0.1", @@ -6783,6 +6555,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -7458,11 +7231,6 @@ "loose-envify": "^1.0.0" } }, - "iota-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", - "integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==" - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -7532,7 +7300,8 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-callable": { "version": "1.2.0", @@ -8085,11 +7854,6 @@ "launch-editor": "^2.2.1" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==" - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -8305,16 +8069,6 @@ "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", "dev": true }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==" - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -9251,40 +9005,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "ndarray": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", - "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==", - "requires": { - "iota-array": "^1.0.0", - "is-buffer": "^1.0.2" - } - }, - "ndarray-fft": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ndarray-fft/-/ndarray-fft-1.0.3.tgz", - "integrity": "sha512-p7OPcNAHP616TdoQdmroW666To530jY1q32Gy1DvK3fkaAQ4BuGu715UDDPIARkVQGhHC2qhbjwrhYG2eUQPCw==", - "requires": { - "bit-twiddle": "^1.0.2", - "cwise": "^1.0.4", - "ndarray": "^1.0.15", - "ndarray-ops": "^1.2.2", - "typedarray-pool": "^1.0.0" - } - }, - "ndarray-gemm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ndarray-gemm/-/ndarray-gemm-1.0.0.tgz", - "integrity": "sha512-LSAzu9dFrQHGImnO/14EtKuRsxQwyehtYg56mxajTB2XnJ4eVx90Dq+xP2x9lyH4PLPtVnZMhGrvnHiIxtGysw==" - }, - "ndarray-ops": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ndarray-ops/-/ndarray-ops-1.2.2.tgz", - "integrity": "sha512-BppWAFRjMYF7N/r6Ie51q6D4fs0iiGmeXIACKY66fLpnwIui3Wc3CXiD/30mgLbDjPpSLrsqcp3Z62+IcHZsDw==", - "requires": { - "cwise-compiler": "^1.0.0" - } - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -10962,65 +10682,6 @@ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" }, - "quote-stream": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", - "integrity": "sha512-m4VtvjAMx00wgAS6eOy50ZDat1EBQeFKBIrtF/oxUt0MenEI33y7runJcRiOihc+JBBIt2aFFJhILIh4e9shJA==", - "requires": { - "minimist": "0.0.8", - "through2": "~0.4.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==", - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, "ramda": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", @@ -11280,7 +10941,8 @@ "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "request": { "version": "2.88.2", @@ -11431,14 +11093,6 @@ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -11539,11 +11193,6 @@ "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", "integrity": "sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ=" }, - "seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -11750,11 +11399,6 @@ "safe-buffer": "^5.0.1" } }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -12065,7 +11709,8 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "source-map-resolve": { "version": "0.5.3", @@ -12234,36 +11879,6 @@ "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", "dev": true }, - "static-eval": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", - "integrity": "sha512-6dWWPfa/0+1zULdQi7ssT5EQZHsGK8LygBzhE/HdafNCo4e/Ibt7vLPfxBw9VcdVV+t0ARtN4ZAJKtApVc0A5Q==", - "requires": { - "escodegen": "~0.0.24" - }, - "dependencies": { - "escodegen": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", - "integrity": "sha512-6ioQhg16lFs5c7XJlJFXIDxBjO4yRvXC9yK6dLNNGuhI3a/fJukHanPF6qtpjGDgAFzI8Wuq3PSIarWmaOq/5A==", - "requires": { - "esprima": "~1.0.2", - "estraverse": "~1.3.0", - "source-map": ">= 0.1.2" - } - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==" - }, - "estraverse": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", - "integrity": "sha512-OkbCPVUu8D9tbsLcUR+CKFRBbhZlogmkbWaP3BPERlkqzWL5Q6IdTz6eUk+b5cid2MTaCqJb2nNRGoJ8TpfPrg==" - } - } - }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -12285,109 +11900,6 @@ } } }, - "static-module": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", - "integrity": "sha512-XTj7pQOHT33l77lK/Pu8UXqzI44C6LYAqwAc9hLTTESHRqJAFudBpReuopFPpoRr5CtOoSmGfFQC6FPlbDnyCw==", - "requires": { - "concat-stream": "~1.6.0", - "duplexer2": "~0.0.2", - "escodegen": "~1.3.2", - "falafel": "^2.1.0", - "has": "^1.0.0", - "object-inspect": "~0.4.0", - "quote-stream": "~0.0.0", - "readable-stream": "~1.0.27-1", - "shallow-copy": "~0.0.1", - "static-eval": "~0.2.0", - "through2": "~0.4.1" - }, - "dependencies": { - "escodegen": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", - "integrity": "sha512-z9FWgKc48wjMlpzF5ymKS1AF8OIgnKLp9VyN7KbdtyrP/9lndwUFqCtMm+TAJmJf7KJFFYc4cFJfVTTGkKEwsA==", - "requires": { - "esprima": "~1.1.1", - "estraverse": "~1.5.0", - "esutils": "~1.0.0", - "source-map": "~0.1.33" - } - }, - "esprima": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", - "integrity": "sha512-qxxB994/7NtERxgXdFgLHIs9M6bhLXc6qtUmWZ3L8+gTQ9qaoyki2887P2IqAYsoENyr8SUbTutStDniOHSDHg==" - }, - "estraverse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", - "integrity": "sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==" - }, - "esutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", - "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "object-inspect": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", - "integrity": "sha512-8WvkvUZiKAjjsy/63rJjA7jw9uyF0CLVLjBKEfnPHE3Jxvs1LgwqL2OmJN+LliIX1vrzKW+AAu02Cc+xv27ncQ==" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==", - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -13011,16 +12523,8 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-pool": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", - "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", - "requires": { - "bit-twiddle": "^1.0.0", - "dup": "^1.0.0" - } + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true }, "uglify-js": { "version": "3.4.10", @@ -13046,12 +12550,6 @@ } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", - "optional": true - }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -13095,7 +12593,8 @@ "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true }, "uniqs": { "version": "2.0.0", @@ -14103,22 +13602,12 @@ } } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==" - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==" - }, "workbox-background-sync": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", diff --git a/package.json b/package.json index 4ac95fbb..7ef371ad 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,7 @@ "format": "prettier --write \"{src,tests}/**/**\"" }, "dependencies": { - "@d4c/numjs": "^0.17.34", "@mdi/font": "^5.3.45", - "@tensorflow/tfjs-backend-cpu": "^4.17.0", - "@tensorflow/tfjs-core": "^4.17.0", "axios": "^0.21.2", "buefy": "^0.8.0", "ci": "^2.3.0", diff --git a/src/components/TestRun.vue b/src/components/TestRun.vue index 2a3bf952..f70f9570 100644 --- a/src/components/TestRun.vue +++ b/src/components/TestRun.vue @@ -10,7 +10,10 @@
-
💡Tip: Drag and drop your own image file below to try out the model. We support formats like .tiff, .png, and .jpg
+
+ 💡Tip: Drag and drop your own image file below to try out the model. We + support formats like .tiff, .png, and .jpg +
@@ -33,8 +36,6 @@