diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..83f26dfd1b58b94586bbd8f155c1a473ab3fd2bc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,35 +1,14 @@ -*.7z filter=lfs diff=lfs merge=lfs -text -*.arrow filter=lfs diff=lfs merge=lfs -text -*.bin filter=lfs diff=lfs merge=lfs -text -*.bz2 filter=lfs diff=lfs merge=lfs -text -*.ckpt filter=lfs diff=lfs merge=lfs -text -*.ftz filter=lfs diff=lfs merge=lfs -text -*.gz filter=lfs diff=lfs merge=lfs -text -*.h5 filter=lfs diff=lfs merge=lfs -text -*.joblib filter=lfs diff=lfs merge=lfs -text -*.lfs.* filter=lfs diff=lfs merge=lfs -text -*.mlmodel filter=lfs diff=lfs merge=lfs -text -*.model filter=lfs diff=lfs merge=lfs -text -*.msgpack filter=lfs diff=lfs merge=lfs -text -*.npy filter=lfs diff=lfs merge=lfs -text -*.npz filter=lfs diff=lfs merge=lfs -text *.onnx filter=lfs diff=lfs merge=lfs -text -*.ot filter=lfs diff=lfs merge=lfs -text -*.parquet filter=lfs diff=lfs merge=lfs -text -*.pb filter=lfs diff=lfs merge=lfs -text -*.pickle filter=lfs diff=lfs merge=lfs -text -*.pkl filter=lfs diff=lfs merge=lfs -text -*.pt filter=lfs diff=lfs merge=lfs -text -*.pth filter=lfs diff=lfs merge=lfs -text -*.rar filter=lfs diff=lfs merge=lfs -text -*.safetensors filter=lfs diff=lfs merge=lfs -text -saved_model/**/* filter=lfs diff=lfs merge=lfs -text -*.tar.* filter=lfs diff=lfs merge=lfs -text -*.tar filter=lfs diff=lfs merge=lfs -text -*.tflite filter=lfs diff=lfs merge=lfs -text -*.tgz filter=lfs diff=lfs merge=lfs -text *.wasm filter=lfs diff=lfs merge=lfs -text -*.xz filter=lfs diff=lfs merge=lfs -text -*.zip filter=lfs diff=lfs merge=lfs -text -*.zst filter=lfs diff=lfs merge=lfs -text -*tfevents* filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.woff filter=lfs diff=lfs merge=lfs -text +*.woff2 filter=lfs diff=lfs merge=lfs -text +*.eot filter=lfs diff=lfs merge=lfs -text +*.otf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text +*.gif filter=lfs diff=lfs merge=lfs -text +*.ico filter=lfs diff=lfs merge=lfs -text +*.webp filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md index 2bc5ace76969697c21a010c1c56528b12a006613..d2aada1ae8039d46fd973583369d5740f7853fea 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,28 @@ --- -title: Updraft -emoji: 🐨 -colorFrom: indigo -colorTo: red +title: Updraft Upscaler +colorFrom: blue +colorTo: indigo sdk: static pinned: false license: mit -short_description: Updraft Local In-Browser Upscaling +short_description: In-browser image upscaler — no upload, no install +custom_headers: + cross-origin-embedder-policy: require-corp + cross-origin-opener-policy: same-origin + cross-origin-resource-policy: cross-origin --- -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +# Updraft + +In-browser image upscaler running ONNX models client-side. Your images never leave your device. + +This Space ships a curated subset of models. For the full model lineup (including the larger DAT and TinySR diffusion-refiner models) plus video upscaling, use the main site: + +→ **https://nickcelestin.com/applications/aitools/index.html** + +## Models in this Space + +- `models/4x-UpdraftSmall.onnx` +- `models/4x-ClearRealityV1.onnx` +- `models/DAT_light_x4_dyn_OTF_4.onnx` +- `models/4x-UltraSharpV2_Lite.onnx` diff --git a/assets/favicon-180x180.png b/assets/favicon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..08c3e4124ea8ab9c118489a6b7e6ae13ae182690 --- /dev/null +++ b/assets/favicon-180x180.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77c0f06811ab7652e4c21745bf07ef502193cd7db606695c57c29b8aa0aee813 +size 10049 diff --git a/assets/favicon-32x32.png b/assets/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a11d87a98eb7ec3911e5d5883df11c8cac414c --- /dev/null +++ b/assets/favicon-32x32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a473be4cc7477c3cd297e8bebe6b1fa8e6b87c0874fcbdc54e48d4752ded9388 +size 1176 diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..10a9694a44b5bf3a51b799f287df23aae03e08bc --- /dev/null +++ b/assets/favicon.ico @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ed7c4bab8e8e7f9ef078a875a7c200f1985f1020112b44d6c0c6996064cebe3 +size 562 diff --git a/assets/favicon.svg b/assets/favicon.svg new file mode 100644 index 0000000000000000000000000000000000000000..fe9a19e17cd85590a1ff11b5c3b2bb64dad9b8d2 --- /dev/null +++ b/assets/favicon.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/shared.css b/assets/shared.css new file mode 100644 index 0000000000000000000000000000000000000000..75c385ded9a0bab5e46b341cad699dd83a7b5a3b --- /dev/null +++ b/assets/shared.css @@ -0,0 +1,33 @@ +/* === AI Tools — Global Overrides === */ + +:root { + --pico-font-size: 100%; + scrollbar-width: thin; + scrollbar-color: var(--pico-secondary-border) var(--pico-background-color); +} + +/* Nav brand */ +nav .brand { + color: #6366f1; +} +nav .brand-icon { + height: 2.25em; + vertical-align: -0.35em; + margin: 0 -0.5em; +} + +/* Compact form controls inside tool UIs */ +.controls select, +.controls input { + margin-bottom: 0; +} + +/* Feature sections */ +[id^="feature-"] { + animation: fadeIn 0.15s ease-in; +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} diff --git a/components/compare-slider.js b/components/compare-slider.js new file mode 100644 index 0000000000000000000000000000000000000000..d0bee573bd3062c428711a6a5213444c51dd155e --- /dev/null +++ b/components/compare-slider.js @@ -0,0 +1,469 @@ +/** + * — before/after image comparison slider. + * + * The slider is always on. Left-click / drag positions the divider. Right-click + * snaps the divider to whichever extreme it isn't currently nearer to (left + * or right edge), so a single right-click flips between the before-only and + * after-only views. + */ + +import { morph } from 'lib/morph'; +import { canvasToBlobUrl } from 'lib/canvas'; + +class CompareSlider extends HTMLElement { + #dragging = false; + #beforeSrc = ''; + #afterSrc = ''; + #positionFrac = 0.5; + #downloadSrc = ''; + #downloadName = ''; + #beforeCanvas = null; + #afterCanvas = null; + #lazyBlobURL = ''; + + #onWindowMouseMove = (e) => { if (this.#dragging) this.#setPosition(this.#getFrac(e)); }; + #onWindowTouchMove = (e) => { if (this.#dragging) this.#setPosition(this.#getFrac(e)); }; + #onWindowMouseUp = () => { + this.#dragging = false; + this.classList.remove('dragging'); + }; + #onWindowTouchEnd = () => { + this.#dragging = false; + this.classList.remove('dragging'); + }; + + #knobScheduled = false; + #knobFullWidth = 0; + #resizeObserver = null; + #scheduleKnobUpdate = () => { + if (this.#knobScheduled) return; + this.#knobScheduled = true; + requestAnimationFrame(() => { + this.#knobScheduled = false; + this.#updateKnobPosition(); + }); + }; + #onResize = () => { + // Knob's measured full width may change with font-metric / DPR shifts. + this.#knobFullWidth = 0; + this.#scheduleKnobUpdate(); + }; + + connectedCallback() { + this.classList.add('compare'); + // Belt-and-suspenders: also set display:none inline so the slider is + // definitely hidden before show() has been called. The class CSS rule + // does this too, but it lives inside our own +
+ ${afterTag} +
+ ${beforeTag} +
+ +
+ `); + if (cm) this.#drawCanvasSources(); + } +} + +customElements.define('compare-slider', CompareSlider); diff --git a/components/image-cropper.js b/components/image-cropper.js new file mode 100644 index 0000000000000000000000000000000000000000..90a21ec33804c328b73662e75a169f74991bd1d7 --- /dev/null +++ b/components/image-cropper.js @@ -0,0 +1,243 @@ +/** + * — optional bounding-box selection on the source image. + * + * Events: + * crop-changed — detail: { crop: { x, y, w, h } | null } + */ + +import { morph } from 'lib/morph'; +import { cropToCanvas } from 'lib/canvas'; + +class ImageCropper extends HTMLElement { + #image = null; + #crop = null; + #dragging = false; + #dragStart = null; + #dragCurrent = null; + + #onWindowMouseMove = (e) => { if (this.#dragging) { this.#dragCurrent = this.#eventToElement(e); this.#drawOverlay(); } }; + #onWindowTouchMove = (e) => { if (this.#dragging) { this.#dragCurrent = this.#eventToElement(e); this.#drawOverlay(); } }; + #onWindowMouseUp = () => { if (this.#dragging) this.#finishDrag(); }; + #onWindowTouchEnd = () => { if (this.#dragging) this.#finishDrag(); }; + + connectedCallback() { + this.classList.add('image-cropper'); + this.#render(); + + this.addEventListener('mousedown', e => { + const canvas = e.target.closest('canvas'); + if (!canvas) return; + this.#dragging = true; + this.#dragStart = this.#eventToElement(e); + this.#dragCurrent = this.#dragStart; + this.#crop = null; + this.#drawOverlay(); + }); + this.addEventListener('touchstart', e => { + const canvas = e.target.closest('canvas'); + if (!canvas) return; + this.#dragging = true; + this.#dragStart = this.#eventToElement(e); + this.#dragCurrent = this.#dragStart; + this.#crop = null; + this.#drawOverlay(); + }, { passive: true }); + + window.addEventListener('mousemove', this.#onWindowMouseMove); + window.addEventListener('touchmove', this.#onWindowTouchMove, { passive: true }); + window.addEventListener('mouseup', this.#onWindowMouseUp); + window.addEventListener('touchend', this.#onWindowTouchEnd); + } + + disconnectedCallback() { + window.removeEventListener('mousemove', this.#onWindowMouseMove); + window.removeEventListener('touchmove', this.#onWindowTouchMove); + window.removeEventListener('mouseup', this.#onWindowMouseUp); + window.removeEventListener('touchend', this.#onWindowTouchEnd); + } + + show(image) { + // Preserve the existing crop selection when re-shown with the same image + // reference (e.g. when the upscaler navigates back to crop mode from the + // compare view). A genuinely new image still resets the crop. + const sameImage = image === this.#image; + this.#image = image; + if (!sameImage) this.#crop = null; + this.style.setProperty('--ar', `${image.width} / ${image.height}`); + this.style.setProperty('--ar-num', `${image.width / image.height}`); + this.style.setProperty('--natural-w', `${image.width}px`); + this.#render(); + this.style.display = 'block'; + this.#resizeCanvas(); + this.#drawOverlay(); + } + + hide() { + this.style.display = 'none'; + this.style.removeProperty('--ar'); + this.style.removeProperty('--ar-num'); + this.style.removeProperty('--natural-w'); + this.#image = null; + this.#crop = null; + const canvas = this.querySelector('canvas'); + if (canvas) { canvas.width = 0; canvas.height = 0; } + } + + clearCrop() { + this.#crop = null; + this.#render(); + this.#resizeCanvas(); + this.#drawOverlay(); + this.dispatchEvent(new CustomEvent('crop-changed', { bubbles: true, detail: { crop: null } })); + } + + get crop() { return this.#crop; } + + extractImage() { + const img = this.#image; + if (!img) throw new Error('No image loaded'); + if (!this.#crop) return img; + return cropToCanvas(img, this.#crop); + } + + #resizeCanvas() { + if (!this.#image) return; + const canvas = this.querySelector('canvas'); + if (!canvas) return; + canvas.width = this.#image.width; + canvas.height = this.#image.height; + } + + #eventToElement(e) { + const canvas = this.querySelector('canvas'); + if (!canvas) return { ex: 0, ey: 0 }; + const rect = canvas.getBoundingClientRect(); + const clientX = e.touches ? e.touches[0].clientX : e.clientX; + const clientY = e.touches ? e.touches[0].clientY : e.clientY; + return { + ex: Math.max(0, Math.min(rect.width, clientX - rect.left)), + ey: Math.max(0, Math.min(rect.height, clientY - rect.top)), + }; + } + + #finishDrag() { + this.#dragging = false; + if (!this.#dragStart || !this.#dragCurrent || !this.#image) return; + + const canvas = this.querySelector('canvas'); + const scaleX = this.#image.width / canvas.clientWidth; + const scaleY = this.#image.height / canvas.clientHeight; + + const x1 = Math.min(this.#dragStart.ex, this.#dragCurrent.ex); + const y1 = Math.min(this.#dragStart.ey, this.#dragCurrent.ey); + const x2 = Math.max(this.#dragStart.ex, this.#dragCurrent.ex); + const y2 = Math.max(this.#dragStart.ey, this.#dragCurrent.ey); + + const ix = Math.round(x1 * scaleX); + const iy = Math.round(y1 * scaleY); + const iw = Math.round((x2 - x1) * scaleX); + const ih = Math.round((y2 - y1) * scaleY); + + if (iw < 16 || ih < 16) { + this.#crop = null; + this.#render(); + this.#resizeCanvas(); + this.#drawOverlay(); + this.dispatchEvent(new CustomEvent('crop-changed', { bubbles: true, detail: { crop: null } })); + return; + } + + this.#crop = { x: ix, y: iy, w: iw, h: ih }; + this.#render(); + this.#resizeCanvas(); + this.#drawOverlay(); + this.dispatchEvent(new CustomEvent('crop-changed', { bubbles: true, detail: { crop: this.#crop } })); + } + + #drawOverlay() { + const canvas = this.querySelector('canvas'); + if (!canvas || !this.#image) return; + const ctx = canvas.getContext('2d'); + const cw = canvas.width; + const ch = canvas.height; + + ctx.drawImage(this.#image, 0, 0, cw, ch); + + let sx, sy, sw, sh; + if (this.#dragging && this.#dragStart && this.#dragCurrent) { + const scaleX = cw / canvas.clientWidth; + const scaleY = ch / canvas.clientHeight; + sx = Math.min(this.#dragStart.ex, this.#dragCurrent.ex) * scaleX; + sy = Math.min(this.#dragStart.ey, this.#dragCurrent.ey) * scaleY; + sw = Math.abs(this.#dragCurrent.ex - this.#dragStart.ex) * scaleX; + sh = Math.abs(this.#dragCurrent.ey - this.#dragStart.ey) * scaleY; + } else if (this.#crop) { + sx = this.#crop.x; + sy = this.#crop.y; + sw = this.#crop.w; + sh = this.#crop.h; + } else { + return; + } + + ctx.fillStyle = 'rgba(0, 0, 0, 0.5)'; + ctx.fillRect(0, 0, cw, sy); + ctx.fillRect(0, sy, sx, sh); + ctx.fillRect(sx + sw, sy, cw - sx - sw, sh); + ctx.fillRect(0, sy + sh, cw, ch - sy - sh); + + ctx.strokeStyle = 'var(--pico-primary, #4c8)'; + ctx.lineWidth = 2; + ctx.strokeRect(sx, sy, sw, sh); + } + + #render() { + morph(this, ` + + + `); + } +} + +customElements.define('image-cropper', ImageCropper); diff --git a/components/image-drop-zone.js b/components/image-drop-zone.js new file mode 100644 index 0000000000000000000000000000000000000000..fee96c7983a51bfe685ffc02b137229f25289576 --- /dev/null +++ b/components/image-drop-zone.js @@ -0,0 +1,90 @@ +/** + * — file picker + drag-and-drop image loader. + * + * Events: + * image-loaded — detail: { image: HTMLImageElement } + */ + +import { morph } from 'lib/morph'; + +class ImageDropZone extends HTMLElement { + connectedCallback() { + this.classList.add('drop-zone'); + this.#render(); + + this.addEventListener('click', e => { + if (e.target.closest('.drop-zone-area')) this.querySelector('input[type="file"]').click(); + }); + this.addEventListener('dragover', e => { + if (e.target.closest('.drop-zone-area')) { e.preventDefault(); e.target.closest('.drop-zone-area').classList.add('dragover'); } + }); + this.addEventListener('dragleave', e => { + if (e.target.closest('.drop-zone-area')) e.target.closest('.drop-zone-area').classList.remove('dragover'); + }); + this.addEventListener('drop', e => { + const area = e.target.closest('.drop-zone-area'); + if (!area) return; + e.preventDefault(); + area.classList.remove('dragover'); + if (e.dataTransfer.files.length) this.#handleFile(e.dataTransfer.files[0]); + }); + this.addEventListener('change', e => { + if (e.target.matches('input[type="file"]') && e.target.files.length) this.#handleFile(e.target.files[0]); + }); + document.addEventListener('paste', e => { + const items = e.clipboardData?.items; + if (!items) return; + for (const item of items) { + if (item.type.startsWith('image/')) { + e.preventDefault(); + this.#handleFile(item.getAsFile()); + return; + } + } + }); + } + + #handleFile(file) { + if (!file.type.startsWith('image/')) return; + const reader = new FileReader(); + reader.onload = () => { + const img = new Image(); + img.onload = () => { + this.dispatchEvent(new CustomEvent('image-loaded', { bubbles: true, detail: { image: img } })); + }; + img.src = reader.result; + }; + reader.readAsDataURL(file); + } + + show() { + this.style.display = ''; + const input = this.querySelector('input[type="file"]'); + if (input) input.value = ''; + } + hide() { this.style.display = 'none'; } + + #render() { + morph(this, ` + + +
+ + Drop an image here, paste from clipboard, or click to browse +
+ `); + } +} + +customElements.define('image-drop-zone', ImageDropZone); diff --git a/components/status-bar.js b/components/status-bar.js new file mode 100644 index 0000000000000000000000000000000000000000..b2fd869ad6fb8b5fb09117bb74f93bd8ee3d01b4 --- /dev/null +++ b/components/status-bar.js @@ -0,0 +1,179 @@ +/** + * — colored state icon + title + details (tooltip) + progress row. + * + * State icon: filled circle (FA fa-circle) colored by state: + * idle — grey + * running — blue (subtle pulse) + * success — green + * warning — orange (success with a non-fatal fallback/skip) + * error — red + * + * Title is the brief "what's happening right now" line. Details live in a + * hover tooltip on the icon — used for the longer narrative (which EP, + * what error, etc.). Progress row shows a fractional bar with an optional + * tile count to the right. + * + * Primary API: + * sb.set({ title, state, details, progress, tileCount }) + * - any subset; unspecified fields are left as-is + * - state: 'idle' | 'running' | 'success' | 'warning' | 'error' + * - progress: 0..1, -1 to hide, -2 indeterminate + * - tileCount: { done, total } or null + * + * Convenience aliases preserved for incremental callers: + * sb.message = '...' ≡ sb.set({ title }) + * sb.showProgress(frac) ≡ sb.set({ progress: frac }) + * sb.hideProgress() ≡ sb.set({ progress: -1, tileCount: null }) + * sb.showIndeterminate() ≡ sb.set({ progress: -2 }) + */ + +import { morph } from 'lib/morph'; + +const esc = (s) => String(s).replace(/&/g, '&').replace(//g, '>'); +const STATES = ['idle', 'running', 'success', 'warning', 'error']; + +class StatusBar extends HTMLElement { + #title = ''; + #state = 'idle'; + #details = ''; + #progress = -1; + #tileCount = null; + + connectedCallback() { + this.classList.add('status-bar'); + this.#render(); + } + + set(fields) { + if (fields.title !== undefined) this.#title = fields.title; + if (fields.state !== undefined && STATES.includes(fields.state)) this.#state = fields.state; + if (fields.details !== undefined) this.#details = fields.details; + if (fields.progress !== undefined) this.#progress = fields.progress; + if (fields.tileCount !== undefined) this.#tileCount = fields.tileCount; + this.#render(); + } + + set message(msg) { this.set({ title: msg }); } + showProgress(frac) { this.set({ progress: frac }); } + hideProgress() { this.set({ progress: -1, tileCount: null }); } + showIndeterminate() { this.set({ progress: -2 }); } + + #render() { + const showProgress = this.#progress !== -1; + const indeterminate = this.#progress === -2; + const fillWidth = indeterminate ? 100 : Math.max(0, Math.min(1, this.#progress)) * 100; + const fillAnim = indeterminate ? 'animation: status-indeterminate 1.5s ease-in-out infinite;' : ''; + const tc = this.#tileCount; + const hasTileCount = tc && Number.isFinite(tc.done) && Number.isFinite(tc.total); + const tileText = hasTileCount ? `${tc.done} / ${tc.total}` : ''; + const ariaLabel = this.#details ? `${this.#title} — ${this.#details}` : this.#title; + + morph(this, ` + + +
+ + + ${this.#details ? `${esc(this.#details)}` : ''} + +
${esc(this.#title)}
+ ${showProgress ? ` + + ${hasTileCount ? `${esc(tileText)}` : ''} + ` : ''} +
+ `); + } +} + +customElements.define('status-bar', StatusBar); diff --git a/components/view-mode-controls.js b/components/view-mode-controls.js new file mode 100644 index 0000000000000000000000000000000000000000..1d7a5b7d4c028b5afb712dc5844fec8d3e24983e --- /dev/null +++ b/components/view-mode-controls.js @@ -0,0 +1,97 @@ +/** + * — segmented icon-button radio for the canvas view mode. + * + * Renders one button per mode; the currently-selected mode is marked with + * `aria-pressed="true"`. Clicking a different button switches and emits + * `mode-change` { detail: { mode } }. + * + * Mode keys: 'fit-width' | 'fit-height' | 'one-to-one'. + */ + +const VIEW_MODES = [ + { key: 'fit-width', label: 'Fit Width', icon: 'fa-arrows-left-right' }, + { key: 'fit-height', label: 'Fit Height', icon: 'fa-arrows-up-down' }, + { key: 'one-to-one', label: '1:1', icon: 'fa-vector-square' }, +]; + +class ViewModeControls extends HTMLElement { + #mode = 'fit-width'; + + connectedCallback() { + this.#render(); + this.addEventListener('click', this.#onClick); + } + + get mode() { return this.#mode; } + set mode(value) { + if (!VIEW_MODES.find(m => m.key === value)) return; + if (this.#mode === value) return; + this.#mode = value; + this.#render(); + } + + #onClick = (e) => { + const btn = e.target.closest('button[data-mode]'); + if (!btn) return; + e.stopPropagation(); + if (btn.dataset.mode === this.#mode) return; + this.#mode = btn.dataset.mode; + this.#render(); + this.dispatchEvent(new CustomEvent('mode-change', { detail: { mode: this.#mode } })); + }; + + #render() { + const buttons = VIEW_MODES.map(m => ` + + `).join(''); + this.innerHTML = ` + +
+ ${buttons} +
+ `; + } +} + +customElements.define('view-mode-controls', ViewModeControls); diff --git a/features/bg-removal/bg-removal-app.js b/features/bg-removal/bg-removal-app.js new file mode 100644 index 0000000000000000000000000000000000000000..09bbabf237ee228fae6b1e933400164a6c6eda3a --- /dev/null +++ b/features/bg-removal/bg-removal-app.js @@ -0,0 +1,564 @@ +/** + * — orchestrates the background removal feature. + */ + +import { morph } from 'lib/morph'; +import { canvasToBlobUrl, imageToBlobUrl } from 'lib/canvas'; +import { trackBackendEvents, friendlyBackend, realizedIsGpu } from 'lib/backend-events'; +import 'components/image-drop-zone'; +import 'components/status-bar'; +import 'components/compare-slider'; +import 'components/image-cropper'; +import 'components/view-mode-controls'; +import { BgRemovalEngine } from './bg-removal-engine.js'; + +/** + * Draw a checkerboard pattern + transparent image onto a canvas, return as blob URL. + */ +function checkerboardComposite(transparentCanvas) { + const w = transparentCanvas.width; + const h = transparentCanvas.height; + const c = document.createElement('canvas'); + c.width = w; + c.height = h; + const ctx = c.getContext('2d'); + + const size = 16; + for (let y = 0; y < h; y += size) { + for (let x = 0; x < w; x += size) { + ctx.fillStyle = ((x / size + y / size) & 1) ? '#ccc' : '#fff'; + ctx.fillRect(x, y, size, size); + } + } + + ctx.drawImage(transparentCanvas, 0, 0); + return canvasToBlobUrl(c); +} + +class BgRemovalApp extends HTMLElement { + static BRIA_MODEL_KEY = 'rmbg-1.4'; + + #loadedImage = null; + #running = false; + #engine = new BgRemovalEngine(); + #abortController = null; + #resultBlobUrl = null; + #checkerBlobUrl = null; + #beforeBlobUrl = null; + #transparentBlobUrl = null; + #viewState = { mode: 'fit-width' }; + static #VIEW_MODES = ['fit-width', 'fit-height', 'one-to-one']; + + connectedCallback() { + this.#render(); + this.#setupEvents(); + this.#restoreViewState(); + } + + #q(sel) { return this.querySelector(sel); } + + #cleanup() { + if (this.#resultBlobUrl) { URL.revokeObjectURL(this.#resultBlobUrl); this.#resultBlobUrl = null; } + if (this.#checkerBlobUrl) { URL.revokeObjectURL(this.#checkerBlobUrl); this.#checkerBlobUrl = null; } + if (this.#beforeBlobUrl) { URL.revokeObjectURL(this.#beforeBlobUrl); this.#beforeBlobUrl = null; } + if (this.#transparentBlobUrl) { URL.revokeObjectURL(this.#transparentBlobUrl); this.#transparentBlobUrl = null; } + } + + #applyViewState() { + const mode = this.#viewState.mode; + const isFitHeight = mode === 'fit-height'; + const isOneToOne = mode === 'one-to-one'; + for (const sel of ['image-cropper', 'compare-slider']) { + const el = this.#q(sel); + if (!el) continue; + el.classList.toggle('expanded', isFitHeight); + el.classList.toggle('native-size', isOneToOne); + } + } + + #persistViewState() { + localStorage.setItem('bgremoval_view_mode', this.#viewState.mode); + } + + #setMode(mode) { + if (!BgRemovalApp.#VIEW_MODES.includes(mode)) return; + if (this.#viewState.mode === mode) return; + this.#viewState.mode = mode; + const vmc = this.#q('view-mode-controls'); + if (vmc) vmc.mode = mode; + this.#applyViewState(); + this.#persistViewState(); + } + + #defaultModeForImage(image) { + const vw = window.innerWidth || 1; + const vh = window.innerHeight || 1; + const imgRatio = image.width / image.height; + const vpRatio = vw / vh; + return imgRatio >= vpRatio ? 'fit-width' : 'fit-height'; + } + + #restoreViewState() { + const savedMode = localStorage.getItem('bgremoval_view_mode'); + if (BgRemovalApp.#VIEW_MODES.includes(savedMode)) { + this.#viewState.mode = savedMode; + } + this.#q('view-mode-controls').mode = this.#viewState.mode; + this.#applyViewState(); + } + + #getVisibleCanvasElement() { + for (const sel of ['compare-slider', 'image-cropper', 'image-drop-zone']) { + const el = this.#q(sel); + if (el && el.offsetParent !== null) return el; + } + return null; + } + + #snapCenterVisibleCanvas() { + const el = this.#getVisibleCanvasElement(); + if (!el) return; + requestAnimationFrame(() => { + const rect = el.getBoundingClientRect(); + const vh = window.innerHeight; + const fullyVisible = rect.top >= 0 && rect.bottom <= vh; + if (fullyVisible) return; + el.scrollIntoView({ block: 'center', behavior: 'smooth' }); + }); + } + + #setupEvents() { + const backendEl = this.#q('.backend-select'); + const removeBtn = this.#q('.remove-btn'); + const stopBtn = this.#q('.stop-btn'); + const startOverBtn = this.#q('.startover-btn'); + const backToCropBtn = this.#q('.back-to-crop-btn'); + const clearCropBtn = this.#q('.clear-crop-btn'); + const viewModeControls = this.#q('view-mode-controls'); + const openInTabBtn = this.#q('.open-in-tab-btn'); + const downloadBtn = this.#q('.download-btn'); + const toolbarLeft = this.#q('.canvas-toolbar-left'); + const toolbarRight = this.#q('.canvas-toolbar-right'); + + const statusBar = this.#q('status-bar'); + const dropZone = this.#q('image-drop-zone'); + const cropper = this.#q('image-cropper'); + const compareSlider = this.#q('compare-slider'); + + const showCompareControls = () => { + backToCropBtn.style.display = 'inline-block'; + toolbarRight.hidden = false; + }; + const hideCompareControls = () => { + backToCropBtn.style.display = 'none'; + toolbarRight.hidden = true; + }; + + statusBar.set({ title: '', state: 'idle', details: '', progress: -1, tileCount: null }); + + const idleDetails = (img, crop) => crop + ? `${img.width}\u00d7${img.height}, cropped to ${crop.w}\u00d7${crop.h}. Click Remove Background.` + : `${img.width}\u00d7${img.height}. Drag to crop (optional), then click Remove Background.`; + + const resetToStart = () => { + this.#loadedImage = null; + this.#running = false; + this.#abortController = null; + this.#cleanup(); + removeBtn.disabled = true; + stopBtn.style.display = 'none'; + startOverBtn.style.display = 'none'; + clearCropBtn.style.display = 'none'; + hideCompareControls(); + toolbarLeft.hidden = true; + cropper.hide(); + compareSlider.hide(); + dropZone.show(); + statusBar.set({ title: '', state: 'idle', details: '', progress: -1, tileCount: null }); + }; + + const showReady = () => { + removeBtn.disabled = false; + startOverBtn.style.display = 'inline-block'; + hideCompareControls(); + toolbarLeft.hidden = false; + compareSlider.hide(); + dropZone.hide(); + cropper.show(this.#loadedImage); + const existingCrop = cropper.crop; + clearCropBtn.style.display = existingCrop ? 'inline-block' : 'none'; + statusBar.set({ + title: existingCrop ? 'Crop selected' : 'Image loaded', + state: 'idle', + details: idleDetails(this.#loadedImage, existingCrop), + progress: -1, + tileCount: null, + }); + }; + + dropZone.addEventListener('image-loaded', (e) => { + if (this.#running) { + this.#abortController?.abort(); + this.#running = false; + this.#abortController = null; + stopBtn.style.display = 'none'; + } + this.#loadedImage = e.detail.image; + this.#setMode(this.#defaultModeForImage(this.#loadedImage)); + showReady(); + }); + + cropper.addEventListener('crop-changed', (e) => { + const crop = e.detail.crop; + clearCropBtn.style.display = crop ? 'inline-block' : 'none'; + statusBar.set({ + title: crop ? 'Crop selected' : 'Image loaded', + state: 'idle', + details: idleDetails(this.#loadedImage, crop), + }); + }); + + clearCropBtn.addEventListener('click', () => { + cropper.clearCrop(); + }); + + backToCropBtn.addEventListener('click', () => { + if (this.#running || !this.#loadedImage) return; + showReady(); + }); + + viewModeControls.addEventListener('mode-change', (e) => { + this.#viewState.mode = e.detail.mode; + this.#applyViewState(); + this.#persistViewState(); + this.#snapCenterVisibleCanvas(); + }); + + openInTabBtn.addEventListener('click', () => { + compareSlider.openInTab(); + }); + downloadBtn.addEventListener('click', () => { + compareSlider.download(); + }); + + removeBtn.addEventListener('click', async () => { + if (this.#running || !this.#loadedImage) return; + this.#running = true; + this.#cleanup(); + removeBtn.disabled = true; + stopBtn.style.display = 'inline-block'; + startOverBtn.style.display = 'none'; + clearCropBtn.style.display = 'none'; + hideCompareControls(); + compareSlider.hide(); + + this.#abortController = new AbortController(); + const { signal } = this.#abortController; + const inputImage = cropper.extractImage(); + cropper.style.display = 'none'; + + // runState is monotonic: 'running' \u2192 'warning' (locked once warned). + let runState = 'running'; + const tracker = trackBackendEvents((ev) => { + if (ev.kind === 'attempt') { + statusBar.set({ title: `Loading on ${friendlyBackend(ev.backend)}`, state: runState }); + } else if (ev.kind === 'success') { + statusBar.set({ title: `Running on ${friendlyBackend(ev.backend)}`, state: runState }); + } else if (ev.kind === 'fallback') { + runState = 'warning'; + statusBar.set({ title: `Fallback from ${friendlyBackend(ev.backend)}`, state: runState }); + } else if (ev.kind === 'skipped') { + runState = 'warning'; + statusBar.set({ title: `Skipping ${friendlyBackend(ev.backend)}`, state: runState }); + } + }); + + try { + statusBar.set({ + title: 'Loading model', + state: 'running', + details: '', + progress: 0, + tileCount: null, + }); + await this.#engine.loadModel(BgRemovalApp.BRIA_MODEL_KEY, backendEl.value, (frac, msg) => { + statusBar.set({ progress: frac, details: msg }); + }); + + statusBar.set({ + title: 'Removing background', + state: runState, + details: 'Running inference\u2026', + progress: -2, + }); + + const resultCanvas = await this.#engine.removeBackground(inputImage, signal); + + const w = inputImage.width; + const h = inputImage.height; + const summary = tracker.summary(); + const userWantsGpu = backendEl.value === 'gpu'; + const ranOnCpuDespiteIntent = userWantsGpu && summary.activeBackend && !realizedIsGpu(summary.activeBackend); + const finalState = (summary.hadFallback || summary.hadSkip || ranOnCpuDespiteIntent) ? 'warning' : 'success'; + const via = summary.activeBackend ? ` via ${friendlyBackend(summary.activeBackend)}` : ''; + const detailsLines = [`${w}\u00d7${h}${via}`]; + if (ranOnCpuDespiteIntent && !summary.hadFallback) { + detailsLines.push(`Requested GPU but running on ${friendlyBackend(summary.activeBackend)} (prior fallback this session \u2014 reload to retry GPU).`); + } + if (summary.lines.length) detailsLines.push(...summary.lines); + statusBar.set({ + title: 'Done', + state: finalState, + details: detailsLines.join('\n'), + progress: -1, + tileCount: null, + }); + + this.#transparentBlobUrl = await canvasToBlobUrl(resultCanvas); + this.#checkerBlobUrl = await checkerboardComposite(resultCanvas); + this.#beforeBlobUrl = await imageToBlobUrl(inputImage); + + await compareSlider.show(this.#beforeBlobUrl, this.#checkerBlobUrl, { + downloadSrc: this.#transparentBlobUrl, + downloadName: 'bg_removed.png', + }); + this.#applyViewState(); + showCompareControls(); + + } catch (e) { + if (e.name === 'AbortError') { + statusBar.set({ + title: 'Cancelled', + state: 'idle', + details: 'You stopped this run.', + progress: -1, + tileCount: null, + }); + } else { + console.error(e); + statusBar.set({ + title: 'Error', + state: 'error', + details: e.message || String(e), + progress: -1, + tileCount: null, + }); + } + } finally { + tracker.stop(); + } + + this.#running = false; + this.#abortController = null; + stopBtn.style.display = 'none'; + startOverBtn.style.display = 'inline-block'; + removeBtn.disabled = false; + }); + + stopBtn.addEventListener('click', () => { + this.#abortController?.abort(); + }); + + startOverBtn.addEventListener('click', () => { + if (this.#running) this.#abortController?.abort(); + resetToStart(); + }); + + } + + #render() { + morph(this, ` + + +

+ Background Removal + (in-browser, ONNX Runtime) +

+ +
+ +
+ +
+ + + + +
+ `); + } +} + +customElements.define('bg-removal-app', BgRemovalApp); diff --git a/features/bg-removal/bg-removal-engine.js b/features/bg-removal/bg-removal-engine.js new file mode 100644 index 0000000000000000000000000000000000000000..6d1e2770381eac95d6a7ff1a33e8ee474d948704 --- /dev/null +++ b/features/bg-removal/bg-removal-engine.js @@ -0,0 +1,230 @@ +/** + * BgRemovalEngine — pure inference logic, zero DOM dependency. + * Downloads an ONNX segmentation model, creates a session, + * and runs background removal on an image. + */ + +import { fetchWithProgress } from 'lib/fetch-progress'; +import { dispatchBackendEvent } from 'lib/backend-events'; +import { loadSession } from 'lib/backend'; + +const MODELS = { + 'isnet': { + url: 'https://huggingface.co/onnx-community/ISNet-ONNX/resolve/main/onnx/model_quantized.onnx', + inputSize: 1024, + label: 'IS-Net (General Use, ~42 MB)', + // preprocessor_config: do_rescale=false, mean=[128,128,128], std=[256,256,256] + preprocess(pixel) { return (pixel - 128) / 256; }, + }, + 'rmbg-1.4': { + url: 'https://huggingface.co/briaai/RMBG-1.4/resolve/main/onnx/model_quantized.onnx', + inputSize: 1024, + label: 'BRIA RMBG-1.4 (High Quality, ~44 MB)', + // preprocessor_config: do_rescale=true (1/255), mean=[0.5,0.5,0.5], std=[1,1,1] + preprocess(pixel) { return pixel / 255 - 0.5; }, + }, +}; + +export { MODELS }; + +export class BgRemovalEngine { + #session = null; + #modelBuffer = null; + #currentModelKey = null; + #intent = null; + // Set by loadSession; kept current by #backendListener so a runtime EP + // fallback (worker drops from CoreML to CPU between calls) doesn't leave + // a stale label that the loadModel early-return re-announces later. + #realizedBackend = null; + #backendListener = null; + + get isLoaded() { return this.#session !== null; } + get currentModel() { return this.#currentModelKey; } + get realizedBackend() { return this.#realizedBackend; } + get intent() { return this.#intent; } + + #trackRealizedBackend() { + if (this.#backendListener) return; + this.#backendListener = (e) => { + const d = e?.detail; + if (d && d.kind === 'success' && typeof d.backend === 'string') { + this.#realizedBackend = d.backend; + } + }; + document.addEventListener('aitools:backend-event', this.#backendListener); + } + #untrackRealizedBackend() { + if (!this.#backendListener) return; + document.removeEventListener('aitools:backend-event', this.#backendListener); + this.#backendListener = null; + } + + async loadModel(modelKey, intent = 'cpu', onProgress) { + if (onProgress != null && typeof onProgress !== 'function') { + console.warn('[BgRemovalEngine] Ignoring non-function onProgress callback.', { + type: typeof onProgress, + value: onProgress, + modelKey, + intent, + }); + } + intent = normalizeIntent(intent); + const report = typeof onProgress === 'function' ? onProgress : null; + if (this.#session && this.#currentModelKey === modelKey && this.#intent === intent) { + // Same model + same intent \u2014 re-announce so per-run tracker captures + // the active backend label. + if (this.#realizedBackend) { + dispatchBackendEvent({ kind: 'success', backend: this.#realizedBackend }); + } + return; + } + + const cfg = MODELS[modelKey]; + if (!cfg) throw new Error(`Unknown model: ${modelKey}`); + + // Release old session if switching models or intent. + if (this.#session) { + this.#session.release(); + this.#session = null; + } + if (this.#currentModelKey !== modelKey) { + this.#modelBuffer = null; + } + + if (!this.#modelBuffer) { + this.#modelBuffer = await fetchWithProgress(cfg.url, report); + } + + report?.(1, 'Loading model into runtime\u2026'); + + const { session, realizedBackend } = await loadSession(this.#modelBuffer, intent); + this.#session = session; + this.#intent = intent; + this.#realizedBackend = realizedBackend; + this.#currentModelKey = modelKey; + this.#trackRealizedBackend(); + report?.(1, 'Model loaded.'); + } + + async removeBackground(image, signal) { + if (!this.#session) throw new Error('Model not loaded — call loadModel() first'); + if (signal?.aborted) throw new DOMException('Cancelled', 'AbortError'); + + const cfg = MODELS[this.#currentModelKey]; + const inputSize = cfg.inputSize; + const origW = image.width; + const origH = image.height; + + // --- Resize input to model dimensions --- + const tmpCanvas = document.createElement('canvas'); + tmpCanvas.width = inputSize; + tmpCanvas.height = inputSize; + const tmpCtx = tmpCanvas.getContext('2d'); + tmpCtx.drawImage(image, 0, 0, inputSize, inputSize); + const imageData = tmpCtx.getImageData(0, 0, inputSize, inputSize); + + // --- Convert to CHW Float32 with model-specific normalization --- + const planeSize = inputSize * inputSize; + const float32 = new Float32Array(3 * planeSize); + const px = imageData.data; + const preprocess = cfg.preprocess; + + for (let i = 0; i < planeSize; i++) { + const si = i * 4; + float32[i] = preprocess(px[si]); + float32[planeSize + i] = preprocess(px[si + 1]); + float32[2 * planeSize + i] = preprocess(px[si + 2]); + } + + // Free temp canvas memory + tmpCanvas.width = 0; + tmpCanvas.height = 0; + + if (signal?.aborted) throw new DOMException('Cancelled', 'AbortError'); + + // --- Run inference --- + const tensor = new ort.Tensor('float32', float32, [1, 3, inputSize, inputSize]); + const inputName = this.#session.inputNames[0]; + const outputName = this.#session.outputNames[0]; + + const results = await this.#session.run({ [inputName]: tensor }); + const rawMask = results[outputName].data; + + tensor.dispose(); + + // --- Sigmoid + clamp to 0-1 --- + const maskSize = inputSize * inputSize; + const mask = new Float32Array(maskSize); + for (let i = 0; i < maskSize; i++) { + const v = rawMask[i]; + // Apply sigmoid if value is outside 0-1 (raw logits) + mask[i] = (v < 0 || v > 1) ? 1 / (1 + Math.exp(-v)) : v; + } + + results[outputName].dispose(); + + // --- Write mask to canvas, resize to original dimensions --- + const maskCanvas = document.createElement('canvas'); + maskCanvas.width = inputSize; + maskCanvas.height = inputSize; + const maskCtx = maskCanvas.getContext('2d'); + const maskImgData = maskCtx.createImageData(inputSize, inputSize); + for (let i = 0; i < maskSize; i++) { + const v = Math.round(mask[i] * 255); + maskImgData.data[i * 4] = v; + maskImgData.data[i * 4 + 1] = v; + maskImgData.data[i * 4 + 2] = v; + maskImgData.data[i * 4 + 3] = 255; + } + maskCtx.putImageData(maskImgData, 0, 0); + + // Resize mask to original image dimensions (bilinear via drawImage) + const fullMaskCanvas = document.createElement('canvas'); + fullMaskCanvas.width = origW; + fullMaskCanvas.height = origH; + const fullMaskCtx = fullMaskCanvas.getContext('2d'); + fullMaskCtx.drawImage(maskCanvas, 0, 0, origW, origH); + const fullMaskData = fullMaskCtx.getImageData(0, 0, origW, origH); + + // Free small mask canvas + maskCanvas.width = 0; + maskCanvas.height = 0; + + // --- Apply mask as alpha channel to original image --- + const resultCanvas = document.createElement('canvas'); + resultCanvas.width = origW; + resultCanvas.height = origH; + const resultCtx = resultCanvas.getContext('2d'); + resultCtx.drawImage(image, 0, 0); + const resultData = resultCtx.getImageData(0, 0, origW, origH); + + for (let i = 0; i < origW * origH; i++) { + resultData.data[i * 4 + 3] = fullMaskData.data[i * 4]; // R channel = mask + } + resultCtx.putImageData(resultData, 0, 0); + + // Free full mask canvas + fullMaskCanvas.width = 0; + fullMaskCanvas.height = 0; + + return resultCanvas; + } + + release() { + this.#untrackRealizedBackend(); + if (this.#session) { + this.#session.release(); + this.#session = null; + } + this.#modelBuffer = null; + this.#currentModelKey = null; + this.#intent = null; + this.#realizedBackend = null; + } +} + +function normalizeIntent(value) { + if (value === 'webgpu' || value === 'gpu') return 'gpu'; + if (value === 'wasm' || value === 'cpu') return 'cpu'; + return 'cpu'; +} diff --git a/features/upscaler/custom-models/custom-model-inspector.js b/features/upscaler/custom-models/custom-model-inspector.js new file mode 100644 index 0000000000000000000000000000000000000000..efc6bac913f3d8a005afde962eb90e1da43575af --- /dev/null +++ b/features/upscaler/custom-models/custom-model-inspector.js @@ -0,0 +1,336 @@ +import { readMetaEntry, isFp16InputType } from 'lib/onnx-meta'; + +function normalizeDims(dims) { + if (!Array.isArray(dims)) return []; + return dims.map((d) => (typeof d === 'number' ? d : Number.NaN)); +} + +/** + * The ValueMetadata shape array is `shape` in ORT-Web 1.20+; older + * versions called the same field `dimensions`. Read either and let the + * caller handle the array of (number | string) entries. + */ +function readMetaShape(meta) { + return meta?.shape ?? meta?.dimensions ?? null; +} + +function detectLayout(dims) { + if (dims.length !== 4) return 'unknown'; + const cAt1 = dims[1]; + const cAt3 = dims[3]; + if (cAt1 === 3 || cAt1 === 1) return 'nchw'; + if (cAt3 === 3 || cAt3 === 1) return 'nhwc'; + return 'unknown'; +} + +function inferScaleFromStaticDims(inDims, outDims, layout) { + if (inDims.length !== 4 || outDims.length !== 4) return null; + let inH, inW, outH, outW; + if (layout === 'nhwc') { + inH = inDims[1]; + inW = inDims[2]; + outH = outDims[1]; + outW = outDims[2]; + } else { + inH = inDims[2]; + inW = inDims[3]; + outH = outDims[2]; + outW = outDims[3]; + } + if (![inH, inW, outH, outW].every(Number.isFinite)) return null; + if (inH <= 0 || inW <= 0) return null; + const sx = outW / inW; + const sy = outH / inH; + if (!Number.isFinite(sx) || !Number.isFinite(sy) || sx !== sy) return null; + if (sx < 1 || sx > 16) return null; + return Math.round(sx); +} + +function rangeFromInputType(inputType) { + if (typeof inputType !== 'string') return 1; + if (inputType.includes('uint8') || inputType.includes('int8')) return 255; + return 1; +} + +function createProbeTensor(ort, inputType, layout, size, range) { + const dims = layout === 'nhwc' ? [1, size, size, 3] : [1, 3, size, size]; + const count = dims.reduce((acc, v) => acc * v, 1); + const type = String(inputType || 'float32').toLowerCase(); + if (type.includes('uint8')) { + const data = new Uint8Array(count); + data.fill(range === 255 ? 128 : 1); + return new ort.Tensor('uint8', data, dims); + } + if (type.includes('int8')) { + const data = new Int8Array(count); + data.fill(0); + return new ort.Tensor('int8', data, dims); + } + if (type.includes('float16')) { + const data = new Uint16Array(count); + return new ort.Tensor('float16', data, dims); + } + const data = new Float32Array(count); + data.fill(range === 255 ? 128 : 0.5); + return new ort.Tensor('float32', data, dims); +} + +function getPrimaryOutput(results, outputName) { + if (!results || typeof results !== 'object') return null; + if (outputName && results[outputName]) return results[outputName]; + const first = Object.values(results)[0]; + return first || null; +} + +function inferScaleFromProbeOutput(layout, inputSize, outDims) { + if (!Array.isArray(outDims) || outDims.length !== 4) return null; + const dims = normalizeDims(outDims); + const outH = layout === 'nhwc' ? dims[1] : dims[2]; + const outW = layout === 'nhwc' ? dims[2] : dims[3]; + if (![outH, outW].every(Number.isFinite) || inputSize <= 0) return null; + const sx = outW / inputSize; + const sy = outH / inputSize; + if (!Number.isFinite(sx) || !Number.isFinite(sy) || sx !== sy) return null; + if (sx < 1 || sx > 16) return null; + return Math.round(sx); +} + +function inferMultipleFromReshapeError(rawError) { + const raw = String(rawError || ''); + const match = raw.match(/requested shape:\{([^}]*)\}/i); + if (!match) return null; + const requested = match[1] + .split(',') + .map((v) => parseInt(v.trim(), 10)) + .filter(Number.isFinite); + const pow2 = requested.filter((d) => d > 1 && d <= 256 && (d & (d - 1)) === 0); + if (!pow2.length) return null; + return Math.max(...pow2); +} + +/** + * Detect a hard upper bound on input size by probing at increasing sizes. + * Some ONNX exports (notably PyTorch traces of models with shape-dependent + * conditionals — e.g. DAT-style window attention) bake in window counts as + * Constants and only accept inputs near the trace size. The auto-detect + * sweet-spot probe at 64 alone can't catch this, so we sweep a few common + * tile sizes upward and report the largest size that still runs. + * + * Returns `null` if the model worked at every probed size (i.e. no upper + * bound was found within the tested range). + */ +async function probeMaxInputSize(session, ort, baseProbeArgs, knownWorkingSize, report) { + const candidates = [128, 256]; + let lastWorking = knownWorkingSize; + let foundUpperBound = false; + for (const size of candidates) { + if (size <= lastWorking) continue; + report?.(`testing maximum tile size at ${size}\u00d7${size}…`); + const probe = await runProbe(session, ort, { ...baseProbeArgs, size }); + if (probe.ok) { + lastWorking = size; + } else { + foundUpperBound = true; + break; + } + } + return foundUpperBound ? lastWorking : null; +} + +async function runProbe(session, ort, { inputName, outputName, inputType, layout, size, range }) { + const inputTensor = createProbeTensor(ort, inputType, layout, size, range); + try { + const results = await session.run({ [inputName]: inputTensor }); + const output = getPrimaryOutput(results, outputName); + const outDims = output?.dims || []; + for (const tensor of Object.values(results)) { + try { tensor?.dispose?.(); } catch {} + } + return { ok: true, outDims }; + } catch (error) { + return { ok: false, error }; + } finally { + try { inputTensor.dispose?.(); } catch {} + } +} + +export class CustomModelInspector { + async inspectFile(file, { onProgress } = {}) { + if (!(file instanceof File)) { + throw new Error('Expected an ONNX file.'); + } + const report = typeof onProgress === 'function' ? onProgress : null; + const ort = globalThis.ort; + if (!ort?.InferenceSession) { + return { + scale: 4, + range: 1, + layout: 'nchw', + multipleOf: 1, + maxTileSize: null, + inputType: 'float32', + precision: 'fp32', + scaleSource: 'default', + multipleOfSource: 'default', + notes: ['ONNX Runtime not loaded yet; using defaults (4x, range 1).'], + }; + } + + report?.('reading ONNX metadata and loading session…'); + const bytes = await file.arrayBuffer(); + // Probe on WebGPU first when available — fp16 models will only run there, + // and fp32 models work fine on either EP, so WebGPU is the right default. + // Fall back to WASM when WebGPU is unavailable or session creation fails. + const hasWebGpu = !!(navigator.gpu && ort.env?.webgpu); + let session = null; + let probeBackend = null; + if (hasWebGpu) { + try { + report?.('loading session on WebGPU…'); + session = await ort.InferenceSession.create(bytes, { + executionProviders: [{ name: 'webgpu', preferredLayout: 'NCHW' }], + graphOptimizationLevel: 'all', + }); + probeBackend = 'webgpu'; + } catch (err) { + console.warn('[CustomModelInspector] WebGPU probe session failed, falling back to WASM:', err); + } + } + if (!session) { + report?.('loading session on CPU/WASM…'); + session = await ort.InferenceSession.create(bytes, { + executionProviders: ['wasm'], + graphOptimizationLevel: 'all', + }); + probeBackend = 'wasm'; + } + try { + const inputName = session.inputNames?.[0]; + const outputName = session.outputNames?.[0]; + if (!inputName) { + return { + scale: 4, + range: 1, + layout: 'nchw', + multipleOf: 1, + maxTileSize: null, + inputType: 'float32', + precision: 'fp32', + scaleSource: 'default', + multipleOfSource: 'default', + notes: ['Model has no detectable input tensor; using defaults.'], + }; + } + const inMeta = readMetaEntry(session.inputMetadata, inputName, 0); + const outMeta = readMetaEntry(session.outputMetadata, outputName, 0); + const inDims = normalizeDims(readMetaShape(inMeta)); + const outDims = normalizeDims(readMetaShape(outMeta)); + const layout = detectLayout(inDims); + const inputType = inMeta?.type || 'float32'; + const range = rangeFromInputType(inputType); + const precision = isFp16InputType(inputType) ? 'fp16' : 'fp32'; + const notes = []; + if (precision === 'fp16' && probeBackend !== 'webgpu') { + notes.push('This model is fp16 but probing fell back to CPU/WASM, which has limited fp16 op coverage. Probe results may be unreliable; the model itself will require WebGPU at run time.'); + } + const layoutCandidates = layout === 'unknown' + ? ['nchw', 'nhwc'] + : [layout, layout === 'nchw' ? 'nhwc' : 'nchw']; + + let chosenLayout = layout === 'nhwc' ? 'nhwc' : 'nchw'; + let probeScale = null; + let probeWorked = false; + for (const candidateLayout of layoutCandidates) { + report?.(`testing ${candidateLayout.toUpperCase()} layout at 64\u00d764…`); + const probe = await runProbe(session, ort, { + inputName, + outputName, + inputType, + layout: candidateLayout, + size: 64, + range, + }); + if (!probe.ok) continue; + probeWorked = true; + chosenLayout = candidateLayout; + probeScale = inferScaleFromProbeOutput(candidateLayout, 64, probe.outDims); + break; + } + if (!probeWorked) { + notes.push('Layout probe failed for both NCHW and NHWC; using defaults.'); + } else if (chosenLayout === 'nhwc') { + notes.push('Detected NHWC layout from probe; this can run, but may be slower than NCHW.'); + } + + const staticScale = inferScaleFromStaticDims(inDims, outDims, chosenLayout); + const scale = probeScale || staticScale || 4; + const scaleSource = probeScale ? 'probe' : staticScale ? 'metadata' : 'default'; + + let multipleOf = 1; + let multipleOfSource = 'default'; + if (probeWorked) { + report?.('checking window-size alignment at 60\u00d760…'); + const mismatchProbe = await runProbe(session, ort, { + inputName, + outputName, + inputType, + layout: chosenLayout, + size: 60, + range, + }); + if (!mismatchProbe.ok) { + const inferred = inferMultipleFromReshapeError(mismatchProbe.error?.message); + if (Number.isFinite(inferred) && inferred > 1) { + multipleOf = inferred; + multipleOfSource = 'probe'; + } + } + } + + let maxTileSize = null; + if (probeWorked) { + maxTileSize = await probeMaxInputSize( + session, + ort, + { inputName, outputName, inputType, layout: chosenLayout, range }, + 64, + report, + ); + if (Number.isFinite(maxTileSize)) { + // Some exports (e.g. DAT with window-count constants baked in) only + // accept inputs in a narrow band around the trace size. To keep + // every padded edge tile inside that band, force the alignment to + // equal the discovered max — combined with a tile-size cap in the + // engine, every inference then runs at exactly maxTileSize. + if (maxTileSize > multipleOf) { + multipleOf = maxTileSize; + multipleOfSource = 'probe'; + } + notes.push( + `Model rejected inputs larger than ${maxTileSize}\u00d7${maxTileSize}; tile size will be capped at ${maxTileSize}.`, + ); + } + } + + return { + scale, + range, + layout: chosenLayout, + multipleOf, + maxTileSize, + inputType, + precision, + scaleSource, + multipleOfSource, + notes, + }; + } finally { + try { session.release?.(); } catch {} + } + } +} + +export async function inspectCustomModelFile(file, opts) { + const inspector = new CustomModelInspector(); + return inspector.inspectFile(file, opts); +} diff --git a/features/upscaler/custom-models/custom-model-store.js b/features/upscaler/custom-models/custom-model-store.js new file mode 100644 index 0000000000000000000000000000000000000000..50973c4d497e081ac7edae46219cb8976c3e6ca8 --- /dev/null +++ b/features/upscaler/custom-models/custom-model-store.js @@ -0,0 +1,205 @@ +import { CUSTOM_MODEL_URL_PREFIX, getModelCache } from 'lib/fetch-progress'; + +const CUSTOM_MODELS_KEY = 'upscaler_custom_models'; + +function sanitizeScale(scale) { + const parsed = parseInt(scale, 10); + if (!Number.isFinite(parsed) || parsed < 1) return 1; + if (parsed > 16) return 16; + return parsed; +} + +function sanitizeRange(range) { + const parsed = parseInt(range, 10); + if (parsed === 255) return 255; + return 1; +} + +function sanitizeLayout(layout) { + const normalized = String(layout || '').toLowerCase(); + if (normalized === 'nhwc') return 'nhwc'; + return 'nchw'; +} + +function sanitizeMultipleOf(multipleOf) { + const parsed = parseInt(multipleOf, 10); + if (!Number.isFinite(parsed) || parsed < 1) return 1; + if (parsed > 256) return 256; + return parsed; +} + +function sanitizeMaxTileSize(maxTileSize) { + if (maxTileSize == null || maxTileSize === '') return null; + const parsed = parseInt(maxTileSize, 10); + if (!Number.isFinite(parsed) || parsed < 1) return null; + if (parsed > 4096) return 4096; + return parsed; +} + +function sanitizePrecision(precision) { + return String(precision || '').toLowerCase() === 'fp16' ? 'fp16' : 'fp32'; +} + +function sanitizeUpscaleBefore(value) { + if (value === true || value === 'true' || value === 1 || value === '1') return true; + return false; +} + +function sanitizeTileBlend(value) { + return value === 'gaussian' ? 'gaussian' : 'overlapCrop'; +} + +function normalizeLabel(label) { + const trimmed = (label || '').trim(); + return trimmed || 'Custom ONNX'; +} + +function toModelRecord(raw = {}) { + const id = String(raw.id || ''); + if (!id) return null; + const scale = sanitizeScale(raw.scale); + const range = sanitizeRange(raw.range); + const layout = sanitizeLayout(raw.layout); + const multipleOf = sanitizeMultipleOf(raw.multipleOf); + const maxTileSize = sanitizeMaxTileSize(raw.maxTileSize); + const precision = sanitizePrecision(raw.precision); + const upscaleBefore = sanitizeUpscaleBefore(raw.upscaleBefore); + const tileBlend = sanitizeTileBlend(raw.tileBlend); + const sizeBytes = Number.isFinite(raw.sizeBytes) ? Math.max(0, raw.sizeBytes) : 0; + const sizeMB = Number((sizeBytes / (1024 * 1024)).toFixed(1)); + return { + id, + url: `${CUSTOM_MODEL_URL_PREFIX}${id}`, + label: normalizeLabel(raw.label), + scale, + range, + layout, + multipleOf, + maxTileSize, + precision, + upscaleBefore, + tileBlend, + sizeBytes, + sizeMB, + custom: true, + }; +} + +function readStoredRecords() { + try { + const json = localStorage.getItem(CUSTOM_MODELS_KEY); + if (!json) return []; + const parsed = JSON.parse(json); + if (!Array.isArray(parsed)) return []; + return parsed + .map(toModelRecord) + .filter(Boolean); + } catch { + return []; + } +} + +function persistRecords(records) { + const payload = records.map(({ id, label, scale, range, layout, multipleOf, maxTileSize, precision, upscaleBefore, tileBlend, sizeBytes }) => ({ + id, + label, + scale, + range, + layout, + multipleOf, + maxTileSize, + precision, + upscaleBefore, + tileBlend, + sizeBytes, + })); + localStorage.setItem(CUSTOM_MODELS_KEY, JSON.stringify(payload)); +} + +export function listCustomModels() { + return readStoredRecords(); +} + +export function getUploadCustomOptionHTML() { + return ''; +} + +export function getCustomModelByUrl(url) { + if (!url || typeof url !== 'string') return null; + return readStoredRecords().find((model) => model.url === url) || null; +} + +export async function saveCustomModel({ file, label, scale, range, layout, multipleOf, maxTileSize, precision, upscaleBefore, tileBlend }) { + if (!(file instanceof File)) { + throw new Error('Missing ONNX file for custom model upload.'); + } + const idSeed = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`; + const id = `custom-${idSeed}`; + const url = `${CUSTOM_MODEL_URL_PREFIX}${id}`; + const bytes = await file.arrayBuffer(); + + const cache = await getModelCache(); + if (!cache) { + throw new Error('Browser Cache API is unavailable, cannot store custom model.'); + } + await cache.put(url, new Response(bytes, { + headers: { + 'content-type': 'application/octet-stream', + 'content-length': String(bytes.byteLength), + }, + })); + + const records = readStoredRecords(); + const model = toModelRecord({ + id, label, scale, range, layout, multipleOf, maxTileSize, + precision, upscaleBefore, tileBlend, + sizeBytes: bytes.byteLength, + }); + records.unshift(model); + persistRecords(records); + return model; +} + +/** + * Update an existing custom model's metadata (label / scale / range / layout / + * multipleOf). The cached ONNX file and id/url are preserved. Unspecified + * fields are left unchanged. Returns the updated model record, or `null` if + * no model matches `url`. + */ +export function updateCustomModelByUrl(url, updates = {}) { + if (!url || typeof url !== 'string') return null; + const records = readStoredRecords(); + const index = records.findIndex((entry) => entry.url === url); + if (index === -1) return null; + + const current = records[index]; + const merged = toModelRecord({ + id: current.id, + label: 'label' in updates ? updates.label : current.label, + scale: 'scale' in updates ? updates.scale : current.scale, + range: 'range' in updates ? updates.range : current.range, + layout: 'layout' in updates ? updates.layout : current.layout, + multipleOf: 'multipleOf' in updates ? updates.multipleOf : current.multipleOf, + maxTileSize: 'maxTileSize' in updates ? updates.maxTileSize : current.maxTileSize, + precision: 'precision' in updates ? updates.precision : current.precision, + upscaleBefore: 'upscaleBefore' in updates ? updates.upscaleBefore : current.upscaleBefore, + tileBlend: 'tileBlend' in updates ? updates.tileBlend : current.tileBlend, + sizeBytes: current.sizeBytes, + }); + records[index] = merged; + persistRecords(records); + return merged; +} + +export async function deleteCustomModelByUrl(url) { + if (!url || typeof url !== 'string') return false; + const records = readStoredRecords(); + const model = records.find((entry) => entry.url === url); + if (!model) return false; + + const cache = await getModelCache(); + await cache?.delete(url); + + persistRecords(records.filter((entry) => entry.id !== model.id)); + return true; +} diff --git a/features/upscaler/custom-models/custom-model-upload-dialog.js b/features/upscaler/custom-models/custom-model-upload-dialog.js new file mode 100644 index 0000000000000000000000000000000000000000..cb5d7ddfccb0dd92bb4c77d32d53dee139f4a468 --- /dev/null +++ b/features/upscaler/custom-models/custom-model-upload-dialog.js @@ -0,0 +1,460 @@ +/** + * — modal for uploading a custom ONNX model. + * + * Self-contained UX: file selection, automatic ONNX inspection, manual + * overrides for scale / range / layout / multiple-of, validation, and save + * via the custom-model store. + * + * Usage: + * const dialog = document.querySelector('custom-model-upload-dialog'); + * const model = await dialog.open({ defaultScale: 4 }); + * if (model) { ... } else { user cancelled } + */ + +import { morph } from 'lib/morph'; +import { saveCustomModel, updateCustomModelByUrl } from './custom-model-store.js'; +import { inspectCustomModelFile } from './custom-model-inspector.js'; + +class CustomModelUploadDialog extends HTMLElement { + connectedCallback() { + this.classList.add('custom-model-upload-dialog'); + this.#render(); + } + + /** + * Show the modal and resolve with the saved CustomModel — or null if the + * user cancelled or closed the dialog. + * + * When `editModel` is provided, the dialog opens in edit mode: the file + * picker is hidden, fields are pre-filled, auto-detection is skipped, and + * Save updates the existing record's metadata in place. + * + * @param {{ defaultScale?: number, editModel?: import('./custom-model-store.js').CustomModel }} [opts] + */ + open({ defaultScale = 4, editModel = null } = {}) { + const dialog = this.querySelector('dialog'); + const form = this.querySelector('.custom-model-form'); + const titleEl = this.querySelector('.custom-model-title'); + const fileLabel = this.querySelector('.custom-model-file-label'); + const fileInput = this.querySelector('.custom-model-file'); + const analyzeRow = this.querySelector('.custom-model-analyze-row'); + const analyzeBtn = this.querySelector('.custom-model-analyze-btn'); + const labelInput = this.querySelector('.custom-model-label'); + const scaleInput = this.querySelector('.custom-model-scale'); + const rangeInput = this.querySelector('.custom-model-range'); + const layoutInput = this.querySelector('.custom-model-layout'); + const multipleInput = this.querySelector('.custom-model-multiple'); + const maxTileInput = this.querySelector('.custom-model-maxtile'); + const precisionInput = this.querySelector('.custom-model-precision'); + const upscaleBeforeInput = this.querySelector('.custom-model-upscalebefore'); + const tileBlendInput = this.querySelector('.custom-model-tileblend'); + const sizeLabel = this.querySelector('.custom-model-size'); + const detectLabel = this.querySelector('.custom-model-detected'); + const errorLabel = this.querySelector('.custom-model-error'); + const saveBtn = this.querySelector('.custom-model-save-btn'); + const cancelBtn = this.querySelector('.custom-model-cancel-btn'); + + const isEdit = !!editModel; + const ANALYZE_BTN_HTML = ' Analyze model'; + titleEl.textContent = isEdit ? 'Edit custom ONNX model' : 'Upload custom ONNX model'; + fileLabel.hidden = isEdit; + fileInput.required = !isEdit; + analyzeRow.hidden = isEdit; + detectLabel.hidden = isEdit; + analyzeBtn.innerHTML = ANALYZE_BTN_HTML; + analyzeBtn.disabled = true; + saveBtn.textContent = isEdit ? 'Save changes' : 'Save model'; + + fileInput.value = ''; + if (isEdit) { + labelInput.value = editModel.label || ''; + scaleInput.value = String(editModel.scale ?? defaultScale); + rangeInput.value = String(editModel.range === 255 ? 255 : 1); + layoutInput.value = editModel.layout === 'nhwc' ? 'nhwc' : 'nchw'; + multipleInput.value = String(Math.max(1, editModel.multipleOf || 1)); + maxTileInput.value = editModel.maxTileSize != null ? String(editModel.maxTileSize) : ''; + precisionInput.value = editModel.precision === 'fp16' ? 'fp16' : 'fp32'; + upscaleBeforeInput.value = editModel.upscaleBefore ? 'true' : 'false'; + tileBlendInput.value = editModel.tileBlend === 'gaussian' ? 'gaussian' : 'overlapCrop'; + sizeLabel.textContent = editModel.sizeMB != null + ? `Model size: ~${editModel.sizeMB} MB` + : 'Model size: -'; + } else { + labelInput.value = ''; + scaleInput.value = String(defaultScale); + rangeInput.value = '1'; + layoutInput.value = 'nchw'; + multipleInput.value = '1'; + maxTileInput.value = ''; + precisionInput.value = 'fp32'; + upscaleBeforeInput.value = 'false'; + tileBlendInput.value = 'overlapCrop'; + sizeLabel.textContent = 'Model size: -'; + } + errorLabel.textContent = ''; + detectLabel.innerHTML = ''; + saveBtn.disabled = false; + + return new Promise((resolve) => { + let settled = false; + let inspectSeq = 0; + const cleanup = () => { + form.removeEventListener('submit', onSubmit); + fileInput.removeEventListener('change', onFileChange); + analyzeBtn.removeEventListener('click', onAnalyzeClick); + cancelBtn.removeEventListener('click', onCancel); + dialog.removeEventListener('cancel', onCancel); + dialog.removeEventListener('close', onClose); + }; + const finish = (result) => { + if (settled) return; + settled = true; + cleanup(); + resolve(result); + }; + const onFileChange = () => { + // Bumping inspectSeq cancels any in-flight analysis whose result is + // about to come back: we don't want stale probe data overwriting + // form values for the file the user just switched to. + ++inspectSeq; + const file = fileInput.files?.[0]; + errorLabel.textContent = ''; + if (!file) { + sizeLabel.textContent = 'Model size: -'; + detectLabel.innerHTML = ''; + analyzeBtn.disabled = true; + analyzeBtn.innerHTML = ANALYZE_BTN_HTML; + return; + } + const sizeMB = (file.size / (1024 * 1024)).toFixed(1); + sizeLabel.textContent = `Model size: ~${sizeMB} MB`; + if (!labelInput.value.trim()) { + labelInput.value = file.name.replace(/\.onnx$/i, ''); + } + const sizeHint = parseFloat(sizeMB) > 50 + ? ' (this model is large — probing may take 30s+)' + : ' (probing typically takes 5–20s)'; + detectLabel.innerHTML = `Auto-detect: ready — click Analyze model to probe the file${sizeHint}.`; + analyzeBtn.disabled = false; + analyzeBtn.innerHTML = ANALYZE_BTN_HTML; + }; + const onAnalyzeClick = () => { + const file = fileInput.files?.[0]; + if (!file) return; + const seq = ++inspectSeq; + errorLabel.textContent = ''; + analyzeBtn.disabled = true; + analyzeBtn.innerHTML = ' Analyzing…'; + saveBtn.disabled = true; + detectLabel.textContent = 'Auto-detect: starting — running inference probes (WebGPU when available, otherwise CPU/WASM); this can take a while on large models.'; + inspectCustomModelFile(file, { + onProgress: (message) => { + if (seq !== inspectSeq || settled) return; + detectLabel.textContent = `Auto-detect: ${message}`; + }, + }).then((result) => { + if (seq !== inspectSeq || settled) return; + if (Number.isFinite(result?.scale)) { + scaleInput.value = String(result.scale); + } + rangeInput.value = String(result?.range === 255 ? 255 : 1); + layoutInput.value = result?.layout === 'nhwc' ? 'nhwc' : 'nchw'; + if (Number.isFinite(result?.multipleOf)) { + multipleInput.value = String(Math.max(1, result.multipleOf)); + } + maxTileInput.value = Number.isFinite(result?.maxTileSize) + ? String(result.maxTileSize) + : ''; + precisionInput.value = result?.precision === 'fp16' ? 'fp16' : 'fp32'; + const parts = []; + if (result?.layout) parts.push(`layout ${result.layout.toUpperCase()}`); + if (Number.isFinite(result?.multipleOf)) { + const suffix = result?.multipleOfSource === 'probe' ? ' (probed)' : ''; + parts.push(`multiple ${result.multipleOf}${suffix}`); + } + if (Number.isFinite(result?.maxTileSize)) { + parts.push(`max tile ${result.maxTileSize}\u00d7${result.maxTileSize} (probed)`); + } + if (result?.inputType) parts.push(`input ${result.inputType}`); + if (Number.isFinite(result?.scale)) { + const suffix = result?.scaleSource === 'probe' ? ' (probed)' : result?.scaleSource === 'metadata' ? ' (metadata)' : ' (default)'; + parts.push(`scale ${result.scale}x${suffix}`); + } + detectLabel.textContent = parts.length + ? `Auto-detected: ${parts.join(', ')}.` + : 'Auto-detect finished with defaults.'; + if (Array.isArray(result?.notes) && result.notes.length) { + errorLabel.textContent = result.notes[0]; + } + analyzeBtn.disabled = false; + analyzeBtn.innerHTML = ' Re-analyze'; + saveBtn.disabled = false; + }).catch((err) => { + if (seq !== inspectSeq || settled) return; + detectLabel.textContent = 'Auto-detect failed; you can adjust the fields manually and save anyway.'; + errorLabel.textContent = err?.message || 'Could not inspect model metadata.'; + analyzeBtn.disabled = false; + analyzeBtn.innerHTML = ANALYZE_BTN_HTML; + saveBtn.disabled = false; + }); + }; + const onCancel = (e) => { + e?.preventDefault?.(); + if (dialog.open) dialog.close(); + finish(null); + }; + const onClose = () => finish(null); + const onSubmit = async (e) => { + e.preventDefault(); + errorLabel.textContent = ''; + if (isEdit) { + saveBtn.disabled = true; + try { + const model = updateCustomModelByUrl(editModel.url, { + label: labelInput.value, + scale: scaleInput.value, + range: rangeInput.value, + layout: layoutInput.value, + multipleOf: multipleInput.value, + maxTileSize: maxTileInput.value, + precision: precisionInput.value, + upscaleBefore: upscaleBeforeInput.value === 'true', + tileBlend: tileBlendInput.value, + }); + if (!model) { + errorLabel.textContent = 'Model not found; it may have been removed.'; + saveBtn.disabled = false; + return; + } + if (dialog.open) dialog.close(); + finish(model); + } catch (err) { + errorLabel.textContent = err?.message || 'Failed to update model.'; + saveBtn.disabled = false; + } + return; + } + const file = fileInput.files?.[0]; + if (!file) { + errorLabel.textContent = 'Choose an ONNX model file first.'; + return; + } + if (!/\.onnx$/i.test(file.name)) { + errorLabel.textContent = 'Only .onnx files are supported.'; + return; + } + saveBtn.disabled = true; + try { + const model = await saveCustomModel({ + file, + label: labelInput.value, + scale: scaleInput.value, + range: rangeInput.value, + layout: layoutInput.value, + multipleOf: multipleInput.value, + maxTileSize: maxTileInput.value, + precision: precisionInput.value, + upscaleBefore: upscaleBeforeInput.value === 'true', + tileBlend: tileBlendInput.value, + }); + if (dialog.open) dialog.close(); + finish(model); + } catch (err) { + errorLabel.textContent = err?.message || 'Failed to save model.'; + saveBtn.disabled = false; + } + }; + + form.addEventListener('submit', onSubmit); + if (!isEdit) { + fileInput.addEventListener('change', onFileChange); + analyzeBtn.addEventListener('click', onAnalyzeClick); + } + cancelBtn.addEventListener('click', onCancel); + dialog.addEventListener('cancel', onCancel); + dialog.addEventListener('close', onClose); + dialog.showModal(); + }); + } + + #render() { + morph(this, ` + + +
+

Upload custom ONNX model

+ +
+ + + Probe model to auto-fill values. + +
+
+ + + + + + + + + +
+
Auto-detect: waiting for model file…
+
+ Model size: - +
+
+
+ + +
+
+
+ `); + } +} + +customElements.define('custom-model-upload-dialog', CustomModelUploadDialog); diff --git a/features/upscaler/engine/face-detector-engine.js b/features/upscaler/engine/face-detector-engine.js new file mode 100644 index 0000000000000000000000000000000000000000..75dd92a310686d3ccb14394c9d566b02c82b71b1 --- /dev/null +++ b/features/upscaler/engine/face-detector-engine.js @@ -0,0 +1,368 @@ +import { fetchWithProgress } from 'lib/fetch-progress'; +import { loadSession } from 'lib/backend'; +import { dispatchBackendEvent } from 'lib/backend-events'; + +const DETECTORS = { + 'face-yunet': { + label: 'Face (YuNet)', + url: 'https://huggingface.co/opencv/face_detection_yunet/resolve/main/face_detection_yunet_2023mar.onnx', + inputWidth: 640, + inputHeight: 640, + scoreThreshold: 0.7, + iouThreshold: 0.3, + topK: 20, + }, +}; + +export { DETECTORS }; + +function clamp(v, min, max) { + return v < min ? min : v > max ? max : v; +} + + +function tensorToRows(tensor) { + const dims = tensor.dims || []; + const data = tensor.data; + if (!data || !dims.length) return null; + + // [N, C] + if (dims.length === 2) { + return { + rows: dims[0], + cols: dims[1], + at: (row, col) => data[row * dims[1] + col], + }; + } + + // [1, N, C] + if (dims.length === 3 && dims[0] === 1) { + return { + rows: dims[1], + cols: dims[2], + at: (row, col) => data[row * dims[2] + col], + }; + } + + return null; +} + +function nms(boxes, iouThreshold, topK) { + const sorted = [...boxes].sort((a, b) => b.score - a.score); + const kept = []; + + function iou(a, b) { + const x1 = Math.max(a.x, b.x); + const y1 = Math.max(a.y, b.y); + const x2 = Math.min(a.x + a.w, b.x + b.w); + const y2 = Math.min(a.y + a.h, b.y + b.h); + const iw = Math.max(0, x2 - x1); + const ih = Math.max(0, y2 - y1); + const inter = iw * ih; + const union = a.w * a.h + b.w * b.h - inter; + return union <= 0 ? 0 : inter / union; + } + + for (const cand of sorted) { + if (kept.length >= topK) break; + let suppressed = false; + for (const k of kept) { + if (iou(cand, k) > iouThreshold) { + suppressed = true; + break; + } + } + if (!suppressed) kept.push(cand); + } + + return kept; +} + +function parseDecodedDetections(outputTensor, scoreThreshold, srcW, srcH, inW, inH) { + const rows = tensorToRows(outputTensor); + if (!rows || rows.cols < 15) return []; + const sx = srcW / inW; + const sy = srcH / inH; + const faces = []; + + for (let i = 0; i < rows.rows; i++) { + const score = rows.at(i, 14); + if (score < scoreThreshold) continue; + + const x = rows.at(i, 0) * sx; + const y = rows.at(i, 1) * sy; + const w = rows.at(i, 2) * sx; + const h = rows.at(i, 3) * sy; + if (w <= 1 || h <= 1) continue; + + faces.push({ x, y, w, h, score }); + } + + return faces; +} + +function readFeatureVector(tensor, anchorIndex, featureCount) { + const dims = tensor.dims || []; + const data = tensor.data; + if (!data) return null; + + // [1, A, F] + if (dims.length === 3 && dims[0] === 1 && dims[2] >= featureCount) { + const off = anchorIndex * dims[2]; + const out = new Array(featureCount); + for (let i = 0; i < featureCount; i++) out[i] = data[off + i]; + return out; + } + + // [1, F, H, W] + if (dims.length === 4 && dims[0] === 1 && dims[1] >= featureCount) { + const anchors = dims[2] * dims[3]; + if (anchorIndex >= anchors) return null; + const out = new Array(featureCount); + for (let i = 0; i < featureCount; i++) out[i] = data[i * anchors + anchorIndex]; + return out; + } + + // [1, H, W, F] + if (dims.length === 4 && dims[0] === 1 && dims[3] >= featureCount) { + const off = anchorIndex * dims[3]; + const out = new Array(featureCount); + for (let i = 0; i < featureCount; i++) out[i] = data[off + i]; + return out; + } + + const off = anchorIndex * featureCount; + if (off + featureCount - 1 >= data.length) return null; + const out = new Array(featureCount); + for (let i = 0; i < featureCount; i++) out[i] = data[off + i]; + return out; +} + +function decodeRawYunet(results, scoreThreshold, srcW, srcH, padW, padH) { + const sx = srcW / padW; + const sy = srcH / padH; + const outByName = new Map(Object.entries(results)); + const faces = []; + const strides = [8, 16, 32]; + + for (const stride of strides) { + const cls = outByName.get(`cls_${stride}`); + const obj = outByName.get(`obj_${stride}`); + const bbox = outByName.get(`bbox_${stride}`); + if (!cls || !obj || !bbox) continue; + + const fmW = Math.floor(padW / stride); + const fmH = Math.floor(padH / stride); + const anchorCount = fmW * fmH; + + for (let i = 0; i < anchorCount; i++) { + const clsVec = readFeatureVector(cls, i, 1); + const objVec = readFeatureVector(obj, i, 1); + if (!clsVec || !objVec) continue; + const clsScore = clamp(clsVec[0], 0, 1); + const objScore = clamp(objVec[0], 0, 1); + const score = Math.sqrt(clsScore * objScore); + if (score < scoreThreshold) continue; + + const bb = readFeatureVector(bbox, i, 4); + if (!bb) continue; + const [dx, dy, dw, dh] = bb; + + const c = i % fmW; + const r = Math.floor(i / fmW); + const cx = (c + dx) * stride; + const cy = (r + dy) * stride; + const w = Math.exp(dw) * stride; + const h = Math.exp(dh) * stride; + const x1 = cx - w / 2; + const y1 = cy - h / 2; + if (w <= 1 || h <= 1) continue; + + faces.push({ + x: clamp(x1 * sx, 0, srcW - 1), + y: clamp(y1 * sy, 0, srcH - 1), + w: Math.min(w * sx, srcW), + h: Math.min(h * sy, srcH), + score, + }); + } + } + + return faces; +} + +export class FaceDetectorEngine { + #session = null; + #modelBuffer = null; + #currentDetectorKey = null; + #intent = null; + // Set by loadSession; kept current by #backendListener so a runtime EP + // fallback doesn't leave a stale label that the loadModel early-return + // re-announces later. + #realizedBackend = null; + #backendListener = null; + get isLoaded() { return this.#session !== null; } + get realizedBackend() { return this.#realizedBackend; } + get intent() { return this.#intent; } + get currentDetector() { return this.#currentDetectorKey; } + + #trackRealizedBackend() { + if (this.#backendListener) return; + this.#backendListener = (e) => { + const d = e?.detail; + if (d && d.kind === 'success' && typeof d.backend === 'string') { + this.#realizedBackend = d.backend; + } + }; + document.addEventListener('aitools:backend-event', this.#backendListener); + } + #untrackRealizedBackend() { + if (!this.#backendListener) return; + document.removeEventListener('aitools:backend-event', this.#backendListener); + this.#backendListener = null; + } + + async loadModel(detectorKey = 'face-yunet', intent = 'cpu', onProgress) { + if (onProgress != null && typeof onProgress !== 'function') { + console.warn('[FaceDetectorEngine] Ignoring non-function onProgress callback.', { + type: typeof onProgress, + value: onProgress, + detectorKey, + intent, + }); + } + intent = normalizeIntent(intent); + const report = typeof onProgress === 'function' ? onProgress : null; + if (this.#session && this.#currentDetectorKey === detectorKey && this.#intent === intent) { + if (this.#realizedBackend) { + dispatchBackendEvent({ kind: 'success', backend: this.#realizedBackend }); + } + return; + } + + const cfg = DETECTORS[detectorKey]; + if (!cfg) throw new Error(`Unknown detector: ${detectorKey}`); + + if (this.#session) { + try { this.#session.release(); } catch {} + this.#session = null; + } + if (this.#currentDetectorKey !== detectorKey) { + this.#modelBuffer = null; + } + + if (!this.#modelBuffer) { + this.#modelBuffer = await fetchWithProgress(cfg.url, report); + } + + report?.(1, 'Loading detector into runtime...'); + console.info(`[FaceDetectorEngine] Loading detector "${detectorKey}" with intent "${intent}"`); + const { session, realizedBackend } = await loadSession(this.#modelBuffer, intent); + this.#session = session; + this.#intent = intent; + this.#realizedBackend = realizedBackend; + this.#currentDetectorKey = detectorKey; + this.#trackRealizedBackend(); + console.info(`[FaceDetectorEngine] Detector ready on ${realizedBackend}`); + report?.(1, 'Detector loaded.'); + } + + async detectFaces(image, { + detectorKey = 'face-yunet', + scoreThreshold, + iouThreshold, + topK, + signal, + } = {}) { + if (!this.#session || this.#currentDetectorKey !== detectorKey) { + throw new Error('Detector not loaded — call loadModel() first'); + } + if (signal?.aborted) throw new DOMException('Cancelled', 'AbortError'); + + const cfg = DETECTORS[detectorKey]; + const minScore = Number.isFinite(scoreThreshold) ? scoreThreshold : cfg.scoreThreshold; + const maxIou = Number.isFinite(iouThreshold) ? iouThreshold : cfg.iouThreshold; + const maxKeep = Number.isFinite(topK) ? topK : cfg.topK; + const srcW = image.width; + const srcH = image.height; + const inW = cfg.inputWidth; + const inH = cfg.inputHeight; + + const prepCanvas = document.createElement('canvas'); + prepCanvas.width = inW; + prepCanvas.height = inH; + const prepCtx = prepCanvas.getContext('2d'); + prepCtx.drawImage(image, 0, 0, inW, inH); + const imageData = prepCtx.getImageData(0, 0, inW, inH); + const px = imageData.data; + + const planeSize = inW * inH; + const input = new Float32Array(3 * planeSize); + for (let i = 0; i < planeSize; i++) { + const si = i * 4; + // Match OpenCV DNN blobFromImage defaults used by FaceDetectorYN: + // BGR order, no scale, zero mean. + input[i] = px[si + 2]; + input[planeSize + i] = px[si + 1]; + input[2 * planeSize + i] = px[si]; + } + + prepCanvas.width = 0; + prepCanvas.height = 0; + + if (signal?.aborted) throw new DOMException('Cancelled', 'AbortError'); + + const ort = globalThis.ort; + const tensor = new ort.Tensor('float32', input, [1, 3, inH, inW]); + const inputName = this.#session.inputNames[0]; + const results = await this.#session.run({ [inputName]: tensor }); + tensor.dispose(); + + let candidates = []; + const outputNames = this.#session.outputNames || []; + if (outputNames.length === 1) { + const raw = results[outputNames[0]]; + candidates = parseDecodedDetections(raw, minScore, srcW, srcH, inW, inH); + } + + if (!candidates.length) { + candidates = decodeRawYunet(results, minScore, srcW, srcH, inW, inH); + } + + for (const name of outputNames) { + try { results[name]?.dispose?.(); } catch {} + } + + const filtered = nms( + candidates, + maxIou, + maxKeep, + ); + + return filtered.map(face => ({ + ...face, + x: clamp(face.x, 0, srcW - 1), + y: clamp(face.y, 0, srcH - 1), + w: clamp(face.w, 1, srcW), + h: clamp(face.h, 1, srcH), + })); + } + + release() { + this.#untrackRealizedBackend(); + if (this.#session) { + try { this.#session.release(); } catch {} + this.#session = null; + } + this.#modelBuffer = null; + this.#currentDetectorKey = null; + this.#intent = null; + this.#realizedBackend = null; + } +} + +function normalizeIntent(value) { + if (value === 'webgpu' || value === 'gpu') return 'gpu'; + if (value === 'wasm' || value === 'cpu') return 'cpu'; + return 'cpu'; +} diff --git a/features/upscaler/engine/gpu-frame-extractor.js b/features/upscaler/engine/gpu-frame-extractor.js new file mode 100644 index 0000000000000000000000000000000000000000..83ff8748059348fa00499e9269f23b53b147c19a --- /dev/null +++ b/features/upscaler/engine/gpu-frame-extractor.js @@ -0,0 +1,201 @@ +/** + * GpuFrameExtractor — uploads a video/image frame to a GPU texture and + * extracts CHW float32 tiles via a compute shader, avoiding CPU-side + * getImageData() + extractTileCHW() entirely. + * + * Usage: + * const extractor = new GpuFrameExtractor(device); + * extractor.uploadFrame(videoElement, width, height); + * const gpuBuffer = extractor.extractTile(tx, ty, tw, th, modelValueRange); + * // gpuBuffer contains CHW float32 data for the tile + * extractor.destroy(); + */ + +const SHADER = /* wgsl */ ` +struct Params { + tileX: u32, + tileY: u32, + tileW: u32, + tileH: u32, + scale: f32, +} + +@group(0) @binding(0) var src: texture_2d; +@group(0) @binding(1) var out: array; +@group(0) @binding(2) var params: Params; + +@compute @workgroup_size(16, 16) +fn main(@builtin(global_invocation_id) gid: vec3u) { + let col = gid.x; + let row = gid.y; + if (col >= params.tileW || row >= params.tileH) { return; } + + let pixel = textureLoad(src, vec2u(params.tileX + col, params.tileY + row), 0); + let plane = params.tileW * params.tileH; + let idx = row * params.tileW + col; + + // Texture values are [0,1]; scale converts to model's expected range + // (1.0 keeps [0,1], 255.0 produces [0,255]). + out[idx] = pixel.r * params.scale; + out[plane + idx] = pixel.g * params.scale; + out[2u * plane + idx] = pixel.b * params.scale; +} +`; + +const PARAMS_SIZE = 5 * 4; +const PARAMS_BUFFER_SIZE = Math.ceil(PARAMS_SIZE / 16) * 16; + +export class GpuFrameExtractor { + #device; + #pipeline; + #bindGroupLayout; + #paramsBuffer; + #frameTexture = null; + #tileBuffer = null; + #tileBufferSize = 0; + #lost = false; + + constructor(device) { + this.#device = device; + this.#initPipeline(); + this.#device.lost.then((info) => { + this.#lost = true; + console.warn('[GpuFrameExtractor] GPU device lost:', info.message); + }); + } + + get lost() { return this.#lost; } + + /** + * Upload a frame source to the internal GPU texture. + * Accepts HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, + * ImageBitmap, VideoFrame, OffscreenCanvas — anything valid for + * copyExternalImageToTexture(). + */ + uploadFrame(source, width, height) { + if (this.#frameTexture && + (this.#frameTexture.width !== width || this.#frameTexture.height !== height)) { + this.#frameTexture.destroy(); + this.#frameTexture = null; + } + + if (!this.#frameTexture) { + this.#frameTexture = this.#device.createTexture({ + size: [width, height], + format: 'rgba8unorm', + usage: + GPUTextureUsage.TEXTURE_BINDING | + GPUTextureUsage.COPY_DST | + GPUTextureUsage.RENDER_ATTACHMENT, + }); + } + + this.#device.queue.copyExternalImageToTexture( + { source }, + { texture: this.#frameTexture }, + [width, height], + ); + } + + /** + * Run the compute shader to extract a tile as CHW float32 into a + * reusable GPU storage buffer. + * + * @param {number} tx - source tile X + * @param {number} ty - source tile Y + * @param {number} tw - tile width + * @param {number} th - tile height + * @param {number} modelValueRange - upper bound of the model's expected value range (1 or 255); + * texture values are [0,1] so this acts as a multiplier. + * @returns {GPUBuffer} containing 3×tw×th float32 values in CHW order + */ + extractTile(tx, ty, tw, th, modelValueRange) { + const byteSize = 3 * tw * th * 4; + + if (this.#tileBufferSize < byteSize) { + this.#tileBuffer?.destroy(); + this.#tileBuffer = this.#device.createBuffer({ + size: byteSize, + usage: + GPUBufferUsage.STORAGE | + GPUBufferUsage.COPY_SRC | + GPUBufferUsage.COPY_DST, + }); + this.#tileBufferSize = byteSize; + } + + const paramsData = new ArrayBuffer(PARAMS_BUFFER_SIZE); + const u32 = new Uint32Array(paramsData); + const f32 = new Float32Array(paramsData); + u32[0] = tx; + u32[1] = ty; + u32[2] = tw; + u32[3] = th; + f32[4] = modelValueRange; + this.#device.queue.writeBuffer(this.#paramsBuffer, 0, paramsData); + + const bindGroup = this.#device.createBindGroup({ + layout: this.#bindGroupLayout, + entries: [ + { binding: 0, resource: this.#frameTexture.createView() }, + { binding: 1, resource: { buffer: this.#tileBuffer, size: byteSize } }, + { binding: 2, resource: { buffer: this.#paramsBuffer } }, + ], + }); + + const encoder = this.#device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(this.#pipeline); + pass.setBindGroup(0, bindGroup); + pass.dispatchWorkgroups(Math.ceil(tw / 16), Math.ceil(th / 16)); + pass.end(); + this.#device.queue.submit([encoder.finish()]); + + return this.#tileBuffer; + } + + destroy() { + this.#frameTexture?.destroy(); + this.#frameTexture = null; + this.#tileBuffer?.destroy(); + this.#tileBuffer = null; + this.#paramsBuffer?.destroy(); + this.#paramsBuffer = null; + } + + #initPipeline() { + const module = this.#device.createShaderModule({ code: SHADER }); + + this.#bindGroupLayout = this.#device.createBindGroupLayout({ + entries: [ + { + binding: 0, + visibility: GPUShaderStage.COMPUTE, + texture: { sampleType: 'float' }, + }, + { + binding: 1, + visibility: GPUShaderStage.COMPUTE, + buffer: { type: 'storage' }, + }, + { + binding: 2, + visibility: GPUShaderStage.COMPUTE, + buffer: { type: 'uniform' }, + }, + ], + }); + + this.#pipeline = this.#device.createComputePipeline({ + layout: this.#device.createPipelineLayout({ + bindGroupLayouts: [this.#bindGroupLayout], + }), + compute: { module, entryPoint: 'main' }, + }); + + this.#paramsBuffer = this.#device.createBuffer({ + size: PARAMS_BUFFER_SIZE, + usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST, + }); + } +} diff --git a/features/upscaler/engine/gpu-tile-renderer.js b/features/upscaler/engine/gpu-tile-renderer.js new file mode 100644 index 0000000000000000000000000000000000000000..bcc89f4e798233a0c87f96979c52acaec01000b6 --- /dev/null +++ b/features/upscaler/engine/gpu-tile-renderer.js @@ -0,0 +1,251 @@ +/** + * GpuTileRenderer — renders CHW float32 ORT output buffers directly to a + * GPU texture via a WGSL fragment shader, avoiding the GPU→CPU readback. + * + * Usage: + * const renderer = new GpuTileRenderer(device); + * renderer.configure(canvas, outW, outH); + * // per tile: + * renderer.renderTile(gpuBuffer, tileW, tileH, destX, destY, overlap, outputScale); + * renderer.presentToCanvas(); + * // cleanup: + * renderer.destroy(); + */ + +import { overlapCrop } from './tiling.js'; + +const SHADER = /* wgsl */ ` +struct Params { + tileW: u32, + tileH: u32, + destX: u32, + destY: u32, + outputScale: f32, +} + +@group(0) @binding(0) var chw: array; +@group(0) @binding(1) var params: Params; + +@vertex fn vs(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4f { + var pos = array( + vec2f(-1, -1), vec2f(1, -1), vec2f(-1, 1), + vec2f(-1, 1), vec2f(1, -1), vec2f(1, 1), + ); + return vec4f(pos[vi], 0, 1); +} + +@fragment fn fs(@builtin(position) pos: vec4f) -> @location(0) vec4f { + let x = u32(pos.x) - params.destX; + let y = u32(pos.y) - params.destY; + let plane = params.tileW * params.tileH; + let s = params.outputScale; + return vec4f( + clamp(chw[y * params.tileW + x] * s, 0.0, 1.0), + clamp(chw[plane + y * params.tileW + x] * s, 0.0, 1.0), + clamp(chw[2u * plane + y * params.tileW + x] * s, 0.0, 1.0), + 1.0, + ); +} +`; + +const PARAMS_SIZE = 5 * 4; // 5 u32/f32 fields × 4 bytes, padded to 16-byte alignment +const PARAMS_BUFFER_SIZE = Math.ceil(PARAMS_SIZE / 16) * 16; + +/** + * Thrown by GpuTileRenderer.configure() when the requested canvas/texture + * dimensions exceed the device's maxTextureDimension2D. Callers can catch + * this and fall back to a CPU readback path instead of silently producing + * a black canvas (which is what WebGPU does on validation failure). + */ +export class GpuOutputTooLargeError extends Error { + constructor(width, height, maxDim) { + super(`Output ${width}×${height} exceeds GPU max texture dimension (${maxDim}).`); + this.name = 'GpuOutputTooLargeError'; + this.width = width; + this.height = height; + this.maxDim = maxDim; + } +} + +export class GpuTileRenderer { + #device; + #pipeline = null; + #bindGroupLayout = null; + #paramsBuffer = null; + #outputTexture = null; + #canvasCtx = null; + #canvasFormat; + #width = 0; + #height = 0; + #lost = false; + + constructor(device) { + this.#device = device; + this.#canvasFormat = navigator.gpu.getPreferredCanvasFormat(); + this.#initPipeline(); + this.#device.lost.then((info) => { + this.#lost = true; + console.warn('[GpuTileRenderer] GPU device lost:', info.message); + }); + } + + get lost() { return this.#lost; } + + /** + * @throws {GpuOutputTooLargeError} when width/height exceeds + * device.limits.maxTextureDimension2D. Both the WebGPU canvas surface + * and the persistent output texture are subject to that cap; exceeding + * it causes WebGPU to silently produce a black canvas, so we surface + * the failure up-front instead. + */ + configure(canvas, width, height) { + const maxDim = this.#device.limits?.maxTextureDimension2D ?? 8192; + if (width > maxDim || height > maxDim) { + throw new GpuOutputTooLargeError(width, height, maxDim); + } + + this.#canvasCtx = canvas.getContext('webgpu'); + this.#canvasCtx.configure({ + device: this.#device, + format: this.#canvasFormat, + alphaMode: 'opaque', + usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_DST, + }); + + this.#width = width; + this.#height = height; + + this.#outputTexture?.destroy(); + this.#outputTexture = this.#device.createTexture({ + size: [width, height], + format: this.#canvasFormat, + usage: + GPUTextureUsage.RENDER_ATTACHMENT | + GPUTextureUsage.COPY_SRC | + GPUTextureUsage.TEXTURE_BINDING, + }); + + // Clear the persistent texture to black + const encoder = this.#device.createCommandEncoder(); + const pass = encoder.beginRenderPass({ + colorAttachments: [{ + view: this.#outputTexture.createView(), + loadOp: 'clear', + clearValue: { r: 0, g: 0, b: 0, a: 1 }, + storeOp: 'store', + }], + }); + pass.end(); + this.#device.queue.submit([encoder.finish()]); + } + + /** + * Render one tile from an ORT GPU buffer onto the persistent output texture. + * + * @param {GPUBuffer} gpuBuffer - ORT output tensor's GPUBuffer (CHW float32) + * @param {number} tileW - output tile width in pixels + * @param {number} tileH - output tile height in pixels + * @param {number} destX - destination X on the output texture + * @param {number} destY - destination Y on the output texture + * @param {number} overlap - overlap in output-space pixels + * @param {number} outputScale - multiply CHW values by this (1.0 for 0-1 models, 1/255 for 0-255 models) + */ + renderTile(gpuBuffer, tileW, tileH, destX, destY, overlap, outputScale) { + const scissor = overlapCrop(destX, destY, tileW, tileH, this.#width, this.#height, overlap); + if (scissor.w <= 0 || scissor.h <= 0) return; + + // Write tile params to uniform buffer + const paramsData = new ArrayBuffer(PARAMS_BUFFER_SIZE); + const u32 = new Uint32Array(paramsData); + const f32 = new Float32Array(paramsData); + u32[0] = tileW; + u32[1] = tileH; + u32[2] = destX; + u32[3] = destY; + f32[4] = outputScale; + this.#device.queue.writeBuffer(this.#paramsBuffer, 0, paramsData); + + const bindGroup = this.#device.createBindGroup({ + layout: this.#bindGroupLayout, + entries: [ + { binding: 0, resource: { buffer: gpuBuffer } }, + { binding: 1, resource: { buffer: this.#paramsBuffer } }, + ], + }); + + const encoder = this.#device.createCommandEncoder(); + const pass = encoder.beginRenderPass({ + colorAttachments: [{ + view: this.#outputTexture.createView(), + loadOp: 'load', + storeOp: 'store', + }], + }); + + pass.setPipeline(this.#pipeline); + pass.setBindGroup(0, bindGroup); + pass.setViewport(destX, destY, tileW, tileH, 0, 1); + pass.setScissorRect(scissor.x, scissor.y, scissor.w, scissor.h); + pass.draw(6); + pass.end(); + + this.#device.queue.submit([encoder.finish()]); + } + + /** Copy the persistent output texture to the canvas for display / toBlob. */ + presentToCanvas() { + const canvasTex = this.#canvasCtx.getCurrentTexture(); + const encoder = this.#device.createCommandEncoder(); + encoder.copyTextureToTexture( + { texture: this.#outputTexture }, + { texture: canvasTex }, + [this.#width, this.#height], + ); + this.#device.queue.submit([encoder.finish()]); + } + + destroy() { + this.#outputTexture?.destroy(); + this.#outputTexture = null; + this.#paramsBuffer?.destroy(); + this.#paramsBuffer = null; + } + + #initPipeline() { + const module = this.#device.createShaderModule({ code: SHADER }); + + this.#bindGroupLayout = this.#device.createBindGroupLayout({ + entries: [ + { + binding: 0, + visibility: GPUShaderStage.FRAGMENT, + buffer: { type: 'read-only-storage' }, + }, + { + binding: 1, + visibility: GPUShaderStage.FRAGMENT, + buffer: { type: 'uniform' }, + }, + ], + }); + + const pipelineLayout = this.#device.createPipelineLayout({ + bindGroupLayouts: [this.#bindGroupLayout], + }); + + this.#pipeline = this.#device.createRenderPipeline({ + layout: pipelineLayout, + vertex: { module, entryPoint: 'vs' }, + fragment: { + module, + entryPoint: 'fs', + targets: [{ format: this.#canvasFormat }], + }, + }); + + this.#paramsBuffer = this.#device.createBuffer({ + size: PARAMS_BUFFER_SIZE, + usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST, + }); + } +} diff --git a/features/upscaler/engine/tiling.js b/features/upscaler/engine/tiling.js new file mode 100644 index 0000000000000000000000000000000000000000..3db8898592b0069016d1b41ea51468399985d756 --- /dev/null +++ b/features/upscaler/engine/tiling.js @@ -0,0 +1,168 @@ +/** + * Tiling utilities — dividing images into overlapping tiles and + * reassembling them with seam-free stitching. + */ + +/** + * Compute the interior region a tile should contribute, trimming overlap + * margins at seams. Returns a canvas-space rect { x, y, w, h }. + * + * Each side touching another tile is trimmed by half the overlap; + * edges against the canvas boundary keep their full extent. + */ +export function overlapCrop(destX, destY, tileW, tileH, canvasW, canvasH, overlap) { + const cropL = destX > 0 ? (overlap / 2) | 0 : 0; + const cropT = destY > 0 ? (overlap / 2) | 0 : 0; + const cropR = (destX + tileW) < canvasW ? (overlap / 2) | 0 : 0; + const cropB = (destY + tileH) < canvasH ? (overlap / 2) | 0 : 0; + return { + x: destX + cropL, + y: destY + cropT, + w: tileW - cropL - cropR, + h: tileH - cropT - cropB, + }; +} + +/** + * Build the grid of overlapping source tiles that cover the image. + * Returns an array of { x, y, w, h } in source-pixel coordinates. + */ +export function buildTileGrid(srcW, srcH, tileSize, overlap) { + const noTiling = tileSize <= 0; + const size = noTiling ? Math.max(srcW, srcH) : tileSize; + const step = noTiling ? size : size - overlap; + const tiles = []; + for (let ty = 0; ty < srcH; ty += step) { + for (let tx = 0; tx < srcW; tx += step) { + tiles.push({ + x: tx, y: ty, + w: Math.min(size, srcW - tx), + h: Math.min(size, srcH - ty), + }); + } + } + return tiles; +} + +/** Write an ImageData to the canvas, trimming overlap margins at tile seams. */ +export function pasteTileCropped(ctx, imgData, dx, dy, canvasW, canvasH, overlap) { + const crop = overlapCrop(dx, dy, imgData.width, imgData.height, canvasW, canvasH, overlap); + if (crop.w <= 0 || crop.h <= 0) return; + ctx.putImageData(imgData, dx, dy, crop.x - dx, crop.y - dy, crop.w, crop.h); +} + +// ─── Gaussian tile blending ──────────────────────────────────────────── +// For diffusion-style refiners (e.g. TinySR) the tile-edge artifacts are +// strong enough that the half-overlap hard crop above shows visible seams. +// `makeGaussianWeights2D` produces a per-pixel weight kernel matching +// TinySR's pipeline.js: variance=0.01 scaled by tile^2 so the shape is +// scale-invariant. Engines that opt in maintain a float32 accumulator and +// a contribution buffer, then divide once at the end. + +/** + * 2D Gaussian weight kernel for tile blending. Returns a Float32Array of + * length tileH*tileW with pixel-space weights (single channel — apply the + * same weight to all 3 colour channels at accumulation time). + * + * Matches the formula in tinysr/tools/web/pipeline.js:makeGaussianWeights + * so the visual behaviour ports over directly. + */ +export function makeGaussianWeights2D(tileH, tileW) { + const variance = 0.01; + const midX = (tileW - 1) / 2; + const midY = tileH / 2; // intentional asymmetry — matches the upstream + const denomX = tileW * tileW * 2 * variance; + const denomY = tileH * tileH * 2 * variance; + const norm = 1 / Math.sqrt(2 * Math.PI * variance); + const xs = new Float32Array(tileW); + const ys = new Float32Array(tileH); + for (let i = 0; i < tileW; i++) xs[i] = norm * Math.exp(-((i - midX) ** 2) / denomX); + for (let i = 0; i < tileH; i++) ys[i] = norm * Math.exp(-((i - midY) ** 2) / denomY); + const out = new Float32Array(tileH * tileW); + for (let y = 0; y < tileH; y++) { + const yw = ys[y]; + const rowOff = y * tileW; + for (let x = 0; x < tileW; x++) out[rowOff + x] = yw * xs[x]; + } + return out; +} + +/** + * Accumulate one model-output tile into the canvas-sized float32 buffers + * `accumRGB` (3*outW*outH, RGB-planar) and `accumW` (outW*outH), weighted + * by `weights`. `srcRGB` is in [0, modelValueRange]; `layout` is 'chw' for + * RGB-planar input or 'hwc' for RGB-interleaved. Crops to the top-left + * (tileW × tileH) region if the model output was padded. + */ +export function accumulateGaussianTile( + accumRGB, accumW, outW, outH, + srcRGB, srcStrideW, srcStrideH, + tileW, tileH, destX, destY, + weights, valueScale, layout, +) { + const outPlane = outW * outH; + const isCHW = layout === 'chw'; + const chanStride = isCHW ? srcStrideW * srcStrideH : 1; + const colStride = isCHW ? 1 : 3; + const rowStride = isCHW ? srcStrideW : srcStrideW * 3; + for (let y = 0; y < tileH; y++) { + const dy = destY + y; + if (dy < 0 || dy >= outH) continue; + const wRow = y * tileW; + const sRow = y * rowStride; + const dRow = dy * outW; + for (let x = 0; x < tileW; x++) { + const dx = destX + x; + if (dx < 0 || dx >= outW) continue; + const w = weights[wRow + x]; + const srcIdx = sRow + x * colStride; + const dstIdx = dRow + dx; + accumRGB[dstIdx] += srcRGB[srcIdx] * valueScale * w; + accumRGB[outPlane + dstIdx] += srcRGB[srcIdx + chanStride] * valueScale * w; + accumRGB[2 * outPlane + dstIdx] += srcRGB[srcIdx + 2 * chanStride] * valueScale * w; + accumW[dstIdx] += w; + } + } +} + +/** + * Divide accumulated RGB by weights inside a rectangular region of the + * output canvas, clamp to [0,255], and write via putImageData. Called + * after each tile accumulates so the user sees progressive preview; the + * last tile to touch any given pixel ends up writing the final value + * (which is the same value a single full-canvas finalize would produce). + * + * Clips the region to the canvas bounds, so callers can pass tile-sized + * rects without worrying about edge tiles. + */ +export function finalizeGaussianRegion(ctx, outX, outY, regionW, regionH, outW, outH, accumRGB, accumW) { + const x0 = Math.max(0, outX | 0); + const y0 = Math.max(0, outY | 0); + const x1 = Math.min(outW, (outX + regionW) | 0); + const y1 = Math.min(outH, (outY + regionH) | 0); + const w = x1 - x0; + const h = y1 - y0; + if (w <= 0 || h <= 0) return; + const imgData = ctx.createImageData(w, h); + const px = imgData.data; + const plane = outW * outH; + for (let y = 0; y < h; y++) { + const srcRow = (y0 + y) * outW; + const dstRow = y * w; + for (let x = 0; x < w; x++) { + // accumW is zero only if no tile covered this pixel — shouldn't + // happen for pixels reached by this call, but guard against NaN. + const srcIdx = srcRow + x0 + x; + const wAcc = accumW[srcIdx] || 1; + const r = accumRGB[srcIdx] / wAcc; + const g = accumRGB[plane + srcIdx] / wAcc; + const b = accumRGB[2 * plane + srcIdx] / wAcc; + const o = (dstRow + x) * 4; + px[o] = r < 0 ? 0 : r > 255 ? 255 : (r + 0.5) | 0; + px[o + 1] = g < 0 ? 0 : g > 255 ? 255 : (g + 0.5) | 0; + px[o + 2] = b < 0 ? 0 : b > 255 ? 255 : (b + 0.5) | 0; + px[o + 3] = 255; + } + } + ctx.putImageData(imgData, x0, y0); +} diff --git a/features/upscaler/engine/upscaler-engine.js b/features/upscaler/engine/upscaler-engine.js new file mode 100644 index 0000000000000000000000000000000000000000..c16f92a9346f8cc9fb056fdfa2ae82031e317b3e --- /dev/null +++ b/features/upscaler/engine/upscaler-engine.js @@ -0,0 +1,924 @@ +/** + * UpscalerEngine — tiled ONNX super-resolution inference. + * Downloads a model, creates a session, runs tiled inference on images. + * Uses Canvas 2D for pixel I/O in the WASM/WebGL path; GPU paths avoid readback. + */ + +import { fetchWithProgress } from 'lib/fetch-progress'; +import { GpuTileRenderer, GpuOutputTooLargeError } from './gpu-tile-renderer.js'; +import { GpuFrameExtractor } from './gpu-frame-extractor.js'; +import { + buildTileGrid, + pasteTileCropped, + overlapCrop, + makeGaussianWeights2D, + accumulateGaussianTile, + finalizeGaussianRegion, +} from './tiling.js'; +import { readMetaEntry, isFp16InputType } from 'lib/onnx-meta'; +import { dispatchBackendEvent } from 'lib/backend-events'; +import { loadSession } from 'lib/backend'; + +const DEFAULT_SCALE = 4; +const DEFAULT_OVERLAP = 16; + +function clampByte(v) { + return v < 0 ? 0 : v > 255 ? 255 : (v + 0.5) | 0; +} + +// Normalize the various aliases the caller might pass for backend intent. +// New code should pass 'gpu' or 'cpu' directly; the legacy ORT-Web strings +// 'webgpu' and 'wasm' are still accepted so a half-migrated UI keeps working. +function normalizeIntent(value) { + if (value === 'webgpu' || value === 'gpu') return 'gpu'; + if (value === 'wasm' || value === 'cpu') return 'cpu'; + return 'cpu'; +} + +function yieldToEventLoop() { + return new Promise(resolve => { + const ch = new MessageChannel(); + ch.port1.onmessage = resolve; + ch.port2.postMessage(undefined); + }); +} + +function clampCoord(v, max) { + if (v < 0) return 0; + if (v > max) return max; + return v; +} + +/** + * Extract a tile from ImageData as Float32 in CHW layout + * (channels-first: [R plane, G plane, B plane]), with edge replication padding. + * + * @param {number} valueScale - multiply each pixel byte by this (e.g. 1/255 for [0,1] output) + */ +function extractTileNCHW(imageData, tx, ty, tw, th, padW, padH, valueScale) { + const { data, width } = imageData; + const out = new Float32Array(3 * padH * padW); + const planeSize = padH * padW; + const maxX = tx + tw - 1; + const maxY = ty + th - 1; + for (let row = 0; row < padH; row++) { + for (let col = 0; col < padW; col++) { + const srcX = clampCoord(tx + col, maxX); + const srcY = clampCoord(ty + row, maxY); + const srcIdx = (srcY * width + srcX) * 4; + const dstIdx = row * padW + col; + out[dstIdx] = data[srcIdx] * valueScale; + out[planeSize + dstIdx] = data[srcIdx + 1] * valueScale; + out[2 * planeSize + dstIdx] = data[srcIdx + 2] * valueScale; + } + } + return out; +} + +/** + * Extract a tile from ImageData as Float32 in HWC layout + * (channels-last: [R,G,B, R,G,B, ...]), with edge replication padding. + */ +function extractTileNHWC(imageData, tx, ty, tw, th, padW, padH, valueScale) { + const { data, width } = imageData; + const out = new Float32Array(padH * padW * 3); + const maxX = tx + tw - 1; + const maxY = ty + th - 1; + for (let row = 0; row < padH; row++) { + for (let col = 0; col < padW; col++) { + const srcX = clampCoord(tx + col, maxX); + const srcY = clampCoord(ty + row, maxY); + const srcIdx = (srcY * width + srcX) * 4; + const dstIdx = (row * padW + col) * 3; + out[dstIdx] = data[srcIdx] * valueScale; + out[dstIdx + 1] = data[srcIdx + 1] * valueScale; + out[dstIdx + 2] = data[srcIdx + 2] * valueScale; + } + } + return out; +} + +/** + * Convert CHW float32 data (channels-first: [R plane, G plane, B plane]) + * back into an RGBA ImageData. Inverse of extractTileCHW. + * + * @param {number} valueScale - multiply each CHW value by this to get [0,255] bytes + */ +function chwToImageData(chwData, width, height, valueScale) { + const imgData = new ImageData(width, height); + const px = imgData.data; + const planeSize = width * height; + for (let row = 0; row < height; row++) { + for (let col = 0; col < width; col++) { + const srcIdx = row * width + col; + const dstIdx = srcIdx * 4; + px[dstIdx] = clampByte(chwData[srcIdx] * valueScale); + px[dstIdx + 1] = clampByte(chwData[planeSize + srcIdx] * valueScale); + px[dstIdx + 2] = clampByte(chwData[2 * planeSize + srcIdx] * valueScale); + px[dstIdx + 3] = 255; + } + } + return imgData; +} + +/** + * Convert HWC float32 data (channels-last: [R,G,B, R,G,B, …] per pixel) + * into an RGBA ImageData. Used when the WebGPU EP returns NHWC-ordered output. + */ +function hwcToImageData(hwcData, width, height, valueScale) { + const imgData = new ImageData(width, height); + const px = imgData.data; + for (let row = 0; row < height; row++) { + for (let col = 0; col < width; col++) { + const srcIdx = (row * width + col) * 3; + const dstIdx = (row * width + col) * 4; + px[dstIdx] = clampByte(hwcData[srcIdx] * valueScale); + px[dstIdx + 1] = clampByte(hwcData[srcIdx + 1] * valueScale); + px[dstIdx + 2] = clampByte(hwcData[srcIdx + 2] * valueScale); + px[dstIdx + 3] = 255; + } + } + return imgData; +} + +// --------------------------------------------------------------------------- +// fp16 packing — ORT-Web fp16 tensors take/return a Uint16Array of IEEE-754 +// binary16 bit patterns. We use the platform's Float16Array when available +// (Chromium 122+, Safari 18.2+) and fall back to a manual packer otherwise. +// fp16 only kicks in when the model is declared fp16; everything else stays +// fp32 with no extra work. +// --------------------------------------------------------------------------- + +const HAS_NATIVE_FLOAT16 = typeof globalThis.Float16Array === 'function'; + +function packFloat32ToFloat16Bits(f32) { + if (HAS_NATIVE_FLOAT16) { + const f16 = new globalThis.Float16Array(f32); + return new Uint16Array(f16.buffer, f16.byteOffset, f16.length); + } + const out = new Uint16Array(f32.length); + // f32arr is a Float32Array; reinterpret as Uint32 to read bit fields. + const u32 = new Uint32Array(f32.buffer, f32.byteOffset, f32.length); + for (let i = 0; i < f32.length; i++) { + const x = u32[i]; + const sign = (x >>> 16) & 0x8000; + const expRaw = (x >>> 23) & 0xff; + const mantissa = x & 0x7fffff; + let exp = expRaw - 127 + 15; + if (expRaw === 0xff) { + out[i] = sign | 0x7c00 | (mantissa ? 0x200 : 0); + } else if (exp >= 31) { + out[i] = sign | 0x7c00; + } else if (exp <= 0) { + if (exp < -10) { + out[i] = sign; + } else { + const m = mantissa | 0x800000; + out[i] = sign | (m >>> (14 - exp)); + } + } else { + out[i] = sign | (exp << 10) | (mantissa >>> 13); + } + } + return out; +} + +function unpackFloat16BitsToFloat32(u16) { + if (HAS_NATIVE_FLOAT16) { + const f16 = new globalThis.Float16Array(u16.buffer, u16.byteOffset, u16.length); + return new Float32Array(f16); + } + const out = new Float32Array(u16.length); + const u32 = new Uint32Array(out.buffer); + for (let i = 0; i < u16.length; i++) { + const h = u16[i]; + const sign = (h & 0x8000) << 16; + const exp = (h >> 10) & 0x1f; + const mantissa = h & 0x3ff; + if (exp === 0) { + if (mantissa === 0) { + u32[i] = sign; + } else { + let e = -14; + let m = mantissa; + while (!(m & 0x400)) { m <<= 1; e--; } + m &= 0x3ff; + u32[i] = sign | ((e + 127) << 23) | (m << 13); + } + } else if (exp === 0x1f) { + u32[i] = sign | 0x7f800000 | (mantissa << 13); + } else { + u32[i] = sign | ((exp - 15 + 127) << 23) | (mantissa << 13); + } + } + return out; +} + +// TODO(ort-web): remove this whole block when ORT-Web fixes +// program-manager.ts normalizeDispatchGroupSize, which today does a lossy +// rewrite of dispatch shape (X, 1, 1) → (sqrt(X), sqrt(X), 1) and breaks +// the (X=col, Y=row) contract Conv2DMatMul and MatMul shaders expect. +// +// What goes wrong: ORT reshuffles whenever X > maxComputeWorkgroupsPerDimension +// (65535). Conv2DMatMul/MatMul then treat the synthesised Y as a row-tile +// index, the row-bounds guard rejects ~99% of writes, and the output +// buffer is left mostly uninitialised — visible as scrambled output for +// any model whose post-PixelShuffle activation has H*W > ~2.1M pixels. +// +// Workaround: monkey-patch device.createShaderModule to recover the +// effective column from both workgroup ids when dim_a_outer is small +// enough that the original dispatch Y was 1. + +const WGPU_DISPATCH_FIX_INSTALLED = Symbol.for('updraft.wgslDispatchOverflowFix'); + +const CONV2D_MM_FIND = + 'let globalRowStart = i32(workgroupId.y) * 32;\n' + + ' let globalColStart = i32(workgroupId.x) * 32;'; +const CONV2D_MM_REPLACE = + 'let p_isSmallA = uniforms.dim_a_outer <= 32;\n' + + ' let p_totalCols = (u32(uniforms.dim_b_outer) + 31u) / 32u;\n' + + ' let p_dispatchX = u32(ceil(sqrt(f32(p_totalCols))));\n' + + ' let p_effectiveCol = workgroupId.x + workgroupId.y * p_dispatchX;\n' + + ' let globalRowStart = select(i32(workgroupId.y) * 32, 0, p_isSmallA);\n' + + ' let globalColStart = select(i32(workgroupId.x) * 32, i32(p_effectiveCol) * 32, p_isSmallA);'; + +const MATMUL_FIND = + 'let globalRow =i32(globalId.y) * rowPerThread;\n' + + ' let globalCol = i32(globalId.x);'; +const MATMUL_REPLACE = + 'let p_isSmallA = uniforms.dim_a_outer <= 8;\n' + + ' let p_totalVecCols = (u32(uniforms.dim_b_outer) + 31u) / 32u;\n' + + ' let p_dispatchX = u32(ceil(sqrt(f32(p_totalVecCols))));\n' + + ' let p_effectiveWgX = workgroupId.x + workgroupId.y * p_dispatchX;\n' + + ' let globalRow = select(i32(globalId.y) * rowPerThread, i32(localId.y) * rowPerThread, p_isSmallA);\n' + + ' let globalCol = select(i32(globalId.x), i32(p_effectiveWgX) * 8 + i32(localId.x), p_isSmallA);'; + +function patchWGSLForDispatchOverflow(code, label) { + if (label === 'Conv2DMatMul' && code.includes(CONV2D_MM_FIND)) { + return code.split(CONV2D_MM_FIND).join(CONV2D_MM_REPLACE); + } + if (label === 'MatMul' && code.includes(MATMUL_FIND)) { + return code.split(MATMUL_FIND).join(MATMUL_REPLACE); + } + return code; +} + +function installWebGPUDispatchFix(device) { + if (!device || device[WGPU_DISPATCH_FIX_INSTALLED]) return false; + const origCreate = device.createShaderModule.bind(device); + device.createShaderModule = (descriptor) => { + const patched = patchWGSLForDispatchOverflow(descriptor.code, descriptor.label || ''); + if (patched === descriptor.code) return origCreate(descriptor); + return origCreate({ ...descriptor, code: patched }); + }; + device[WGPU_DISPATCH_FIX_INSTALLED] = true; + return true; +} + +export class UpscalerEngine { + #session = null; + #modelBuffer = null; + #modelUrl; + #scale; + #overlap; + #modelValueRange; + #modelLayout; + #modelInputMultiple; + #modelPrecision; + #upscaleBefore; + #tileBlend; + #profiling = false; + // What the user actually got: a label like 'web-webgpu', 'web-wasm', + // 'native-coreml/MLProgram', 'native-cpu'. Set by loadSession on every + // successful load AND kept current by #backendListener for the rest of + // the session — without that, runtime EP fallbacks (e.g. native worker + // drops from CoreML to CPU mid-tile) would leave it stale and the + // loadModel early-return path would mis-announce on the next run. + #realizedBackend = null; + #backendListener = null; + // What the caller asked for ('gpu' | 'cpu'). The loadModel short-circuit + // keys off this so the engine doesn't pointlessly reload when the user + // re-runs with the same intent. + #intent = null; + #device = null; + #gpuRenderer = null; + #gpuExtractor = null; + + constructor({ + modelUrl, + scale = DEFAULT_SCALE, + overlap = DEFAULT_OVERLAP, + modelValueRange = 1, + modelLayout = 'nchw', + modelInputMultiple = 1, + modelPrecision = 'fp32', + // upscaleBefore=true: the model operates in HR pixel space (e.g. a + // refiner that takes a pre-upsampled LR image and returns an HR image + // at the SAME resolution). Tile coordinates and modelInputMultiple + // stay in LR-pixel units (consistent with regular SR models advertised + // with scale > 1); the engine bicubic-upsamples LR->HR before tile + // extraction and multiplies extraction coords by `scale` so the + // backend sees HR tensors. All GPU fast paths remain viable — they're + // coordinate-agnostic. + upscaleBefore = false, + // tileBlend='gaussian' replaces the default half-overlap hard crop + // with float32 Gaussian-weighted accumulation. Use for diffusion- + // style models with visible tile seams. Costs ~16 bytes/HR-pixel + // working memory and forces the CPU readback path (the GPU output + // renderer writes directly to the bgra8unorm canvas surface, which + // can't host the float32 accumulator). + tileBlend = 'overlapCrop', + profile = false, + }) { + this.#modelUrl = modelUrl; + this.#scale = scale; + this.#overlap = overlap; + this.#modelValueRange = modelValueRange; + this.#modelLayout = modelLayout === 'nhwc' ? 'nhwc' : 'nchw'; + this.#modelInputMultiple = Number.isFinite(modelInputMultiple) ? Math.max(1, Math.floor(modelInputMultiple)) : 1; + this.#modelPrecision = modelPrecision === 'fp16' ? 'fp16' : 'fp32'; + this.#upscaleBefore = !!upscaleBefore; + this.#tileBlend = tileBlend === 'gaussian' ? 'gaussian' : 'overlapCrop'; + this.#profiling = profile; + } + + get scale() { return this.#scale; } + // The realized backend label (e.g. 'web-webgpu', 'native-coreml/MLProgram'). + // For UI display via friendlyBackend; not used for identity checks. + get realizedBackend() { return this.#realizedBackend; } + // The user's load intent ('gpu' | 'cpu'). EnginePool and loadModel both + // key off this for "do we already have the right session?" decisions. + get intent() { return this.#intent; } + get isLoaded() { return this.#session !== null; } + get profiling() { return this.#profiling; } + set profiling(v) { this.#profiling = !!v; } + get modelPrecision() { return this.#modelPrecision; } + + async loadModel(intent = 'cpu', onProgress) { + if (onProgress != null && typeof onProgress !== 'function') { + console.warn('[UpscalerEngine] Ignoring non-function onProgress callback.', { + type: typeof onProgress, + value: onProgress, + intent, + }); + } + intent = normalizeIntent(intent); + const report = typeof onProgress === 'function' ? onProgress : null; + if (this.#session && this.#intent === intent) { + // Reusing the existing session; re-announce so per-run backend + // trackers (status bar's "Done via X" line) record a success this run. + if (this.#realizedBackend) { + dispatchBackendEvent({ kind: 'success', backend: this.#realizedBackend }); + } + return; + } + this.#releaseSession(); + + if (!this.#modelBuffer) { + this.#modelBuffer = await fetchWithProgress(this.#modelUrl, report); + } + + report?.(1, 'Loading model into runtime\u2026'); + + // The GPU fast paths (zero-copy input extract via GpuFrameExtractor and + // zero-readback output render via GpuTileRenderer) both assume fp32 + // storage buffers in their WGSL shaders. fp16 models go through the + // standard CPU readback path: ONNX still runs on the GPU, but the tile + // tensors round-trip through the CPU as Uint16 bit patterns. We make the + // initial decision from the configured precision, then re-validate after + // the session is created (the model's declared input dtype is the source + // of truth — see comment below). + let canUseGpuFastPath = + this.#modelPrecision !== 'fp16' && + this.#modelLayout === 'nchw' && + this.#modelInputMultiple === 1; + const sessionLoadOpts = { profile: this.#profiling }; + if (intent === 'gpu' && canUseGpuFastPath) { + sessionLoadOpts.preferredOutputLocation = 'gpu-buffer'; + } + + // loadSession picks between native (desktop bridge) and web (ort-web) + // based on whether __nativeOrt is exposed; it dispatches its own + // attempt/fallback/success backend-events so we don't need to here. + const { session, realizedBackend } = await loadSession(this.#modelBuffer, intent, sessionLoadOpts); + this.#session = session; + this.#intent = intent; + this.#realizedBackend = realizedBackend; + this.#trackRealizedBackend(); + + // Self-correct modelPrecision from the model's declared input dtype. + // Stale custom-model records (e.g. uploaded before fp16 support existed, + // or before the inspector started reading the right metadata field) + // can carry the wrong precision; the model graph itself doesn't lie. + // Without this, the engine would build fp32 tensors for an fp16 model + // and ORT would throw "Unexpected input data type" at the first run. + const sessionInputName = this.#session.inputNames?.[0]; + const sessionInMeta = readMetaEntry(this.#session.inputMetadata, sessionInputName, 0); + const declaredInputType = sessionInMeta?.type; + const detectedPrecision = isFp16InputType(declaredInputType) + ? 'fp16' + : 'fp32'; + if (detectedPrecision !== this.#modelPrecision) { + console.warn( + `[UpscalerEngine] Configured precision (${this.#modelPrecision}) disagrees with the model's declared input dtype (${declaredInputType}); using ${detectedPrecision}. ` + + `If this is a saved custom model, edit it and set Precision = ${detectedPrecision} to make this explicit.`, + ); + this.#modelPrecision = detectedPrecision; + canUseGpuFastPath = + this.#modelPrecision !== 'fp16' && + this.#modelLayout === 'nchw' && + this.#modelInputMultiple === 1; + } + + if (this.#realizedBackend === 'web-webgpu') { + const ort = globalThis.ort; + try { + this.#device = await ort.env.webgpu.device; + // installWebGPUDispatchFix is idempotent across model loads. If we + // install it here for the first time, the just-created session's + // shader modules were compiled by ORT-Web BEFORE the wrapper + // existed — release and recreate so all shaders go through it now. + if (installWebGPUDispatchFix(this.#device)) { + await this.#session.release(); + const reloaded = await loadSession(this.#modelBuffer, intent, sessionLoadOpts); + this.#session = reloaded.session; + this.#realizedBackend = reloaded.realizedBackend; + } + if (canUseGpuFastPath) { + this.#gpuRenderer = new GpuTileRenderer(this.#device); + } + if (canUseGpuFastPath && typeof ort.Tensor.fromGpuBuffer === 'function') { + this.#gpuExtractor = new GpuFrameExtractor(this.#device); + } + } catch (err) { + console.warn('[UpscalerEngine] GPU pipeline init failed, using CPU fallback:', err); + this.#device = null; + this.#gpuRenderer = null; + this.#gpuExtractor = null; + } + } + + this.#modelBuffer = null; + report?.(1, 'Model loaded.'); + } + + async upscale(img, tileSize, { onTile, signal } = {}) { + if (!this.#session) throw new Error('Model not loaded — call loadModel() first'); + + const perf = { + setup: 0, + extract: 0, + inference: 0, + inferenceEstimated: 0, + readback: 0, + gpuRender: 0, + writeTile: 0, + dispose: 0, + total: 0, + }; + const tTotal = performance.now(); + + const scale = this.#scale; + const overlap = this.#overlap; + const srcW = img.videoWidth ?? img.width; + const srcH = img.videoHeight ?? img.height; + const outW = srcW * scale; + const outH = srcH * scale; + const gaussianBlend = this.#tileBlend === 'gaussian'; + // The GPU output renderer writes via fragment shader directly to the + // canvas's bgra8unorm surface, so it can't host the float32 + // accumulator Gaussian blending needs. Force the CPU readback path. + let useGpu = this.#gpuRenderer !== null && !gaussianBlend; + const useGpuInput = this.#gpuExtractor !== null; + + // In upscaleBefore mode the model takes HR-sized tiles, so we + // multiply all input-side tile coords/dims by `scale`. The output + // side already uses HR coords (tx*scale, outTW=tw*scale, …) for + // every model, so the GPU output renderer needs no changes. + const pixelScale = this.#upscaleBefore ? scale : 1; + + // Gaussian accumulator buffers + a per-tile-size weight cache. The + // accumRGB stores values in [0, 255] before clamping (matching what + // the existing chwToImageData decoder produces), so finalize can do + // a single divide+clamp+pack pass. + const accumRGB = gaussianBlend ? new Float32Array(3 * outW * outH) : null; + const accumW = gaussianBlend ? new Float32Array(outW * outH) : null; + const gaussWeightCache = gaussianBlend ? new Map() : null; + + // The WebGPU canvas surface and the renderer's persistent output texture + // are both bounded by maxTextureDimension2D (commonly 8192, sometimes + // 16384). Exceeding this cap doesn't throw — WebGPU pushes a validation + // error and the canvas stays black — so we proactively fall back to the + // CPU readback path whenever the destination is too big. ONNX inference + // continues to run on WebGPU; only the output rendering path changes. + if (useGpu) { + const maxDim = this.#device?.limits?.maxTextureDimension2D ?? 8192; + if (outW > maxDim || outH > maxDim) { + console.info( + `[UpscalerEngine] Output ${outW}\u00d7${outH} exceeds GPU max texture dimension ${maxDim}; using CPU readback path for this image.`, + ); + useGpu = false; + } + } + + // For upscaleBefore models, pre-rasterize an HR bicubic upsample on + // a 2D canvas and use that as the source for tile extraction. The + // GPU extractor and CPU getImageData paths both accept any canvas; + // they just see a larger texture/ImageData with HR coordinates. + let extractImg = img; + let extractW = srcW; + let extractH = srcH; + if (this.#upscaleBefore) { + const hrCanvas = document.createElement('canvas'); + hrCanvas.width = outW; + hrCanvas.height = outH; + const hrCtx = hrCanvas.getContext('2d'); + hrCtx.imageSmoothingEnabled = true; + hrCtx.imageSmoothingQuality = 'high'; + hrCtx.drawImage(img, 0, 0, outW, outH); + extractImg = hrCanvas; + extractW = outW; + extractH = outH; + } + + const srcData = this.#prepareSource(extractImg, extractW, extractH, useGpuInput, perf); + + const outCanvas = document.createElement('canvas'); + outCanvas.width = outW; + outCanvas.height = outH; + + let outCtx = null; + if (useGpu) { + try { + this.#gpuRenderer.configure(outCanvas, outW, outH); + } catch (err) { + if (err instanceof GpuOutputTooLargeError) { + console.info( + `[UpscalerEngine] ${err.message} Using CPU readback path for this image.`, + ); + } else { + console.warn( + '[UpscalerEngine] GPU canvas configure failed, falling back to CPU readback:', + err, + ); + } + useGpu = false; + } + } + if (!useGpu) { + outCtx = outCanvas.getContext('2d'); + } + + const tiles = buildTileGrid(srcW, srcH, tileSize, overlap); + + const inputName = this.#session.inputNames[0]; + const outputName = this.#session.outputNames[0]; + + if (this.#profiling) try { this.#session.startProfiling(); } catch {} + + let firstInferAt = 0; + let callbackMs = 0; + let yieldMs = 0; + for (let i = 0; i < tiles.length; i++) { + if (signal?.aborted) throw new DOMException('Upscale cancelled', 'AbortError'); + const rendererLost = useGpu && this.#gpuRenderer?.lost; + const extractorLost = useGpuInput && this.#gpuExtractor?.lost; + if (rendererLost || extractorLost) { + throw new Error('GPU device was lost (browser or OS interrupted). Please retry or switch to the WASM backend.'); + } + + const { x: tx, y: ty, w: tw, h: th } = tiles[i]; + + const paddedTW = this.#alignToMultiple(tw); + const paddedTH = this.#alignToMultiple(th); + const tExtract = performance.now(); + // In upscaleBefore mode the source canvas is HR-sized, so extraction + // coords/dims scale up. Equality checks against the LR-side padded + // values are unaffected (both sides scale by the same factor). + const tensor = this.#createTileTensor( + srcData, + tx * pixelScale, + ty * pixelScale, + tw * pixelScale, + th * pixelScale, + paddedTW * pixelScale, + paddedTH * pixelScale, + useGpuInput && paddedTW === tw && paddedTH === th, + ); + const extractMs = performance.now() - tExtract; + perf.extract += extractMs; + + const tInfer = performance.now(); + if (!firstInferAt) firstInferAt = tInfer; + const results = await this.#session.run({ [inputName]: tensor }); + const inferenceMs = performance.now() - tInfer; + perf.inference += inferenceMs; + + const outTW = tw * scale; + const outTH = th * scale; + const outPaddedTW = paddedTW * scale; + const outPaddedTH = paddedTH * scale; + let renderMs = 0, readbackMs = 0; + + if (useGpu && outPaddedTW === outTW && outPaddedTH === outTH) { + const tGpu = performance.now(); + this.#gpuRenderer.renderTile( + results[outputName].gpuBuffer, outTW, outTH, + tx * scale, ty * scale, overlap * scale, 1 / this.#modelValueRange, + ); + this.#gpuRenderer.presentToCanvas(); + renderMs = performance.now() - tGpu; + perf.gpuRender += renderMs; + } else { + const tReadback = performance.now(); + const outTensor = results[outputName]; + // When the session was opened with preferredOutputLocation:'gpu-buffer' + // (gpu fast path enabled at load time) but we're falling back per-image + // because the destination canvas would exceed maxTextureDimension2D, + // the tensor lives on the GPU and `.data` is empty. getData(true) + // downloads the data and releases the GPU buffer in one step. + const rawOutData = outTensor.location === 'gpu-buffer' + ? await outTensor.getData(true) + : outTensor.data; + // fp16 output tensors expose a Uint16Array of bit patterns; unpack + // to Float32 once so the existing CHW/HWC decoders can stay fp32. + const outData = outTensor.type === 'float16' + ? unpackFloat16BitsToFloat32(rawOutData) + : rawOutData; + readbackMs = performance.now() - tReadback; + perf.readback += readbackMs; + + const tWrite = performance.now(); + const dims = outTensor.dims; + const isNHWC = dims.length === 4 && dims[3] === 3 && dims[1] !== 3; + if (gaussianBlend) { + // Look up / build the weight kernel for this tile's HR-side + // content dimensions (outTH, outTW). Edge tiles can be smaller + // than interior tiles; cache by key. + const key = `${outTH}x${outTW}`; + let weights = gaussWeightCache.get(key); + if (!weights) { + weights = makeGaussianWeights2D(outTH, outTW); + gaussWeightCache.set(key, weights); + } + const valueScale = 255 / this.#modelValueRange; + accumulateGaussianTile( + accumRGB, accumW, outW, outH, + outData, outPaddedTW, outPaddedTH, + outTW, outTH, tx * scale, ty * scale, + weights, valueScale, isNHWC ? 'hwc' : 'chw', + ); + // Finalize just the rectangle this tile touched so the user + // sees progressive preview. Overlapping tiles will rewrite + // their shared region as they accumulate; the last tile to + // touch a pixel writes the same value a final full-canvas + // finalize would. + finalizeGaussianRegion( + outCtx, tx * scale, ty * scale, outTW, outTH, + outW, outH, accumRGB, accumW, + ); + } else { + const decode = isNHWC ? hwcToImageData : chwToImageData; + const paddedImgData = decode(outData, outPaddedTW, outPaddedTH, 255 / this.#modelValueRange); + const imgData = outPaddedTW === outTW && outPaddedTH === outTH + ? paddedImgData + : this.#cropImageData(paddedImgData, outTW, outTH); + pasteTileCropped(outCtx, imgData, tx * scale, ty * scale, outW, outH, overlap * scale); + } + renderMs = performance.now() - tWrite; + perf.writeTile += renderMs; + } + + const tDispose = performance.now(); + tensor.dispose(); + results[outputName].dispose(); + const disposeMs = performance.now() - tDispose; + perf.dispose += disposeMs; + + const crop = overlapCrop(tx * scale, ty * scale, outTW, outTH, outW, outH, overlap * scale); + const tCallback = performance.now(); + onTile?.({ + index: i, total: tiles.length, tileMs: inferenceMs, tilePixels: tw * th, + canvas: outCanvas, outX: tx * scale, outY: ty * scale, outW: outTW, outH: outTH, + crop, + perf: { extractMs, inferenceMs, readbackMs, renderMs, disposeMs }, + }); + callbackMs += performance.now() - tCallback; + + const tYield = performance.now(); + await yieldToEventLoop(); + yieldMs += performance.now() - tYield; + } + + if (useGpu) { + this.#gpuRenderer.presentToCanvas(); + await this.#waitForGpuWork(); + } + + const tDone = performance.now(); + perf.total = tDone - tTotal; + if (useGpu && firstInferAt) { + const gpuSpanMs = tDone - firstInferAt; + const otherTrackedMs = + perf.extract + + perf.gpuRender + + perf.readback + + perf.writeTile + + perf.dispose + + callbackMs + + yieldMs; + perf.inferenceEstimated = Math.max(0, gpuSpanMs - otherTrackedMs); + } + + let ortProfile = null; + if (this.#profiling) { + ortProfile = this.#collectOrtProfile(); + } + + // 'gpu-gpu' = GPU input extract + GPU output render (zero readback). + // 'gpu' = ONNX runs on GPU but at least one of input/output uses CPU + // (e.g., per-image fallback when output exceeds maxTexDim). + // 'cpu' = WASM/CPU end-to-end. + const pipeline = useGpu && useGpuInput + ? 'gpu-gpu' + : (useGpu || useGpuInput) ? 'gpu' : 'cpu'; + return { + canvas: outCanvas, + perf: { ...perf, tiles: tiles.length, tileSize, srcW, srcH, outW, outH, pipeline }, + ortProfile, + }; + } + + destroy() { + this.#releaseSession(); + this.#modelBuffer = null; + } + + #releaseSession() { + this.#untrackRealizedBackend(); + this.#gpuRenderer?.destroy(); + this.#gpuRenderer = null; + this.#gpuExtractor?.destroy(); + this.#gpuExtractor = null; + this.#device = null; + try { this.#session?.release(); } catch {} + this.#session = null; + this.#realizedBackend = null; + this.#intent = null; + } + + // While a session is alive, follow runtime backend changes via the + // backend-event channel — the native worker can fall back from CoreML to + // CPU between tiles, and that's the only signal we get. Without this the + // next loadModel-early-return announces a stale realizedBackend. + #trackRealizedBackend() { + if (this.#backendListener) return; + this.#backendListener = (e) => { + const d = e?.detail; + if (d && d.kind === 'success' && typeof d.backend === 'string') { + this.#realizedBackend = d.backend; + } + }; + document.addEventListener('aitools:backend-event', this.#backendListener); + } + + #untrackRealizedBackend() { + if (!this.#backendListener) return; + document.removeEventListener('aitools:backend-event', this.#backendListener); + this.#backendListener = null; + } + + #prepareSource(img, srcW, srcH, useGpuInput, perf) { + const tSetup = performance.now(); + let srcData = null; + if (useGpuInput) { + this.#gpuExtractor.uploadFrame(img, srcW, srcH); + } else { + const tmpC = document.createElement('canvas'); + tmpC.width = srcW; + tmpC.height = srcH; + const tmpCtx = tmpC.getContext('2d'); + tmpCtx.drawImage(img, 0, 0); + srcData = tmpCtx.getImageData(0, 0, srcW, srcH); + tmpC.width = 0; + tmpC.height = 0; + } + perf.setup = performance.now() - tSetup; + return srcData; + } + + #alignToMultiple(value) { + const m = this.#modelInputMultiple; + if (!Number.isFinite(m) || m <= 1) return value; + return Math.ceil(value / m) * m; + } + + #cropImageData(imgData, width, height) { + if (imgData.width === width && imgData.height === height) return imgData; + const out = new ImageData(width, height); + const src = imgData.data; + const dst = out.data; + const srcStride = imgData.width * 4; + const dstStride = width * 4; + for (let row = 0; row < height; row++) { + const srcStart = row * srcStride; + const dstStart = row * dstStride; + dst.set(src.subarray(srcStart, srcStart + dstStride), dstStart); + } + return out; + } + + #createTileTensor(srcData, tx, ty, tw, th, paddedTW, paddedTH, useGpuInput) { + const ort = globalThis.ort; + if (useGpuInput) { + // GPU input fast path is gated to fp32 in loadModel(), so we only + // reach here when the model is fp32. + const gpuBuf = this.#gpuExtractor.extractTile(tx, ty, tw, th, this.#modelValueRange); + return ort.Tensor.fromGpuBuffer(gpuBuf, { + dataType: 'float32', + dims: [1, 3, th, tw], + dispose: () => {}, + }); + } + const isNHWC = this.#modelLayout === 'nhwc'; + const extract = isNHWC ? extractTileNHWC : extractTileNCHW; + const dims = isNHWC ? [1, paddedTH, paddedTW, 3] : [1, 3, paddedTH, paddedTW]; + const f32 = extract( + srcData, + tx, + ty, + tw, + th, + paddedTW, + paddedTH, + this.#modelValueRange / 255, + ); + if (this.#modelPrecision === 'fp16') { + const u16 = packFloat32ToFloat16Bits(f32); + return new ort.Tensor('float16', u16, dims); + } + return new ort.Tensor('float32', f32, dims); + } + + async #waitForGpuWork() { + try { + if (this.#device?.queue?.onSubmittedWorkDone) { + await this.#device.queue.onSubmittedWorkDone(); + } + } catch { + // Ignore sync failures and let the caller continue. + } + } + + /** + * Capture ORT's profiling output (logged to console by endProfiling) + * and return it as structured data instead of formatted strings. + */ + #collectOrtProfile() { + const captured = []; + const origLog = console.log; + const origWarn = console.warn; + const intercept = (...args) => captured.push(args.join(' ')); + console.log = intercept; + console.warn = intercept; + try { this.#session.endProfiling(); } catch {} + console.log = origLog; + console.warn = origWarn; + + if (!captured.length) return null; + let events; + try { + const raw = captured.join('\n'); + events = JSON.parse(raw.substring(raw.indexOf('['), raw.lastIndexOf(']') + 1)); + } catch { return null; } + + const nodes = events.filter(e => e.cat === 'Node'); + const runs = events.filter(e => e.name === 'model_run'); + if (!nodes.length) return null; + + const gpuOps = {}, cpuOps = {}; + let toHostUs = 0, toHostN = 0, fromHostUs = 0, fromHostN = 0; + + for (const n of nodes) { + const op = n.args?.op_name ?? n.name; + const us = n.dur ?? 0; + if (op === 'MemcpyToHost') { toHostUs += us; toHostN++; continue; } + if (op === 'MemcpyFromHost') { fromHostUs += us; fromHostN++; continue; } + const bucket = n.args?.provider === 'CPUExecutionProvider' ? cpuOps : gpuOps; + bucket[op] ??= { us: 0, n: 0 }; + bucket[op].us += us; + bucket[op].n++; + } + + return { + runs: runs.length, + modelRunUs: runs.reduce((s, r) => s + (r.dur ?? 0), 0), + gpuOps, + cpuOps, + memcpy: { + toHost: { us: toHostUs, n: toHostN }, + fromHost: { us: fromHostUs, n: fromHostN }, + }, + }; + } +} diff --git a/features/upscaler/model-registry.js b/features/upscaler/model-registry.js new file mode 100644 index 0000000000000000000000000000000000000000..318a87bb1563877f17c6e5f0fbb83dfae71e0abf --- /dev/null +++ b/features/upscaler/model-registry.js @@ -0,0 +1,135 @@ +// Generated by deploy-hf-space.js — do not edit by hand. + +export const UPSCALER_MODELS = [ + { + "url": "models/4x-UpdraftSmall.onnx", + "scale": 4, + "label": "Updraft Small (Custom)", + "sizeMB": 1.4, + "multipleOf": 32 + }, + { + "url": "models/4x-ClearRealityV1.onnx", + "scale": 4, + "label": "ClearReality (SPAN)", + "sizeMB": 1.9 + }, + { + "url": "models/DAT_light_x4_dyn_OTF_4.onnx", + "scale": 4, + "label": "DAT Light Restore (DAT-Light OTF)", + "sizeMB": 5 + }, + { + "url": "models/4x-UltraSharpV2_Lite.onnx", + "scale": 4, + "label": "UltraSharp V2 Lite (RealPLKSR)", + "sizeMB": 30 + } +]; + +export const UPSCALER_RESAMPLER_MODELS = [ + { + "url": "builtin:lanczos-4x", + "scale": 4, + "label": "Lanczos" + }, + { + "url": "builtin:bicubic-4x", + "scale": 4, + "label": "Bicubic" + } +]; + +/** + * Shared model definitions for the image and video upscaler features. + * Single source of truth — all model . + * @param {typeof UPSCALER_MODELS} [models] + * @param {{ selected?: string, includeResamplers?: boolean }} [opts] + * - `selected` is matched against model URL + * - `includeResamplers` appends built-in non-ONNX upscale methods + */ +export function modelOptionsHTML(models = UPSCALER_MODELS, { selected, includeResamplers = false } = {}) { + const modelList = includeResamplers + ? [...models, ...UPSCALER_RESAMPLER_MODELS] + : models; + + return modelList.map(m => { + const attrs = [ + `value="${m.url}"`, + `data-scale="${m.scale}"`, + ]; + if (m.range) attrs.push(`data-range="${m.range}"`); + if (m.backend) attrs.push(`data-backend="${m.backend}"`); + if (m.sizeMB != null) attrs.push(`data-sizemb="${m.sizeMB}"`); + if (Number.isFinite(m.maxTileSize)) attrs.push(`data-maxtilesize="${m.maxTileSize}"`); + if (Number.isFinite(m.multipleOf) && m.multipleOf > 1) { + attrs.push(`data-multipleof="${m.multipleOf}"`); + } + // Default precision is fp32; only emit data-precision when the model is + // fp16 so unannotated registry entries stay legible. + if (m.precision === 'fp16') attrs.push(`data-precision="fp16"`); + // upscaleBefore=true marks HR-space refiners (e.g. fused diffusion SR + // graphs). The engine bicubic-upsamples LR->HR before tiling so the + // model sees HR pixel patches; multipleOf / maxTileSize stay in LR units. + if (m.upscaleBefore) attrs.push(`data-upscalebefore="true"`); + // tileBlend='gaussian' switches the tile stitcher to float32 Gaussian- + // weighted accumulation (forces CPU readback path). Use for diffusion- + // style models where the default half-overlap hard crop shows seams. + if (m.tileBlend === 'gaussian') attrs.push(`data-tileblend="gaussian"`); + if (m.url === selected) attrs.push('selected'); + const sizeStr = m.sizeMB != null ? ` (~${m.sizeMB}MB)` : ''; + return ``; + }).join('\n '); +} + diff --git a/features/upscaler/ui/perf-monitor.js b/features/upscaler/ui/perf-monitor.js new file mode 100644 index 0000000000000000000000000000000000000000..5434b0f8f4a0185ffb8fb21e257424dd951e17a8 --- /dev/null +++ b/features/upscaler/ui/perf-monitor.js @@ -0,0 +1,305 @@ +/** + * — fixed-position performance overlay. + * Consumes events from the upscaler engine to display live tile stats, + * session timing breakdowns, and optional ORT kernel profiles. + */ + +import { morph } from 'lib/morph'; + +function fmtTime(ms) { + if (ms < 1000) return ms.toFixed(0) + ' ms'; + const s = ms / 1000; + if (s < 60) return s.toFixed(1) + ' s'; + const m = Math.floor(s / 60); + return m + ':' + String(Math.floor(s % 60)).padStart(2, '0'); +} + +function fmtMs(ms) { + return ms.toFixed(1) + ' ms'; +} + +function fmtMB(bytes) { + return (bytes / 1048576).toFixed(1) + ' MB'; +} + +function humanStepName(step) { + const names = { + tiledUpscale: 'Base pass', + blendAll: 'All-pass blend', + detectFaces: 'Face detection', + enhanceFaces: 'Face enhance', + pipeline: 'Pipeline', + }; + return names[step] || step || '—'; +} + +class PerfMonitor extends HTMLElement { + #tileTimes = []; + #startTime = 0; + #heapInterval = null; + #state = 'idle'; + #tilePerf = null; + #currentStep = null; + + #stats = { + backend: '\u2014', tile: '\u2014', tileTime: '\u2014', avgTile: '\u2014', + elapsed: '\u2014', eta: '\u2014', heap: '\u2014', heapLimit: '\u2014', + heapPct: 0, heapClass: '', throughput: '\u2014', stage: '\u2014', + }; + + #results = null; + + connectedCallback() { + this.classList.add('perf-monitor'); + this.style.display = 'none'; + this.#render(); + this.addEventListener('click', (e) => { + if (e.target.closest('.perf-close')) this.hide(); + }); + } + + disconnectedCallback() { + if (this.#heapInterval) { + clearInterval(this.#heapInterval); + this.#heapInterval = null; + } + } + + start(backend) { + this.#tileTimes = []; + this.#startTime = performance.now(); + this.#state = 'running'; + this.#tilePerf = null; + this.#currentStep = null; + this.#results = null; + + const s = this.#stats; + s.backend = backend.toUpperCase(); + s.tile = '\u2014'; s.tileTime = '\u2014'; s.avgTile = '\u2014'; + s.elapsed = '0 s'; s.eta = '\u2014'; s.throughput = '\u2014'; + s.stage = '\u2014'; + + this.#refreshHeap(); + this.style.display = 'block'; + this.#render(); + this.#heapInterval = setInterval(() => { this.#refreshHeap(); this.#render(); }, 500); + } + + update({ step, index, total, tileMs, tilePixels, perf: tilePerf }) { + if (step && step !== this.#currentStep) { + this.#currentStep = step; + this.#tileTimes = []; + } + this.#tileTimes.push(tileMs); + this.#tilePerf = tilePerf || null; + const elapsed = performance.now() - this.#startTime; + const avg = this.#tileTimes.reduce((a, b) => a + b, 0) / this.#tileTimes.length; + const remaining = (total - index - 1) * avg; + const totalPixels = this.#tileTimes.length * tilePixels; + const mpxPerSec = (totalPixels / (elapsed / 1000)) / 1e6; + + const s = this.#stats; + s.stage = humanStepName(step); + s.tile = `${index + 1} / ${total}`; + s.tileTime = fmtTime(tileMs); + s.avgTile = fmtTime(avg); + s.elapsed = fmtTime(elapsed); + s.eta = remaining > 0 ? '~' + fmtTime(remaining) : '\u2014'; + s.throughput = mpxPerSec.toFixed(2) + ' Mpx/s'; + + this.#refreshHeap(); + this.#render(); + } + + updateStage({ step, phase, message }) { + if (this.#state !== 'running') return; + const label = humanStepName(step); + this.#stats.stage = phase === 'done' && label ? `${label} done` : label; + if (message) this.#stats.tile = message; + this.#render(); + } + + showResults(perf, ortProfile, pipelinePerf) { + this.#state = 'done'; + this.#results = { perf, ortProfile, pipelinePerf }; + if (this.#heapInterval) { + clearInterval(this.#heapInterval); + this.#heapInterval = null; + } + this.#refreshHeap(); + this.#render(); + } + + stop() { + if (this.#heapInterval) { + clearInterval(this.#heapInterval); + this.#heapInterval = null; + } + if (this.#state === 'running') { + this.#stats.eta = 'Done'; + this.#state = 'done'; + } + this.#render(); + } + + get elapsedFormatted() { + return fmtTime(performance.now() - this.#startTime); + } + + show() { this.style.display = 'block'; this.#render(); } + hide() { this.style.display = 'none'; } + get visible() { return this.style.display !== 'none'; } + + #refreshHeap() { + const s = this.#stats; + const mem = performance.memory; + if (!mem) { + s.heap = 'N/A'; s.heapLimit = 'N/A'; s.heapPct = 0; s.heapClass = ''; + return; + } + const used = mem.usedJSHeapSize; + const limit = mem.jsHeapSizeLimit; + const pct = (used / limit) * 100; + s.heap = fmtMB(used); + s.heapLimit = fmtMB(limit); + s.heapPct = pct; + s.heapClass = pct > 80 ? ' crit' : pct > 60 ? ' warn' : ''; + } + + #render() { + const s = this.#stats; + const r = this.#results; + const tp = this.#tilePerf; + const isRunning = this.#state === 'running'; + const isDone = this.#state === 'done'; + + let tileBreakdownHtml = ''; + if (isRunning && tp) { + tileBreakdownHtml = ` +
Extract${fmtMs(tp.extractMs)}
+
Inference${fmtMs(tp.inferenceMs)}
+
Render${fmtMs(tp.renderMs)}
+
Dispose${fmtMs(tp.disposeMs)}
`; + } + + let resultsHtml = ''; + if (isDone && r?.perf) { + const p = r.perf; + const pipelineLabel = p.pipeline === 'gpu-gpu' ? 'GPU\u2192GPU' : p.pipeline === 'gpu' ? 'GPU' : 'CPU'; + const tileSizeLabel = p.tileSize > 0 ? p.tileSize + 'px' : 'full'; + const isGpuPipeline = p.pipeline === 'gpu' || p.pipeline === 'gpu-gpu'; + resultsHtml = ` +
+
Session Summary
+
Pipeline${pipelineLabel}
+
Resolution${p.srcW}\u00d7${p.srcH} \u2192 ${p.outW}\u00d7${p.outH}
+
Tiles${p.tiles} @ ${tileSizeLabel}
+
Total${fmtMs(p.total)}
+ ${p.modelLoad > 0 ? `
Model load${fmtMs(p.modelLoad)}
` : ''} +
Setup${fmtMs(p.setup)}
+
Extract${fmtMs(p.extract)}
+
${isGpuPipeline ? 'Inference est.' : 'Inference'}${fmtMs(isGpuPipeline ? (p.inferenceEstimated || 0) : p.inference)}
+ ${p.readback > 0 ? `
Readback${fmtMs(p.readback)}
` : ''} + ${p.gpuRender > 0 ? `
GPU render${fmtMs(p.gpuRender)}
` : ''} + ${p.writeTile > 0 ? `
Write tiles${fmtMs(p.writeTile)}
` : ''} +
Dispose${fmtMs(p.dispose)}
`; + + if (r.ortProfile) { + const ort = r.ortProfile; + const ms = us => (us / 1000).toFixed(1) + 'ms'; + const gpuTotal = Object.values(ort.gpuOps).reduce((acc, e) => acc + e.us, 0); + const cpuTotal = Object.values(ort.cpuOps).reduce((acc, e) => acc + e.us, 0); + const topGpuOps = Object.entries(ort.gpuOps) + .sort(([, a], [, b]) => b.us - a.us) + .slice(0, 4) + .map(([op, { us, n }]) => `${op}\u00d7${n} ${ms(us)}`) + .join(', '); + + resultsHtml += ` +
+
ORT Profile
+
Runs${ort.runs}, model_run ${ms(ort.modelRunUs)}
+ ${gpuTotal ? `
GPU ops${ms(gpuTotal)}
+
${topGpuOps}
` : ''} + ${cpuTotal ? `
CPU ops${ms(cpuTotal)}
` : ''} + ${ort.memcpy.toHost.n ? `
GPU\u2192CPU${ms(ort.memcpy.toHost.us)} \u00d7${ort.memcpy.toHost.n}
` : ''} + ${ort.memcpy.fromHost.n ? `
CPU\u2192GPU${ms(ort.memcpy.fromHost.us)} \u00d7${ort.memcpy.fromHost.n}
` : ''}`; + } + if (r.pipelinePerf?.steps) { + const rows = Object.entries(r.pipelinePerf.steps) + .map(([name, data]) => { + const tiles = data.perf?.tiles ? ` (${data.perf.tiles} tiles)` : ''; + return `
${humanStepName(name)}${fmtMs(data.durationMs)}${tiles}
`; + }) + .join(''); + resultsHtml += ` +
+
Pipeline Steps
+ ${rows} +
Pipeline total${fmtMs(r.pipelinePerf.totalMs || 0)}
`; + } + } + + morph(this, ` + +
+ Performance${isDone ? ' \u2014 Done' : ''} + +
+
Backend${s.backend}
+
Stage${s.stage}
+
Tile${s.tile}
+
Tile time${s.tileTime}
+ ${tileBreakdownHtml} +
Avg tile${s.avgTile}
+
Elapsed${s.elapsed}
+
ETA${s.eta}
+
JS Heap${s.heap}
+
+
+
+
Heap limit${s.heapLimit}
+
Throughput${s.throughput}
+ ${resultsHtml} + `); + } +} + +customElements.define('perf-monitor', PerfMonitor); diff --git a/features/upscaler/ui/upscale-preview.js b/features/upscaler/ui/upscale-preview.js new file mode 100644 index 0000000000000000000000000000000000000000..e17e26503b554f6ba04219ef2b711b7aec133151 --- /dev/null +++ b/features/upscaler/ui/upscale-preview.js @@ -0,0 +1,117 @@ +/** + * — canvas that shows live tile-by-tile upscale progress. + * + * Pure presentation component. The parent orchestrates engines and the + * upscale pipeline; this element just renders tiles as they arrive. + */ + +import { morph } from 'lib/morph'; + +class UpscalePreview extends HTMLElement { + #ctx = null; + + connectedCallback() { + this.classList.add('upscale-preview'); + this.#render(); + } + + /** + * Set up the canvas with a dimmed version of the source image, + * indicating that upscaling is about to begin. + */ + showDimmedPreview(image, outW, outH) { + this.style.setProperty('--ar', `${outW} / ${outH}`); + this.style.setProperty('--ar-num', `${outW / outH}`); + this.style.setProperty('--natural-w', `${outW}px`); + this.#render(); + this.style.display = 'block'; + + const canvas = this.querySelector('canvas'); + canvas.width = outW; + canvas.height = outH; + const ctx = canvas.getContext('2d'); + ctx.imageSmoothingEnabled = false; + ctx.drawImage(image, 0, 0, outW, outH); + ctx.fillStyle = 'rgba(0, 0, 0, 0.45)'; + ctx.fillRect(0, 0, outW, outH); + this.#ctx = ctx; + } + + /** + * Draw a completed tile onto the preview canvas. + * Uses the overlap-cropped rect when available so each pixel is written + * exactly once per step (avoids double-blend artifacts at tile seams). + * @param {{ canvas: HTMLCanvasElement, outX: number, outY: number, outW: number, outH: number, crop?: {x:number,y:number,w:number,h:number} }} tileInfo + * @param {{ opacity?: number }} [opts] + */ + drawTile(tileInfo, { opacity = 1 } = {}) { + if (!this.#ctx) return; + const { x, y, w, h } = tileInfo.crop ?? { + x: tileInfo.outX, y: tileInfo.outY, w: tileInfo.outW, h: tileInfo.outH, + }; + const needsAlpha = opacity < 1; + if (needsAlpha) { this.#ctx.save(); this.#ctx.globalAlpha = opacity; } + this.#ctx.drawImage(tileInfo.canvas, x, y, w, h, x, y, w, h); + if (needsAlpha) this.#ctx.restore(); + } + + hide() { + this.style.display = 'none'; + this.style.removeProperty('--ar'); + this.style.removeProperty('--ar-num'); + this.style.removeProperty('--natural-w'); + const canvas = this.querySelector('canvas'); + if (canvas) { canvas.width = 0; canvas.height = 0; } + this.#ctx = null; + } + + #render() { + morph(this, ` + + + `); + } +} + +customElements.define('upscale-preview', UpscalePreview); diff --git a/features/upscaler/ui/upscaler-canvas-area.js b/features/upscaler/ui/upscaler-canvas-area.js new file mode 100644 index 0000000000000000000000000000000000000000..769c6c1c7b562816b437640aae25cf3ca04e26d3 --- /dev/null +++ b/features/upscaler/ui/upscaler-canvas-area.js @@ -0,0 +1,146 @@ +import 'components/image-drop-zone'; +import 'components/image-cropper'; +import './upscale-preview.js'; +import 'components/compare-slider'; + +class UpscalerCanvasArea extends HTMLElement { + #image = null; + #viewMode = 'fit-width'; + + connectedCallback() { + this.#render(); + this.#wireEvents(); + } + + #q(sel) { return this.querySelector(sel); } + + // ── Public surface ───────────────────────────────────────────────────── + + get image() { return this.#image; } + + get currentCrop() { + return this.#q('image-cropper')?.crop || null; + } + + /** + * Extract the image (cropped or not) to feed the pipeline. Throws if no + * image is loaded. + */ + get croppedImage() { + return this.#q('image-cropper').extractImage(); + } + + get viewMode() { return this.#viewMode; } + set viewMode(mode) { + if (!['fit-width', 'fit-height', 'one-to-one'].includes(mode)) return; + if (mode === this.#viewMode) return; + this.#viewMode = mode; + this.#applyViewState(); + } + + /** + * Pick a default mode based on the loaded image's aspect ratio vs. the + * viewport: fit-width when the image is at least as wide (relative to + * height) as the viewport, fit-height otherwise. + */ + defaultModeForImage(image) { + const vw = window.innerWidth || 1; + const vh = window.innerHeight || 1; + const imgRatio = image.width / image.height; + const vpRatio = vw / vh; + return imgRatio >= vpRatio ? 'fit-width' : 'fit-height'; + } + + showInitial() { + this.#q('image-cropper').hide(); + this.#q('upscale-preview').hide(); + this.#q('compare-slider').hide(); + this.#q('image-drop-zone').show(); + } + + showCropping(image) { + this.#image = image; + this.#q('upscale-preview').hide(); + this.#q('compare-slider').hide(); + this.#q('image-drop-zone').hide(); + this.#q('image-cropper').show(image); + } + + showPreview(image, outW, outH) { + this.#q('image-cropper').style.display = 'none'; + this.#q('compare-slider').hide(); + this.#q('upscale-preview').showDimmedPreview(image, outW, outH); + } + + drawPreviewTile(info, opts) { + this.#q('upscale-preview').drawTile(info, opts); + } + + async showResult(beforeCanvas, afterCanvas, opts) { + this.#q('image-cropper').style.display = 'none'; + this.#q('upscale-preview').hide(); + await this.#q('compare-slider').show(beforeCanvas, afterCanvas, opts); + this.#applyViewState(); + } + + clearCrop() { this.#q('image-cropper').clearCrop(); } + openInTab() { this.#q('compare-slider').openInTab(); } + download() { this.#q('compare-slider').download(); } + + /** + * Scroll the currently-visible stage into view. Useful after a view-mode + * change resizes the stage and pushes it offscreen. + */ + snapCenterVisible() { + const el = this.#visibleStage(); + if (!el) return; + requestAnimationFrame(() => { + const rect = el.getBoundingClientRect(); + const vh = window.innerHeight; + const fullyVisible = rect.top >= 0 && rect.bottom <= vh; + if (fullyVisible) return; + el.scrollIntoView({ block: 'center', behavior: 'smooth' }); + }); + } + + // ── Internal ─────────────────────────────────────────────────────────── + + #visibleStage() { + for (const sel of ['compare-slider', 'upscale-preview', 'image-cropper', 'image-drop-zone']) { + const el = this.#q(sel); + if (el && el.offsetParent !== null) return el; + } + return null; + } + + #applyViewState() { + const mode = this.#viewMode; + const isFitHeight = mode === 'fit-height'; + const isOneToOne = mode === 'one-to-one'; + for (const sel of ['image-cropper', 'upscale-preview', 'compare-slider']) { + const el = this.#q(sel); + if (!el) continue; + el.classList.toggle('expanded', isFitHeight); + el.classList.toggle('native-size', isOneToOne); + } + } + + #wireEvents() { + // Hold the image reference locally; image-loaded also bubbles up so the + // orchestrator can react. crop-changed similarly bubbles from the cropper. + this.#q('image-drop-zone').addEventListener('image-loaded', (e) => { + this.#image = e.detail.image; + }); + } + + #render() { + this.innerHTML = ` + + + + + `; + } +} + +customElements.define('upscaler-canvas-area', UpscalerCanvasArea); diff --git a/features/upscaler/ui/upscaler-controls.js b/features/upscaler/ui/upscaler-controls.js new file mode 100644 index 0000000000000000000000000000000000000000..71d6454bc6760735f74acd01808717deda5f1151 --- /dev/null +++ b/features/upscaler/ui/upscaler-controls.js @@ -0,0 +1,874 @@ +import { morph } from 'lib/morph'; +import { modelOptionsHTML } from '../model-registry.js'; +import { + deleteCustomModelByUrl, + getCustomModelByUrl, + getUploadCustomOptionHTML, + listCustomModels, +} from '../custom-models/custom-model-store.js'; +import '../custom-models/custom-model-upload-dialog.js'; + +// User-facing backend selector returns 'gpu' or 'cpu' (the engine's intent +// vocabulary). Older builds stored 'webgpu' / 'wasm' in localStorage; this +// normalizer keeps a returning user from getting a broken dropdown. +function normalizeIntent(value) { + if (value === 'webgpu' || value === 'gpu') return 'gpu'; + if (value === 'wasm' || value === 'cpu') return 'cpu'; + return 'gpu'; +} + +function escapeHtml(value) { + return String(value) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +const UPLOAD_CUSTOM_VALUE = '__upload_custom__'; + +// Single source of truth for localStorage <-> form control wiring. +// `kind` is 'value' for inputs/selects, 'checked' for checkboxes. +const PERSISTED_CONTROLS = [ + { selector: '.tilesize-select', key: 'upscaler_tilesize', kind: 'value', event: 'change' }, + { selector: '.backend-select', key: 'upscaler_backend', kind: 'value', event: 'change' }, + { selector: '.output-select', key: 'upscaler_output', kind: 'value', event: 'change' }, + { selector: '.pass-all-enabled', key: 'upscaler_pass_all_enabled', kind: 'checked', event: 'change' }, + { selector: '.pass-all-blend', key: 'upscaler_pass_all_blend', kind: 'value', event: 'input' }, + { selector: '.pass-all-model', key: 'upscaler_pass_all_model', kind: 'value', event: 'change' }, + { selector: '.pass-compare-enabled', key: 'upscaler_pass_compare_enabled', kind: 'checked', event: 'change' }, + { selector: '.pass-compare-model', key: 'upscaler_pass_compare_model', kind: 'value', event: 'change' }, + { selector: '.detector-face-enabled', key: 'upscaler_detector_face_enabled', kind: 'checked', event: 'change' }, + { selector: '.detector-face-padding', key: 'upscaler_detector_face_padding_px', kind: 'value', event: 'input' }, + { selector: '.detector-face-score', key: 'upscaler_detector_face_score', kind: 'value', event: 'input' }, + { selector: '.detector-face-blend', key: 'upscaler_detector_face_blend', kind: 'value', event: 'input' }, + { selector: '.detector-face-model', key: 'upscaler_detector_face_model', kind: 'value', event: 'change' }, +]; + +function readControl(el, kind) { + return kind === 'checked' ? (el.checked ? '1' : '0') : el.value; +} +function writeControl(el, kind, saved) { + if (kind === 'checked') el.checked = saved === '1'; + else el.value = saved; +} + +class UpscalerControls extends HTMLElement { + #customModels = []; + #previousModelValue = ''; + #outputBaseLabels = null; + #isRunning = false; + + connectedCallback() { + this.#render(); + this.#customModels = listCustomModels(); + this.#refreshModelSelectOptions(localStorage.getItem('upscaler_model') || undefined); + this.#setupPersistence(); + this.#wireEvents(); + this.#restoreSettings(); + } + + #q(sel) { return this.querySelector(sel); } + #isBuiltInResampler(modelOpt) { return !!modelOpt?.value?.startsWith('builtin:'); } + + // ── Public surface ───────────────────────────────────────────────────── + + get selectedModelOption() { + return this.#q('.model-select')?.selectedOptions?.[0] || null; + } + + get outputScale() { + const parsed = parseInt(this.#q('.output-select')?.value, 10); + return Number.isFinite(parsed) ? parsed : 4; + } + + // The user's load intent: 'gpu' or 'cpu'. Per-model-option overrides via + // data-backend take precedence over the global select. Legacy values + // ('webgpu', 'wasm') from prior localStorage are normalized so a returning + // user doesn't get a broken dropdown. + get backend() { + const raw = this.selectedModelOption?.dataset.backend + || this.#q('.backend-select')?.value + || 'gpu'; + return normalizeIntent(raw); + } + + set isRunning(b) { + this.#isRunning = !!b; + this.#q('.clear-cache-btn').disabled = this.#isRunning; + this.#updateCustomDeleteVisibility(); + } + + refreshAfterCustomModelChange(url) { + this.#customModels = listCustomModels(); + this.#refreshModelSelectOptions(url); + if (url) { + this.#previousModelValue = url; + localStorage.setItem('upscaler_model', url); + } + this.#updateModelBoundControls(); + this.#updateCustomDeleteVisibility(); + } + + /** + * Build the Pipeline config from current form state. Caller adds `profile` + * from the perf-monitor's visibility — the controls component doesn't see + * the perf monitor (lives at the orchestrator level). + */ + get config() { + const opt = this.#q('.model-select').selectedOptions[0]; + const modelUrl = opt.value; + const scale = parseInt(opt.dataset.scale, 10) || 4; + const modelValueRange = parseInt(opt.dataset.range, 10) || 1; + const modelLayout = opt.dataset.layout || 'nchw'; + const modelInputMultiple = parseInt(opt.dataset.multipleof, 10) || 1; + const modelPrecision = opt.dataset.precision === 'fp16' ? 'fp16' : 'fp32'; + const upscaleBefore = opt.dataset.upscalebefore === 'true'; + const tileBlend = opt.dataset.tileblend === 'gaussian' ? 'gaussian' : 'overlapCrop'; + const backend = opt.dataset.backend || this.#q('.backend-select').value; + let tileSize = parseInt(this.#q('.tilesize-select').value, 10); + + const config = { modelUrl, scale, modelValueRange, modelLayout, modelInputMultiple, modelPrecision, upscaleBefore, tileBlend, backend, tileSize }; + + const optionsForClamp = [opt]; + + // Comparison runs the base + a second SR pass and shows them side-by- + // side; All/Faces would mutate the base canvas the slider is supposed to + // expose, so we suppress them entirely whenever Comparison is on. The UI + // already disables those rows — this is the matching defensive guard at + // the config layer. + const compareOn = this.#q('.pass-compare-enabled').checked; + + if (compareOn) { + const copt = this.#q('.pass-compare-model').selectedOptions[0]; + if (copt) optionsForClamp.push(copt); + config.comparison = { + modelUrl: copt?.value || modelUrl, + scale: parseInt(copt?.dataset.scale, 10) || scale, + modelValueRange: parseInt(copt?.dataset.range, 10) || 1, + modelLayout: copt?.dataset.layout || 'nchw', + modelInputMultiple: parseInt(copt?.dataset.multipleof, 10) || 1, + modelPrecision: copt?.dataset.precision === 'fp16' ? 'fp16' : 'fp32', + upscaleBefore: copt?.dataset.upscalebefore === 'true', + tileBlend: copt?.dataset.tileblend === 'gaussian' ? 'gaussian' : 'overlapCrop', + backend: copt?.dataset.backend || backend, + }; + } else { + if (this.#q('.pass-all-enabled').checked) { + const aopt = this.#q('.pass-all-model').selectedOptions[0]; + if (aopt) optionsForClamp.push(aopt); + config.all = { + modelUrl: aopt?.value || modelUrl, + scale: parseInt(aopt?.dataset.scale, 10) || scale, + modelValueRange: parseInt(aopt?.dataset.range, 10) || 1, + modelLayout: aopt?.dataset.layout || 'nchw', + modelInputMultiple: parseInt(aopt?.dataset.multipleof, 10) || 1, + modelPrecision: aopt?.dataset.precision === 'fp16' ? 'fp16' : 'fp32', + upscaleBefore: aopt?.dataset.upscalebefore === 'true', + tileBlend: aopt?.dataset.tileblend === 'gaussian' ? 'gaussian' : 'overlapCrop', + backend: aopt?.dataset.backend || backend, + blendOpacity: parseFloat(this.#q('.pass-all-blend').value), + }; + } + + if (this.#q('.detector-face-enabled').checked) { + const fopt = this.#q('.detector-face-model').selectedOptions[0]; + if (fopt) optionsForClamp.push(fopt); + config.face = { + modelUrl: fopt?.value || modelUrl, + scale: parseInt(fopt?.dataset.scale, 10) || scale, + modelValueRange: parseInt(fopt?.dataset.range, 10) || 1, + modelLayout: fopt?.dataset.layout || 'nchw', + modelInputMultiple: parseInt(fopt?.dataset.multipleof, 10) || 1, + modelPrecision: fopt?.dataset.precision === 'fp16' ? 'fp16' : 'fp32', + upscaleBefore: fopt?.dataset.upscalebefore === 'true', + tileBlend: fopt?.dataset.tileblend === 'gaussian' ? 'gaussian' : 'overlapCrop', + backend: fopt?.dataset.backend || backend, + paddingPx: parseInt(this.#q('.detector-face-padding').value, 10) || 0, + featherPx: 16, + blendOpacity: parseFloat(this.#q('.detector-face-blend').value), + scoreThreshold: parseFloat(this.#q('.detector-face-score').value), + }; + } + } + + // Models with a hard input-size cap (e.g. DAT exports with baked-in + // window counts) only accept tiles up to a fixed dim. Clamp the shared + // tile size to the strictest selected model. When multipleOf === + // maxTileSize the model has a fixed input size: smaller tiles still + // work via edge-replication padding but pay the same per-tile cost over + // a smaller real region, so floor to the fixed size too. + const fixedSizes = optionsForClamp + .map((o) => { + const m = parseInt(o?.dataset?.multipleof, 10); + const c = parseInt(o?.dataset?.maxtilesize, 10); + return (Number.isFinite(m) && Number.isFinite(c) && m === c && m >= 1) ? c : null; + }) + .filter((v) => v != null); + if (fixedSizes.length) { + const floor = Math.max(...fixedSizes); + if (tileSize > 0 && tileSize < floor) tileSize = floor; + } + const caps = optionsForClamp + .map((o) => parseInt(o?.dataset?.maxtilesize, 10)) + .filter((v) => Number.isFinite(v) && v >= 1); + if (caps.length) { + const minCap = Math.min(...caps); + if (tileSize <= 0 || tileSize > minCap) tileSize = minCap; + config.tileSize = tileSize; + } + + return config; + } + + // ── Custom model select rendering ────────────────────────────────────── + + #getCustomModelOptionsHTML(selected) { + if (!this.#customModels.length) return ''; + return this.#customModels.map((model) => { + const attrs = [ + `value="${model.url}"`, + `data-scale="${model.scale}"`, + `data-range="${model.range || 1}"`, + `data-layout="${model.layout || 'nchw'}"`, + `data-multipleof="${model.multipleOf || 1}"`, + `data-sizemb="${model.sizeMB}"`, + ]; + if (Number.isFinite(model.maxTileSize)) { + attrs.push(`data-maxtilesize="${model.maxTileSize}"`); + } + if (model.precision === 'fp16') attrs.push(`data-precision="fp16"`); + if (model.url === selected) attrs.push('selected'); + const sizeStr = model.sizeMB != null ? ` (~${model.sizeMB}MB)` : ''; + return ``; + }).join('\n '); + } + + #refreshModelSelectOptions(selected) { + const modelEl = this.#q('.model-select'); + if (!modelEl) return; + modelEl.innerHTML = [ + modelOptionsHTML(undefined, { selected, includeResamplers: true }), + this.#getCustomModelOptionsHTML(selected), + getUploadCustomOptionHTML(), + ].filter(Boolean).join('\n '); + if (selected) modelEl.value = selected; + if (!modelEl.selectedOptions.length) modelEl.selectedIndex = 0; + + // Pass selectors share the same custom-model list as the primary select. + // We only refresh their option lists — never their selection — so adding + // or editing a custom model from the main select doesn't disturb whatever + // the user has chosen for the all-pass / face-pass. + this.#refreshPassModelSelect('.pass-all-model'); + this.#refreshPassModelSelect('.pass-compare-model'); + this.#refreshPassModelSelect('.detector-face-model'); + } + + #refreshPassModelSelect(selector) { + const el = this.#q(selector); + if (!el) return; + const previousValue = el.value; + el.innerHTML = [ + modelOptionsHTML(undefined, { selected: previousValue }), + this.#getCustomModelOptionsHTML(previousValue), + ].filter(Boolean).join('\n '); + if (previousValue) { + el.value = previousValue; + if (!el.selectedOptions.length) el.selectedIndex = 0; + } else if (!el.selectedOptions.length) { + el.selectedIndex = 0; + } + } + + // ── Persistence ──────────────────────────────────────────────────────── + + #setupPersistence() { + for (const { selector, key, kind, event } of PERSISTED_CONTROLS) { + const el = this.#q(selector); + el.addEventListener(event, () => localStorage.setItem(key, readControl(el, kind))); + } + } + + #restoreSettings() { + for (const { selector, key, kind } of PERSISTED_CONTROLS) { + const saved = localStorage.getItem(key); + if (saved === null) continue; + writeControl(this.#q(selector), kind, saved); + } + const modelEl = this.#q('.model-select'); + if (!modelEl.selectedOptions.length) modelEl.selectedIndex = 0; + this.#previousModelValue = modelEl.value; + this.#syncComparisonExclusion(); + this.#updateModelBoundControls(); + this.#updateInputMirrors(); + this.#updateCustomDeleteVisibility(); + } + + // ── Event wiring ─────────────────────────────────────────────────────── + + #wireEvents() { + const modelEl = this.#q('.model-select'); + const editCustomBtn = this.#q('.edit-custom-model-btn'); + const deleteCustomBtn = this.#q('.delete-custom-model-btn'); + const dialog = this.#q('custom-model-upload-dialog'); + + modelEl.addEventListener('change', async () => { + if (modelEl.value === UPLOAD_CUSTOM_VALUE) { + const previousOption = Array.from(modelEl.options).find((opt) => opt.value === this.#previousModelValue); + const defaultScale = parseInt(previousOption?.dataset.scale, 10) || 4; + const customModel = await dialog.open({ defaultScale }); + if (!customModel) { + modelEl.value = this.#previousModelValue; + } else { + this.refreshAfterCustomModelChange(customModel.url); + this.#emitStatus('Model added', `Added "${customModel.label}" (${customModel.scale}x, ~${customModel.sizeMB}MB).`); + return; + } + } else { + this.#previousModelValue = modelEl.value; + } + localStorage.setItem('upscaler_model', modelEl.value); + this.#updateModelBoundControls(); + this.#updateCustomDeleteVisibility(); + }); + + editCustomBtn.addEventListener('click', async () => { + if (this.#isRunning) return; + const selected = getCustomModelByUrl(modelEl.value); + if (!selected) return; + const updated = await dialog.open({ editModel: selected }); + if (!updated) return; + this.refreshAfterCustomModelChange(updated.url); + this.#emitStatus('Model updated', `Updated "${updated.label}".`); + }); + + deleteCustomBtn.addEventListener('click', async () => { + if (this.#isRunning) return; + const selected = getCustomModelByUrl(modelEl.value); + if (!selected) return; + const ok = globalThis.confirm(`Delete custom model "${selected.label}"?\n\nThis will remove it from the local model cache.`); + if (!ok) return; + await deleteCustomModelByUrl(selected.url); + this.#customModels = listCustomModels(); + this.#refreshModelSelectOptions(); + if (modelEl.value === UPLOAD_CUSTOM_VALUE && modelEl.options.length > 1) { + modelEl.selectedIndex = 0; + } + this.#previousModelValue = modelEl.value; + localStorage.setItem('upscaler_model', modelEl.value); + this.#updateModelBoundControls(); + this.#updateCustomDeleteVisibility(); + this.#emitStatus('Model deleted', `Deleted "${selected.label}".`); + }); + + this.#q('.tilesize-select').addEventListener('change', () => this.#updateHangWarning()); + this.#q('.backend-select').addEventListener('change', () => this.#updateHangWarning()); + + // Toggling a pass on/off or switching its model can change the strictest + // selected max-tile cap, so refresh the tile-size dropdown the same way + // a primary-model change does. + for (const sel of [ + '.pass-all-enabled', + '.pass-all-model', + '.pass-compare-enabled', + '.pass-compare-model', + '.detector-face-enabled', + '.detector-face-model', + ]) { + this.#q(sel)?.addEventListener('change', () => this.#updateModelBoundControls()); + } + + this.#q('.pass-compare-enabled').addEventListener('change', () => this.#syncComparisonExclusion()); + + const wireMirror = (selector, mirrorSelector) => { + this.#q(selector).addEventListener('input', (e) => { + this.#q(mirrorSelector).textContent = e.target.value; + }); + }; + wireMirror('.pass-all-blend', '.pass-all-blend-val'); + wireMirror('.detector-face-score', '.detector-face-score-val'); + wireMirror('.detector-face-blend', '.detector-face-blend-val'); + + const bubble = (name) => this.dispatchEvent(new CustomEvent(name, { bubbles: true })); + this.#q('.perf-toggle-btn').addEventListener('click', () => bubble('perf-toggle')); + this.#q('.clear-cache-btn').addEventListener('click', () => bubble('clear-cache')); + } + + #emitStatus(title, details) { + this.dispatchEvent(new CustomEvent('status-message', { + bubbles: true, + detail: { + title, + state: 'idle', + details: details || '', + progress: -1, + tileCount: null, + }, + })); + } + + #emitModelChange() { + const opt = this.selectedModelOption; + const scale = parseInt(opt?.dataset.scale, 10) || 4; + const verb = scale === 1 ? 'Enhance' : 'Upscale'; + this.dispatchEvent(new CustomEvent('model-change', { + bubbles: true, detail: { scale, verb, isBuiltInResampler: this.#isBuiltInResampler(opt) }, + })); + } + + // ── Model-bound UI sync ──────────────────────────────────────────────── + + #updateModelBoundControls() { + const modelEl = this.#q('.model-select'); + const outputEl = this.#q('.output-select'); + const tileEl = this.#q('.tilesize-select'); + + if (!this.#outputBaseLabels) { + this.#outputBaseLabels = new Map(Array.from(outputEl.options).map(opt => [ + opt.value, + opt.textContent.replace(/\s+\(no downscale\)$/i, ''), + ])); + } + + const modelOpt = modelEl.selectedOptions[0]; + const scale = parseInt(modelOpt?.dataset.scale, 10) || 4; + const maxOutputScale = Math.max(1, Math.min(scale, 4)); + const isBuiltInResampler = this.#isBuiltInResampler(modelOpt); + const previousOutputScale = parseInt(outputEl.value, 10); + + for (const opt of outputEl.options) { + const optionScale = parseInt(opt.value, 10) || 1; + const baseLabel = this.#outputBaseLabels.get(opt.value) || `${optionScale}x`; + opt.textContent = !isBuiltInResampler && optionScale === maxOutputScale + ? `${baseLabel} (no downscale)` + : baseLabel; + opt.disabled = optionScale > maxOutputScale; + } + + const preferredScale = Number.isFinite(previousOutputScale) ? previousOutputScale : maxOutputScale; + const nextOutputScale = Math.max(1, Math.min(maxOutputScale, preferredScale)); + outputEl.value = String(nextOutputScale); + localStorage.setItem('upscaler_output', outputEl.value); + this.#q('.backend-select').disabled = isBuiltInResampler; + tileEl.disabled = isBuiltInResampler; + + // Strictest tile-size cap from the main model plus enabled pass models. + const capCandidates = [modelOpt]; + if (this.#q('.pass-all-enabled')?.checked) { + capCandidates.push(this.#q('.pass-all-model')?.selectedOptions[0]); + } + if (this.#q('.pass-compare-enabled')?.checked) { + capCandidates.push(this.#q('.pass-compare-model')?.selectedOptions[0]); + } + if (this.#q('.detector-face-enabled')?.checked) { + capCandidates.push(this.#q('.detector-face-model')?.selectedOptions[0]); + } + const caps = capCandidates + .map((o) => parseInt(o?.dataset?.maxtilesize, 10)) + .filter((v) => Number.isFinite(v) && v >= 1); + const hasMaxTile = caps.length > 0; + const maxTileSize = hasMaxTile ? Math.min(...caps) : Infinity; + const fixedSizes = capCandidates + .map((o) => { + const m = parseInt(o?.dataset?.multipleof, 10); + const c = parseInt(o?.dataset?.maxtilesize, 10); + return (Number.isFinite(m) && Number.isFinite(c) && m === c && m >= 1) ? c : null; + }) + .filter((v) => v != null); + const tileFloor = fixedSizes.length ? Math.max(...fixedSizes) : 0; + let largestEnabledTileVal = null; + for (const opt of tileEl.options) { + const optVal = parseInt(opt.value, 10); + const isFullImage = optVal === 0; + const exceeds = hasMaxTile && (isFullImage || optVal > maxTileSize); + const belowFloor = tileFloor > 0 && !isFullImage && optVal < tileFloor; + opt.disabled = exceeds || belowFloor; + if (!opt.disabled && Number.isFinite(optVal) && optVal > 0) { + if (largestEnabledTileVal === null || optVal > largestEnabledTileVal) { + largestEnabledTileVal = optVal; + } + } + } + if ((hasMaxTile || tileFloor > 0) && tileEl.selectedOptions[0]?.disabled && largestEnabledTileVal != null) { + tileEl.value = String(largestEnabledTileVal); + localStorage.setItem('upscaler_tilesize', tileEl.value); + } + + this.#updateHangWarning(); + this.#emitModelChange(); + } + + #updateCustomDeleteVisibility() { + const modelEl = this.#q('.model-select'); + const editCustomBtn = this.#q('.edit-custom-model-btn'); + const deleteCustomBtn = this.#q('.delete-custom-model-btn'); + const selected = getCustomModelByUrl(modelEl.value); + deleteCustomBtn.hidden = !selected; + deleteCustomBtn.disabled = !selected || this.#isRunning; + deleteCustomBtn.title = selected ? `Delete custom model "${selected.label}"` : 'Delete selected custom model'; + editCustomBtn.hidden = !selected; + editCustomBtn.disabled = !selected || this.#isRunning; + editCustomBtn.title = selected ? `Edit custom model "${selected.label}"` : 'Edit selected custom model'; + } + + #updateInputMirrors() { + this.#q('.pass-all-blend-val').textContent = this.#q('.pass-all-blend').value; + this.#q('.detector-face-score-val').textContent = this.#q('.detector-face-score').value; + this.#q('.detector-face-blend-val').textContent = this.#q('.detector-face-blend').value; + } + + // When Comparison is on, the All/Faces passes are mutually exclusive — they + // would muddy what the slider is showing. Disable their controls and dim + // the rows, but leave the underlying values untouched so toggling + // Comparison off restores the user's prior pass setup verbatim. + #syncComparisonExclusion() { + const compareOn = !!this.#q('.pass-compare-enabled')?.checked; + const otherRows = this.querySelectorAll('.detector-row:not(.pass-compare-row)'); + for (const row of otherRows) { + row.classList.toggle('passes-disabled', compareOn); + for (const ctrl of row.querySelectorAll('input, select')) { + ctrl.disabled = compareOn; + } + } + } + + #updateHangWarning() { + const warnEl = this.#q('.hang-warn'); + const tipEl = this.#q('.hang-warn-tip'); + const modelOpt = this.#q('.model-select').selectedOptions[0]; + if (this.#isBuiltInResampler(modelOpt)) { + warnEl.classList.remove('visible'); + return; + } + const sizeMB = parseFloat(modelOpt?.dataset.sizemb) || 0; + const tileSize = parseInt(this.#q('.tilesize-select').value, 10); + const isLargeOnBigTile = sizeMB > 10 && tileSize > 128; + + // fp16 inference effectively requires GPU — ORT-Web's WASM EP has very + // limited fp16 op coverage so most fp16 models throw a kernel-not-found + // or input-dtype error. Surface this before the user runs. + const backend = normalizeIntent(modelOpt?.dataset.backend || this.#q('.backend-select').value); + const isFp16OnCpu = modelOpt?.dataset.precision === 'fp16' && backend !== 'gpu'; + + const show = isLargeOnBigTile || isFp16OnCpu; + warnEl.classList.toggle('visible', show); + if (!show) return; + + const messages = []; + if (isFp16OnCpu) { + messages.push( + `fp16 model on CPU backend: this model uses 16-bit precision, which ONNX Runtime's CPU/WASM backend has very limited support for. Inference will almost certainly fail with an "unexpected input data type" or "kernel not found" error. Switch Backend to GPU.`, + ); + } + if (isLargeOnBigTile) { + messages.push( + `Large model with big tiles: models >10 MB combined with tile sizes above 128 can block the browser's main thread for extended periods, causing the UI to freeze. You may not be able to click Stop until the current tile finishes. Consider reducing the tile size or using a smaller model.`, + ); + } + tipEl.innerHTML = messages.join('

'); + } + + // ── Template ─────────────────────────────────────────────────────────── + + #render() { + morph(this, ` + + +
+ + + + + + + + + + + + + + + +
+ +
+ Additional Passes +
+ + +
+
+ + + +
+
+ + + + + +
+
+ + + `); + } +} + +customElements.define('upscaler-controls', UpscalerControls); diff --git a/features/upscaler/ui/upscaler-toolbar.js b/features/upscaler/ui/upscaler-toolbar.js new file mode 100644 index 0000000000000000000000000000000000000000..d8da6d0695d4e5681eef536254fd9e97e205a6ec --- /dev/null +++ b/features/upscaler/ui/upscaler-toolbar.js @@ -0,0 +1,247 @@ +import 'components/status-bar'; +import 'components/view-mode-controls'; + +const STATES = ['empty', 'ready', 'running', 'done']; + +class UpscalerToolbar extends HTMLElement { + #state = 'empty'; + #hasCrop = false; + + connectedCallback() { + this.#render(); + this.#wireEvents(); + this.#applyState(); + } + + #q(sel) { return this.querySelector(sel); } + + // ── Public surface ───────────────────────────────────────────────────── + + get state() { return this.#state; } + set state(s) { + if (!STATES.includes(s)) return; + this.#state = s; + this.#applyState(); + } + + set hasCrop(b) { + this.#hasCrop = !!b; + this.#applyState(); + } + + get viewMode() { return this.#q('view-mode-controls').mode; } + set viewMode(mode) { + const vmc = this.#q('view-mode-controls'); + if (vmc) vmc.mode = mode; + } + + setUpscaleLabel(label) { + const span = this.#q('.upscale-btn .btn-label'); + if (span) span.textContent = label; + } + + // status-bar lives inside this component visually; expose it so the + // orchestrator can write progress/messages directly during a run. + get statusBar() { return this.#q('status-bar'); } + + // ── Internal ─────────────────────────────────────────────────────────── + + #applyState() { + const setDisplay = (sel, show) => { + const el = this.#q(sel); + if (el) el.style.display = show ? 'inline-block' : 'none'; + }; + const setHidden = (sel, hidden) => { + const el = this.#q(sel); + if (el) el.hidden = hidden; + }; + + const s = this.#state; + const upscaleBtn = this.#q('.upscale-btn'); + upscaleBtn.disabled = s === 'empty' || s === 'running'; + + setDisplay('.stop-btn', s === 'running'); + setDisplay('.startover-btn', s === 'ready' || s === 'done'); + setDisplay('.back-to-crop-btn', s === 'done'); + setDisplay('.clear-crop-btn', s === 'ready' && this.#hasCrop); + + setHidden('.canvas-toolbar-left', s === 'empty'); + setHidden('.canvas-toolbar-right', s !== 'done'); + } + + #wireEvents() { + const fire = (name) => () => this.dispatchEvent( + new CustomEvent(name, { bubbles: true }), + ); + + this.#q('.upscale-btn' ).addEventListener('click', fire('upscale-click')); + this.#q('.stop-btn' ).addEventListener('click', fire('stop-click')); + this.#q('.startover-btn' ).addEventListener('click', fire('start-over-click')); + this.#q('.clear-crop-btn' ).addEventListener('click', fire('clear-crop-click')); + this.#q('.back-to-crop-btn' ).addEventListener('click', fire('back-to-crop-click')); + this.#q('.open-in-tab-btn' ).addEventListener('click', fire('open-in-tab-click')); + this.#q('.download-btn' ).addEventListener('click', fire('download-click')); + + // Re-emit view-mode-controls' change as a bubbling event so the + // orchestrator can forward to canvas-area without poking through. + this.#q('view-mode-controls').addEventListener('mode-change', (e) => { + this.dispatchEvent(new CustomEvent('view-mode-change', { + bubbles: true, detail: { mode: e.detail.mode }, + })); + }); + } + + #render() { + this.innerHTML = ` + + +
+ +
+ + `; + } +} + +customElements.define('upscaler-toolbar', UpscalerToolbar); diff --git a/features/upscaler/upscale-pipeline.js b/features/upscaler/upscale-pipeline.js new file mode 100644 index 0000000000000000000000000000000000000000..93b456a1a00d7fc1ae8b07847b796d03941882c5 --- /dev/null +++ b/features/upscaler/upscale-pipeline.js @@ -0,0 +1,536 @@ +/** + * Step-based upscale pipeline — unified processing for image and video upscaling. + * Only the Pipeline class is exported; everything else is module-private. + */ + +import { UpscalerEngine } from './engine/upscaler-engine.js'; +import { FaceDetectorEngine } from './engine/face-detector-engine.js'; +import { + expandRect, + cropToCanvas, + compositeFeathered, + computeFeatherPx, + ensureCanvas, + blendCanvas, +} from 'lib/canvas'; +import { buildTileGrid } from './engine/tiling.js'; + +// --------------------------------------------------------------------------- +// Engine pool — caches engines by tag, recreates when config diverges. +// --------------------------------------------------------------------------- + +class EnginePool { + #slots = new Map(); + + #evict(tag) { + const slot = this.#slots.get(tag); + if (!slot) return; + this.#slots.delete(tag); + (slot.engine.destroy ?? slot.engine.release)?.call(slot.engine); + } + + getUpscaler(tag, { modelUrl, scale, modelValueRange, modelLayout = 'nchw', modelInputMultiple = 1, modelPrecision = 'fp32', upscaleBefore = false, tileBlend = 'overlapCrop', profile = false }) { + // Backend isn't a construction-time parameter — the engine's loadModel + // handles intent transitions internally (release session, load new). The + // pool's identity is purely the things the engine can't change after the + // fact: model URL, layout, precision, tile-blend strategy. + const slot = this.#slots.get(tag); + if ( + slot && + slot.modelUrl === modelUrl && + slot.modelLayout === modelLayout && + slot.modelInputMultiple === modelInputMultiple && + slot.modelPrecision === modelPrecision && + slot.upscaleBefore === upscaleBefore && + slot.tileBlend === tileBlend + ) { + slot.engine.profiling = profile; + return slot.engine; + } + this.#evict(tag); + const engine = new UpscalerEngine({ modelUrl, scale, modelValueRange, modelLayout, modelInputMultiple, modelPrecision, upscaleBefore, tileBlend, profile }); + this.#slots.set(tag, { engine, modelUrl, modelLayout, modelInputMultiple, modelPrecision, upscaleBefore, tileBlend }); + return engine; + } + + getDetector(tag) { + // Backend transitions are handled inside FaceDetectorEngine.loadModel; + // the pool just returns the persistent engine instance. + let slot = this.#slots.get(tag); + if (slot) return slot.engine; + const engine = new FaceDetectorEngine(); + this.#slots.set(tag, { engine }); + return engine; + } + + destroyAll() { + for (const { engine } of this.#slots.values()) { + (engine.destroy ?? engine.release)?.call(engine); + } + this.#slots.clear(); + } +} + +// --------------------------------------------------------------------------- +// Steps — { name, shouldRun?(ctx), run(ctx, cb) → ctx } +// --------------------------------------------------------------------------- + +const tiledUpscaleStep = { + name: 'tiledUpscale', + async run(ctx, cb) { + const { modelUrl, scale, modelValueRange, modelLayout, modelInputMultiple, modelPrecision, upscaleBefore, tileBlend, backend, tileSize, profile } = ctx.config; + const engine = ctx.pool.getUpscaler('base', { + modelUrl, + scale, + modelValueRange, + modelLayout, + modelInputMultiple, + modelPrecision, + upscaleBefore, + tileBlend, + backend, + profile, + }); + emitStage(cb, 'tiledUpscale', 'loading', { message: 'Loading base model…' }); + const tLoad = performance.now(); + await engine.loadModel(backend, (frac, msg) => { + cb.onProgress?.(frac, msg); + emitStage(cb, 'tiledUpscale', 'loading', { progress: frac, message: msg }); + }); + const modelLoadMs = Number((performance.now() - tLoad).toFixed(1)); + emitStage(cb, 'tiledUpscale', 'running', { message: 'Running base upscale pass…' }); + const { canvas, perf, ortProfile } = await engine.upscale(ctx.image, tileSize, { + onTile: (info) => cb.onTile?.({ ...info, step: 'tiledUpscale' }), + signal: cb.signal, + }); + return { + ...ctx, + image: canvas, + scale: engine.scale, + perf, + ortProfile, + stepPerf: { ...(ctx.stepPerf || {}), tiledUpscale: { ...perf, modelLoadMs } }, + }; + }, +}; + +const comparisonStep = { + name: 'comparison', + shouldRun: (ctx) => !!ctx.config.comparison, + async run(ctx, cb) { + const { comparison, backend, tileSize } = ctx.config; + const passBackend = comparison.backend || backend; + const engine = ctx.pool.getUpscaler('comparison-upscaler', { + modelUrl: comparison.modelUrl, + scale: comparison.scale, + modelValueRange: comparison.modelValueRange, + modelLayout: comparison.modelLayout, + modelInputMultiple: comparison.modelInputMultiple, + modelPrecision: comparison.modelPrecision, + upscaleBefore: comparison.upscaleBefore, + tileBlend: comparison.tileBlend, + backend: passBackend, + }); + emitStage(cb, 'comparison', 'loading', { message: 'Loading comparison model…' }); + const tLoad = performance.now(); + await engine.loadModel(passBackend, (progress, message) => { + emitStage(cb, 'comparison', 'loading', { progress, message }); + }); + const modelLoadMs = Number((performance.now() - tLoad).toFixed(1)); + emitStage(cb, 'comparison', 'running', { message: 'Running comparison upscale pass…' }); + + const { canvas, perf } = await engine.upscale(ctx.source, tileSize, { + onTile: (info) => cb.onTile?.({ ...info, step: 'comparison' }), + signal: cb.signal, + }); + return { + ...ctx, + comparisonImage: canvas, + stepPerf: { ...(ctx.stepPerf || {}), comparison: { ...perf, modelLoadMs } }, + }; + }, +}; + +const blendAllStep = { + name: 'blendAll', + shouldRun: (ctx) => !!ctx.config.all, + async run(ctx, cb) { + const { all, backend, tileSize } = ctx.config; + const passBackend = all.backend || backend; + const engine = ctx.pool.getUpscaler('all-upscaler', { + modelUrl: all.modelUrl, + scale: all.scale, + modelValueRange: all.modelValueRange, + modelLayout: all.modelLayout, + modelInputMultiple: all.modelInputMultiple, + modelPrecision: all.modelPrecision, + upscaleBefore: all.upscaleBefore, + tileBlend: all.tileBlend, + backend: passBackend, + }); + emitStage(cb, 'blendAll', 'loading', { message: 'Loading all-pass model…' }); + const tLoad = performance.now(); + await engine.loadModel(passBackend, (progress, message) => { + emitStage(cb, 'blendAll', 'loading', { progress, message }); + }); + const modelLoadMs = Number((performance.now() - tLoad).toFixed(1)); + emitStage(cb, 'blendAll', 'running', { message: 'Running all-pass tiled blend…' }); + + const { canvas: overlayRaw, perf } = await engine.upscale(ctx.source, tileSize, { + onTile: (info) => cb.onTile?.({ ...info, step: 'blendAll' }), + signal: cb.signal, + }); + let baseCanvas = ensureCanvas(ctx.image); + let overlayCanvas = overlayRaw; + if (overlayRaw.width !== baseCanvas.width || overlayRaw.height !== baseCanvas.height) { + overlayCanvas = document.createElement('canvas'); + overlayCanvas.width = baseCanvas.width; + overlayCanvas.height = baseCanvas.height; + overlayCanvas.getContext('2d').drawImage(overlayRaw, 0, 0, baseCanvas.width, baseCanvas.height); + } + baseCanvas = blendCanvas(baseCanvas, overlayCanvas, all.blendOpacity); + return { + ...ctx, + image: baseCanvas, + stepPerf: { ...(ctx.stepPerf || {}), blendAll: { ...perf, modelLoadMs } }, + }; + }, +}; + +const detectFacesStep = { + name: 'detectFaces', + shouldRun: (ctx) => !!ctx.config.face, + async run(ctx, cb) { + const { backend, face } = ctx.config; + const detector = ctx.pool.getDetector('face-detector'); + emitStage(cb, 'detectFaces', 'loading', { message: 'Loading face detector…' }); + const tLoad = performance.now(); + await detector.loadModel('face-yunet', backend, (progress, message) => { + emitStage(cb, 'detectFaces', 'loading', { progress, message }); + }); + const modelLoadMs = Number((performance.now() - tLoad).toFixed(1)); + emitStage(cb, 'detectFaces', 'running', { message: 'Detecting faces…' }); + const tDetect = performance.now(); + const faces = await detector.detectFaces(ctx.source, { + detectorKey: 'face-yunet', + scoreThreshold: face.scoreThreshold, + signal: cb.signal, + }); + const detectPerf = { + modelLoadMs, + total: performance.now() - tDetect, + detections: faces.length, + }; + emitStage(cb, 'detectFaces', 'running', { message: `Detected ${faces.length} face(s).` }); + return { + ...ctx, + detections: { ...ctx.detections, face: faces }, + stepPerf: { ...(ctx.stepPerf || {}), detectFaces: detectPerf }, + }; + }, +}; + +const enhanceFacesStep = { + name: 'enhanceFaces', + shouldRun: (ctx) => ctx.detections.face?.length > 0, + async run(ctx, cb) { + const { face, backend } = ctx.config; + const faceBackend = face.backend || backend; + const { source, scale } = ctx; + + let canvas = ensureCanvas(ctx.image); + + const engine = ctx.pool.getUpscaler('face-upscaler', { + modelUrl: face.modelUrl, + scale: face.scale, + modelValueRange: face.modelValueRange, + modelLayout: face.modelLayout, + modelInputMultiple: face.modelInputMultiple, + modelPrecision: face.modelPrecision, + upscaleBefore: face.upscaleBefore, + tileBlend: face.tileBlend, + backend: faceBackend, + }); + emitStage(cb, 'enhanceFaces', 'loading', { message: 'Loading face enhancer model…' }); + const tLoad = performance.now(); + await engine.loadModel(faceBackend, (progress, message) => { + emitStage(cb, 'enhanceFaces', 'loading', { progress, message }); + }); + const modelLoadMs = Number((performance.now() - tLoad).toFixed(1)); + emitStage(cb, 'enhanceFaces', 'running', { message: 'Enhancing detected faces…' }); + + const srcW = source.naturalWidth ?? source.width; + const srcH = source.naturalHeight ?? source.height; + const faces = ctx.detections.face || []; + const configuredFaceTileSize = Number.isFinite(face.tileSize) ? face.tileSize : ctx.config.tileSize; + const agg = { + setup: 0, extract: 0, inference: 0, inferenceEstimated: 0, readback: 0, gpuRender: 0, writeTile: 0, dispose: 0, total: 0, tiles: 0, modelLoadMs, + }; + + for (let faceIndex = 0; faceIndex < faces.length; faceIndex++) { + const det = faces[faceIndex]; + if (cb.signal?.aborted) throw new DOMException('Cancelled', 'AbortError'); + emitStage(cb, 'enhanceFaces', 'running', { + message: `Enhancing face ${faceIndex + 1}/${faces.length}…`, + }); + + const roi = expandRect(det, face.paddingPx, srcW, srcH); + if (roi.w < 1 || roi.h < 1) continue; + + const crop = cropToCanvas(source, roi); + if (!crop) continue; + + const maxTileForRoi = Math.max(1, Math.min(roi.w, roi.h)); + const requestedTileSize = Number.isFinite(configuredFaceTileSize) ? configuredFaceTileSize : 192; + // Honor selected tile size for face patches so large faces are not over-tiled. + const tileSize = requestedTileSize <= 0 + ? 0 + : Math.min(maxTileForRoi, Math.max(64, requestedTileSize)); + const faceTileTotal = buildTileGrid(roi.w, roi.h, tileSize, 16).length; + const { canvas: patchRaw, perf } = await engine.upscale(crop, tileSize, { + onTile: (info) => cb.onTile?.({ + ...info, + step: 'enhanceFaces', + faceIndex, + faceTotal: faces.length, + faceTileTotal, + }), + signal: cb.signal, + }); + agg.setup += perf.setup; + agg.extract += perf.extract; + agg.inference += perf.inference; + agg.inferenceEstimated += perf.inferenceEstimated || 0; + agg.readback += perf.readback; + agg.gpuRender += perf.gpuRender; + agg.writeTile += perf.writeTile; + agg.dispose += perf.dispose; + agg.total += perf.total; + agg.tiles += perf.tiles; + + const tw = roi.w * scale; + const th = roi.h * scale; + const patch = document.createElement('canvas'); + patch.width = tw; + patch.height = th; + const pctx = patch.getContext('2d'); + pctx.imageSmoothingEnabled = true; + pctx.imageSmoothingQuality = 'high'; + pctx.drawImage(patchRaw, 0, 0, tw, th); + + const roiOutX = roi.x * scale; + const roiOutY = roi.y * scale; + compositeFeathered(canvas, patch, roiOutX, roiOutY, { + featherPx: computeFeatherPx({ + configuredFeatherPx: face.featherPx ?? 16, + regionW: det.w, regionH: det.h, + patchW: tw, patchH: th, + paddingPx: face.paddingPx, + scale, + }), + innerRect: { + x: Math.max(0, (det.x - roi.x) * scale), + y: Math.max(0, (det.y - roi.y) * scale), + w: Math.max(1, det.w * scale), + h: Math.max(1, det.h * scale), + }, + blendOpacity: face.blendOpacity, + }); + + cb.onTile?.({ + canvas, + outX: roiOutX, + outY: roiOutY, + outW: tw, + outH: th, + step: 'enhanceFaces', + faceIndex, + faceTotal: faces.length, + composited: true, + index: faceIndex, + total: faces.length, + }); + + crop.width = crop.height = 0; + patch.width = patch.height = 0; + patchRaw.width = patchRaw.height = 0; + } + + return { ...ctx, image: canvas, stepPerf: { ...(ctx.stepPerf || {}), enhanceFaces: agg } }; + }, +}; + +// --------------------------------------------------------------------------- +// Step runner +// --------------------------------------------------------------------------- + +const STEPS = [tiledUpscaleStep, comparisonStep, blendAllStep, detectFacesStep, enhanceFacesStep]; + +function getImageSize(image) { + if (!image) return null; + const width = image.naturalWidth ?? image.videoWidth ?? image.width ?? 0; + const height = image.naturalHeight ?? image.videoHeight ?? image.height ?? 0; + return width > 0 && height > 0 ? `${width}x${height}` : null; +} + +function logStep(event, stepName, details = {}) { + console.debug(`[UpscalePipeline] ${event} ${stepName}`, details); +} + +function emitStage(cb, step, phase, details = {}) { + cb.onStage?.({ step, phase, ...details }); +} + +const UPSCALE_PERF_KEYS = [ + 'setup', + 'extract', + 'inference', + 'inferenceEstimated', + 'readback', + 'gpuRender', + 'writeTile', + 'dispose', +]; + +function getImageDims(image) { + return { + width: image?.naturalWidth ?? image?.videoWidth ?? image?.width ?? 0, + height: image?.naturalHeight ?? image?.videoHeight ?? image?.height ?? 0, + }; +} + +function looksLikeUpscalePerf(perf) { + return perf && typeof perf === 'object' && ( + Number.isFinite(perf.inference) || + Number.isFinite(perf.setup) || + Number.isFinite(perf.gpuRender) + ); +} + +function aggregateSessionPerf(stepPerf, ctx, input, config, totalMs) { + const src = getImageDims(input); + const out = getImageDims(ctx.image); + const session = { + setup: 0, + extract: 0, + inference: 0, + inferenceEstimated: 0, + readback: 0, + gpuRender: 0, + writeTile: 0, + dispose: 0, + modelLoad: 0, + total: totalMs, + tiles: 0, + tileSize: Number.isFinite(config.tileSize) ? config.tileSize : 0, + srcW: src.width, + srcH: src.height, + outW: out.width, + outH: out.height, + pipeline: config.backend === 'webgpu' ? 'gpu' : 'cpu', + }; + + for (const { perf } of Object.values(stepPerf)) { + if (!perf) continue; + if (Number.isFinite(perf.modelLoadMs)) session.modelLoad += perf.modelLoadMs; + if (!looksLikeUpscalePerf(perf)) continue; + if (Number.isFinite(perf.tiles)) session.tiles += perf.tiles; + if (perf.pipeline === 'gpu-gpu') session.pipeline = 'gpu-gpu'; + else if (perf.pipeline === 'gpu' && session.pipeline !== 'gpu-gpu') session.pipeline = 'gpu'; + for (const key of UPSCALE_PERF_KEYS) { + if (Number.isFinite(perf[key])) session[key] += perf[key]; + } + } + + return session; +} + +async function runSteps(steps, pool, input, config, cb = {}) { + let ctx = { + image: input, + source: input, + scale: 1, + detections: {}, + perf: null, + ortProfile: null, + config, + pool, + }; + const tPipeline = performance.now(); + const stepPerf = {}; + logStep('start', 'pipeline', { + steps: steps.length, + input: getImageSize(input), + backend: config.backend, + tileSize: config.tileSize, + }); + for (const step of steps) { + if (cb.signal?.aborted) throw new DOMException('Cancelled', 'AbortError'); + if (step.shouldRun && !step.shouldRun(ctx)) { + logStep('skip', step.name); + emitStage(cb, step.name, 'skip'); + continue; + } + const tStep = performance.now(); + emitStage(cb, step.name, 'start'); + logStep('start', step.name); + try { + ctx = await step.run(ctx, cb); + const durationMs = Number((performance.now() - tStep).toFixed(1)); + stepPerf[step.name] = { + durationMs, + ...(ctx.stepPerf?.[step.name] ? { perf: ctx.stepPerf[step.name] } : {}), + }; + emitStage(cb, step.name, 'done', { durationMs }); + logStep('done', step.name, { + durationMs, + output: getImageSize(ctx.image), + }); + } catch (error) { + emitStage(cb, step.name, 'error', { message: error?.message || String(error) }); + console.warn(`[UpscalePipeline] failed ${step.name}`, error); + throw error; + } + } + const totalMs = Number((performance.now() - tPipeline).toFixed(1)); + emitStage(cb, 'pipeline', 'done', { durationMs: totalMs }); + logStep('done', 'pipeline', { + durationMs: totalMs, + output: getImageSize(ctx.image), + }); + const sessionPerf = aggregateSessionPerf(stepPerf, ctx, input, config, totalMs); + return { ...ctx, perf: sessionPerf, pipelinePerf: { totalMs, steps: stepPerf } }; +} + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- + +export class Pipeline { + #pool = new EnginePool(); + + async run(input, config, callbacks) { + return runSteps(STEPS, this.#pool, input, config, callbacks); + } + + async warmup(config, { onProgress } = {}) { + const { modelUrl, scale, modelValueRange, modelLayout, modelInputMultiple, modelPrecision, upscaleBefore, tileBlend, backend, profile } = config; + const engine = this.#pool.getUpscaler('base', { + modelUrl, + scale, + modelValueRange, + modelLayout, + modelInputMultiple, + modelPrecision, + upscaleBefore, + tileBlend, + backend, + profile, + }); + await engine.loadModel(backend, onProgress); + } + + destroy() { + this.#pool.destroyAll(); + } +} diff --git a/features/upscaler/upscaler-app.js b/features/upscaler/upscaler-app.js new file mode 100644 index 0000000000000000000000000000000000000000..5b59a07fa1a57cebd6828efed618f5084d9fb1df --- /dev/null +++ b/features/upscaler/upscaler-app.js @@ -0,0 +1,558 @@ +import { morph } from 'lib/morph'; +import { trackBackendEvents, friendlyBackend, realizedIsGpu } from 'lib/backend-events'; +import { Pipeline } from './upscale-pipeline.js'; +import './ui/upscaler-controls.js'; +import './ui/upscaler-canvas-area.js'; +import './ui/upscaler-toolbar.js'; +import './ui/perf-monitor.js'; + +/** + * Format a pipeline/inference error for end users. + * Detects the ONNX reshape-window-size failure and adds a remediation hint + * derived from the model's declared layout/multiple-of/maxTileSize and any + * dimensions the runtime reported in the raw error. Pure: caller passes the + * relevant model facts so this function stays DOM-free and unit-testable. + */ +function formatUpscaleErrorMessage(error, { layout = 'nchw', multipleOf = 1, maxTileSize = null, precision = 'fp32', backend = null } = {}) { + const raw = error?.message || String(error || 'Unknown error'); + + const isFp16DtypeError = + /Unexpected input data type/i.test(raw) && /tensor\(float16\)/i.test(raw); + const isFp16KernelMissing = + precision === 'fp16' && backend !== 'gpu' && + (/kernel.*not.*found/i.test(raw) || /not.*supported/i.test(raw) || /no kernel/i.test(raw)); + if (isFp16DtypeError && backend === 'gpu') { + return `Model precision metadata was stale: this model declares fp16 inputs but the engine had it tagged as fp32. The engine has now corrected itself — try running again. (If the error persists, open the model from the Edit pencil and set Precision = fp16, or re-upload it.) Raw error: ${raw}`; + } + if (isFp16DtypeError || isFp16KernelMissing) { + return `This model uses fp16 (16-bit) precision, which the CPU backend does not fully support. Switch Backend to "GPU" and run again. Raw error: ${raw}`; + } + + const isReshapeWindowError = + /reshape_helper\.h/i.test(raw) || + /input_shape_size == size/i.test(raw) || + /cannot be reshaped to the requested shape/i.test(raw); + if (!isReshapeWindowError) return raw; + + const upperLayout = String(layout).toUpperCase(); + const altLayout = upperLayout === 'NHWC' ? 'NCHW' : 'NHWC'; + const parseShape = (text) => String(text || '') + .split(',') + .map((v) => parseInt(v.trim(), 10)) + .filter(Number.isFinite); + const shapeMatch = raw.match(/Input shape:\{([^}]*)\}.*requested shape:\{([^}]*)\}/i); + const inputDims = shapeMatch ? parseShape(shapeMatch[1]) : []; + const requestedDims = shapeMatch ? parseShape(shapeMatch[2]) : []; + + // When the model is known to have a hard input-size cap (detected by the + // inspector or set manually), the right remediation is to reduce tile size, + // not to bump Multiple-of — bumping it would push padded edge tiles past + // the cap. + if (Number.isFinite(maxTileSize) && maxTileSize >= 1) { + return `Model reshape failed: this model only accepts inputs up to ${maxTileSize}×${maxTileSize}. Reduce Tile size to ≤ ${maxTileSize} and set Multiple-of = ${maxTileSize} so edge tiles get padded back into range. Raw error: ${raw}`; + } + + let inferredMultiple = 0; + const pow2Requested = requestedDims.filter((d) => d > 1 && d <= 256 && (d & (d - 1)) === 0); + if (pow2Requested.length) { + inferredMultiple = Math.max(...pow2Requested); + } + if (inputDims.length > 0 && requestedDims.length > 1) { + const likelyGroup = requestedDims[1]; + if (Number.isFinite(likelyGroup) && likelyGroup > 1 && inputDims[0] % likelyGroup !== 0) { + inferredMultiple = Math.max(inferredMultiple, likelyGroup); + } + } + + const suggestedMultiple = Math.max(multipleOf > 1 ? multipleOf : 8, inferredMultiple || 0); + const specificHint = inferredMultiple > 8 + ? ` Based on the reported reshape, try Multiple-of ${inferredMultiple} first.` + : ''; + return `Model reshape failed (likely window-size constraint). Try setting Multiple-of to ${suggestedMultiple} (common values: 8/16/32/64) and/or switch Layout to ${altLayout}.${specificHint} If reducing the tile size below ~64 makes it work, the model may have a hard upper bound — set "Max tile" on the custom model. Raw error: ${raw}`; +} + +const STEP_LABEL = { + tiledUpscale: 'Upscaling', + comparison: 'Comparison', + blendAll: 'All-pass', + detectFaces: 'Detecting', + enhanceFaces: 'Faces', +}; + +function scaleCanvasToOutput(srCanvas, image, outputScale) { + const targetScale = Math.max(1, outputScale || Math.round(srCanvas.width / image.width) || 1); + const w = image.width * targetScale; + const h = image.height * targetScale; + if (srCanvas.width === w && srCanvas.height === h) return srCanvas; + const out = document.createElement('canvas'); + out.width = w; + out.height = h; + const ctx = out.getContext('2d'); + ctx.imageSmoothingEnabled = true; + ctx.imageSmoothingQuality = 'high'; + ctx.drawImage(srCanvas, 0, 0, w, h); + return out; +} + +function makeComparisonCanvases(resultCanvas, image, outputScale) { + const afterCanvas = scaleCanvasToOutput(resultCanvas, image, outputScale); + const w = afterCanvas.width; + const h = afterCanvas.height; + const beforeCanvas = document.createElement('canvas'); + beforeCanvas.width = w; + beforeCanvas.height = h; + const bCtx = beforeCanvas.getContext('2d'); + bCtx.imageSmoothingEnabled = false; + bCtx.drawImage(image, 0, 0, w, h); + return { beforeCanvas, afterCanvas }; +} + +// For Comparison mode: both layers are SR canvases of the same size, so the +// before slot is the base SR (no pixelated LR upscale) and the after slot +// is the comparison SR. We still honor the user's Final Output downscale. +function makeComparisonPairCanvases(baseSR, comparisonSR, image, outputScale) { + return { + beforeCanvas: scaleCanvasToOutput(baseSR, image, outputScale), + afterCanvas: scaleCanvasToOutput(comparisonSR, image, outputScale), + }; +} + +class UpscalerApp extends HTMLElement { + #pipeline = new Pipeline(); + #abortController = null; + #running = false; + #generation = 0; + + connectedCallback() { + this.#render(); + this.#wire(); + this.#restoreViewState(); + } + + #q(sel) { return this.querySelector(sel); } + + // ── Wiring ───────────────────────────────────────────────────────────── + + #wire() { + const controls = this.#q('upscaler-controls'); + const canvasArea = this.#q('upscaler-canvas-area'); + const toolbar = this.#q('upscaler-toolbar'); + const perfMon = this.#q('perf-monitor'); + + // Empty initial state — no "Ready" copy; icon alone communicates "waiting". + toolbar.statusBar.set({ title: '', state: 'idle', details: '', progress: -1, tileCount: null }); + + // Status updates from controls (custom-model upload/edit/delete) carry + // their own { title, state, details } payload; forward verbatim. + this.addEventListener('status-message', (e) => { + toolbar.statusBar.set(e.detail); + }); + + // Model change → update upscale button label. + this.addEventListener('model-change', (e) => { + toolbar.setUpscaleLabel(`${e.detail.verb} ${e.detail.scale}x`); + }); + + // Image loaded → switch to ready phase, pick a default view mode that + // keeps the whole image on screen. + canvasArea.addEventListener('image-loaded', (e) => { + if (this.#running) { + this.#abortController?.abort(); + this.#running = false; + this.#generation++; + this.#abortController = null; + } + const img = e.detail.image; + this.#setMode(canvasArea.defaultModeForImage(img)); + canvasArea.showCropping(img); + toolbar.state = 'ready'; + toolbar.hasCrop = false; + toolbar.statusBar.set({ + title: 'Image loaded', + state: 'idle', + details: `${img.width}×${img.height}. Drag to crop (optional), then click Upscale.`, + progress: -1, + tileCount: null, + }); + }); + + canvasArea.addEventListener('crop-changed', (e) => { + const crop = e.detail.crop; + const img = canvasArea.image; + toolbar.hasCrop = !!crop; + toolbar.statusBar.set(crop ? { + title: 'Crop selected', + state: 'idle', + details: `${img.width}×${img.height}, cropped to ${crop.w}×${crop.h}.`, + } : { + title: 'Image loaded', + state: 'idle', + details: `${img.width}×${img.height}. Drag to crop (optional), then click Upscale.`, + }); + }); + + // View mode (toolbar → canvas). + toolbar.addEventListener('view-mode-change', (e) => { + this.#setMode(e.detail.mode); + canvasArea.snapCenterVisible(); + }); + + // Button events from toolbar. + toolbar.addEventListener('upscale-click', () => this.#runUpscale()); + toolbar.addEventListener('stop-click', () => this.#abortController?.abort()); + toolbar.addEventListener('start-over-click', () => { + if (this.#running) this.#abortController?.abort(); + this.#reset(); + }); + toolbar.addEventListener('back-to-crop-click', () => { + if (this.#running || !canvasArea.image) return; + this.#showReady(); + }); + toolbar.addEventListener('clear-crop-click', () => canvasArea.clearCrop()); + toolbar.addEventListener('open-in-tab-click', () => canvasArea.openInTab()); + toolbar.addEventListener('download-click', () => canvasArea.download()); + + // perf-toggle + clear-cache buttons live inside + // but their actions are orchestrator-level (perf monitor, pipeline cache). + this.addEventListener('perf-toggle', () => { + perfMon.visible ? perfMon.hide() : perfMon.show(); + }); + this.addEventListener('clear-cache', () => { + if (this.#running) return; + this.#pipeline.destroy(); + toolbar.statusBar.set({ + title: 'Cache cleared', + state: 'idle', + details: 'Model cache cleared. Next run will re-download.', + }); + }); + } + + // ── Phase helpers ────────────────────────────────────────────────────── + + #showReady() { + const canvasArea = this.#q('upscaler-canvas-area'); + const toolbar = this.#q('upscaler-toolbar'); + const img = canvasArea.image; + canvasArea.showCropping(img); + const existingCrop = canvasArea.currentCrop; + toolbar.state = 'ready'; + toolbar.hasCrop = !!existingCrop; + toolbar.statusBar.set(existingCrop ? { + title: 'Crop selected', + state: 'idle', + details: `${img.width}×${img.height}, cropped to ${existingCrop.w}×${existingCrop.h}.`, + progress: -1, + tileCount: null, + } : { + title: 'Image loaded', + state: 'idle', + details: `${img.width}×${img.height}. Drag to crop (optional), then click Upscale.`, + progress: -1, + tileCount: null, + }); + } + + #reset() { + this.#running = false; + this.#generation++; + this.#abortController = null; + const canvasArea = this.#q('upscaler-canvas-area'); + const toolbar = this.#q('upscaler-toolbar'); + canvasArea.showInitial(); + toolbar.state = 'empty'; + toolbar.hasCrop = false; + toolbar.statusBar.set({ title: '', state: 'idle', details: '', progress: -1, tileCount: null }); + } + + // ── View-mode persistence (orchestrator-level so it survives across phases) ── + + #setMode(mode) { + const canvasArea = this.#q('upscaler-canvas-area'); + const toolbar = this.#q('upscaler-toolbar'); + if (canvasArea.viewMode === mode) return; + canvasArea.viewMode = mode; + toolbar.viewMode = mode; + localStorage.setItem('upscaler_view_mode', mode); + } + + #restoreViewState() { + const saved = localStorage.getItem('upscaler_view_mode'); + const mode = ['fit-width', 'fit-height', 'one-to-one'].includes(saved) ? saved : 'fit-width'; + this.#q('upscaler-canvas-area').viewMode = mode; + this.#q('upscaler-toolbar').viewMode = mode; + } + + // ── Upscale run flow ─────────────────────────────────────────────────── + + async #runUpscale() { + if (this.#running) return; + const controls = this.#q('upscaler-controls'); + const canvasArea = this.#q('upscaler-canvas-area'); + const toolbar = this.#q('upscaler-toolbar'); + const perfMon = this.#q('perf-monitor'); + const status = toolbar.statusBar; + + if (!canvasArea.image) return; + this.#running = true; + const gen = ++this.#generation; + this.#abortController = new AbortController(); + const signal = this.#abortController.signal; + + controls.isRunning = true; + toolbar.state = 'running'; + + // runState is monotonic: 'running' → 'warning' (stays once warned). + // The tracker updates it as backend events arrive; the orchestrator + // reads it on completion to pick the final icon color. + let runState = 'running'; + const tracker = trackBackendEvents((ev) => { + if (ev.kind === 'attempt') { + status.set({ title: `Loading on ${friendlyBackend(ev.backend)}`, state: runState }); + } else if (ev.kind === 'success') { + status.set({ title: `Running on ${friendlyBackend(ev.backend)}`, state: runState }); + } else if (ev.kind === 'fallback') { + runState = 'warning'; + status.set({ title: `Fallback from ${friendlyBackend(ev.backend)}`, state: runState }); + } else if (ev.kind === 'skipped') { + runState = 'warning'; + status.set({ title: `Skipping ${friendlyBackend(ev.backend)}`, state: runState }); + } + }); + + try { + status.set({ + title: 'Loading model', + state: 'running', + details: '', + progress: 0, + tileCount: null, + }); + const inputImage = canvasArea.croppedImage; + const requestedOutputScale = controls.outputScale; + + const { beforeCanvas, afterCanvas, scale, comparison } = + await this.#runPipeline(controls, canvasArea, perfMon, status, signal, inputImage, requestedOutputScale, () => runState); + + const outW = inputImage.width * scale; + const outH = inputImage.height * scale; + const summary = tracker.summary(); + // The tracker only flags hadFallback when a fallback event fires *this + // run*. After a prior runtime fallback (CoreML→CPU), the worker's + // session is already on CPU, so the next run produces no fallback + // event of its own — yet the user asked for GPU and is silently on + // CPU. Treat that intent/reality mismatch as warning-worthy too. + const userWantsGpu = controls.backend === 'gpu'; + const ranOnCpuDespiteIntent = userWantsGpu && summary.activeBackend && !realizedIsGpu(summary.activeBackend); + const finalState = (summary.hadFallback || summary.hadSkip || ranOnCpuDespiteIntent) ? 'warning' : 'success'; + const via = summary.activeBackend ? ` via ${friendlyBackend(summary.activeBackend)}` : ''; + const detailsLines = [`${inputImage.width}×${inputImage.height} → ${outW}×${outH}${via}`]; + if (ranOnCpuDespiteIntent && !summary.hadFallback) { + detailsLines.push(`Requested GPU but running on ${friendlyBackend(summary.activeBackend)} (prior fallback this session — reload to retry GPU).`); + } + if (summary.lines.length) detailsLines.push(...summary.lines); + status.set({ + title: 'Done', + state: finalState, + details: detailsLines.join('\n'), + progress: -1, + tileCount: null, + }); + + await canvasArea.showResult(beforeCanvas, afterCanvas, { + downloadName: comparison ? `comparison_${scale}x.png` : `upscaled_${scale}x.png`, + }); + toolbar.state = 'done'; + } catch (e) { + if (e.name === 'AbortError') { + status.set({ + title: 'Cancelled', + state: 'idle', + details: 'You stopped this run.', + progress: -1, + tileCount: null, + }); + } else { + console.error(e); + const opt = controls.selectedModelOption; + const parsedMaxTile = parseInt(opt?.dataset?.maxtilesize, 10); + const errMsg = formatUpscaleErrorMessage(e, { + layout: opt?.dataset?.layout, + multipleOf: parseInt(opt?.dataset?.multipleof, 10), + maxTileSize: Number.isFinite(parsedMaxTile) ? parsedMaxTile : null, + precision: opt?.dataset?.precision === 'fp16' ? 'fp16' : 'fp32', + backend: controls.backend, + }); + status.set({ + title: 'Error', + state: 'error', + details: errMsg, + progress: -1, + tileCount: null, + }); + } + perfMon.stop(); + // Fall back to ready so the user can adjust and retry. + if (this.#generation === gen) toolbar.state = canvasArea.image ? 'ready' : 'empty'; + } finally { + tracker.stop(); + } + + if (this.#generation === gen) { + this.#running = false; + this.#abortController = null; + controls.isRunning = false; + } + } + + async #runPipeline(controls, canvasArea, perfMon, status, signal, inputImage, requestedOutputScale, getRunState) { + const modelOpt = controls.selectedModelOption; + const isBuiltInResampler = !!modelOpt?.value?.startsWith('builtin:'); + + if (isBuiltInResampler) { + return this.#runBuiltInResample(inputImage, modelOpt.value, requestedOutputScale, canvasArea, status, signal); + } + + const config = { ...controls.config, profile: perfMon.visible }; + if (perfMon.visible) perfMon.start(config.backend); + + const outW = inputImage.width * config.scale; + const outH = inputImage.height * config.scale; + canvasArea.showPreview(inputImage, outW, outH); + + const result = await this.#pipeline.run(inputImage, config, { + onProgress(frac, msg) { + status.set({ progress: frac, details: msg }); + }, + onStage(stage) { + const label = STEP_LABEL[stage.step] || stage.step; + const updates = { state: getRunState() }; + if (typeof stage.progress === 'number') updates.progress = stage.progress; + if (stage.message) { + updates.title = label; + updates.details = stage.message; + } else if (stage.phase === 'start') { + updates.title = label; + } + status.set(updates); + if (perfMon.visible) perfMon.updateStage(stage); + }, + onTile: (info) => { + if (info.step === 'tiledUpscale' || info.step === 'comparison') { + canvasArea.drawPreviewTile(info); + } else if (info.step === 'blendAll') { + canvasArea.drawPreviewTile(info, { opacity: config.all?.blendOpacity ?? 1 }); + } else if (info.step === 'enhanceFaces' && info.composited) { + canvasArea.drawPreviewTile(info); + } + const label = STEP_LABEL[info.step] || info.step || 'Pass'; + const progress = (info.index + 1) / info.total; + if (info.step === 'enhanceFaces') { + if (info.composited) { + status.set({ + title: label, + state: getRunState(), + details: `face ${(info.faceIndex ?? 0) + 1}/${info.faceTotal ?? '?'} done`, + progress, + tileCount: { done: info.index + 1, total: info.total }, + }); + } else { + const faceN = Number.isFinite(info.faceIndex) ? info.faceIndex + 1 : null; + const faceTotal = Number.isFinite(info.faceTotal) ? info.faceTotal : null; + const facePrefix = faceN && faceTotal ? `face ${faceN}/${faceTotal}, ` : ''; + const faceTileTotal = Number.isFinite(info.faceTileTotal) ? info.faceTileTotal : info.total; + status.set({ + title: label, + state: getRunState(), + details: `${facePrefix}tile ${info.index + 1}/${faceTileTotal}`, + progress, + tileCount: { done: info.index + 1, total: faceTileTotal }, + }); + } + } else { + status.set({ + title: label, + state: getRunState(), + details: `tile ${info.index + 1}/${info.total} — ${inputImage.width}×${inputImage.height} → ${outW}×${outH}`, + progress, + tileCount: { done: info.index + 1, total: info.total }, + }); + } + if (perfMon.visible) perfMon.update({ + step: info.step, + index: info.index, total: info.total, + tileMs: info.tileMs, tilePixels: info.tilePixels, perf: info.perf, + }); + }, + signal, + }); + + if (result.perf || result.pipelinePerf) { + perfMon.showResults(result.perf, result.ortProfile, result.pipelinePerf); + } + + const outputScale = Math.max(1, Math.min(requestedOutputScale, result.scale)); + if (config.comparison && result.comparisonImage) { + const canvases = makeComparisonPairCanvases(result.image, result.comparisonImage, inputImage, outputScale); + return { ...canvases, scale: outputScale, comparison: true }; + } + const canvases = makeComparisonCanvases(result.image, inputImage, outputScale); + return { ...canvases, scale: outputScale, comparison: false }; + } + + async #runBuiltInResample(inputImage, modelUrl, requestedOutputScale, canvasArea, status, signal) { + if (signal?.aborted) throw new DOMException('Aborted', 'AbortError'); + + const isLanczos = modelUrl === 'builtin:lanczos-4x'; + const methodLabel = isLanczos ? 'Lanczos' : 'Bicubic'; + const scale = 4; + const outW = inputImage.width * scale; + const outH = inputImage.height * scale; + + canvasArea.showPreview(inputImage, outW, outH); + status.set({ + title: 'Resampling', + state: 'running', + details: `${methodLabel} resampling, ${inputImage.width}×${inputImage.height} → ${outW}×${outH}`, + progress: 0.25, + }); + + const resultCanvas = document.createElement('canvas'); + resultCanvas.width = outW; + resultCanvas.height = outH; + const ctx = resultCanvas.getContext('2d'); + ctx.imageSmoothingEnabled = true; + ctx.imageSmoothingQuality = isLanczos ? 'high' : 'medium'; + ctx.drawImage(inputImage, 0, 0, outW, outH); + + if (signal?.aborted) throw new DOMException('Aborted', 'AbortError'); + + status.set({ progress: 1 }); + const outputScale = Math.max(1, Math.min(requestedOutputScale, scale)); + const canvases = makeComparisonCanvases(resultCanvas, inputImage, outputScale); + return { ...canvases, scale: outputScale, comparison: false }; + } + + // ── Template ─────────────────────────────────────────────────────────── + + #render() { + morph(this, ` + + +
+ + +
+ + `); + } +} + +customElements.define('upscaler-app', UpscalerApp); diff --git a/index.html b/index.html index b0c4b3666032a737f3903db53e6a8a9272483e28..7b3687f51d62467d0059554e88930273dc7ee0ca 100644 --- a/index.html +++ b/index.html @@ -1,19 +1,88 @@ - - - - - - My static Space - - - -
-

Welcome to your static Space!

-

You can modify this app directly by editing index.html in the Files and versions tab.

-

- Also don't forget to check the - Spaces documentation. -

-
- + + + + + + + AI Tools + + + + + + + + + + +
+
+ +
+ +
+ + + + + + diff --git a/lib/backend-events.js b/lib/backend-events.js new file mode 100644 index 0000000000000000000000000000000000000000..3fe5ae7f801df2aefe32ec695ee16b52b0beb3aa --- /dev/null +++ b/lib/backend-events.js @@ -0,0 +1,134 @@ +/** + * Unified channel for inference-backend narrative events. Both the web-mode + * engine (when it tries WebGPU then falls back to WASM) and the native + * desktop bridge (when its EP ladder tries CoreML/CUDA/DML then falls back + * to CPU) emit events on `document` with the same shape: + * + * document.dispatchEvent(new CustomEvent('aitools:backend-event', { + * detail: { + * kind: 'attempt' | 'success' | 'fallback' | 'skipped', + * backend: string, // canonical EP name + * reason?: string, // short failure or skip reason + * } + * })); + * + * `trackBackendEvents()` lets a feature orchestrator subscribe for the + * duration of one run, then ask for a summary on completion. + */ + +const CHANNEL = 'aitools:backend-event'; + +export function dispatchBackendEvent(detail) { + document.dispatchEvent(new CustomEvent(CHANNEL, { detail })); +} + +export function trackBackendEvents(onEvent) { + const events = []; + const handler = (e) => { + events.push(e.detail); + onEvent?.(e.detail); + }; + document.addEventListener(CHANNEL, handler); + return { + stop() { document.removeEventListener(CHANNEL, handler); }, + events: () => events.slice(), + summary() { + let activeBackend = null; + let hadFallback = false; + let hadSkip = false; + const lines = []; + for (const e of events) { + if (e.kind === 'success') { + activeBackend = e.backend || activeBackend; + } else if (e.kind === 'fallback') { + hadFallback = true; + const friendly = friendlyBackend(e.backend); + lines.push(e.reason ? `Failed on ${friendly}: ${e.reason}` : `Failed on ${friendly}`); + } else if (e.kind === 'skipped') { + hadSkip = true; + const friendly = friendlyBackend(e.backend); + lines.push(e.reason ? `Skipped ${friendly} (${e.reason})` : `Skipped ${friendly}`); + } + } + return { activeBackend, hadFallback, hadSkip, lines }; + }, + }; +} + +/** + * Trim a runtime error message down to the first useful signal phrase, or + * the first 120 chars if no known phrase matches. ORT/native errors tend + * to be long and noisy; the tooltip wants something compact. + */ +export function shortenReason(e) { + const s = String(e?.message || e || ''); + const m = s.match(/Error in building plan|Non-zero status code returned|Failed to load|Could not create|cannot be reshaped|Unexpected input data type|kernel.*not.*found/i); + if (m) return m[0]; + return s.length > 120 ? s.slice(0, 117) + '…' : s; +} + +/** + * True if the realized backend label denotes a GPU-class execution provider. + * + * 'web-webgpu' counts; everything 'native-*' except 'native-cpu' counts + * (coreml / dml / cuda / rocm all run on the GPU or neural accelerator). + * 'web-wasm' and 'native-cpu' are CPU. + * + * Used by status-bar logic to detect intent/reality mismatches like + * "user asked for GPU but a warm CPU session is what's actually serving". + */ +export function realizedIsGpu(backend) { + if (!backend) return false; + if (backend === 'web-wasm' || backend === 'native-cpu') return false; + return true; +} + +/** + * Map a realized backend identifier to a user-facing label. + * + * The canonical shape produced by lib/backend.js is two-part: a mode prefix + * (`web-` or `native-`) plus the concrete EP. We unpack both — the prefix + * tells the user whether they're on the browser stack or the native one, + * which materially affects perf and error shape. + * + * 'web-webgpu' → 'WebGPU' + * 'web-wasm' → 'CPU (WASM)' + * 'native-cpu' → 'CPU (native)' + * 'native-cuda' → 'CUDA' + * 'native-rocm' → 'ROCm' + * 'native-dml' → 'DirectML' + * 'native-coreml/MLProgram' → 'CoreML (MLProgram)' + * + * Legacy values from before the refactor are also accepted so a half-migrated + * caller doesn't render "unknown". + */ +export function friendlyBackend(b) { + if (!b) return 'unknown'; + + // New-style two-part labels. + if (b === 'web-webgpu') return 'WebGPU'; + if (b === 'web-wasm') return 'CPU (WASM)'; + if (b.startsWith('native-')) { + const ep = b.slice('native-'.length); + if (ep === 'cpu') return 'CPU (native)'; + if (ep === 'cuda') return 'CUDA'; + if (ep === 'rocm') return 'ROCm'; + if (ep === 'dml') return 'DirectML'; + if (ep.startsWith('coreml')) { + const variant = ep.includes('/') ? ep.split('/')[1] : null; + return variant ? `CoreML (${variant})` : 'CoreML'; + } + return ep; + } + + // Legacy single-token forms (kept for any not-yet-migrated callers). + if (b === 'webgpu') return 'WebGPU'; + if (b === 'wasm' || b === 'cpu') return 'CPU'; + if (b === 'cuda') return 'CUDA'; + if (b === 'dml') return 'DirectML'; + if (b.startsWith('coreml')) { + const variant = b.includes('/') ? b.split('/')[1] : null; + return variant ? `CoreML (${variant})` : 'CoreML'; + } + return b; +} diff --git a/lib/backend.js b/lib/backend.js new file mode 100644 index 0000000000000000000000000000000000000000..be303d2fb94a6874d012683fae7f2481e9d116b3 --- /dev/null +++ b/lib/backend.js @@ -0,0 +1,207 @@ +// Unified session loader for inference engines. One entry point, two arms. +// +// loadSession(bytes, intent, opts) -> { session, realizedBackend } +// +// intent 'gpu' | 'cpu' — what the user wants +// realizedBackend 'web-webgpu' | 'web-wasm' — what actually ran +// | 'native-cpu' | 'native-coreml/...' — (display only) +// | 'native-dml' | 'native-cuda' | ... +// +// Callers (the engines) shouldn't need to know whether we're running native +// (Electron + onnxruntime-node) or web (browser + ort-web). They pass intent +// in; they get a session-shaped object out plus a string label of what it's +// running on. No magic options-bag properties, no synthesised exceptions to +// drive control flow, no monkey-patching of ORT-Web's surface. + +import { dispatchBackendEvent, shortenReason } from 'lib/backend-events'; + +// ───── Mode detection ────────────────────────────────────────────────────── +// `__nativeOrt` is installed by desktop/preload.cjs only when the renderer is +// running inside Electron *and* AITOOLS_NATIVE isn't explicitly disabled. Its +// presence is the entire signal — no `enabled` flag to interrogate. + +export function isNativeMode() { + return !!globalThis.__nativeOrt; +} + +// ───── Auto-disable on worker crash ──────────────────────────────────────── +// If the native worker crashes mid-session, we trip a one-way switch so the +// rest of this page's loads fall through to the web path. Same semantics as +// the old inject.js `tripAutoDisable`, just lifted here. + +let nativeAutoDisabled = false; + +function isWorkerCrash(err) { + const m = err && err.message; + return !!m && /worker crashed|worker not available|native ort unavailable/i.test(m); +} + +// ───── Wire tensor codec ─────────────────────────────────────────────────── +// Mirrors WIRE_DTYPES in ort-worker.cjs. + +const WIRE_DTYPES = { + float32: Float32Array, float16: Uint16Array, + int32: Int32Array, int64: BigInt64Array, uint8: Uint8Array, +}; + +// ───── Public entry point ────────────────────────────────────────────────── + +/** + * Load a model and return a session-shaped object plus the realized backend. + * + * @param {Uint8Array|ArrayBuffer} modelBytes + * @param {'gpu'|'cpu'} intent + * @param {{ + * profile?: boolean, + * preferredOutputLocation?: 'gpu-buffer' | 'cpu', + * }} [opts] + * `preferredOutputLocation` is forwarded only on the web-webgpu path; it + * enables zero-readback output tensors for the upscaler's GPU fast path. + * Ignored on web-wasm and on native. + * @returns {Promise<{ session: object, realizedBackend: string }>} + */ +export async function loadSession(modelBytes, intent, opts = {}) { + if (intent !== 'gpu' && intent !== 'cpu') { + throw new Error(`loadSession: unknown intent ${JSON.stringify(intent)} (expected 'gpu' or 'cpu')`); + } + if (isNativeMode() && !nativeAutoDisabled) { + try { + return await loadNative(modelBytes, intent); + } catch (e) { + if (isWorkerCrash(e)) { + nativeAutoDisabled = true; + console.warn(`[backend] native ORT auto-disabled for this page session: ${e.message} Future loads use ORT-Web. Reload to retry native.`); + // Fall through to web path so this load still has a chance. + } else { + throw e; + } + } + } + return loadWeb(modelBytes, intent, opts); +} + +// ───── Native arm ────────────────────────────────────────────────────────── + +let nativeSeq = 0; + +async function loadNative(modelBytes, intent) { + const transferable = toArrayBuffer(modelBytes); + const key = `m${++nativeSeq}_${transferable.byteLength}`; + // Host emits attempt/fallback/skipped events via the model-event channel + // (forwarded to backend-events by desktop/inject.js). We don't synthesise + // an attempt here — let the worker's actual rung outcomes speak. + const meta = await globalThis.__nativeOrt.load(key, transferable, { intent }); + console.log(`[backend] native session ${key}: ${meta.inputNames.join(',')} -> ${meta.outputNames.join(',')} via ${meta.rung}`); + return { + session: makeNativeSession(key, meta), + realizedBackend: `native-${meta.rung}`, + }; +} + +function makeNativeSession(key, meta) { + // ORT-Web sessions expose inputMetadata / outputMetadata as arrays of + // {name, type, dimensions}; the engines self-correct from dims so a narrow + // 'tensor(float)' placeholder is fine. + const inputMetadata = meta.inputNames.map(name => ({ name, type: 'tensor(float)', dimensions: [] })); + const outputMetadata = meta.outputNames.map(name => ({ name, type: 'tensor(float)', dimensions: [] })); + + return { + inputNames: meta.inputNames, + outputNames: meta.outputNames, + inputMetadata, + outputMetadata, + + async run(feeds /*, runOptions */) { + const wire = {}; + for (const [name, t] of Object.entries(feeds)) { + const data = t.data; + const ab = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength); + wire[name] = { type: t.type, dims: t.dims, data: ab }; + } + let raw; + try { + raw = await globalThis.__nativeOrt.run(key, wire); + } catch (e) { + if (isWorkerCrash(e)) { + // Native is now dead for this page. The caller's current run still + // fails (we can't reload mid-session-run), but subsequent loadSession + // calls will fall through to the web path via nativeAutoDisabled. + nativeAutoDisabled = true; + console.warn(`[backend] native ORT auto-disabled mid-run: ${e.message}`); + } + throw e; + } + const out = {}; + for (const [name, t] of Object.entries(raw)) { + const Arr = WIRE_DTYPES[t.type]; + if (!Arr) throw new Error(`[backend] unsupported output tensor type: ${t.type}`); + const ortGlobal = globalThis.ort; + const tensor = new ortGlobal.Tensor(t.type, new Arr(t.data), t.dims); + if (typeof tensor.dispose !== 'function') tensor.dispose = () => {}; + out[name] = tensor; + } + return out; + }, + + async release() { + try { await globalThis.__nativeOrt.release(key); } catch {} + }, + startProfiling() {}, + endProfiling() {}, + }; +} + +// ───── Web arm ───────────────────────────────────────────────────────────── + +async function loadWeb(modelBytes, intent, { profile = false, preferredOutputLocation } = {}) { + const ort = globalThis.ort; + if (!ort) throw new Error('[backend] ort-web is not loaded — include vendor/onnxruntime-web/ort.all.min.js before using loadSession'); + + ort.env.wasm.wasmPaths = + globalThis.__ORT_WASM_PATHS__ || + new URL('vendor/onnxruntime-web/', document.baseURI).toString(); + ort.env.wasm.numThreads = navigator.hardwareConcurrency || 4; + + // ort.env.webgpu.profilingMode is global; clear when not profiling so a + // prior run can't leave it stuck on. + if (ort.env.webgpu) { + ort.env.webgpu.profilingMode = (profile && intent === 'gpu') ? 'default' : 'off'; + } + + const sessionOpts = { + graphOptimizationLevel: 'all', + ...(profile && { enableProfiling: true }), + }; + + if (intent === 'gpu') { + sessionOpts.executionProviders = [{ name: 'webgpu', preferredLayout: 'NCHW' }]; + if (preferredOutputLocation) sessionOpts.preferredOutputLocation = preferredOutputLocation; + dispatchBackendEvent({ kind: 'attempt', backend: 'web-webgpu' }); + try { + const session = await ort.InferenceSession.create(modelBytes, sessionOpts); + dispatchBackendEvent({ kind: 'success', backend: 'web-webgpu' }); + return { session, realizedBackend: 'web-webgpu' }; + } catch (e) { + console.warn(`[backend] WebGPU failed, falling back to WASM. Reason:`, e); + dispatchBackendEvent({ kind: 'fallback', backend: 'web-webgpu', reason: shortenReason(e) }); + // Strip WebGPU-only opts before retrying on WASM. + delete sessionOpts.preferredOutputLocation; + } + } + + sessionOpts.executionProviders = ['wasm']; + dispatchBackendEvent({ kind: 'attempt', backend: 'web-wasm' }); + const session = await ort.InferenceSession.create(modelBytes, sessionOpts); + dispatchBackendEvent({ kind: 'success', backend: 'web-wasm' }); + return { session, realizedBackend: 'web-wasm' }; +} + +// ───── helpers ───────────────────────────────────────────────────────────── + +function toArrayBuffer(modelBytes) { + if (modelBytes instanceof ArrayBuffer) return modelBytes; + if (modelBytes instanceof Uint8Array) { + return modelBytes.buffer.slice(modelBytes.byteOffset, modelBytes.byteOffset + modelBytes.byteLength); + } + throw new Error(`[backend] modelBytes must be ArrayBuffer or Uint8Array, got ${typeof modelBytes}`); +} diff --git a/lib/canvas.js b/lib/canvas.js new file mode 100644 index 0000000000000000000000000000000000000000..44a2a8e94799f3b48d236377a2a4aed976381e89 --- /dev/null +++ b/lib/canvas.js @@ -0,0 +1,175 @@ +function clamp(v, min, max) { + return v < min ? min : v > max ? max : v; +} + +function smoothstep(edge0, edge1, x) { + if (edge1 <= edge0) return x >= edge1 ? 1 : 0; + const t = clamp((x - edge0) / (edge1 - edge0), 0, 1); + return t * t * (3 - 2 * t); +} + +export function expandRect(rect, paddingPx, maxW, maxH) { + const x1 = clamp(rect.x - paddingPx, 0, maxW); + const y1 = clamp(rect.y - paddingPx, 0, maxH); + const x2 = clamp(rect.x + rect.w + paddingPx, 0, maxW); + const y2 = clamp(rect.y + rect.h + paddingPx, 0, maxH); + return { + x: Math.floor(x1), + y: Math.floor(y1), + w: Math.max(1, Math.ceil(x2 - x1)), + h: Math.max(1, Math.ceil(y2 - y1)), + }; +} + +export function ensureCanvas(imageLike) { + if (imageLike?.getContext?.('2d')) return imageLike; + const copy = document.createElement('canvas'); + copy.width = imageLike.width; + copy.height = imageLike.height; + copy.getContext('2d').drawImage(imageLike, 0, 0); + return copy; +} + +export function cropToCanvas(image, rect) { + const c = document.createElement('canvas'); + c.width = rect.w; + c.height = rect.h; + const ctx = c.getContext('2d'); + if (!ctx) return null; + ctx.drawImage( + image, + rect.x, rect.y, rect.w, rect.h, + 0, 0, rect.w, rect.h, + ); + return c; +} + +export function canvasToBlobUrl(canvas) { + return new Promise(resolve => canvas.toBlob(blob => resolve(URL.createObjectURL(blob)), 'image/png')); +} + +export function imageToBlobUrl(image) { + const c = document.createElement('canvas'); + c.width = image.width; + c.height = image.height; + c.getContext('2d').drawImage(image, 0, 0); + return canvasToBlobUrl(c); +} + +export function blendCanvas(destCanvas, srcCanvas, opacity) { + const alpha = clamp(opacity, 0, 1); + if (alpha <= 0) return destCanvas; + const ctx = destCanvas.getContext('2d'); + if (!ctx) return destCanvas; + ctx.save(); + ctx.globalAlpha = alpha; + ctx.drawImage(srcCanvas, 0, 0, destCanvas.width, destCanvas.height); + ctx.restore(); + return destCanvas; +} + +// Composite `patch` onto `dest` at (x, y) with a feathered alpha mask. +// `innerRect` (in patch-local coords) marks the unfeathered region; pixels +// outside it fade out over `featherPx`. Without it, feathering runs from +// the patch edges inward. +export function compositeFeathered(destCanvas, patchCanvas, x, y, { + featherPx = 8, + innerRect = null, + blendOpacity = 1, +} = {}) { + const w = patchCanvas.width; + const h = patchCanvas.height; + if (w < 1 || h < 1) return false; + const opacity = clamp(blendOpacity, 0, 1); + if (opacity <= 0) return true; + const minDim = Math.min(w, h); + const t = Math.max(1, Math.min(Math.floor(featherPx), Math.floor(minDim / 2))); + + const maskCanvas = document.createElement('canvas'); + maskCanvas.width = w; + maskCanvas.height = h; + const mctx = maskCanvas.getContext('2d'); + if (!mctx) return false; + const mask = mctx.createImageData(w, h); + const mpx = mask.data; + for (let py = 0; py < h; py++) { + for (let px = 0; px < w; px++) { + const idx = (py * w + px) * 4; + let a = 0; + if (innerRect) { + const ix1 = innerRect.x; + const iy1 = innerRect.y; + const ix2 = innerRect.x + innerRect.w; + const iy2 = innerRect.y + innerRect.h; + const ox = px < ix1 ? (ix1 - px) : px >= ix2 ? (px - ix2 + 1) : 0; + const oy = py < iy1 ? (iy1 - py) : py >= iy2 ? (py - iy2 + 1) : 0; + const d = Math.hypot(ox, oy); + a = d <= 0 ? 1 : (1 - smoothstep(0, t, d)); + } else { + const dx = Math.min(px, w - 1 - px); + const dy = Math.min(py, h - 1 - py); + const d = Math.min(dx, dy); + a = smoothstep(0, t, d); + } + const alpha = Math.max(0, Math.min(255, Math.round(a * opacity * 255))); + mpx[idx] = 255; + mpx[idx + 1] = 255; + mpx[idx + 2] = 255; + mpx[idx + 3] = alpha; + } + } + mctx.putImageData(mask, 0, 0); + + const patchMasked = document.createElement('canvas'); + patchMasked.width = w; + patchMasked.height = h; + const pctx = patchMasked.getContext('2d'); + if (!pctx) return false; + pctx.drawImage(patchCanvas, 0, 0); + pctx.globalCompositeOperation = 'destination-in'; + pctx.drawImage(maskCanvas, 0, 0); + + const dctx = destCanvas.getContext('2d'); + if (!dctx) return false; + dctx.drawImage(patchMasked, x, y); + + maskCanvas.width = 0; + maskCanvas.height = 0; + patchMasked.width = 0; + patchMasked.height = 0; + return true; +} + +// Feather width (output px) for compositing a detection patch back onto an +// upscaled canvas. Scales with the detected region's min dimension, clamped +// by the padding ring and patch size so the transition stays inside the pad. +export function computeFeatherPx({ + configuredFeatherPx, + regionW, + regionH, + patchW, + patchH, + paddingPx, + scale, +}) { + const minOut = 4; + const maxOut = 12; + const configuredOut = Math.max(0, configuredFeatherPx * scale); + const regionMinOut = Math.max(1, Math.min(regionW, regionH) * scale); + const regionDriven = Math.round(regionMinOut * 0.015); + let feather = clamp( + Math.max(configuredOut, regionDriven), + minOut, + maxOut, + ); + + const paddingOut = Math.max(0, paddingPx * scale); + if (paddingOut > 0) { + feather = Math.min(feather, Math.max(4, Math.round(paddingOut * 0.9))); + } else { + feather = Math.min(feather, 12); + } + + const patchLimit = Math.max(2, Math.floor(Math.min(patchW, patchH) / 4)); + return Math.max(2, Math.min(Math.round(feather), patchLimit)); +} diff --git a/lib/fetch-progress.js b/lib/fetch-progress.js new file mode 100644 index 0000000000000000000000000000000000000000..5754ad2fa4b1e6b45621c822d0ca1108b8761b2f --- /dev/null +++ b/lib/fetch-progress.js @@ -0,0 +1,121 @@ +/** + * Fetch a URL with streaming download progress and Cache API persistence. + * + * Built-in models use relative URLs (e.g. `models/foo.onnx`). In the web + * app those resolve against the deploy origin and just work. In the + * desktop app they resolve against `http://127.0.0.1:/`, where + * the file is only present if the user bundled it at download time. When + * the local fetch 404s and `branding.json` defines a `remoteOrigin`, we + * re-fetch from there — turning the local bundle into a preload + * optimization rather than a hard gate. + * + * Cache keys are normalised against `remoteOrigin` (when configured) so + * the Cache API entry survives across desktop launches even though the + * localhost port is ephemeral. + * + * @param {string} url + * @param {(frac: number, message: string) => void} [onProgress] + * @returns {Promise} + */ + +const MODEL_CACHE_NAME = 'aitools-models-v1'; +export const CUSTOM_MODEL_URL_PREFIX = 'https://cache.aitools.local/custom-model/'; +const LEGACY_CUSTOM_MODEL_URL_PREFIX = 'aitools-custom-model://'; + +export async function getModelCache() { + try { return await caches.open(MODEL_CACHE_NAME); } + catch { return null; } +} + +export function isCustomModelUrl(url) { + return typeof url === 'string' && ( + url.startsWith(CUSTOM_MODEL_URL_PREFIX) || + url.startsWith(LEGACY_CUSTOM_MODEL_URL_PREFIX) + ); +} + +function isRelativeHttpUrl(url) { + return typeof url === 'string' && !/^https?:\/\//i.test(url) && !isCustomModelUrl(url); +} + +let _remoteOriginPromise = null; +function getRemoteOrigin() { + if (_remoteOriginPromise) return _remoteOriginPromise; + _remoteOriginPromise = fetch('branding.json', { cache: 'no-store' }) + .then((r) => (r.ok ? r.json() : null)) + .then((b) => b?.remoteOrigin || null) + .catch(() => null); + return _remoteOriginPromise; +} + +// A cache key that doesn't depend on the (possibly ephemeral) origin we +// fetched from. In desktop mode the localhost port changes each launch, +// so caching under that URL would mean a fresh download every run. +async function stableCacheKey(url) { + if (!isRelativeHttpUrl(url)) return url; + const remoteOrigin = await getRemoteOrigin(); + return remoteOrigin ? new URL(url, remoteOrigin).toString() : url; +} + +export async function fetchWithProgress(url, onProgress) { + if (onProgress != null && typeof onProgress !== 'function') { + console.warn('[fetchWithProgress] Ignoring non-function onProgress callback.', { + type: typeof onProgress, + value: onProgress, + url, + }); + } + const report = typeof onProgress === 'function' ? onProgress : null; + const cache = await getModelCache(); + const cacheKey = await stableCacheKey(url); + + if (cache) { + const cached = await cache.match(cacheKey); + if (cached) { + report?.(1, 'Loading model from cache…'); + return cached.arrayBuffer(); + } + if (isCustomModelUrl(url)) { + throw new Error('Custom model not found in cache. Please re-upload the model file.'); + } + } + + report?.(0, 'Downloading model…'); + let resp = await fetch(url); + if (!resp.ok && resp.status === 404 && isRelativeHttpUrl(url)) { + const remoteOrigin = await getRemoteOrigin(); + if (remoteOrigin) { + const remoteUrl = new URL(url, remoteOrigin).toString(); + report?.(0, 'Model not in local bundle, fetching from server…'); + resp = await fetch(remoteUrl); + } + } + if (!resp.ok) throw new Error(`Model download failed: HTTP ${resp.status}`); + + const respForCache = resp.clone(); + + const total = parseInt(resp.headers.get('content-length') || '0', 10); + const reader = resp.body.getReader(); + const chunks = []; + let loaded = 0; + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + chunks.push(value); + loaded += value.length; + if (total) { + const frac = loaded / total; + report?.(frac, `Downloading model… ${(loaded / 1e6).toFixed(1)} / ${(total / 1e6).toFixed(1)} MB`); + } + } + + if (cache) { + cache.put(cacheKey, respForCache).catch(() => {}); + } + + const buf = new Uint8Array(loaded); + let off = 0; + for (const c of chunks) { buf.set(c, off); off += c.length; } + return buf.buffer; +} diff --git a/lib/morph.js b/lib/morph.js new file mode 100644 index 0000000000000000000000000000000000000000..aa4cd4429223c4cad404a0b1d538563774b43e15 --- /dev/null +++ b/lib/morph.js @@ -0,0 +1,32 @@ +/** + * Idiomorph wrapper — uses the global Idiomorph loaded via CDN. + * Prevents nested custom elements from being torn down and re-created. + */ + +export function morph(component, html) { + Idiomorph.morph(component, html, { + morphStyle: 'innerHTML', + ignoreActiveValue: true, + callbacks: { + beforeNodeMorphed(oldNode, newNode) { + if (isNestedCustomElement(oldNode, component)) { + syncAttributes(oldNode, newNode); + return false; + } + } + } + }); +} + +function isNestedCustomElement(node, owner) { + return node instanceof Element && node.tagName.includes('-') && node !== owner; +} + +function syncAttributes(oldNode, newNode) { + if (!(newNode instanceof Element)) return; + for (const attr of newNode.attributes) { + if (oldNode.getAttribute(attr.name) !== attr.value) { + oldNode.setAttribute(attr.name, attr.value); + } + } +} diff --git a/lib/onnx-meta.js b/lib/onnx-meta.js new file mode 100644 index 0000000000000000000000000000000000000000..b4d058ee037a78872e2a587d0325d9d47c471617 --- /dev/null +++ b/lib/onnx-meta.js @@ -0,0 +1,18 @@ +// ORT-Web 1.18+ exposes inputMetadata/outputMetadata as a readonly array of +// ValueMetadata ordered to match inputNames/outputNames. Older versions +// exposed it as a Record keyed by tensor name. Accept both shapes. +export function readMetaEntry(metaCollection, name, index = 0) { + if (!metaCollection) return null; + if (Array.isArray(metaCollection)) { + if (name) { + const byName = metaCollection.find((m) => m?.name === name); + if (byName) return byName; + } + return metaCollection[index] || null; + } + return (name && metaCollection[name]) || null; +} + +export function isFp16InputType(inputType) { + return typeof inputType === 'string' && inputType.toLowerCase().includes('float16'); +} diff --git a/models/4x-ClearRealityV1.onnx b/models/4x-ClearRealityV1.onnx new file mode 100644 index 0000000000000000000000000000000000000000..04cabfbb7d0a4897e6129d5a1da57af54429b4e1 --- /dev/null +++ b/models/4x-ClearRealityV1.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58381c8df79457670dbb286d36921a044c506eacfe8826bbb6aefc644826f91a +size 1904717 diff --git a/models/4x-UltraSharpV2_Lite.onnx b/models/4x-UltraSharpV2_Lite.onnx new file mode 100644 index 0000000000000000000000000000000000000000..911e241e69d65ffde0c7ce2c29ffce41c518e2a4 --- /dev/null +++ b/models/4x-UltraSharpV2_Lite.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:931e668b639175e4e98a993b5bc7fed65685f3583bad57a0d132bc125a66e349 +size 29745754 diff --git a/models/4x-UpdraftSmall.onnx b/models/4x-UpdraftSmall.onnx new file mode 100644 index 0000000000000000000000000000000000000000..c0c875090dec5a0da67a4410674718e0bc4c31dd --- /dev/null +++ b/models/4x-UpdraftSmall.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7c550b52fbe36e03670fe1a229395c740111d002d361c3520cfa831a7a7f7dc +size 1414617 diff --git a/models/DAT_light_x4_dyn_OTF_4.onnx b/models/DAT_light_x4_dyn_OTF_4.onnx new file mode 100644 index 0000000000000000000000000000000000000000..c72ede68c7b74feb0cc0793e4f77b05ce0b02c88 --- /dev/null +++ b/models/DAT_light_x4_dyn_OTF_4.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d5ece82fef2c1511b80f77b3fe014297dfc21e38320c47983991e0e909428e5 +size 5085946 diff --git a/style.css b/style.css deleted file mode 100644 index 114adf441e9032febb46bc056b2a8bb651075f0d..0000000000000000000000000000000000000000 --- a/style.css +++ /dev/null @@ -1,28 +0,0 @@ -body { - padding: 2rem; - font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif; -} - -h1 { - font-size: 16px; - margin-top: 0; -} - -p { - color: rgb(107, 114, 128); - font-size: 15px; - margin-bottom: 10px; - margin-top: 5px; -} - -.card { - max-width: 620px; - margin: 0 auto; - padding: 16px; - border: 1px solid lightgray; - border-radius: 16px; -} - -.card p:last-child { - margin-bottom: 0; -} diff --git a/vendor/fflate/index.mjs b/vendor/fflate/index.mjs new file mode 100644 index 0000000000000000000000000000000000000000..e1a21e982fefc2021cce24909764661ac6e0fd37 --- /dev/null +++ b/vendor/fflate/index.mjs @@ -0,0 +1,2665 @@ +// DEFLATE is a complex format; to read this code, you should probably check the RFC first: +// https://tools.ietf.org/html/rfc1951 +// You may also wish to take a look at the guide I made about this program: +// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad +// Some of the following code is similar to that of UZIP.js: +// https://github.com/photopea/UZIP.js +// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size. +// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint +// is better for memory in most engines (I *think*). +var ch2 = {}; +var wk = (function (c, id, msg, transfer, cb) { + var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([ + c + ';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})' + ], { type: 'text/javascript' })))); + w.onmessage = function (e) { + var d = e.data, ed = d.$e$; + if (ed) { + var err = new Error(ed[0]); + err['code'] = ed[1]; + err.stack = ed[2]; + cb(err, null); + } + else + cb(null, d); + }; + w.postMessage(msg, transfer); + return w; +}); + +// aliases for shorter compressed code (most minifers don't do this) +var u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array; +// fixed length extra bits +var fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]); +// fixed distance extra bits +var fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]); +// code length index map +var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); +// get base, reverse index map from extra bits +var freb = function (eb, start) { + var b = new u16(31); + for (var i = 0; i < 31; ++i) { + b[i] = start += 1 << eb[i - 1]; + } + // numbers here are at max 18 bits + var r = new i32(b[30]); + for (var i = 1; i < 30; ++i) { + for (var j = b[i]; j < b[i + 1]; ++j) { + r[j] = ((j - b[i]) << 5) | i; + } + } + return { b: b, r: r }; +}; +var _a = freb(fleb, 2), fl = _a.b, revfl = _a.r; +// we can ignore the fact that the other numbers are wrong; they never happen anyway +fl[28] = 258, revfl[258] = 28; +var _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r; +// map of value to reverse (assuming 16 bits) +var rev = new u16(32768); +for (var i = 0; i < 32768; ++i) { + // reverse table algorithm from SO + var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1); + x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2); + x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4); + rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1; +} +// create huffman tree from u8 "map": index -> code length for code index +// mb (max bits) must be at most 15 +// TODO: optimize/split up? +var hMap = (function (cd, mb, r) { + var s = cd.length; + // index + var i = 0; + // u16 "map": index -> # of codes with bit length = index + var l = new u16(mb); + // length of cd must be 288 (total # of codes) + for (; i < s; ++i) { + if (cd[i]) + ++l[cd[i] - 1]; + } + // u16 "map": index -> minimum code for bit length = index + var le = new u16(mb); + for (i = 1; i < mb; ++i) { + le[i] = (le[i - 1] + l[i - 1]) << 1; + } + var co; + if (r) { + // u16 "map": index -> number of actual bits, symbol for code + co = new u16(1 << mb); + // bits to remove for reverser + var rvb = 15 - mb; + for (i = 0; i < s; ++i) { + // ignore 0 lengths + if (cd[i]) { + // num encoding both symbol and bits read + var sv = (i << 4) | cd[i]; + // free bits + var r_1 = mb - cd[i]; + // start value + var v = le[cd[i] - 1]++ << r_1; + // m is end value + for (var m = v | ((1 << r_1) - 1); v <= m; ++v) { + // every 16 bit value starting with the code yields the same result + co[rev[v] >> rvb] = sv; + } + } + } + } + else { + co = new u16(s); + for (i = 0; i < s; ++i) { + if (cd[i]) { + co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]); + } + } + } + return co; +}); +// fixed length tree +var flt = new u8(288); +for (var i = 0; i < 144; ++i) + flt[i] = 8; +for (var i = 144; i < 256; ++i) + flt[i] = 9; +for (var i = 256; i < 280; ++i) + flt[i] = 7; +for (var i = 280; i < 288; ++i) + flt[i] = 8; +// fixed distance tree +var fdt = new u8(32); +for (var i = 0; i < 32; ++i) + fdt[i] = 5; +// fixed length map +var flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1); +// fixed distance map +var fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1); +// find max of array +var max = function (a) { + var m = a[0]; + for (var i = 1; i < a.length; ++i) { + if (a[i] > m) + m = a[i]; + } + return m; +}; +// read d, starting at bit p and mask with m +var bits = function (d, p, m) { + var o = (p / 8) | 0; + return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m; +}; +// read d, starting at bit p continuing for at least 16 bits +var bits16 = function (d, p) { + var o = (p / 8) | 0; + return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7)); +}; +// get end of byte +var shft = function (p) { return ((p + 7) / 8) | 0; }; +// typed array slice - allows garbage collector to free original reference, +// while being more compatible than .slice +var slc = function (v, s, e) { + if (s == null || s < 0) + s = 0; + if (e == null || e > v.length) + e = v.length; + // can't use .constructor in case user-supplied + return new u8(v.subarray(s, e)); +}; +/** + * Codes for errors generated within this library + */ +export var FlateErrorCode = { + UnexpectedEOF: 0, + InvalidBlockType: 1, + InvalidLengthLiteral: 2, + InvalidDistance: 3, + StreamFinished: 4, + NoStreamHandler: 5, + InvalidHeader: 6, + NoCallback: 7, + InvalidUTF8: 8, + ExtraFieldTooLong: 9, + InvalidDate: 10, + FilenameTooLong: 11, + StreamFinishing: 12, + InvalidZipData: 13, + UnknownCompressionMethod: 14 +}; +// error codes +var ec = [ + 'unexpected EOF', + 'invalid block type', + 'invalid length/literal', + 'invalid distance', + 'stream finished', + 'no stream handler', + , + 'no callback', + 'invalid UTF-8 data', + 'extra field too long', + 'date not in range 1980-2099', + 'filename too long', + 'stream finishing', + 'invalid zip data' + // determined by unknown compression method +]; +; +var err = function (ind, msg, nt) { + var e = new Error(msg || ec[ind]); + e.code = ind; + if (Error.captureStackTrace) + Error.captureStackTrace(e, err); + if (!nt) + throw e; + return e; +}; +// expands raw DEFLATE data +var inflt = function (dat, st, buf, dict) { + // source length dict length + var sl = dat.length, dl = dict ? dict.length : 0; + if (!sl || st.f && !st.l) + return buf || new u8(0); + var noBuf = !buf; + // have to estimate size + var resize = noBuf || st.i != 2; + // no state + var noSt = st.i; + // Assumes roughly 33% compression ratio average + if (noBuf) + buf = new u8(sl * 3); + // ensure buffer can fit at least l elements + var cbuf = function (l) { + var bl = buf.length; + // need to increase size to fit + if (l > bl) { + // Double or set to necessary, whichever is greater + var nbuf = new u8(Math.max(bl * 2, l)); + nbuf.set(buf); + buf = nbuf; + } + }; + // last chunk bitpos bytes + var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n; + // total bits + var tbts = sl * 8; + do { + if (!lm) { + // BFINAL - this is only 1 when last chunk is next + final = bits(dat, pos, 1); + // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman + var type = bits(dat, pos + 1, 3); + pos += 3; + if (!type) { + // go to end of byte boundary + var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l; + if (t > sl) { + if (noSt) + err(0); + break; + } + // ensure size + if (resize) + cbuf(bt + l); + // Copy over uncompressed data + buf.set(dat.subarray(s, t), bt); + // Get new bitpos, update byte count + st.b = bt += l, st.p = pos = t * 8, st.f = final; + continue; + } + else if (type == 1) + lm = flrm, dm = fdrm, lbt = 9, dbt = 5; + else if (type == 2) { + // literal lengths + var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4; + var tl = hLit + bits(dat, pos + 5, 31) + 1; + pos += 14; + // length+distance tree + var ldt = new u8(tl); + // code length tree + var clt = new u8(19); + for (var i = 0; i < hcLen; ++i) { + // use index map to get real code + clt[clim[i]] = bits(dat, pos + i * 3, 7); + } + pos += hcLen * 3; + // code lengths bits + var clb = max(clt), clbmsk = (1 << clb) - 1; + // code lengths map + var clm = hMap(clt, clb, 1); + for (var i = 0; i < tl;) { + var r = clm[bits(dat, pos, clbmsk)]; + // bits read + pos += r & 15; + // symbol + var s = r >> 4; + // code length to copy + if (s < 16) { + ldt[i++] = s; + } + else { + // copy count + var c = 0, n = 0; + if (s == 16) + n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1]; + else if (s == 17) + n = 3 + bits(dat, pos, 7), pos += 3; + else if (s == 18) + n = 11 + bits(dat, pos, 127), pos += 7; + while (n--) + ldt[i++] = c; + } + } + // length tree distance tree + var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit); + // max length bits + lbt = max(lt); + // max dist bits + dbt = max(dt); + lm = hMap(lt, lbt, 1); + dm = hMap(dt, dbt, 1); + } + else + err(1); + if (pos > tbts) { + if (noSt) + err(0); + break; + } + } + // Make sure the buffer can hold this + the largest possible addition + // Maximum chunk size (practically, theoretically infinite) is 2^17 + if (resize) + cbuf(bt + 131072); + var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1; + var lpos = pos; + for (;; lpos = pos) { + // bits read, code + var c = lm[bits16(dat, pos) & lms], sym = c >> 4; + pos += c & 15; + if (pos > tbts) { + if (noSt) + err(0); + break; + } + if (!c) + err(2); + if (sym < 256) + buf[bt++] = sym; + else if (sym == 256) { + lpos = pos, lm = null; + break; + } + else { + var add = sym - 254; + // no extra bits needed if less + if (sym > 264) { + // index + var i = sym - 257, b = fleb[i]; + add = bits(dat, pos, (1 << b) - 1) + fl[i]; + pos += b; + } + // dist + var d = dm[bits16(dat, pos) & dms], dsym = d >> 4; + if (!d) + err(3); + pos += d & 15; + var dt = fd[dsym]; + if (dsym > 3) { + var b = fdeb[dsym]; + dt += bits16(dat, pos) & (1 << b) - 1, pos += b; + } + if (pos > tbts) { + if (noSt) + err(0); + break; + } + if (resize) + cbuf(bt + 131072); + var end = bt + add; + if (bt < dt) { + var shift = dl - dt, dend = Math.min(dt, end); + if (shift + bt < 0) + err(3); + for (; bt < dend; ++bt) + buf[bt] = dict[shift + bt]; + } + for (; bt < end; ++bt) + buf[bt] = buf[bt - dt]; + } + } + st.l = lm, st.p = lpos, st.b = bt, st.f = final; + if (lm) + final = 1, st.m = lbt, st.d = dm, st.n = dbt; + } while (!final); + // don't reallocate for streams or user buffers + return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt); +}; +// starting at p, write the minimum number of bits that can hold v to d +var wbits = function (d, p, v) { + v <<= p & 7; + var o = (p / 8) | 0; + d[o] |= v; + d[o + 1] |= v >> 8; +}; +// starting at p, write the minimum number of bits (>8) that can hold v to d +var wbits16 = function (d, p, v) { + v <<= p & 7; + var o = (p / 8) | 0; + d[o] |= v; + d[o + 1] |= v >> 8; + d[o + 2] |= v >> 16; +}; +// creates code lengths from a frequency table +var hTree = function (d, mb) { + // Need extra info to make a tree + var t = []; + for (var i = 0; i < d.length; ++i) { + if (d[i]) + t.push({ s: i, f: d[i] }); + } + var s = t.length; + var t2 = t.slice(); + if (!s) + return { t: et, l: 0 }; + if (s == 1) { + var v = new u8(t[0].s + 1); + v[t[0].s] = 1; + return { t: v, l: 1 }; + } + t.sort(function (a, b) { return a.f - b.f; }); + // after i2 reaches last ind, will be stopped + // freq must be greater than largest possible number of symbols + t.push({ s: -1, f: 25001 }); + var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2; + t[0] = { s: -1, f: l.f + r.f, l: l, r: r }; + // efficient algorithm from UZIP.js + // i0 is lookbehind, i2 is lookahead - after processing two low-freq + // symbols that combined have high freq, will start processing i2 (high-freq, + // non-composite) symbols instead + // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/ + while (i1 != s - 1) { + l = t[t[i0].f < t[i2].f ? i0++ : i2++]; + r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++]; + t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r }; + } + var maxSym = t2[0].s; + for (var i = 1; i < s; ++i) { + if (t2[i].s > maxSym) + maxSym = t2[i].s; + } + // code lengths + var tr = new u16(maxSym + 1); + // max bits in tree + var mbt = ln(t[i1 - 1], tr, 0); + if (mbt > mb) { + // more algorithms from UZIP.js + // TODO: find out how this code works (debt) + // ind debt + var i = 0, dt = 0; + // left cost + var lft = mbt - mb, cst = 1 << lft; + t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; }); + for (; i < s; ++i) { + var i2_1 = t2[i].s; + if (tr[i2_1] > mb) { + dt += cst - (1 << (mbt - tr[i2_1])); + tr[i2_1] = mb; + } + else + break; + } + dt >>= lft; + while (dt > 0) { + var i2_2 = t2[i].s; + if (tr[i2_2] < mb) + dt -= 1 << (mb - tr[i2_2]++ - 1); + else + ++i; + } + for (; i >= 0 && dt; --i) { + var i2_3 = t2[i].s; + if (tr[i2_3] == mb) { + --tr[i2_3]; + ++dt; + } + } + mbt = mb; + } + return { t: new u8(tr), l: mbt }; +}; +// get the max length and assign length codes +var ln = function (n, l, d) { + return n.s == -1 + ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) + : (l[n.s] = d); +}; +// length codes generation +var lc = function (c) { + var s = c.length; + // Note that the semicolon was intentional + while (s && !c[--s]) + ; + var cl = new u16(++s); + // ind num streak + var cli = 0, cln = c[0], cls = 1; + var w = function (v) { cl[cli++] = v; }; + for (var i = 1; i <= s; ++i) { + if (c[i] == cln && i != s) + ++cls; + else { + if (!cln && cls > 2) { + for (; cls > 138; cls -= 138) + w(32754); + if (cls > 2) { + w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305); + cls = 0; + } + } + else if (cls > 3) { + w(cln), --cls; + for (; cls > 6; cls -= 6) + w(8304); + if (cls > 2) + w(((cls - 3) << 5) | 8208), cls = 0; + } + while (cls--) + w(cln); + cls = 1; + cln = c[i]; + } + } + return { c: cl.subarray(0, cli), n: s }; +}; +// calculate the length of output from tree, code lengths +var clen = function (cf, cl) { + var l = 0; + for (var i = 0; i < cl.length; ++i) + l += cf[i] * cl[i]; + return l; +}; +// writes a fixed block +// returns the new bit pos +var wfblk = function (out, pos, dat) { + // no need to write 00 as type: TypedArray defaults to 0 + var s = dat.length; + var o = shft(pos + 2); + out[o] = s & 255; + out[o + 1] = s >> 8; + out[o + 2] = out[o] ^ 255; + out[o + 3] = out[o + 1] ^ 255; + for (var i = 0; i < s; ++i) + out[o + i + 4] = dat[i]; + return (o + 4 + s) * 8; +}; +// writes a block +var wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) { + wbits(out, p++, final); + ++lf[256]; + var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l; + var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l; + var _c = lc(dlt), lclt = _c.c, nlc = _c.n; + var _d = lc(ddt), lcdt = _d.c, ndc = _d.n; + var lcfreq = new u16(19); + for (var i = 0; i < lclt.length; ++i) + ++lcfreq[lclt[i] & 31]; + for (var i = 0; i < lcdt.length; ++i) + ++lcfreq[lcdt[i] & 31]; + var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l; + var nlcc = 19; + for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc) + ; + var flen = (bl + 5) << 3; + var ftlen = clen(lf, flt) + clen(df, fdt) + eb; + var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]; + if (bs >= 0 && flen <= ftlen && flen <= dtlen) + return wfblk(out, p, dat.subarray(bs, bs + bl)); + var lm, ll, dm, dl; + wbits(out, p, 1 + (dtlen < ftlen)), p += 2; + if (dtlen < ftlen) { + lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt; + var llm = hMap(lct, mlcb, 0); + wbits(out, p, nlc - 257); + wbits(out, p + 5, ndc - 1); + wbits(out, p + 10, nlcc - 4); + p += 14; + for (var i = 0; i < nlcc; ++i) + wbits(out, p + 3 * i, lct[clim[i]]); + p += 3 * nlcc; + var lcts = [lclt, lcdt]; + for (var it = 0; it < 2; ++it) { + var clct = lcts[it]; + for (var i = 0; i < clct.length; ++i) { + var len = clct[i] & 31; + wbits(out, p, llm[len]), p += lct[len]; + if (len > 15) + wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12; + } + } + } + else { + lm = flm, ll = flt, dm = fdm, dl = fdt; + } + for (var i = 0; i < li; ++i) { + var sym = syms[i]; + if (sym > 255) { + var len = (sym >> 18) & 31; + wbits16(out, p, lm[len + 257]), p += ll[len + 257]; + if (len > 7) + wbits(out, p, (sym >> 23) & 31), p += fleb[len]; + var dst = sym & 31; + wbits16(out, p, dm[dst]), p += dl[dst]; + if (dst > 3) + wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst]; + } + else { + wbits16(out, p, lm[sym]), p += ll[sym]; + } + } + wbits16(out, p, lm[256]); + return p + ll[256]; +}; +// deflate options (nice << 13) | chain +var deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]); +// empty +var et = /*#__PURE__*/ new u8(0); +// compresses data into a raw DEFLATE buffer +var dflt = function (dat, lvl, plvl, pre, post, st) { + var s = st.z || dat.length; + var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post); + // writing to this writes to the output buffer + var w = o.subarray(pre, o.length - post); + var lst = st.l; + var pos = (st.r || 0) & 7; + if (lvl) { + if (pos) + w[0] = st.r >> 3; + var opt = deo[lvl - 1]; + var n = opt >> 13, c = opt & 8191; + var msk_1 = (1 << plvl) - 1; + // prev 2-byte val map curr 2-byte val map + var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1); + var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1; + var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; }; + // 24576 is an arbitrary number of maximum symbols per block + // 424 buffer for last block + var syms = new i32(25000); + // length/literal freq distance freq + var lf = new u16(288), df = new u16(32); + // l/lcnt exbits index l/lind waitdx blkpos + var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0; + for (; i + 2 < s; ++i) { + // hash value + var hv = hsh(i); + // index mod 32768 previous index mod + var imod = i & 32767, pimod = head[hv]; + prev[imod] = pimod; + head[hv] = imod; + // We always should modify head and prev, but only add symbols if + // this data is not yet processed ("wait" for wait index) + if (wi <= i) { + // bytes remaining + var rem = s - i; + if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) { + pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos); + li = lc_1 = eb = 0, bs = i; + for (var j = 0; j < 286; ++j) + lf[j] = 0; + for (var j = 0; j < 30; ++j) + df[j] = 0; + } + // len dist chain + var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767; + if (rem > 2 && hv == hsh(i - dif)) { + var maxn = Math.min(n, rem) - 1; + var maxd = Math.min(32767, i); + // max possible length + // not capped at dif because decompressors implement "rolling" index population + var ml = Math.min(258, rem); + while (dif <= maxd && --ch_1 && imod != pimod) { + if (dat[i + l] == dat[i + l - dif]) { + var nl = 0; + for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl) + ; + if (nl > l) { + l = nl, d = dif; + // break out early when we reach "nice" (we are satisfied enough) + if (nl > maxn) + break; + // now, find the rarest 2-byte sequence within this + // length of literals and search for that instead. + // Much faster than just using the start + var mmd = Math.min(dif, nl - 2); + var md = 0; + for (var j = 0; j < mmd; ++j) { + var ti = i - dif + j & 32767; + var pti = prev[ti]; + var cd = ti - pti & 32767; + if (cd > md) + md = cd, pimod = ti; + } + } + } + // check the previous match + imod = pimod, pimod = prev[imod]; + dif += imod - pimod & 32767; + } + } + // d will be nonzero only when a match was found + if (d) { + // store both dist and len data in one int32 + // Make sure this is recognized as a len/dist with 28th bit (2^28) + syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d]; + var lin = revfl[l] & 31, din = revfd[d] & 31; + eb += fleb[lin] + fdeb[din]; + ++lf[257 + lin]; + ++df[din]; + wi = i + l; + ++lc_1; + } + else { + syms[li++] = dat[i]; + ++lf[dat[i]]; + } + } + } + for (i = Math.max(i, wi); i < s; ++i) { + syms[li++] = dat[i]; + ++lf[dat[i]]; + } + pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos); + if (!lst) { + st.r = (pos & 7) | w[(pos / 8) | 0] << 3; + // shft(pos) now 1 less if pos & 7 != 0 + pos -= 7; + st.h = head, st.p = prev, st.i = i, st.w = wi; + } + } + else { + for (var i = st.w || 0; i < s + lst; i += 65535) { + // end + var e = i + 65535; + if (e >= s) { + // write final block + w[(pos / 8) | 0] = lst; + e = s; + } + pos = wfblk(w, pos + 1, dat.subarray(i, e)); + } + st.i = s; + } + return slc(o, 0, pre + shft(pos) + post); +}; +// CRC32 table +var crct = /*#__PURE__*/ (function () { + var t = new Int32Array(256); + for (var i = 0; i < 256; ++i) { + var c = i, k = 9; + while (--k) + c = ((c & 1) && -306674912) ^ (c >>> 1); + t[i] = c; + } + return t; +})(); +// CRC32 +var crc = function () { + var c = -1; + return { + p: function (d) { + // closures have awful performance + var cr = c; + for (var i = 0; i < d.length; ++i) + cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8); + c = cr; + }, + d: function () { return ~c; } + }; +}; +// Adler32 +var adler = function () { + var a = 1, b = 0; + return { + p: function (d) { + // closures have awful performance + var n = a, m = b; + var l = d.length | 0; + for (var i = 0; i != l;) { + var e = Math.min(i + 2655, l); + for (; i < e; ++i) + m += n += d[i]; + n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16); + } + a = n, b = m; + }, + d: function () { + a %= 65521, b %= 65521; + return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8); + } + }; +}; +; +// deflate with opts +var dopt = function (dat, opt, pre, post, st) { + if (!st) { + st = { l: 1 }; + if (opt.dictionary) { + var dict = opt.dictionary.subarray(-32768); + var newDat = new u8(dict.length + dat.length); + newDat.set(dict); + newDat.set(dat, dict.length); + dat = newDat; + st.w = dict.length; + } + } + return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st); +}; +// Walmart object spread +var mrg = function (a, b) { + var o = {}; + for (var k in a) + o[k] = a[k]; + for (var k in b) + o[k] = b[k]; + return o; +}; +// worker clone +// This is possibly the craziest part of the entire codebase, despite how simple it may seem. +// The only parameter to this function is a closure that returns an array of variables outside of the function scope. +// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization. +// We will return an object mapping of true variable name to value (basically, the current scope as a JS object). +// The reason we can't just use the original variable names is minifiers mangling the toplevel scope. +// This took me three weeks to figure out how to do. +var wcln = function (fn, fnStr, td) { + var dt = fn(); + var st = fn.toString(); + var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\s+/g, '').split(','); + for (var i = 0; i < dt.length; ++i) { + var v = dt[i], k = ks[i]; + if (typeof v == 'function') { + fnStr += ';' + k + '='; + var st_1 = v.toString(); + if (v.prototype) { + // for global objects + if (st_1.indexOf('[native code]') != -1) { + var spInd = st_1.indexOf(' ', 8) + 1; + fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd)); + } + else { + fnStr += st_1; + for (var t in v.prototype) + fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString(); + } + } + else + fnStr += st_1; + } + else + td[k] = v; + } + return fnStr; +}; +var ch = []; +// clone bufs +var cbfs = function (v) { + var tl = []; + for (var k in v) { + if (v[k].buffer) { + tl.push((v[k] = new v[k].constructor(v[k])).buffer); + } + } + return tl; +}; +// use a worker to execute code +var wrkr = function (fns, init, id, cb) { + if (!ch[id]) { + var fnStr = '', td_1 = {}, m = fns.length - 1; + for (var i = 0; i < m; ++i) + fnStr = wcln(fns[i], fnStr, td_1); + ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 }; + } + var td = mrg({}, ch[id].e); + return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb); +}; +// base async inflate fn +var bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; }; +var bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; }; +// gzip extra +var gze = function () { return [gzh, gzhl, wbytes, crc, crct]; }; +// gunzip extra +var guze = function () { return [gzs, gzl]; }; +// zlib extra +var zle = function () { return [zlh, wbytes, adler]; }; +// unzlib extra +var zule = function () { return [zls]; }; +// post buf +var pbf = function (msg) { return postMessage(msg, [msg.buffer]); }; +// get opts +var gopt = function (o) { return o && { + out: o.size && new u8(o.size), + dictionary: o.dictionary +}; }; +// async helper +var cbify = function (dat, opts, fns, init, id, cb) { + var w = wrkr(fns, init, id, function (err, dat) { + w.terminate(); + cb(err, dat); + }); + w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []); + return function () { w.terminate(); }; +}; +// auto stream +var astrm = function (strm) { + strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); }; + return function (ev) { + if (ev.data.length) { + strm.push(ev.data[0], ev.data[1]); + postMessage([ev.data[0].length]); + } + else + strm.flush(); + }; +}; +// async stream attach +var astrmify = function (fns, strm, opts, init, id, flush, ext) { + var t; + var w = wrkr(fns, init, id, function (err, dat) { + if (err) + w.terminate(), strm.ondata.call(strm, err); + else if (!Array.isArray(dat)) + ext(dat); + else if (dat.length == 1) { + strm.queuedSize -= dat[0]; + if (strm.ondrain) + strm.ondrain(dat[0]); + } + else { + if (dat[1]) + w.terminate(); + strm.ondata.call(strm, err, dat[0], dat[1]); + } + }); + w.postMessage(opts); + strm.queuedSize = 0; + strm.push = function (d, f) { + if (!strm.ondata) + err(5); + if (t) + strm.ondata(err(4, 0, 1), null, !!f); + strm.queuedSize += d.length; + w.postMessage([d, t = f], [d.buffer]); + }; + strm.terminate = function () { w.terminate(); }; + if (flush) { + strm.flush = function () { w.postMessage([]); }; + } +}; +// read 2 bytes +var b2 = function (d, b) { return d[b] | (d[b + 1] << 8); }; +// read 4 bytes +var b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; }; +var b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); }; +// write bytes +var wbytes = function (d, b, v) { + for (; v; ++b) + d[b] = v, v >>>= 8; +}; +// gzip header +var gzh = function (c, o) { + var fn = o.filename; + c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix + if (o.mtime != 0) + wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000)); + if (fn) { + c[3] = 8; + for (var i = 0; i <= fn.length; ++i) + c[i + 10] = fn.charCodeAt(i); + } +}; +// gzip footer: -8 to -4 = CRC, -4 to -0 is length +// gzip start +var gzs = function (d) { + if (d[0] != 31 || d[1] != 139 || d[2] != 8) + err(6, 'invalid gzip data'); + var flg = d[3]; + var st = 10; + if (flg & 4) + st += (d[10] | d[11] << 8) + 2; + for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++]) + ; + return st + (flg & 2); +}; +// gzip length +var gzl = function (d) { + var l = d.length; + return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0; +}; +// gzip header length +var gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); }; +// zlib header +var zlh = function (c, o) { + var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2; + c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32); + c[1] |= 31 - ((c[0] << 8) | c[1]) % 31; + if (o.dictionary) { + var h = adler(); + h.p(o.dictionary); + wbytes(c, 2, h.d()); + } +}; +// zlib start +var zls = function (d, dict) { + if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31)) + err(6, 'invalid zlib data'); + if ((d[1] >> 5 & 1) == +!dict) + err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary'); + return (d[1] >> 3 & 4) + 2; +}; +function StrmOpt(opts, cb) { + if (typeof opts == 'function') + cb = opts, opts = {}; + this.ondata = cb; + return opts; +} +/** + * Streaming DEFLATE compression + */ +var Deflate = /*#__PURE__*/ (function () { + function Deflate(opts, cb) { + if (typeof opts == 'function') + cb = opts, opts = {}; + this.ondata = cb; + this.o = opts || {}; + this.s = { l: 0, i: 32768, w: 32768, z: 32768 }; + // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev + // 98304 = 32768 (lookback) + 65536 (common chunk size) + this.b = new u8(98304); + if (this.o.dictionary) { + var dict = this.o.dictionary.subarray(-32768); + this.b.set(dict, 32768 - dict.length); + this.s.i = 32768 - dict.length; + } + } + Deflate.prototype.p = function (c, f) { + this.ondata(dopt(c, this.o, 0, 0, this.s), f); + }; + /** + * Pushes a chunk to be deflated + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + Deflate.prototype.push = function (chunk, final) { + if (!this.ondata) + err(5); + if (this.s.l) + err(4); + var endLen = chunk.length + this.s.z; + if (endLen > this.b.length) { + if (endLen > 2 * this.b.length - 32768) { + var newBuf = new u8(endLen & -32768); + newBuf.set(this.b.subarray(0, this.s.z)); + this.b = newBuf; + } + var split = this.b.length - this.s.z; + this.b.set(chunk.subarray(0, split), this.s.z); + this.s.z = this.b.length; + this.p(this.b, false); + this.b.set(this.b.subarray(-32768)); + this.b.set(chunk.subarray(split), 32768); + this.s.z = chunk.length - split + 32768; + this.s.i = 32766, this.s.w = 32768; + } + else { + this.b.set(chunk, this.s.z); + this.s.z += chunk.length; + } + this.s.l = final & 1; + if (this.s.z > this.s.w + 8191 || final) { + this.p(this.b, final || false); + this.s.w = this.s.i, this.s.i -= 2; + } + }; + /** + * Flushes buffered uncompressed data. Useful to immediately retrieve the + * deflated output for small inputs. + */ + Deflate.prototype.flush = function () { + if (!this.ondata) + err(5); + if (this.s.l) + err(4); + this.p(this.b, false); + this.s.w = this.s.i, this.s.i -= 2; + }; + return Deflate; +}()); +export { Deflate }; +/** + * Asynchronous streaming DEFLATE compression + */ +var AsyncDeflate = /*#__PURE__*/ (function () { + function AsyncDeflate(opts, cb) { + astrmify([ + bDflt, + function () { return [astrm, Deflate]; } + ], this, StrmOpt.call(this, opts, cb), function (ev) { + var strm = new Deflate(ev.data); + onmessage = astrm(strm); + }, 6, 1); + } + return AsyncDeflate; +}()); +export { AsyncDeflate }; +export function deflate(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != 'function') + err(7); + return cbify(data, opts, [ + bDflt, + ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb); +} +/** + * Compresses data with DEFLATE without any wrapper + * @param data The data to compress + * @param opts The compression options + * @returns The deflated version of the data + */ +export function deflateSync(data, opts) { + return dopt(data, opts || {}, 0, 0); +} +/** + * Streaming DEFLATE decompression + */ +var Inflate = /*#__PURE__*/ (function () { + function Inflate(opts, cb) { + // no StrmOpt here to avoid adding to workerizer + if (typeof opts == 'function') + cb = opts, opts = {}; + this.ondata = cb; + var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768); + this.s = { i: 0, b: dict ? dict.length : 0 }; + this.o = new u8(32768); + this.p = new u8(0); + if (dict) + this.o.set(dict); + } + Inflate.prototype.e = function (c) { + if (!this.ondata) + err(5); + if (this.d) + err(4); + if (!this.p.length) + this.p = c; + else if (c.length) { + var n = new u8(this.p.length + c.length); + n.set(this.p), n.set(c, this.p.length), this.p = n; + } + }; + Inflate.prototype.c = function (final) { + this.s.i = +(this.d = final || false); + var bts = this.s.b; + var dt = inflt(this.p, this.s, this.o); + this.ondata(slc(dt, bts, this.s.b), this.d); + this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length; + this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7; + }; + /** + * Pushes a chunk to be inflated + * @param chunk The chunk to push + * @param final Whether this is the final chunk + */ + Inflate.prototype.push = function (chunk, final) { + this.e(chunk), this.c(final); + }; + return Inflate; +}()); +export { Inflate }; +/** + * Asynchronous streaming DEFLATE decompression + */ +var AsyncInflate = /*#__PURE__*/ (function () { + function AsyncInflate(opts, cb) { + astrmify([ + bInflt, + function () { return [astrm, Inflate]; } + ], this, StrmOpt.call(this, opts, cb), function (ev) { + var strm = new Inflate(ev.data); + onmessage = astrm(strm); + }, 7, 0); + } + return AsyncInflate; +}()); +export { AsyncInflate }; +export function inflate(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != 'function') + err(7); + return cbify(data, opts, [ + bInflt + ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb); +} +/** + * Expands DEFLATE data with no wrapper + * @param data The data to decompress + * @param opts The decompression options + * @returns The decompressed version of the data + */ +export function inflateSync(data, opts) { + return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary); +} +// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize. +/** + * Streaming GZIP compression + */ +var Gzip = /*#__PURE__*/ (function () { + function Gzip(opts, cb) { + this.c = crc(); + this.l = 0; + this.v = 1; + Deflate.call(this, opts, cb); + } + /** + * Pushes a chunk to be GZIPped + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + Gzip.prototype.push = function (chunk, final) { + this.c.p(chunk); + this.l += chunk.length; + Deflate.prototype.push.call(this, chunk, final); + }; + Gzip.prototype.p = function (c, f) { + var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s); + if (this.v) + gzh(raw, this.o), this.v = 0; + if (f) + wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l); + this.ondata(raw, f); + }; + /** + * Flushes buffered uncompressed data. Useful to immediately retrieve the + * GZIPped output for small inputs. + */ + Gzip.prototype.flush = function () { + Deflate.prototype.flush.call(this); + }; + return Gzip; +}()); +export { Gzip }; +/** + * Asynchronous streaming GZIP compression + */ +var AsyncGzip = /*#__PURE__*/ (function () { + function AsyncGzip(opts, cb) { + astrmify([ + bDflt, + gze, + function () { return [astrm, Deflate, Gzip]; } + ], this, StrmOpt.call(this, opts, cb), function (ev) { + var strm = new Gzip(ev.data); + onmessage = astrm(strm); + }, 8, 1); + } + return AsyncGzip; +}()); +export { AsyncGzip }; +export function gzip(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != 'function') + err(7); + return cbify(data, opts, [ + bDflt, + gze, + function () { return [gzipSync]; } + ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb); +} +/** + * Compresses data with GZIP + * @param data The data to compress + * @param opts The compression options + * @returns The gzipped version of the data + */ +export function gzipSync(data, opts) { + if (!opts) + opts = {}; + var c = crc(), l = data.length; + c.p(data); + var d = dopt(data, opts, gzhl(opts), 8), s = d.length; + return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d; +} +/** + * Streaming single or multi-member GZIP decompression + */ +var Gunzip = /*#__PURE__*/ (function () { + function Gunzip(opts, cb) { + this.v = 1; + this.r = 0; + Inflate.call(this, opts, cb); + } + /** + * Pushes a chunk to be GUNZIPped + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + Gunzip.prototype.push = function (chunk, final) { + Inflate.prototype.e.call(this, chunk); + this.r += chunk.length; + if (this.v) { + var p = this.p.subarray(this.v - 1); + var s = p.length > 3 ? gzs(p) : 4; + if (s > p.length) { + if (!final) + return; + } + else if (this.v > 1 && this.onmember) { + this.onmember(this.r - p.length); + } + this.p = p.subarray(s), this.v = 0; + } + // necessary to prevent TS from using the closure value + // This allows for workerization to function correctly + Inflate.prototype.c.call(this, final); + // process concatenated GZIP + if (this.s.f && !this.s.l && !final) { + this.v = shft(this.s.p) + 9; + this.s = { i: 0 }; + this.o = new u8(0); + this.push(new u8(0), final); + } + }; + return Gunzip; +}()); +export { Gunzip }; +/** + * Asynchronous streaming single or multi-member GZIP decompression + */ +var AsyncGunzip = /*#__PURE__*/ (function () { + function AsyncGunzip(opts, cb) { + var _this = this; + astrmify([ + bInflt, + guze, + function () { return [astrm, Inflate, Gunzip]; } + ], this, StrmOpt.call(this, opts, cb), function (ev) { + var strm = new Gunzip(ev.data); + strm.onmember = function (offset) { return postMessage(offset); }; + onmessage = astrm(strm); + }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); }); + } + return AsyncGunzip; +}()); +export { AsyncGunzip }; +export function gunzip(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != 'function') + err(7); + return cbify(data, opts, [ + bInflt, + guze, + function () { return [gunzipSync]; } + ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb); +} +/** + * Expands GZIP data + * @param data The data to decompress + * @param opts The decompression options + * @returns The decompressed version of the data + */ +export function gunzipSync(data, opts) { + var st = gzs(data); + if (st + 8 > data.length) + err(6, 'invalid gzip data'); + return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary); +} +/** + * Streaming Zlib compression + */ +var Zlib = /*#__PURE__*/ (function () { + function Zlib(opts, cb) { + this.c = adler(); + this.v = 1; + Deflate.call(this, opts, cb); + } + /** + * Pushes a chunk to be zlibbed + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + Zlib.prototype.push = function (chunk, final) { + this.c.p(chunk); + Deflate.prototype.push.call(this, chunk, final); + }; + Zlib.prototype.p = function (c, f) { + var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s); + if (this.v) + zlh(raw, this.o), this.v = 0; + if (f) + wbytes(raw, raw.length - 4, this.c.d()); + this.ondata(raw, f); + }; + /** + * Flushes buffered uncompressed data. Useful to immediately retrieve the + * zlibbed output for small inputs. + */ + Zlib.prototype.flush = function () { + Deflate.prototype.flush.call(this); + }; + return Zlib; +}()); +export { Zlib }; +/** + * Asynchronous streaming Zlib compression + */ +var AsyncZlib = /*#__PURE__*/ (function () { + function AsyncZlib(opts, cb) { + astrmify([ + bDflt, + zle, + function () { return [astrm, Deflate, Zlib]; } + ], this, StrmOpt.call(this, opts, cb), function (ev) { + var strm = new Zlib(ev.data); + onmessage = astrm(strm); + }, 10, 1); + } + return AsyncZlib; +}()); +export { AsyncZlib }; +export function zlib(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != 'function') + err(7); + return cbify(data, opts, [ + bDflt, + zle, + function () { return [zlibSync]; } + ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb); +} +/** + * Compress data with Zlib + * @param data The data to compress + * @param opts The compression options + * @returns The zlib-compressed version of the data + */ +export function zlibSync(data, opts) { + if (!opts) + opts = {}; + var a = adler(); + a.p(data); + var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4); + return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d; +} +/** + * Streaming Zlib decompression + */ +var Unzlib = /*#__PURE__*/ (function () { + function Unzlib(opts, cb) { + Inflate.call(this, opts, cb); + this.v = opts && opts.dictionary ? 2 : 1; + } + /** + * Pushes a chunk to be unzlibbed + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + Unzlib.prototype.push = function (chunk, final) { + Inflate.prototype.e.call(this, chunk); + if (this.v) { + if (this.p.length < 6 && !final) + return; + this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0; + } + if (final) { + if (this.p.length < 4) + err(6, 'invalid zlib data'); + this.p = this.p.subarray(0, -4); + } + // necessary to prevent TS from using the closure value + // This allows for workerization to function correctly + Inflate.prototype.c.call(this, final); + }; + return Unzlib; +}()); +export { Unzlib }; +/** + * Asynchronous streaming Zlib decompression + */ +var AsyncUnzlib = /*#__PURE__*/ (function () { + function AsyncUnzlib(opts, cb) { + astrmify([ + bInflt, + zule, + function () { return [astrm, Inflate, Unzlib]; } + ], this, StrmOpt.call(this, opts, cb), function (ev) { + var strm = new Unzlib(ev.data); + onmessage = astrm(strm); + }, 11, 0); + } + return AsyncUnzlib; +}()); +export { AsyncUnzlib }; +export function unzlib(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != 'function') + err(7); + return cbify(data, opts, [ + bInflt, + zule, + function () { return [unzlibSync]; } + ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb); +} +/** + * Expands Zlib data + * @param data The data to decompress + * @param opts The decompression options + * @returns The decompressed version of the data + */ +export function unzlibSync(data, opts) { + return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary); +} +// Default algorithm for compression (used because having a known output size allows faster decompression) +export { gzip as compress, AsyncGzip as AsyncCompress }; +export { gzipSync as compressSync, Gzip as Compress }; +/** + * Streaming GZIP, Zlib, or raw DEFLATE decompression + */ +var Decompress = /*#__PURE__*/ (function () { + function Decompress(opts, cb) { + this.o = StrmOpt.call(this, opts, cb) || {}; + this.G = Gunzip; + this.I = Inflate; + this.Z = Unzlib; + } + // init substream + // overriden by AsyncDecompress + Decompress.prototype.i = function () { + var _this = this; + this.s.ondata = function (dat, final) { + _this.ondata(dat, final); + }; + }; + /** + * Pushes a chunk to be decompressed + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + Decompress.prototype.push = function (chunk, final) { + if (!this.ondata) + err(5); + if (!this.s) { + if (this.p && this.p.length) { + var n = new u8(this.p.length + chunk.length); + n.set(this.p), n.set(chunk, this.p.length); + } + else + this.p = chunk; + if (this.p.length > 2) { + this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8) + ? new this.G(this.o) + : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31)) + ? new this.I(this.o) + : new this.Z(this.o); + this.i(); + this.s.push(this.p, final); + this.p = null; + } + } + else + this.s.push(chunk, final); + }; + return Decompress; +}()); +export { Decompress }; +/** + * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression + */ +var AsyncDecompress = /*#__PURE__*/ (function () { + function AsyncDecompress(opts, cb) { + Decompress.call(this, opts, cb); + this.queuedSize = 0; + this.G = AsyncGunzip; + this.I = AsyncInflate; + this.Z = AsyncUnzlib; + } + AsyncDecompress.prototype.i = function () { + var _this = this; + this.s.ondata = function (err, dat, final) { + _this.ondata(err, dat, final); + }; + this.s.ondrain = function (size) { + _this.queuedSize -= size; + if (_this.ondrain) + _this.ondrain(size); + }; + }; + /** + * Pushes a chunk to be decompressed + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + AsyncDecompress.prototype.push = function (chunk, final) { + this.queuedSize += chunk.length; + Decompress.prototype.push.call(this, chunk, final); + }; + return AsyncDecompress; +}()); +export { AsyncDecompress }; +export function decompress(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != 'function') + err(7); + return (data[0] == 31 && data[1] == 139 && data[2] == 8) + ? gunzip(data, opts, cb) + : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31)) + ? inflate(data, opts, cb) + : unzlib(data, opts, cb); +} +/** + * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format + * @param data The data to decompress + * @param opts The decompression options + * @returns The decompressed version of the data + */ +export function decompressSync(data, opts) { + return (data[0] == 31 && data[1] == 139 && data[2] == 8) + ? gunzipSync(data, opts) + : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31)) + ? inflateSync(data, opts) + : unzlibSync(data, opts); +} +// flatten a directory structure +var fltn = function (d, p, t, o) { + for (var k in d) { + var val = d[k], n = p + k, op = o; + if (Array.isArray(val)) + op = mrg(o, val[1]), val = val[0]; + if (val instanceof u8) + t[n] = [val, op]; + else { + t[n += '/'] = [new u8(0), op]; + fltn(val, n, t, o); + } + } +}; +// text encoder +var te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder(); +// text decoder +var td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder(); +// text decoder stream +var tds = 0; +try { + td.decode(et, { stream: true }); + tds = 1; +} +catch (e) { } +// decode UTF8 +var dutf8 = function (d) { + for (var r = '', i = 0;;) { + var c = d[i++]; + var eb = (c > 127) + (c > 223) + (c > 239); + if (i + eb > d.length) + return { s: r, r: slc(d, i - 1) }; + if (!eb) + r += String.fromCharCode(c); + else if (eb == 3) { + c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536, + r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023)); + } + else if (eb & 1) + r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63)); + else + r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)); + } +}; +/** + * Streaming UTF-8 decoding + */ +var DecodeUTF8 = /*#__PURE__*/ (function () { + /** + * Creates a UTF-8 decoding stream + * @param cb The callback to call whenever data is decoded + */ + function DecodeUTF8(cb) { + this.ondata = cb; + if (tds) + this.t = new TextDecoder(); + else + this.p = et; + } + /** + * Pushes a chunk to be decoded from UTF-8 binary + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + DecodeUTF8.prototype.push = function (chunk, final) { + if (!this.ondata) + err(5); + final = !!final; + if (this.t) { + this.ondata(this.t.decode(chunk, { stream: true }), final); + if (final) { + if (this.t.decode().length) + err(8); + this.t = null; + } + return; + } + if (!this.p) + err(4); + var dat = new u8(this.p.length + chunk.length); + dat.set(this.p); + dat.set(chunk, this.p.length); + var _a = dutf8(dat), s = _a.s, r = _a.r; + if (final) { + if (r.length) + err(8); + this.p = null; + } + else + this.p = r; + this.ondata(s, final); + }; + return DecodeUTF8; +}()); +export { DecodeUTF8 }; +/** + * Streaming UTF-8 encoding + */ +var EncodeUTF8 = /*#__PURE__*/ (function () { + /** + * Creates a UTF-8 decoding stream + * @param cb The callback to call whenever data is encoded + */ + function EncodeUTF8(cb) { + this.ondata = cb; + } + /** + * Pushes a chunk to be encoded to UTF-8 + * @param chunk The string data to push + * @param final Whether this is the last chunk + */ + EncodeUTF8.prototype.push = function (chunk, final) { + if (!this.ondata) + err(5); + if (this.d) + err(4); + this.ondata(strToU8(chunk), this.d = final || false); + }; + return EncodeUTF8; +}()); +export { EncodeUTF8 }; +/** + * Converts a string into a Uint8Array for use with compression/decompression methods + * @param str The string to encode + * @param latin1 Whether or not to interpret the data as Latin-1. This should + * not need to be true unless decoding a binary string. + * @returns The string encoded in UTF-8/Latin-1 binary + */ +export function strToU8(str, latin1) { + if (latin1) { + var ar_1 = new u8(str.length); + for (var i = 0; i < str.length; ++i) + ar_1[i] = str.charCodeAt(i); + return ar_1; + } + if (te) + return te.encode(str); + var l = str.length; + var ar = new u8(str.length + (str.length >> 1)); + var ai = 0; + var w = function (v) { ar[ai++] = v; }; + for (var i = 0; i < l; ++i) { + if (ai + 5 > ar.length) { + var n = new u8(ai + 8 + ((l - i) << 1)); + n.set(ar); + ar = n; + } + var c = str.charCodeAt(i); + if (c < 128 || latin1) + w(c); + else if (c < 2048) + w(192 | (c >> 6)), w(128 | (c & 63)); + else if (c > 55295 && c < 57344) + c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023), + w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63)); + else + w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63)); + } + return slc(ar, 0, ai); +} +/** + * Converts a Uint8Array to a string + * @param dat The data to decode to string + * @param latin1 Whether or not to interpret the data as Latin-1. This should + * not need to be true unless encoding to binary string. + * @returns The original UTF-8/Latin-1 string + */ +export function strFromU8(dat, latin1) { + if (latin1) { + var r = ''; + for (var i = 0; i < dat.length; i += 16384) + r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384)); + return r; + } + else if (td) { + return td.decode(dat); + } + else { + var _a = dutf8(dat), s = _a.s, r = _a.r; + if (r.length) + err(8); + return s; + } +} +; +// deflate bit flag +var dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; }; +// skip local zip header +var slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); }; +// read zip header +var zh = function (d, b, z) { + var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20); + var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2]; + return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off]; +}; +// read zip64 extra field +var z64e = function (d, b) { + for (; b2(d, b) != 1; b += 4 + b2(d, b + 2)) + ; + return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)]; +}; +// extra field length +var exfl = function (ex) { + var le = 0; + if (ex) { + for (var k in ex) { + var l = ex[k].length; + if (l > 65535) + err(9); + le += l + 4; + } + } + return le; +}; +// write zip header +var wzh = function (d, b, f, fn, u, c, ce, co) { + var fl = fn.length, ex = f.extra, col = co && co.length; + var exl = exfl(ex); + wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4; + if (ce != null) + d[b++] = 20, d[b++] = f.os; + d[b] = 20, b += 2; // spec compliance? what's that? + d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8; + d[b++] = f.compression & 255, d[b++] = f.compression >> 8; + var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980; + if (y < 0 || y > 119) + err(10); + wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4; + if (c != -1) { + wbytes(d, b, f.crc); + wbytes(d, b + 4, c < 0 ? -c - 2 : c); + wbytes(d, b + 8, f.size); + } + wbytes(d, b + 12, fl); + wbytes(d, b + 14, exl), b += 16; + if (ce != null) { + wbytes(d, b, col); + wbytes(d, b + 6, f.attrs); + wbytes(d, b + 10, ce), b += 14; + } + d.set(fn, b); + b += fl; + if (exl) { + for (var k in ex) { + var exf = ex[k], l = exf.length; + wbytes(d, b, +k); + wbytes(d, b + 2, l); + d.set(exf, b + 4), b += 4 + l; + } + } + if (col) + d.set(co, b), b += col; + return b; +}; +// write zip footer (end of central directory) +var wzf = function (o, b, c, d, e) { + wbytes(o, b, 0x6054B50); // skip disk + wbytes(o, b + 8, c); + wbytes(o, b + 10, c); + wbytes(o, b + 12, d); + wbytes(o, b + 16, e); +}; +/** + * A pass-through stream to keep data uncompressed in a ZIP archive. + */ +var ZipPassThrough = /*#__PURE__*/ (function () { + /** + * Creates a pass-through stream that can be added to ZIP archives + * @param filename The filename to associate with this data stream + */ + function ZipPassThrough(filename) { + this.filename = filename; + this.c = crc(); + this.size = 0; + this.compression = 0; + } + /** + * Processes a chunk and pushes to the output stream. You can override this + * method in a subclass for custom behavior, but by default this passes + * the data through. You must call this.ondata(err, chunk, final) at some + * point in this method. + * @param chunk The chunk to process + * @param final Whether this is the last chunk + */ + ZipPassThrough.prototype.process = function (chunk, final) { + this.ondata(null, chunk, final); + }; + /** + * Pushes a chunk to be added. If you are subclassing this with a custom + * compression algorithm, note that you must push data from the source + * file only, pre-compression. + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + ZipPassThrough.prototype.push = function (chunk, final) { + if (!this.ondata) + err(5); + this.c.p(chunk); + this.size += chunk.length; + if (final) + this.crc = this.c.d(); + this.process(chunk, final || false); + }; + return ZipPassThrough; +}()); +export { ZipPassThrough }; +// I don't extend because TypeScript extension adds 1kB of runtime bloat +/** + * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate + * for better performance + */ +var ZipDeflate = /*#__PURE__*/ (function () { + /** + * Creates a DEFLATE stream that can be added to ZIP archives + * @param filename The filename to associate with this data stream + * @param opts The compression options + */ + function ZipDeflate(filename, opts) { + var _this = this; + if (!opts) + opts = {}; + ZipPassThrough.call(this, filename); + this.d = new Deflate(opts, function (dat, final) { + _this.ondata(null, dat, final); + }); + this.compression = 8; + this.flag = dbf(opts.level); + } + ZipDeflate.prototype.process = function (chunk, final) { + try { + this.d.push(chunk, final); + } + catch (e) { + this.ondata(e, null, final); + } + }; + /** + * Pushes a chunk to be deflated + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + ZipDeflate.prototype.push = function (chunk, final) { + ZipPassThrough.prototype.push.call(this, chunk, final); + }; + return ZipDeflate; +}()); +export { ZipDeflate }; +/** + * Asynchronous streaming DEFLATE compression for ZIP archives + */ +var AsyncZipDeflate = /*#__PURE__*/ (function () { + /** + * Creates an asynchronous DEFLATE stream that can be added to ZIP archives + * @param filename The filename to associate with this data stream + * @param opts The compression options + */ + function AsyncZipDeflate(filename, opts) { + var _this = this; + if (!opts) + opts = {}; + ZipPassThrough.call(this, filename); + this.d = new AsyncDeflate(opts, function (err, dat, final) { + _this.ondata(err, dat, final); + }); + this.compression = 8; + this.flag = dbf(opts.level); + this.terminate = this.d.terminate; + } + AsyncZipDeflate.prototype.process = function (chunk, final) { + this.d.push(chunk, final); + }; + /** + * Pushes a chunk to be deflated + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + AsyncZipDeflate.prototype.push = function (chunk, final) { + ZipPassThrough.prototype.push.call(this, chunk, final); + }; + return AsyncZipDeflate; +}()); +export { AsyncZipDeflate }; +// TODO: Better tree shaking +/** + * A zippable archive to which files can incrementally be added + */ +var Zip = /*#__PURE__*/ (function () { + /** + * Creates an empty ZIP archive to which files can be added + * @param cb The callback to call whenever data for the generated ZIP archive + * is available + */ + function Zip(cb) { + this.ondata = cb; + this.u = []; + this.d = 1; + } + /** + * Adds a file to the ZIP archive + * @param file The file stream to add + */ + Zip.prototype.add = function (file) { + var _this = this; + if (!this.ondata) + err(5); + // finishing or finished + if (this.d & 2) + this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false); + else { + var f = strToU8(file.filename), fl_1 = f.length; + var com = file.comment, o = com && strToU8(com); + var u = fl_1 != file.filename.length || (o && (com.length != o.length)); + var hl_1 = fl_1 + exfl(file.extra) + 30; + if (fl_1 > 65535) + this.ondata(err(11, 0, 1), null, false); + var header = new u8(hl_1); + wzh(header, 0, file, f, u, -1); + var chks_1 = [header]; + var pAll_1 = function () { + for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) { + var chk = chks_2[_i]; + _this.ondata(null, chk, false); + } + chks_1 = []; + }; + var tr_1 = this.d; + this.d = 0; + var ind_1 = this.u.length; + var uf_1 = mrg(file, { + f: f, + u: u, + o: o, + t: function () { + if (file.terminate) + file.terminate(); + }, + r: function () { + pAll_1(); + if (tr_1) { + var nxt = _this.u[ind_1 + 1]; + if (nxt) + nxt.r(); + else + _this.d = 1; + } + tr_1 = 1; + } + }); + var cl_1 = 0; + file.ondata = function (err, dat, final) { + if (err) { + _this.ondata(err, dat, final); + _this.terminate(); + } + else { + cl_1 += dat.length; + chks_1.push(dat); + if (final) { + var dd = new u8(16); + wbytes(dd, 0, 0x8074B50); + wbytes(dd, 4, file.crc); + wbytes(dd, 8, cl_1); + wbytes(dd, 12, file.size); + chks_1.push(dd); + uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size; + if (tr_1) + uf_1.r(); + tr_1 = 1; + } + else if (tr_1) + pAll_1(); + } + }; + this.u.push(uf_1); + } + }; + /** + * Ends the process of adding files and prepares to emit the final chunks. + * This *must* be called after adding all desired files for the resulting + * ZIP file to work properly. + */ + Zip.prototype.end = function () { + var _this = this; + if (this.d & 2) { + this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true); + return; + } + if (this.d) + this.e(); + else + this.u.push({ + r: function () { + if (!(_this.d & 1)) + return; + _this.u.splice(-1, 1); + _this.e(); + }, + t: function () { } + }); + this.d = 3; + }; + Zip.prototype.e = function () { + var bt = 0, l = 0, tl = 0; + for (var _i = 0, _a = this.u; _i < _a.length; _i++) { + var f = _a[_i]; + tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0); + } + var out = new u8(tl + 22); + for (var _b = 0, _c = this.u; _b < _c.length; _b++) { + var f = _c[_b]; + wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o); + bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b; + } + wzf(out, bt, this.u.length, tl, l); + this.ondata(null, out, true); + this.d = 2; + }; + /** + * A method to terminate any internal workers used by the stream. Subsequent + * calls to add() will fail. + */ + Zip.prototype.terminate = function () { + for (var _i = 0, _a = this.u; _i < _a.length; _i++) { + var f = _a[_i]; + f.t(); + } + this.d = 2; + }; + return Zip; +}()); +export { Zip }; +export function zip(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != 'function') + err(7); + var r = {}; + fltn(data, '', r, opts); + var k = Object.keys(r); + var lft = k.length, o = 0, tot = 0; + var slft = lft, files = new Array(lft); + var term = []; + var tAll = function () { + for (var i = 0; i < term.length; ++i) + term[i](); + }; + var cbd = function (a, b) { + mt(function () { cb(a, b); }); + }; + mt(function () { cbd = cb; }); + var cbf = function () { + var out = new u8(tot + 22), oe = o, cdl = tot - o; + tot = 0; + for (var i = 0; i < slft; ++i) { + var f = files[i]; + try { + var l = f.c.length; + wzh(out, tot, f, f.f, f.u, l); + var badd = 30 + f.f.length + exfl(f.extra); + var loc = tot + badd; + out.set(f.c, loc); + wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l; + } + catch (e) { + return cbd(e, null); + } + } + wzf(out, o, files.length, cdl, oe); + cbd(null, out); + }; + if (!lft) + cbf(); + var _loop_1 = function (i) { + var fn = k[i]; + var _a = r[fn], file = _a[0], p = _a[1]; + var c = crc(), size = file.length; + c.p(file); + var f = strToU8(fn), s = f.length; + var com = p.comment, m = com && strToU8(com), ms = m && m.length; + var exl = exfl(p.extra); + var compression = p.level == 0 ? 0 : 8; + var cbl = function (e, d) { + if (e) { + tAll(); + cbd(e, null); + } + else { + var l = d.length; + files[i] = mrg(p, { + size: size, + crc: c.d(), + c: d, + f: f, + m: m, + u: s != fn.length || (m && (com.length != ms)), + compression: compression + }); + o += 30 + s + exl + l; + tot += 76 + 2 * (s + exl) + (ms || 0) + l; + if (!--lft) + cbf(); + } + }; + if (s > 65535) + cbl(err(11, 0, 1), null); + if (!compression) + cbl(null, file); + else if (size < 160000) { + try { + cbl(null, deflateSync(file, p)); + } + catch (e) { + cbl(e, null); + } + } + else + term.push(deflate(file, p, cbl)); + }; + // Cannot use lft because it can decrease + for (var i = 0; i < slft; ++i) { + _loop_1(i); + } + return tAll; +} +/** + * Synchronously creates a ZIP file. Prefer using `zip` for better performance + * with more than one file. + * @param data The directory structure for the ZIP archive + * @param opts The main options, merged with per-file options + * @returns The generated ZIP archive + */ +export function zipSync(data, opts) { + if (!opts) + opts = {}; + var r = {}; + var files = []; + fltn(data, '', r, opts); + var o = 0; + var tot = 0; + for (var fn in r) { + var _a = r[fn], file = _a[0], p = _a[1]; + var compression = p.level == 0 ? 0 : 8; + var f = strToU8(fn), s = f.length; + var com = p.comment, m = com && strToU8(com), ms = m && m.length; + var exl = exfl(p.extra); + if (s > 65535) + err(11); + var d = compression ? deflateSync(file, p) : file, l = d.length; + var c = crc(); + c.p(file); + files.push(mrg(p, { + size: file.length, + crc: c.d(), + c: d, + f: f, + m: m, + u: s != fn.length || (m && (com.length != ms)), + o: o, + compression: compression + })); + o += 30 + s + exl + l; + tot += 76 + 2 * (s + exl) + (ms || 0) + l; + } + var out = new u8(tot + 22), oe = o, cdl = tot - o; + for (var i = 0; i < files.length; ++i) { + var f = files[i]; + wzh(out, f.o, f, f.f, f.u, f.c.length); + var badd = 30 + f.f.length + exfl(f.extra); + out.set(f.c, f.o + badd); + wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0); + } + wzf(out, o, files.length, cdl, oe); + return out; +} +/** + * Streaming pass-through decompression for ZIP archives + */ +var UnzipPassThrough = /*#__PURE__*/ (function () { + function UnzipPassThrough() { + } + UnzipPassThrough.prototype.push = function (data, final) { + this.ondata(null, data, final); + }; + UnzipPassThrough.compression = 0; + return UnzipPassThrough; +}()); +export { UnzipPassThrough }; +/** + * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for + * better performance. + */ +var UnzipInflate = /*#__PURE__*/ (function () { + /** + * Creates a DEFLATE decompression that can be used in ZIP archives + */ + function UnzipInflate() { + var _this = this; + this.i = new Inflate(function (dat, final) { + _this.ondata(null, dat, final); + }); + } + UnzipInflate.prototype.push = function (data, final) { + try { + this.i.push(data, final); + } + catch (e) { + this.ondata(e, null, final); + } + }; + UnzipInflate.compression = 8; + return UnzipInflate; +}()); +export { UnzipInflate }; +/** + * Asynchronous streaming DEFLATE decompression for ZIP archives + */ +var AsyncUnzipInflate = /*#__PURE__*/ (function () { + /** + * Creates a DEFLATE decompression that can be used in ZIP archives + */ + function AsyncUnzipInflate(_, sz) { + var _this = this; + if (sz < 320000) { + this.i = new Inflate(function (dat, final) { + _this.ondata(null, dat, final); + }); + } + else { + this.i = new AsyncInflate(function (err, dat, final) { + _this.ondata(err, dat, final); + }); + this.terminate = this.i.terminate; + } + } + AsyncUnzipInflate.prototype.push = function (data, final) { + if (this.i.terminate) + data = slc(data, 0); + this.i.push(data, final); + }; + AsyncUnzipInflate.compression = 8; + return AsyncUnzipInflate; +}()); +export { AsyncUnzipInflate }; +/** + * A ZIP archive decompression stream that emits files as they are discovered + */ +var Unzip = /*#__PURE__*/ (function () { + /** + * Creates a ZIP decompression stream + * @param cb The callback to call whenever a file in the ZIP archive is found + */ + function Unzip(cb) { + this.onfile = cb; + this.k = []; + this.o = { + 0: UnzipPassThrough + }; + this.p = et; + } + /** + * Pushes a chunk to be unzipped + * @param chunk The chunk to push + * @param final Whether this is the last chunk + */ + Unzip.prototype.push = function (chunk, final) { + var _this = this; + if (!this.onfile) + err(5); + if (!this.p) + err(4); + if (this.c > 0) { + var len = Math.min(this.c, chunk.length); + var toAdd = chunk.subarray(0, len); + this.c -= len; + if (this.d) + this.d.push(toAdd, !this.c); + else + this.k[0].push(toAdd); + chunk = chunk.subarray(len); + if (chunk.length) + return this.push(chunk, final); + } + else { + var f = 0, i = 0, is = void 0, buf = void 0; + if (!this.p.length) + buf = chunk; + else if (!chunk.length) + buf = this.p; + else { + buf = new u8(this.p.length + chunk.length); + buf.set(this.p), buf.set(chunk, this.p.length); + } + var l = buf.length, oc = this.c, add = oc && this.d; + var _loop_2 = function () { + var _a; + var sig = b4(buf, i); + if (sig == 0x4034B50) { + f = 1, is = i; + this_1.d = null; + this_1.c = 0; + var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28); + if (l > i + 30 + fnl + es) { + var chks_3 = []; + this_1.k.unshift(chks_3); + f = 2; + var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22); + var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u); + if (sc_1 == 4294967295) { + _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1]; + } + else if (dd) + sc_1 = -1; + i += es; + this_1.c = sc_1; + var d_1; + var file_1 = { + name: fn_1, + compression: cmp_1, + start: function () { + if (!file_1.ondata) + err(5); + if (!sc_1) + file_1.ondata(null, et, true); + else { + var ctr = _this.o[cmp_1]; + if (!ctr) + file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false); + d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1); + d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); }; + for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) { + var dat = chks_4[_i]; + d_1.push(dat, false); + } + if (_this.k[0] == chks_3 && _this.c) + _this.d = d_1; + else + d_1.push(et, true); + } + }, + terminate: function () { + if (d_1 && d_1.terminate) + d_1.terminate(); + } + }; + if (sc_1 >= 0) + file_1.size = sc_1, file_1.originalSize = su_1; + this_1.onfile(file_1); + } + return "break"; + } + else if (oc) { + if (sig == 0x8074B50) { + is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0; + return "break"; + } + else if (sig == 0x2014B50) { + is = i -= 4, f = 3, this_1.c = 0; + return "break"; + } + } + }; + var this_1 = this; + for (; i < l - 4; ++i) { + var state_1 = _loop_2(); + if (state_1 === "break") + break; + } + this.p = et; + if (oc < 0) { + var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i); + if (add) + add.push(dat, !!f); + else + this.k[+(f == 2)].push(dat); + } + if (f & 2) + return this.push(buf.subarray(i), final); + this.p = buf.subarray(i); + } + if (final) { + if (this.c) + err(13); + this.p = null; + } + }; + /** + * Registers a decoder with the stream, allowing for files compressed with + * the compression type provided to be expanded correctly + * @param decoder The decoder constructor + */ + Unzip.prototype.register = function (decoder) { + this.o[decoder.compression] = decoder; + }; + return Unzip; +}()); +export { Unzip }; +var mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); }; +export function unzip(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != 'function') + err(7); + var term = []; + var tAll = function () { + for (var i = 0; i < term.length; ++i) + term[i](); + }; + var files = {}; + var cbd = function (a, b) { + mt(function () { cb(a, b); }); + }; + mt(function () { cbd = cb; }); + var e = data.length - 22; + for (; b4(data, e) != 0x6054B50; --e) { + if (!e || data.length - e > 65558) { + cbd(err(13, 0, 1), null); + return tAll; + } + } + ; + var lft = b2(data, e + 8); + if (lft) { + var c = lft; + var o = b4(data, e + 16); + var z = o == 4294967295 || c == 65535; + if (z) { + var ze = b4(data, e - 12); + z = b4(data, ze) == 0x6064B50; + if (z) { + c = lft = b4(data, ze + 32); + o = b4(data, ze + 48); + } + } + var fltr = opts && opts.filter; + var _loop_3 = function (i) { + var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off); + o = no; + var cbl = function (e, d) { + if (e) { + tAll(); + cbd(e, null); + } + else { + if (d) + files[fn] = d; + if (!--lft) + cbd(null, files); + } + }; + if (!fltr || fltr({ + name: fn, + size: sc, + originalSize: su, + compression: c_1 + })) { + if (!c_1) + cbl(null, slc(data, b, b + sc)); + else if (c_1 == 8) { + var infl = data.subarray(b, b + sc); + // Synchronously decompress under 512KB, or barely-compressed data + if (su < 524288 || sc > 0.8 * su) { + try { + cbl(null, inflateSync(infl, { out: new u8(su) })); + } + catch (e) { + cbl(e, null); + } + } + else + term.push(inflate(infl, { size: su }, cbl)); + } + else + cbl(err(14, 'unknown compression type ' + c_1, 1), null); + } + else + cbl(null, null); + }; + for (var i = 0; i < c; ++i) { + _loop_3(i); + } + } + else + cbd(null, {}); + return tAll; +} +/** + * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better + * performance with more than one file. + * @param data The raw compressed ZIP file + * @param opts The ZIP extraction options + * @returns The decompressed files + */ +export function unzipSync(data, opts) { + var files = {}; + var e = data.length - 22; + for (; b4(data, e) != 0x6054B50; --e) { + if (!e || data.length - e > 65558) + err(13); + } + ; + var c = b2(data, e + 8); + if (!c) + return {}; + var o = b4(data, e + 16); + var z = o == 4294967295 || c == 65535; + if (z) { + var ze = b4(data, e - 12); + z = b4(data, ze) == 0x6064B50; + if (z) { + c = b4(data, ze + 32); + o = b4(data, ze + 48); + } + } + var fltr = opts && opts.filter; + for (var i = 0; i < c; ++i) { + var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off); + o = no; + if (!fltr || fltr({ + name: fn, + size: sc, + originalSize: su, + compression: c_2 + })) { + if (!c_2) + files[fn] = slc(data, b, b + sc); + else if (c_2 == 8) + files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) }); + else + err(14, 'unknown compression type ' + c_2); + } + } + return files; +} diff --git a/vendor/font-awesome/css/all.min.css b/vendor/font-awesome/css/all.min.css new file mode 100644 index 0000000000000000000000000000000000000000..45072b309e1482071b68c33d4ba7203bfa837499 --- /dev/null +++ b/vendor/font-awesome/css/all.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} +.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/vendor/font-awesome/webfonts/fa-brands-400.ttf b/vendor/font-awesome/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d46149305fa276aaccc2d823ebe93981a81fe5c6 --- /dev/null +++ b/vendor/font-awesome/webfonts/fa-brands-400.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e28096fa75a96ac77020155ea3a6dd7312983e84115366d4cf49a0c312ec6d51 +size 209128 diff --git a/vendor/font-awesome/webfonts/fa-brands-400.woff2 b/vendor/font-awesome/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d371371f5d009be2473b6adf772c6c9b7d328223 --- /dev/null +++ b/vendor/font-awesome/webfonts/fa-brands-400.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:232c6f6a7678304f9efaa26f30b1610debc2ba9f4cd636b5e6751c8d73761b92 +size 117852 diff --git a/vendor/font-awesome/webfonts/fa-regular-400.ttf b/vendor/font-awesome/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fdef35da63f1c5584263ec228946f5c9ee4e449a --- /dev/null +++ b/vendor/font-awesome/webfonts/fa-regular-400.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9174757efc83e072436e873c22be1663d3c103b0a16d7fb73569af4918d4d351 +size 67860 diff --git a/vendor/font-awesome/webfonts/fa-regular-400.woff2 b/vendor/font-awesome/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5e26ed74e1211620587aa76c2e5ab4e068a3bbab --- /dev/null +++ b/vendor/font-awesome/webfonts/fa-regular-400.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c27da6f833431da5aa295c44540bfac0fd8270ba6a3c4346427006d8a7b34b76 +size 25392 diff --git a/vendor/font-awesome/webfonts/fa-solid-900.ttf b/vendor/font-awesome/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5f81d9fbeb285964d13edac24f293731e1c2e056 --- /dev/null +++ b/vendor/font-awesome/webfonts/fa-solid-900.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4990d0d0c5f5d38d62e936eea120674e584c7eea8dcee38a975c0cf9a37539b +size 420332 diff --git a/vendor/font-awesome/webfonts/fa-solid-900.woff2 b/vendor/font-awesome/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c0b8781ba358123501b24e0257731f76250ba959 --- /dev/null +++ b/vendor/font-awesome/webfonts/fa-solid-900.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae17c16afbea216707b2203ea1cf9bdb45b9bfe47d0f4ae3258ddbc6294dd02f +size 156400 diff --git a/vendor/font-awesome/webfonts/fa-v4compatibility.ttf b/vendor/font-awesome/webfonts/fa-v4compatibility.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5351d809716b67b67d8bdd6113ffcc1c250e4c85 --- /dev/null +++ b/vendor/font-awesome/webfonts/fa-v4compatibility.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff8f525fb050c5d24519ccc8f5723d85b2e51edd3f9bc6548af55aebadd4f269 +size 10832 diff --git a/vendor/font-awesome/webfonts/fa-v4compatibility.woff2 b/vendor/font-awesome/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e4f6366595a6fd8fcac26d542887728a8749000f --- /dev/null +++ b/vendor/font-awesome/webfonts/fa-v4compatibility.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7a869faca299d15be10a01f19d0765a7c4d46d8922d9b9317235c1e4a6f0982 +size 4792 diff --git a/vendor/idiomorph/idiomorph.min.js b/vendor/idiomorph/idiomorph.min.js new file mode 100644 index 0000000000000000000000000000000000000000..e807c19b0566c9cf997898a1491b566a51c086f4 --- /dev/null +++ b/vendor/idiomorph/idiomorph.min.js @@ -0,0 +1 @@ +var Idiomorph=function(){"use strict";let o=new Set;let n={morphStyle:"outerHTML",callbacks:{beforeNodeAdded:t,afterNodeAdded:t,beforeNodeMorphed:t,afterNodeMorphed:t,beforeNodeRemoved:t,afterNodeRemoved:t,beforeAttributeUpdated:t},head:{style:"merge",shouldPreserve:function(e){return e.getAttribute("im-preserve")==="true"},shouldReAppend:function(e){return e.getAttribute("im-re-append")==="true"},shouldRemove:t,afterHeadMorphed:t}};function e(e,t,n={}){if(e instanceof Document){e=e.documentElement}if(typeof t==="string"){t=k(t)}let l=y(t);let r=p(e,l,n);return a(e,l,r)}function a(r,i,o){if(o.head.block){let t=r.querySelector("head");let n=i.querySelector("head");if(t&&n){let e=c(n,t,o);Promise.all(e).then(function(){a(r,i,Object.assign(o,{head:{block:false,ignore:true}}))});return}}if(o.morphStyle==="innerHTML"){l(i,r,o);return r.children}else if(o.morphStyle==="outerHTML"||o.morphStyle==null){let e=M(i,r,o);let t=e?.previousSibling;let n=e?.nextSibling;let l=d(r,e,o);if(e){return N(t,l,n)}else{return[]}}else{throw"Do not understand how to morph style "+o.morphStyle}}function u(e,t){return t.ignoreActiveValue&&e===document.activeElement}function d(e,t,n){if(n.ignoreActive&&e===document.activeElement){}else if(t==null){if(n.callbacks.beforeNodeRemoved(e)===false)return e;e.remove();n.callbacks.afterNodeRemoved(e);return null}else if(!g(e,t)){if(n.callbacks.beforeNodeRemoved(e)===false)return e;if(n.callbacks.beforeNodeAdded(t)===false)return e;e.parentElement.replaceChild(t,e);n.callbacks.afterNodeAdded(t);n.callbacks.afterNodeRemoved(e);return t}else{if(n.callbacks.beforeNodeMorphed(e,t)===false)return e;if(e instanceof HTMLHeadElement&&n.head.ignore){}else if(e instanceof HTMLHeadElement&&n.head.style!=="morph"){c(t,e,n)}else{r(t,e,n);if(!u(e,n)){l(t,e,n)}}n.callbacks.afterNodeMorphed(e,t);return e}}function l(n,l,r){let i=n.firstChild;let o=l.firstChild;let a;while(i){a=i;i=a.nextSibling;if(o==null){if(r.callbacks.beforeNodeAdded(a)===false)return;l.appendChild(a);r.callbacks.afterNodeAdded(a);H(r,a);continue}if(b(a,o,r)){d(o,a,r);o=o.nextSibling;H(r,a);continue}let e=A(n,l,a,o,r);if(e){o=v(o,e,r);d(e,a,r);H(r,a);continue}let t=S(n,l,a,o,r);if(t){o=v(o,t,r);d(t,a,r);H(r,a);continue}if(r.callbacks.beforeNodeAdded(a)===false)return;l.insertBefore(a,o);r.callbacks.afterNodeAdded(a);H(r,a)}while(o!==null){let e=o;o=o.nextSibling;T(e,r)}}function f(e,t,n,l){if(e==="value"&&l.ignoreActiveValue&&t===document.activeElement){return true}return l.callbacks.beforeAttributeUpdated(e,t,n)===false}function r(t,n,l){let e=t.nodeType;if(e===1){const r=t.attributes;const i=n.attributes;for(const o of r){if(f(o.name,n,"update",l)){continue}if(n.getAttribute(o.name)!==o.value){n.setAttribute(o.name,o.value)}}for(let e=i.length-1;0<=e;e--){const a=i[e];if(f(a.name,n,"remove",l)){continue}if(!t.hasAttribute(a.name)){n.removeAttribute(a.name)}}}if(e===8||e===3){if(n.nodeValue!==t.nodeValue){n.nodeValue=t.nodeValue}}if(!u(n,l)){s(t,n,l)}}function i(t,n,l,r){if(t[l]!==n[l]){let e=f(l,n,"update",r);if(!e){n[l]=t[l]}if(t[l]){if(!e){n.setAttribute(l,t[l])}}else{if(!f(l,n,"remove",r)){n.removeAttribute(l)}}}}function s(n,l,r){if(n instanceof HTMLInputElement&&l instanceof HTMLInputElement&&n.type!=="file"){let e=n.value;let t=l.value;i(n,l,"checked",r);i(n,l,"disabled",r);if(!n.hasAttribute("value")){if(!f("value",l,"remove",r)){l.value="";l.removeAttribute("value")}}else if(e!==t){if(!f("value",l,"update",r)){l.setAttribute("value",e);l.value=e}}}else if(n instanceof HTMLOptionElement){i(n,l,"selected",r)}else if(n instanceof HTMLTextAreaElement&&l instanceof HTMLTextAreaElement){let e=n.value;let t=l.value;if(f("value",l,"update",r)){return}if(e!==t){l.value=e}if(l.firstChild&&l.firstChild.nodeValue!==e){l.firstChild.nodeValue=e}}}function c(e,t,l){let r=[];let i=[];let o=[];let a=[];let u=l.head.style;let d=new Map;for(const n of e.children){d.set(n.outerHTML,n)}for(const s of t.children){let e=d.has(s.outerHTML);let t=l.head.shouldReAppend(s);let n=l.head.shouldPreserve(s);if(e||n){if(t){i.push(s)}else{d.delete(s.outerHTML);o.push(s)}}else{if(u==="append"){if(t){i.push(s);a.push(s)}}else{if(l.head.shouldRemove(s)!==false){i.push(s)}}}}a.push(...d.values());m("to append: ",a);let f=[];for(const c of a){m("adding: ",c);let n=document.createRange().createContextualFragment(c.outerHTML).firstChild;m(n);if(l.callbacks.beforeNodeAdded(n)!==false){if(n.href||n.src){let t=null;let e=new Promise(function(e){t=e});n.addEventListener("load",function(){t()});f.push(e)}t.appendChild(n);l.callbacks.afterNodeAdded(n);r.push(n)}}for(const h of i){if(l.callbacks.beforeNodeRemoved(h)!==false){t.removeChild(h);l.callbacks.afterNodeRemoved(h)}}l.head.afterHeadMorphed(t,{added:r,kept:o,removed:i});return f}function m(){}function t(){}function h(e){let t={};Object.assign(t,n);Object.assign(t,e);t.callbacks={};Object.assign(t.callbacks,n.callbacks);Object.assign(t.callbacks,e.callbacks);t.head={};Object.assign(t.head,n.head);Object.assign(t.head,e.head);return t}function p(e,t,n){n=h(n);return{target:e,newContent:t,config:n,morphStyle:n.morphStyle,ignoreActive:n.ignoreActive,ignoreActiveValue:n.ignoreActiveValue,idMap:C(e,t),deadIds:new Set,callbacks:n.callbacks,head:n.head}}function b(e,t,n){if(e==null||t==null){return false}if(e.nodeType===t.nodeType&&e.tagName===t.tagName){if(e.id!==""&&e.id===t.id){return true}else{return L(n,e,t)>0}}return false}function g(e,t){if(e==null||t==null){return false}return e.nodeType===t.nodeType&&e.tagName===t.tagName}function v(t,e,n){while(t!==e){let e=t;t=t.nextSibling;T(e,n)}H(n,e);return e.nextSibling}function A(n,e,l,r,i){let o=L(i,l,e);let t=null;if(o>0){let e=r;let t=0;while(e!=null){if(b(l,e,i)){return e}t+=L(i,e,n);if(t>o){return null}e=e.nextSibling}}return t}function S(e,t,n,l,r){let i=l;let o=n.nextSibling;let a=0;while(i!=null){if(L(r,i,e)>0){return null}if(g(n,i)){return i}if(g(o,i)){a++;o=o.nextSibling;if(a>=2){return null}}i=i.nextSibling}return i}function k(n){let l=new DOMParser;let e=n.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,"");if(e.match(/<\/html>/)||e.match(/<\/head>/)||e.match(/<\/body>/)){let t=l.parseFromString(n,"text/html");if(e.match(/<\/html>/)){t.generatedByIdiomorph=true;return t}else{let e=t.firstChild;if(e){e.generatedByIdiomorph=true;return e}else{return null}}}else{let e=l.parseFromString("","text/html");let t=e.body.querySelector("template").content;t.generatedByIdiomorph=true;return t}}function y(e){if(e==null){const t=document.createElement("div");return t}else if(e.generatedByIdiomorph){return e}else if(e instanceof Node){const t=document.createElement("div");t.append(e);return t}else{const t=document.createElement("div");for(const n of[...e]){t.append(n)}return t}}function N(e,t,n){let l=[];let r=[];while(e!=null){l.push(e);e=e.previousSibling}while(l.length>0){let e=l.pop();r.push(e);t.parentElement.insertBefore(e,t)}r.push(t);while(n!=null){l.push(n);r.push(n);n=n.nextSibling}while(l.length>0){t.parentElement.insertBefore(l.pop(),t.nextSibling)}return r}function M(e,t,n){let l;l=e.firstChild;let r=l;let i=0;while(l){let e=w(l,t,n);if(e>i){r=l;i=e}l=l.nextSibling}return r}function w(e,t,n){if(g(e,t)){return.5+L(n,e,t)}return 0}function T(e,t){H(t,e);if(t.callbacks.beforeNodeRemoved(e)===false)return;e.remove();t.callbacks.afterNodeRemoved(e)}function E(e,t){return!e.deadIds.has(t)}function x(e,t,n){let l=e.idMap.get(n)||o;return l.has(t)}function H(e,t){let n=e.idMap.get(t)||o;for(const l of n){e.deadIds.add(l)}}function L(e,t,n){let l=e.idMap.get(t)||o;let r=0;for(const i of l){if(E(e,i)&&x(e,i,n)){++r}}return r}function R(e,n){let l=e.parentElement;let t=e.querySelectorAll("[id]");for(const r of t){let t=r;while(t!==l&&t!=null){let e=n.get(t);if(e==null){e=new Set;n.set(t,e)}e.add(r.id);t=t.parentElement}}}function C(e,t){let n=new Map;R(e,n);R(t,n);return n}return{morph:e,defaults:n}}(); \ No newline at end of file diff --git a/vendor/onnxruntime-web/ort-wasm-simd-threaded.asyncify.mjs b/vendor/onnxruntime-web/ort-wasm-simd-threaded.asyncify.mjs new file mode 100644 index 0000000000000000000000000000000000000000..bfb9ac1328505f87db4f9b59e484b05c92b05479 --- /dev/null +++ b/vendor/onnxruntime-web/ort-wasm-simd-threaded.asyncify.mjs @@ -0,0 +1,116 @@ +async function ortWasmThreaded(moduleArg={}){var moduleRtn;var g=moduleArg,aa=!!globalThis.window,ba=!!globalThis.WorkerGlobalScope,l=globalThis.process?.versions?.node&&"renderer"!=globalThis.process?.type,n=ba&&self.name?.startsWith("em-pthread");if(l){const {createRequire:a}=await import("module");var require=a(import.meta.url),ca=require("worker_threads");global.Worker=ca.Worker;n=(ba=!ca.Je)&&"em-pthread"==ca.workerData}g.mountExternalData=(a,b)=>{a.startsWith("./")&&(a=a.substring(2));(g.Zc||(g.Zc=new Map)).set(a,b)}; +g.unmountExternalData=()=>{delete g.Zc};var SharedArrayBuffer=globalThis.SharedArrayBuffer??(new WebAssembly.Memory({initial:0,maximum:0,Me:!0})).buffer.constructor; +let ea=()=>{const a=b=>(...c)=>{const d=r;c=b(...c);return r!=d?da():c};(b=>{for(const c of b)g[c]=a(g[c])})(["_OrtAppendExecutionProvider","_OrtCreateSession","_OrtRun","_OrtRunWithBinding","_OrtBindInput"]);"undefined"!==typeof jsepRunAsync&&(g._OrtRun=jsepRunAsync(g._OrtRun),g._OrtRunWithBinding=jsepRunAsync(g._OrtRunWithBinding));ea=void 0};g.asyncInit=()=>{ea?.()};var fa="./this.program",ha=(a,b)=>{throw b;},ia=import.meta.url,ja="",ka,la; +if(l){var fs=require("fs");ia.startsWith("file:")&&(ja=require("path").dirname(require("url").fileURLToPath(ia))+"/");la=a=>{a=ma(a)?new URL(a):a;return fs.readFileSync(a)};ka=async a=>{a=ma(a)?new URL(a):a;return fs.readFileSync(a,void 0)};1{process.exitCode=a;throw b;}}else if(aa||ba){try{ja=(new URL(".",ia)).href}catch{}l||(ba&&(la=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer"; +b.send(null);return new Uint8Array(b.response)}),ka=async a=>{if(ma(a))return new Promise((c,d)=>{var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=()=>{200==e.status||0==e.status&&e.response?c(e.response):d(e.status)};e.onerror=d;e.send(null)});var b=await fetch(a,{credentials:"same-origin"});if(b.ok)return b.arrayBuffer();throw Error(b.status+" : "+b.url);})}var na=console.log.bind(console),oa=console.error.bind(console); +if(l){var pa=require("util"),qa=a=>"object"==typeof a?pa.inspect(a):a;na=(...a)=>fs.writeSync(1,a.map(qa).join(" ")+"\n");oa=(...a)=>fs.writeSync(2,a.map(qa).join(" ")+"\n")}var ra=na,t=oa,sa,ta,ua=!1,va,ma=a=>a.startsWith("file://");function u(){v.buffer!=w.buffer&&wa()}var xa,ya; +if(l&&n){var Aa=ca.parentPort;Aa.on("message",a=>global.onmessage?.({data:a}));Object.assign(globalThis,{self:global,postMessage:a=>Aa.postMessage(a)});process.on("uncaughtException",a=>{postMessage({Uc:"uncaughtException",error:a});process.exit(1)})}var Ba; +if(n){var Ca=!1;self.onunhandledrejection=b=>{throw b.reason||b;};function a(b){try{var c=b.data,d=c.Uc;if("load"===d){let e=[];self.onmessage=f=>e.push(f);Ba=()=>{postMessage({Uc:"loaded"});for(let f of e)a(f);self.onmessage=a};for(const f of c.ne)if(!g[f]||g[f].proxy)g[f]=(...h)=>{postMessage({Uc:"callHandler",me:f,args:h})},"print"==f&&(ra=g[f]),"printErr"==f&&(t=g[f]);v=c.we;wa();ta=c.xe;Da();Ea()}else if("run"===d){Fa(c.Sc);Ga(c.Sc,0,0,1,0,0);Ha();Ia(c.Sc);Ca||(Ja(),Ca=!0);try{Ka(c.te,c.ad)}catch(e){if("unwind"!= +e)throw e;}}else"setimmediate"!==c.target&&("checkMailbox"===d?Ca&&La():d&&(t(`worker: received unknown command ${d}`),t(c)))}catch(e){throw Ma(),e;}}self.onmessage=a}var w,x,Na,Oa,B,C,Pa,E,F,Qa,Ra=!1;function wa(){var a=v.buffer;g.HEAP8=w=new Int8Array(a);Na=new Int16Array(a);g.HEAPU8=x=new Uint8Array(a);Oa=new Uint16Array(a);g.HEAP32=B=new Int32Array(a);g.HEAPU32=C=new Uint32Array(a);Pa=new Float32Array(a);E=new Float64Array(a);F=new BigInt64Array(a);Qa=new BigUint64Array(a)} +function Sa(){Ra=!0;n?Ba():G.dc()}function H(a){a="Aborted("+a+")";t(a);ua=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");ya?.(a);throw a;}var Ta;async function Ua(a){if(!sa)try{var b=await ka(a);return new Uint8Array(b)}catch{}if(a==Ta&&sa)a=new Uint8Array(sa);else if(la)a=la(a);else throw"both async and sync fetching of the wasm failed";return a} +async function Va(a,b){try{var c=await Ua(a);return await WebAssembly.instantiate(c,b)}catch(d){t(`failed to asynchronously prepare wasm: ${d}`),H(d)}}async function Wa(a){var b=Ta;if(!sa&&!ma(b)&&!l)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){t(`wasm streaming compile failed: ${d}`),t("falling back to ArrayBuffer instantiation")}return Va(b,a)} +function Xa(){Ya={sa:Za,g:$a,K:ab,f:bb,n:cb,h:db,wa:eb,b:fb,ea:gb,Ja:hb,p:ib,fa:jb,Za:kb,$b:lb,bc:mb,_a:nb,Xa:ob,Qa:pb,Wa:qb,qa:rb,ac:sb,Zb:tb,Ya:ub,_b:vb,db:wb,Fa:xb,Ub:yb,Sb:zb,Ea:Ab,P:Cb,I:Db,Tb:Fb,ma:Gb,Vb:Hb,Ta:Ib,Xb:Jb,Ka:Kb,Pb:Lb,Ha:Mb,Sa:Ia,ab:Nb,W:Ob,r:Pb,c:Qb,tb:Rb,y:Sb,N:Tb,D:Ub,m:Vb,t:Wb,ub:Xb,J:Yb,V:Zb,j:$b,u:ac,q:bc,l:cc,Na:dc,Oa:ec,Pa:fc,La:gc,Ma:hc,Rb:ic,fb:jc,cb:kc,$:lc,sb:mc,na:nc,bb:oc,Y:pc,$a:qc,Yb:rc,G:sc,ib:tc,_:uc,ra:vc,Wb:wc,hb:xc,gb:yc,pb:zc,E:Ac,va:Bc,ua:Cc,rb:Dc,Z:Ec,w:Fc, +ob:Gc,nb:Hc,mb:Ic,qb:Jc,lb:Kc,kb:Lc,jb:Mc,Ua:Nc,Va:Oc,Ia:Pc,ga:Qc,pa:Rc,Ra:Sc,oa:Tc,Eb:Uc,za:Vc,Fb:Wc,Aa:Xc,H:Yc,e:Zc,s:$c,x:ad,B:bd,Ib:cd,L:dd,v:ed,Ba:fd,ca:gd,ja:hd,Gb:jd,Hb:kd,Da:ld,Ca:md,Kb:nd,O:od,da:pd,d:qd,A:rd,k:sd,Db:td,o:ud,z:vd,C:wd,F:xd,M:yd,Lb:zd,U:Ad,ka:Bd,ba:Cd,Mb:Dd,Nb:Ed,R:Fd,i:Gd,a:v,eb:Hd,Jb:Id,la:Jd,Q:Kd,ta:Ld,Ob:Md,S:Nd,Ab:Od,Bb:Pd,xa:Qd,ha:Rd,T:Sd,Ga:Td,ya:Ud,aa:Vd,yb:Wd,cc:Xd,X:Yd,Cb:Zd,vb:$d,wb:ae,xb:be,ia:ce,zb:de,Qb:ee};return{a:Ya}} +async function Da(){function a(d,e){var f=G=d.exports;d={};for(let [h,k]of Object.entries(f))"function"==typeof k?(f=fe(k),d[h]=f):d[h]=k;G=d;G=ge();he.push(G.md);d=G;ie=d.ec;Ja=d.fc;g._OrtInit=d.gc;g._OrtGetLastError=d.hc;g._OrtCreateSessionOptions=d.ic;g._OrtAppendExecutionProvider=d.jc;g._OrtAddFreeDimensionOverride=d.kc;g._OrtAddSessionConfigEntry=d.lc;g._OrtReleaseSessionOptions=d.mc;g._OrtCreateSession=d.nc;g._OrtReleaseSession=d.oc;g._OrtGetInputOutputCount=d.pc;g._OrtGetInputOutputMetadata= +d.qc;g._OrtFree=d.rc;g._OrtCreateTensor=d.sc;g._OrtGetTensorData=d.tc;g._OrtReleaseTensor=d.uc;g._OrtCreateRunOptions=d.vc;g._OrtAddRunConfigEntry=d.wc;g._OrtReleaseRunOptions=d.xc;g._OrtCreateBinding=d.yc;g._OrtBindInput=d.zc;g._OrtBindOutput=d.Ac;g._OrtClearBoundOutputs=d.Bc;g._OrtReleaseBinding=d.Cc;g._OrtRunWithBinding=d.Dc;g._OrtRun=d.Ec;g._OrtEndProfiling=d.Fc;je=g._OrtGetWebGpuDevice=d.Gc;ke=d.Hc;I=g._free=d.Ic;le=g._malloc=d.Jc;me=g._wgpuBufferRelease=d.Kc;ne=g._wgpuCreateInstance=d.Lc;oe= +d.Mc;pe=d.Nc;qe=d.Oc;re=d.Pc;se=d.Qc;te=d.Tc;ue=d.bd;ve=d.cd;we=d.dd;xe=d.fd;ye=d.gd;ze=d.hd;Ae=d.id;Be=d.jd;Ce=d.kd;De=d.ld;Ga=d.od;Ma=d.pd;Ee=d.qd;Fe=d.rd;Ge=d.sd;He=d.td;Ie=d.ud;Je=d.vd;J=d.wd;Ke=d.xd;Le=d.yd;K=d.zd;Me=d.Ad;L=d.Bd;Ne=d.Cd;Oe=d.Dd;Pe=d.Ed;Qe=d.Fd;dynCall_vii=d.Gd;Re=d.Hd;dynCall_v=d.Id;Se=d.Jd;Te=d.Kd;Ue=d.Ld;dynCall_iii=d.Md;Ve=d.Nd;We=d.Od;Xe=d.Pd;dynCall_vi=d.Qd;Ye=d.Rd;Ze=d.Sd;$e=d.Td;af=d.Ud;bf=d.Vd;cf=d.Wd;df=d.Yd;ef=d.Zd;ff=d._d;gf=d.$d;hf=d.be;jf=d.ce;kf=d.de;lf=d.ee;mf= +d.fe;nf=d.ge;of=d.qe;pf=d.ve;qf=d.ye;rf=d.ze;sf=d.Ae;tf=d.Be;uf=d.Ce;vf=d.De;wf=d.Ee;xf=d.Fe;yf=d.Ge;zf=d.ef;Af=d.ff;Bf=d.gf;Cf=d.hf;ta=e;return G}var b=Xa();if(g.instantiateWasm)return new Promise(d=>{g.instantiateWasm(b,(e,f)=>{d(a(e,f))})});if(n){var c=new WebAssembly.Instance(ta,Xa());return a(c,ta)}Ta??=g.locateFile?g.locateFile?g.locateFile("ort-wasm-simd-threaded.asyncify.wasm",ja):ja+"ort-wasm-simd-threaded.asyncify.wasm":(new URL("ort-wasm-simd-threaded.asyncify.wasm",import.meta.url)).href; +return function(d){return a(d.instance,d.module)}(await Wa(b))}class Df{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}} +var Ef=a=>{a.terminate();a.onmessage=()=>{}},Ff=[],Gf=0,Hf=null,Nf=a=>{0==If.length&&(Jf(),Kf(If[0]));var b=If.pop();if(!b)return 6;Lf.push(b);Mf[a.Sc]=b;b.Sc=a.Sc;var c={Uc:"run",te:a.se,ad:a.ad,Sc:a.Sc};l&&b.unref();b.postMessage(c,a.he);return 0},M=0,N=(a,b,...c)=>{var d=16*c.length,e=L(),f=Me(d),h=f>>>3,k;for(k of c)"bigint"==typeof k?((u(),F)[h++>>>0]=1n,(u(),F)[h++>>>0]=k):((u(),F)[h++>>>0]=0n,(u(),E)[h++>>>0]=k);a=Ee(a,0,d,f,b);K(e);return a}; +function Hd(a){if(n)return N(0,1,a);va=a;if(!(0{va=a;if(n)throw Of(a),"unwind";Hd(a)},If=[],Lf=[],he=[],Mf={};function Pf(){for(var a=g.numThreads-1;a--;)Jf();Ff.push(async()=>{var b=Qf();Gf++;await b;Gf--;0==Gf&&Hf&&(b=Hf,Hf=null,b())})}var Rf=a=>{var b=a.Sc;delete Mf[b];If.push(a);Lf.splice(Lf.indexOf(a),1);a.Sc=0;Fe(b)};function Ha(){he.forEach(a=>a())} +var Kf=a=>new Promise(b=>{a.onmessage=f=>{var h=f.data;f=h.Uc;if(h.$c&&h.$c!=ke()){var k=Mf[h.$c];k?k.postMessage(h,h.he):t(`Internal error! Worker sent a message "${f}" to target pthread ${h.$c}, but that thread no longer exists!`)}else if("checkMailbox"===f)La();else if("spawnThread"===f)Nf(h);else if("cleanupThread"===f)Sf(()=>{Rf(Mf[h.ue])});else if("loaded"===f)a.loaded=!0,l&&!a.Sc&&a.unref(),b(a);else if("setimmediate"===h.target)a.postMessage(h);else if("uncaughtException"===f)a.onerror(h.error); +else if("callHandler"===f)g[h.me](...h.args);else f&&t(`worker sent an unknown command ${f}`)};a.onerror=f=>{t(`${"worker sent an error!"} ${f.filename}:${f.lineno}: ${f.message}`);throw f;};l&&(a.on("message",f=>a.onmessage({data:f})),a.on("error",f=>a.onerror(f)));var c=[],d=[],e;for(e of d)g.propertyIsEnumerable(e)&&c.push(e);a.postMessage({Uc:"load",ne:c,we:v,xe:ta})});async function Qf(){if(!n)return Promise.all(If.map(Kf))} +function Jf(){var a=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});If.push(a)}function Fa(a){var b=(u(),C)[a+52>>>2>>>0];a=(u(),C)[a+56>>>2>>>0];Le(b,b-a);K(b)}var Ka=(a,b)=>{M=0;a=Re(a,b);0-9007199254740992>a||9007199254740992>>=0;var b=new Vf(a);0==(u(),w)[b.Vc+12>>>0]&&(Wf(b,!0),Uf--);Xf(b,!1);Tf.push(b);return Qe(a)} +var Yf=0,ab=()=>{J(0,0);var a=Tf.pop();Ne(a.nd);Yf=0};function Wf(a,b){b=b?1:0;(u(),w)[a.Vc+12>>>0]=b}function Xf(a,b){b=b?1:0;(u(),w)[a.Vc+13>>>0]=b}class Vf{constructor(a){this.nd=a;this.Vc=a-24}}var Zf=a=>{var b=Yf;if(!b)return Ke(0),0;var c=new Vf(b);(u(),C)[c.Vc+16>>>2>>>0]=b;var d=(u(),C)[c.Vc+4>>>2>>>0];if(!d)return Ke(0),b;for(var e of a){if(0===e||e===d)break;if(Pe(e,d,c.Vc+16))return Ke(e),b}Ke(d);return b};function bb(){return Zf([])}function cb(a){return Zf([a>>>0])} +function db(a,b,c,d){return Zf([a>>>0,b>>>0,c>>>0,d>>>0])}var eb=()=>{var a=Tf.pop();a||H("no exception to throw");var b=a.nd;0==(u(),w)[a.Vc+13>>>0]&&(Tf.push(a),Xf(a,!0),Wf(a,!1),Uf++);Oe(b);Yf=b;throw Yf;};function fb(a,b,c){a>>>=0;var d=new Vf(a);b>>>=0;c>>>=0;(u(),C)[d.Vc+16>>>2>>>0]=0;(u(),C)[d.Vc+4>>>2>>>0]=b;(u(),C)[d.Vc+8>>>2>>>0]=c;Oe(a);Yf=a;Uf++;throw Yf;}var gb=()=>Uf;function $f(a,b,c,d){return n?N(2,1,a,b,c,d):hb(a,b,c,d)} +function hb(a,b,c,d){a>>>=0;b>>>=0;c>>>=0;d>>>=0;if(!globalThis.SharedArrayBuffer)return 6;var e=[];if(n&&0===e.length)return $f(a,b,c,d);a={se:c,Sc:a,ad:d,he:e};return n?(a.Uc="spawnThread",postMessage(a,e),0):Nf(a)}function ib(a){Yf||=a>>>0;throw Yf;} +var ag=globalThis.TextDecoder&&new TextDecoder,bg=(a,b,c,d)=>{c=b+c;if(d)return c;for(;a[b]&&!(b>=c);)++b;return b},cg=(a,b=0,c,d)=>{b>>>=0;c=bg(a,b,c,d);if(16e?d+=String.fromCharCode(e):(e-=65536,d+=String.fromCharCode(55296| +e>>10,56320|e&1023))}}else d+=String.fromCharCode(e)}return d},dg=(a,b,c)=>(a>>>=0)?cg((u(),x),a,b,c):"";function jb(a,b,c){return n?N(3,1,a,b,c):0}function kb(a,b){if(n)return N(4,1,a,b)}function lb(a,b){if(n)return N(5,1,a,b)}function mb(a,b,c){if(n)return N(6,1,a,b,c)}function nb(a,b,c){return n?N(7,1,a,b,c):0}function ob(a,b){if(n)return N(8,1,a,b)}function pb(a,b,c){if(n)return N(9,1,a,b,c)}function qb(a,b,c,d){if(n)return N(10,1,a,b,c,d)}function rb(a,b,c,d){if(n)return N(11,1,a,b,c,d)} +function sb(a,b,c,d){if(n)return N(12,1,a,b,c,d)}function tb(a){if(n)return N(13,1,a)}function ub(a,b){if(n)return N(14,1,a,b)}function vb(a,b,c){if(n)return N(15,1,a,b,c)}var wb=()=>H(""),P=a=>{a>>>=0;for(var b="";;){var c=(u(),x)[a++>>>0];if(!c)return b;b+=String.fromCharCode(c)}},eg={},fg={},gg={},hg=class extends Error{constructor(a){super(a);this.name="BindingError"}}; +function ig(a,b,c={}){var d=b.name;if(!a)throw new hg(`type "${d}" must have a positive integer typeid pointer`);if(fg.hasOwnProperty(a)){if(c.oe)return;throw new hg(`Cannot register type '${d}' twice`);}fg[a]=b;delete gg[a];eg.hasOwnProperty(a)&&(b=eg[a],delete eg[a],b.forEach(e=>e()))}function Q(a,b,c={}){return ig(a,b,c)} +var jg=(a,b,c)=>{switch(b){case 1:return c?d=>(u(),w)[d>>>0]:d=>(u(),x)[d>>>0];case 2:return c?d=>(u(),Na)[d>>>1>>>0]:d=>(u(),Oa)[d>>>1>>>0];case 4:return c?d=>(u(),B)[d>>>2>>>0]:d=>(u(),C)[d>>>2>>>0];case 8:return c?d=>(u(),F)[d>>>3>>>0]:d=>(u(),Qa)[d>>>3>>>0];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}}; +function xb(a,b,c,d,e){a>>>=0;c>>>=0;b=P(b>>>0);d=0n===d;let f=h=>h;if(d){const h=8*c;f=k=>BigInt.asUintN(h,k);e=f(e)}Q(a,{name:b,Rc:f,Xc:(h,k)=>{"number"==typeof k&&(k=BigInt(k));return k},Wc:jg(b,c,!d),Yc:null})}function yb(a,b,c,d){a>>>=0;b=P(b>>>0);Q(a,{name:b,Rc:function(e){return!!e},Xc:function(e,f){return f?c:d},Wc:function(e){return this.Rc((u(),x)[e>>>0])},Yc:null})}var kg=[],lg=[0,1,,1,null,1,!0,1,!1,1];function Qb(a){a>>>=0;9{if(!a)throw new hg(`Cannot use deleted val. handle = ${a}`);return lg[a]},S=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=kg.pop()||lg.length;lg[b]=a;lg[b+1]=1;return b}};function mg(a){return this.Rc((u(),C)[a>>>2>>>0])}var ng={name:"emscripten::val",Rc:a=>{var b=R(a);Qb(a);return b},Xc:(a,b)=>S(b),Wc:mg,Yc:null};function zb(a){return Q(a>>>0,ng)} +var og=(a,b)=>{switch(b){case 4:return function(c){return this.Rc((u(),Pa)[c>>>2>>>0])};case 8:return function(c){return this.Rc((u(),E)[c>>>3>>>0])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}};function Ab(a,b,c){a>>>=0;c>>>=0;b=P(b>>>0);Q(a,{name:b,Rc:d=>d,Xc:(d,e)=>e,Wc:og(b,c),Yc:null})}function Cb(a,b,c,d,e){a>>>=0;c>>>=0;b=P(b>>>0);let f=k=>k;if(0===d){var h=32-8*c;f=k=>k<>>h;e=f(e)}Q(a,{name:b,Rc:f,Xc:(k,m)=>m,Wc:jg(b,c,0!==d),Yc:null})} +function Db(a,b,c){function d(f){var h=(u(),C)[f>>>2>>>0];f=(u(),C)[f+4>>>2>>>0];return new e((u(),w).buffer,f,h)}a>>>=0;var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][b];c=P(c>>>0);Q(a,{name:c,Rc:d,Wc:d},{oe:!0})} +var T=(a,b,c)=>{var d=(u(),x);b>>>=0;if(0=h){if(b>=c)break;d[b++>>>0]=h}else if(2047>=h){if(b+1>=c)break;d[b++>>>0]=192|h>>6;d[b++>>>0]=128|h&63}else if(65535>=h){if(b+2>=c)break;d[b++>>>0]=224|h>>12;d[b++>>>0]=128|h>>6&63;d[b++>>>0]=128|h&63}else{if(b+3>=c)break;d[b++>>>0]=240|h>>18;d[b++>>>0]=128|h>>12&63;d[b++>>>0]=128|h>>6&63;d[b++>>>0]=128|h&63;f++}}d[b>>>0]=0;a=b-e}else a=0;return a},U=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}return b}; +function Fb(a,b){a>>>=0;b=P(b>>>0);Q(a,{name:b,Rc(c){var d=(u(),C)[c>>>2>>>0];d=dg(c+4,d,!0);I(c);return d},Xc(c,d){d instanceof ArrayBuffer&&(d=new Uint8Array(d));var e="string"==typeof d;if(!(e||ArrayBuffer.isView(d)&&1==d.BYTES_PER_ELEMENT))throw new hg("Cannot pass non-string to std::string");var f=e?U(d):d.length;var h=le(4+f+1),k=h+4;(u(),C)[h>>>2>>>0]=f;e?T(d,k,f+1):(u(),x).set(d,k>>>0);null!==c&&c.push(I,h);return h},Wc:mg,Yc(c){I(c)}})} +var pg=globalThis.TextDecoder?new TextDecoder("utf-16le"):void 0,qg=(a,b,c)=>{a>>>=1;b=bg((u(),Oa),a,b/2,c);if(16>>0];c+=String.fromCharCode(d)}return c},rg=(a,b,c)=>{c??=2147483647;if(2>c)return 0;c-=2;var d=b;c=c<2*a.length?c/2:a.length;for(var e=0;e>>1>>>0]=f;b+=2}(u(),Na)[b>>>1>>>0]=0;return b-d},sg=a=>2*a.length,tg=(a,b,c)=>{var d="";a>>>=2;for(var e=0;!(e>=b/4);e++){var f= +(u(),C)[a+e>>>0];if(!f&&!c)break;d+=String.fromCodePoint(f)}return d},ug=(a,b,c)=>{b>>>=0;c??=2147483647;if(4>c)return 0;var d=b;c=d+c-4;for(var e=0;e>>2>>>0]=f;b+=4;if(b+4>c)break}(u(),B)[b>>>2>>>0]=0;return b-d},vg=a=>{for(var b=0,c=0;c>>=0;b>>>=0;c>>>=0;c=P(c);if(2===b){var d=qg;var e=rg;var f=sg}else d=tg,e=ug,f=vg;Q(a,{name:c,Rc:h=>{var k=(u(),C)[h>>>2>>>0];k=d(h+4,k*b,!0);I(h);return k},Xc:(h,k)=>{if("string"!=typeof k)throw new hg(`Cannot pass non-string to C++ string type ${c}`);var m=f(k),p=le(4+m+b);(u(),C)[p>>>2>>>0]=m/b;e(k,p+4,m+b);null!==h&&h.push(I,p);return p},Wc:mg,Yc(h){I(h)}})}function Hb(a,b){a>>>=0;b=P(b>>>0);Q(a,{pe:!0,name:b,Rc:()=>{},Xc:()=>{}})} +function Ib(a){Ga(a>>>0,!ba,1,!aa,131072,!1);Ha()}var Sf=a=>{if(!ua)try{if(a(),!(0Number((navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)||[])[2]);function Ia(a){a>>>=0;wg||(Atomics.waitAsync((u(),B),a>>>2,a).value.then(La),a+=128,Atomics.store((u(),B),a>>>2,1))}var La=()=>Sf(()=>{var a=ke();a&&(Ia(a),Ie())}); +function Jb(a,b){a>>>=0;a==b>>>0?setTimeout(La):n?postMessage({$c:a,Uc:"checkMailbox"}):(a=Mf[a])&&a.postMessage({Uc:"checkMailbox"})}var xg=[];function Kb(a,b,c,d,e){b>>>=0;e>>>=0;xg.length=0;c=e>>>3;for(d=e+d>>>3;c>>0]?f=(u(),F)[c++>>>0]:f=(u(),E)[c++>>>0];xg.push(f)}return(b?yg[b]:zg[a])(...xg)}var Lb=()=>{M=0};function Mb(a){a>>>=0;n?postMessage({Uc:"cleanupThread",ue:a}):Rf(Mf[a])}function Nb(a){l&&Mf[a>>>0].ref()}var Ag=a=>{try{a()}catch(b){H(b)}}; +function fe(a){var b=(...c)=>{Bg.push(a);try{return a(...c)}finally{ua||(Bg.pop(),r&&1===Cg&&0===Bg.length&&(Cg=0,M+=1,Ag(Af),"undefined"!=typeof Fibers&&Fibers.Oe()))}};Dg.set(a,b);return b}var Cg=0,r=null,Eg=0,Bg=[],Fg=new Map,Gg=new Map,Dg=new Map,Hg=0,Ig=null,Jg=[];function da(){return new Promise((a,b)=>{Ig={resolve:a,reject:b}})} +function Kg(){var a=le(65548),b=a+12;(u(),C)[a>>>2>>>0]=b;(u(),C)[a+4>>>2>>>0]=b+65536;b=Bg[0];if(!Fg.has(b)){var c=Hg++;Fg.set(b,c);Gg.set(c,b)}b=Fg.get(b);(u(),B)[a+8>>>2>>>0]=b;return a}function Lg(){var a=(u(),B)[r+8>>>2>>>0];a=Gg.get(a);a=Dg.get(a);--M;return a()} +function Mg(a){if(!ua){if(0===Cg){var b=!1,c=!1;a((d=0)=>{if(!ua&&(Eg=d,b=!0,c)){Cg=2;Ag(()=>Bf(r));"undefined"!=typeof MainLoop&&MainLoop.le&&MainLoop.resume();d=!1;try{var e=Lg()}catch(k){e=k,d=!0}var f=!1;if(!r){var h=Ig;h&&(Ig=null,(d?h.reject:h.resolve)(e),f=!0)}if(d&&!f)throw e;}});c=!0;b||(Cg=1,r=Kg(),"undefined"!=typeof MainLoop&&MainLoop.le&&MainLoop.pause(),Ag(()=>zf(r)))}else 2===Cg?(Cg=0,Ag(Cf),I(r),r=null,Jg.forEach(Sf)):H(`invalid state: ${Cg}`);return Eg}}var Ng=a=>Mg(b=>{a().then(b)}); +function Ob(a){a>>>=0;return Ng(async()=>{var b=await R(a);return S(b)})}var Og=[],Pg=a=>{var b=Og.length;Og.push(a);return b},Qg=(a,b)=>{for(var c=Array(a),d=0;d>>2>>>0],h=fg[f];if(void 0===h)throw a=`parameter ${d}`,f=ie(f),b=P(f),I(f),new hg(`${a} has unknown type ${b}`);c[e]=h}return c},Rg=(a,b,c)=>{var d=[];a=a(d,c);d.length&&((u(),C)[b>>>2>>>0]=S(d));return a},Sg={},Tg=a=>{var b=Sg[a];return void 0===b?P(a):b}; +function Pb(a,b,c){var [d,...e]=Qg(a,b>>>0);b=d.Xc.bind(d);var f=e.map(m=>m.Wc.bind(m));a--;var h={toValue:R};a=f.map((m,p)=>{var z=`argFromPtr${p}`;h[z]=m;return`${z}(args${p?"+"+8*p:""})`});switch(c){case 0:var k="toValue(handle)";break;case 2:k="new (toValue(handle))";break;case 3:k="";break;case 1:h.getStringOrSymbol=Tg,k="toValue(handle)[getStringOrSymbol(methodName)]"}k+=`(${a})`;d.pe||(h.toReturnWire=b,h.emval_returnValue=Rg,k=`return emval_returnValue(toReturnWire, destructorsRef, ${k})`); +k=`return function (handle, methodName, destructorsRef, args) {\n ${k}\n }`;c=(new Function(Object.keys(h),k))(...Object.values(h));k=`methodCaller<(${e.map(m=>m.name)}) => ${d.name}>`;return Pg(Object.defineProperty(c,"name",{value:k}))}function Rb(a,b){b>>>=0;a=R(a>>>0);b=R(b);return a==b}function Sb(a){a>>>=0;if(!a)return S(globalThis);a=Tg(a);return S(globalThis[a])}function Tb(a){a=Tg(a>>>0);return S(g[a])}function Ub(a,b){b>>>=0;a=R(a>>>0);b=R(b);return S(a[b])} +function Vb(a){a>>>=0;9>>0](b>>>0,c>>>0,d>>>0,e>>>0)}function Xb(a,b,c,d,e){return Wb(a>>>0,b>>>0,c>>>0,d>>>0,e>>>0)}function Yb(){return S([])}function Zb(a){a=R(a>>>0);for(var b=Array(a.length),c=0;c>>0))}function ac(){return S({})}function bc(a){a>>>=0;for(var b=R(a);b.length;){var c=b.pop();b.pop()(c)}Qb(a)}function cc(a,b,c){b>>>=0;c>>>=0;a=R(a>>>0);b=R(b);c=R(c);a[b]=c} +function dc(a,b){a=O(a);b>>>=0;a=new Date(1E3*a);(u(),B)[b>>>2>>>0]=a.getUTCSeconds();(u(),B)[b+4>>>2>>>0]=a.getUTCMinutes();(u(),B)[b+8>>>2>>>0]=a.getUTCHours();(u(),B)[b+12>>>2>>>0]=a.getUTCDate();(u(),B)[b+16>>>2>>>0]=a.getUTCMonth();(u(),B)[b+20>>>2>>>0]=a.getUTCFullYear()-1900;(u(),B)[b+24>>>2>>>0]=a.getUTCDay();a=(a.getTime()-Date.UTC(a.getUTCFullYear(),0,1,0,0,0,0))/864E5|0;(u(),B)[b+28>>>2>>>0]=a} +var Ug=a=>0===a%4&&(0!==a%100||0===a%400),Vg=[0,31,60,91,121,152,182,213,244,274,305,335],Wg=[0,31,59,90,120,151,181,212,243,273,304,334]; +function ec(a,b){a=O(a);b>>>=0;a=new Date(1E3*a);(u(),B)[b>>>2>>>0]=a.getSeconds();(u(),B)[b+4>>>2>>>0]=a.getMinutes();(u(),B)[b+8>>>2>>>0]=a.getHours();(u(),B)[b+12>>>2>>>0]=a.getDate();(u(),B)[b+16>>>2>>>0]=a.getMonth();(u(),B)[b+20>>>2>>>0]=a.getFullYear()-1900;(u(),B)[b+24>>>2>>>0]=a.getDay();var c=(Ug(a.getFullYear())?Vg:Wg)[a.getMonth()]+a.getDate()-1|0;(u(),B)[b+28>>>2>>>0]=c;(u(),B)[b+36>>>2>>>0]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();var d=(new Date(a.getFullYear(), +0,1)).getTimezoneOffset();a=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0;(u(),B)[b+32>>>2>>>0]=a} +function fc(a){a>>>=0;var b=new Date((u(),B)[a+20>>>2>>>0]+1900,(u(),B)[a+16>>>2>>>0],(u(),B)[a+12>>>2>>>0],(u(),B)[a+8>>>2>>>0],(u(),B)[a+4>>>2>>>0],(u(),B)[a>>>2>>>0],0),c=(u(),B)[a+32>>>2>>>0],d=b.getTimezoneOffset(),e=(new Date(b.getFullYear(),6,1)).getTimezoneOffset(),f=(new Date(b.getFullYear(),0,1)).getTimezoneOffset(),h=Math.min(f,e);0>c?(u(),B)[a+32>>>2>>>0]=Number(e!=f&&h==d):0>>2>>>0]=b.getDay();c=(Ug(b.getFullYear())? +Vg:Wg)[b.getMonth()]+b.getDate()-1|0;(u(),B)[a+28>>>2>>>0]=c;(u(),B)[a>>>2>>>0]=b.getSeconds();(u(),B)[a+4>>>2>>>0]=b.getMinutes();(u(),B)[a+8>>>2>>>0]=b.getHours();(u(),B)[a+12>>>2>>>0]=b.getDate();(u(),B)[a+16>>>2>>>0]=b.getMonth();(u(),B)[a+20>>>2>>>0]=b.getYear();a=b.getTime();return BigInt(isNaN(a)?-1:a/1E3)}function gc(a,b,c,d,e,f,h){return n?N(16,1,a,b,c,d,e,f,h):-52}function hc(a,b,c,d,e,f){if(n)return N(17,1,a,b,c,d,e,f)}var Xg={},sc=()=>performance.timeOrigin+performance.now(); +function ic(a,b){if(n)return N(18,1,a,b);Xg[a]&&(clearTimeout(Xg[a].id),delete Xg[a]);if(!b)return 0;var c=setTimeout(()=>{delete Xg[a];Sf(()=>He(a,performance.timeOrigin+performance.now()))},b);Xg[a]={id:c,Ne:b};return 0} +function jc(a,b,c,d){a>>>=0;b>>>=0;c>>>=0;d>>>=0;var e=(new Date).getFullYear(),f=(new Date(e,0,1)).getTimezoneOffset();e=(new Date(e,6,1)).getTimezoneOffset();var h=Math.max(f,e);(u(),C)[a>>>2>>>0]=60*h;(u(),B)[b>>>2>>>0]=Number(f!=e);b=k=>{var m=Math.abs(k);return`UTC${0<=k?"-":"+"}${String(Math.floor(m/60)).padStart(2,"0")}${String(m%60).padStart(2,"0")}`};a=b(f);b=b(e);eDate.now(),Yg=1; +function kc(a,b,c){c>>>=0;if(!(0<=a&&3>=a))return 28;if(0===a)a=Date.now();else if(Yg)a=performance.timeOrigin+performance.now();else return 52;a=Math.round(1E6*a);(u(),F)[c>>>3>>>0]=BigInt(a);return 0}var Zg=[],$g=(a,b)=>{Zg.length=0;for(var c;c=(u(),x)[a++>>>0];){var d=105!=c;d&=112!=c;b+=d&&b%8?4:0;Zg.push(112==c?(u(),C)[b>>>2>>>0]:106==c?(u(),F)[b>>>3>>>0]:105==c?(u(),B)[b>>>2>>>0]:(u(),E)[b>>>3>>>0]);b+=d?8:4}return Zg};function lc(a,b,c){a>>>=0;b=$g(b>>>0,c>>>0);return yg[a](...b)} +function mc(a,b,c){a>>>=0;b=$g(b>>>0,c>>>0);return yg[a](...b)}var nc=()=>{};function pc(a,b){return t(dg(a>>>0,b>>>0))}var qc=()=>{M+=1;throw"unwind";};function rc(){return 4294901760}var tc=()=>1,uc=()=>l?require("os").cpus().length:navigator.hardwareConcurrency,ah={},bh=a=>{var b=U(a)+1,c=le(b);c&&T(a,c,b);return c},ch=a=>{var b;return(b=/\bwasm-function\[\d+\]:(0x[0-9a-f]+)/.exec(a))?+b[1]:(b=/:(\d+):\d+(?:\)|$)/.exec(a))?2147483648|+b[1]:0},dh=a=>{for(var b of a)(a=ch(b))&&(ah[a]=b)}; +function xc(){var a=Error().stack.toString().split("\n");"Error"==a[0]&&a.shift();dh(a);ah.Xd=ch(a[3]);ah.re=a;return ah.Xd}function vc(a){a=ah[a>>>0];if(!a)return 0;var b;if(b=/^\s+at .*\.wasm\.(.*) \(.*\)$/.exec(a))a=b[1];else if(b=/^\s+at (.*) \(.*\)$/.exec(a))a=b[1];else if(b=/^(.+?)@/.exec(a))a=b[1];else return 0;I(vc.ae??0);vc.ae=bh(a);return vc.ae} +function wc(a){a>>>=0;var b=(u(),x).length;if(a<=b||4294901760=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(4294901760,65536*Math.ceil(Math.max(a,d)/65536))-v.buffer.byteLength+65535)/65536|0;try{v.grow(d);wa();var e=1;break a}catch(f){}e=void 0}if(e)return!0}return!1} +function yc(a,b,c){a>>>=0;b>>>=0;if(ah.Xd==a)var d=ah.re;else d=Error().stack.toString().split("\n"),"Error"==d[0]&&d.shift(),dh(d);for(var e=3;d[e]&&ch(d[e])!=a;)++e;for(a=0;a>>2>>>0]=ch(d[a+e]);return a} +var V=a=>{var b=U(a)+1,c=Me(b);T(a,c,b);return c},eh=[],W=(a,b)=>{eh[a>>>=0]=b},X=[],fh=[],gh=(a,b)=>{fh[a]=new Promise(c=>b.finally(()=>c(a)))},Y=a=>{if(a)return eh[a>>>0]},hh=(a,b=0)=>{"pending"!=a.mapState||H();b=ue(b,"mapped"==a.mapState?3:1);W(b,a);"mapped"==a.mapState&&(X[b]=[]);return b},ih=(a,b=0)=>{var c=we(b);b=ve(b,c);W(c,a.queue);W(b,a);return b},jh=(a,b,c)=>{(u(),C)[a>>>2>>>0]=b;(u(),C)[a+4>>>2>>>0]=c},kh=a=>{var b=(u(),C)[a>>>2>>>0];a=(u(),C)[a+4>>>2>>>0];return dg(b,a)},Z=a=>{var b= +(u(),C)[a>>>2>>>0];a=(u(),C)[a+4>>>2>>>0];if(b)return dg(b,a);if(0===a)return""},lh=a=>{var b=Z(a+4);var c=(c=(u(),C)[a+12>>>2>>>0])?Y(c):"auto";if(a+=16){var d=Y((u(),C)[a+4>>>2>>>0]);var e=(u(),C)[a+16>>>2>>>0];var f=(u(),C)[a+20>>>2>>>0];if(e){for(var h={},k=0;k>>3>>>0]}e=h}else e=void 0;a={module:d,constants:e,entryPoint:Z(a+8)}}else a=void 0;return{label:b,layout:c,compute:a}},mh=(a,b)=>{function c(e,f){e=a[e];(u(),B)[b+f>>>2>>>0]=e}function d(e, +f){e=a[e];(u(),F)[b+f>>>3>>>0]=BigInt(e)}c("maxTextureDimension1D",4);c("maxTextureDimension2D",8);c("maxTextureDimension3D",12);c("maxTextureArrayLayers",16);c("maxBindGroups",20);c("maxBindGroupsPlusVertexBuffers",24);c("maxBindingsPerBindGroup",28);c("maxDynamicUniformBuffersPerPipelineLayout",32);c("maxDynamicStorageBuffersPerPipelineLayout",36);c("maxSampledTexturesPerShaderStage",40);c("maxSamplersPerShaderStage",44);c("maxStorageBuffersPerShaderStage",48);c("maxStorageTexturesPerShaderStage", +52);c("maxUniformBuffersPerShaderStage",56);c("minUniformBufferOffsetAlignment",80);c("minStorageBufferOffsetAlignment",84);d("maxUniformBufferBindingSize",64);d("maxStorageBufferBindingSize",72);c("maxVertexBuffers",88);d("maxBufferSize",96);c("maxVertexAttributes",104);c("maxVertexBufferArrayStride",108);c("maxInterStageShaderVariables",112);c("maxColorAttachments",116);c("maxColorAttachmentBytesPerSample",120);c("maxComputeWorkgroupStorageSize",124);c("maxComputeInvocationsPerWorkgroup",128);c("maxComputeWorkgroupSizeX", +132);c("maxComputeWorkgroupSizeY",136);c("maxComputeWorkgroupSizeZ",140);c("maxComputeWorkgroupsPerDimension",144);void 0!==a.Le&&c("maxImmediateSize",148)},nh=[,"validation","out-of-memory","internal"],oh=[,"compatibility","core"],ph={1:"core-features-and-limits",2:"depth-clip-control",3:"depth32float-stencil8",4:"texture-compression-bc",5:"texture-compression-bc-sliced-3d",6:"texture-compression-etc2",7:"texture-compression-astc",8:"texture-compression-astc-sliced-3d",9:"timestamp-query",10:"indirect-first-instance", +11:"shader-f16",12:"rg11b10ufloat-renderable",13:"bgra8unorm-storage",14:"float32-filterable",15:"float32-blendable",16:"clip-distances",17:"dual-source-blending",18:"subgroups",19:"texture-formats-tier1",20:"texture-formats-tier2",21:"primitive-index",327692:"chromium-experimental-unorm16-texture-formats",327693:"chromium-experimental-snorm16-texture-formats",327732:"chromium-experimental-multi-draw-indirect"},qh=[,"low-power","high-performance"],rh=[,"occlusion","timestamp"],sh={undefined:1,unknown:1, +destroyed:2}; +function zc(a,b,c,d,e,f){b=O(b);c=O(c);d>>>=0;e>>>=0;f>>>=0;var h=Y(a>>>0);a={};if(f){var k=(u(),C)[f+12>>>2>>>0];if(k){var m=(u(),C)[f+16>>>2>>>0];a.requiredFeatures=Array.from((u(),C).subarray(m>>>2>>>0,m+4*k>>>2>>>0),q=>ph[q])}var p=(u(),C)[f+20>>>2>>>0];if(p){var z={};function q(A,D,za=!1){D=p+D;D=(u(),C)[D>>>2>>>0];4294967295==D||za&&0==D||(z[A]=D)}function y(A,D){D=p+D;var za=(u(),C)[D>>>2>>>0],Bb=(u(),C)[D+4>>>2>>>0];if(4294967295!=za||4294967295!=Bb)z[A]=4294967296*(u(),C)[D+4>>>2>>>0]+(u(), +C)[D>>>2>>>0]}q("maxTextureDimension1D",4);q("maxTextureDimension2D",8);q("maxTextureDimension3D",12);q("maxTextureArrayLayers",16);q("maxBindGroups",20);q("maxBindGroupsPlusVertexBuffers",24);q("maxDynamicUniformBuffersPerPipelineLayout",32);q("maxDynamicStorageBuffersPerPipelineLayout",36);q("maxSampledTexturesPerShaderStage",40);q("maxSamplersPerShaderStage",44);q("maxStorageBuffersPerShaderStage",48);q("maxStorageTexturesPerShaderStage",52);q("maxUniformBuffersPerShaderStage",56);q("minUniformBufferOffsetAlignment", +80);q("minStorageBufferOffsetAlignment",84);y("maxUniformBufferBindingSize",64);y("maxStorageBufferBindingSize",72);q("maxVertexBuffers",88);y("maxBufferSize",96);q("maxVertexAttributes",104);q("maxVertexBufferArrayStride",108);q("maxInterStageShaderVariables",112);q("maxColorAttachments",116);q("maxColorAttachmentBytesPerSample",120);q("maxComputeWorkgroupStorageSize",124);q("maxComputeInvocationsPerWorkgroup",128);q("maxComputeWorkgroupSizeX",132);q("maxComputeWorkgroupSizeY",136);q("maxComputeWorkgroupSizeZ", +140);q("maxComputeWorkgroupsPerDimension",144);q("maxImmediateSize",148,!0);a.requiredLimits=z}if(k=(u(),C)[f+24>>>2>>>0])k={label:Z(k+4)},a.defaultQueue=k;a.label=Z(f+4)}M+=1;gh(b,h.requestDevice(a).then(q=>{--M;W(e,q.queue);W(d,q);c&&(M+=1,gh(c,q.lost.then(y=>{--M;q.onuncapturederror=()=>{};var A=L(),D=V(y.message);ye(c,sh[y.reason],D);K(A)})));q.onuncapturederror=y=>{var A=5;y.error instanceof GPUValidationError?A=2:y.error instanceof GPUOutOfMemoryError?A=3:y.error instanceof GPUInternalError&& +(A=4);var D=L();y=V(y.error.message);De(d,A,y);K(D)};"adapterInfo"in q||(q.adapterInfo=h.info);Ce(b,1,d,0)},q=>{--M;var y=L();q=V(q.message);Ce(b,3,d,q);c&&ye(c,4,q);K(y)}))}function Ac(a){a>>>=0;var b=Y(a),c=X[a];if(c){for(var d=0;d{var a="getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE";th.ed||(th.ed={});th.ed[a]||(th.ed[a]=1,l&&(a="warning: "+a),t(a))}; +function Bc(a,b,c){a>>>=0;b>>>=0;c>>>=0;var d=Y(a);0===c&&th();4294967295==c&&(c=void 0);try{var e=d.getMappedRange(b,c)}catch(h){return 0}var f=Je(16,e.byteLength);(u(),x).set(new Uint8Array(e),f>>>0);X[a].push(()=>I(f));return f} +function Cc(a,b,c){a>>>=0;b>>>=0;c>>>=0;var d=Y(a);0===c&&th();4294967295==c&&(c=void 0);try{var e=d.getMappedRange(b,c)}catch(h){return 0}var f=Je(16,e.byteLength);(u(),x).fill(0,f,e.byteLength);X[a].push(()=>{(new Uint8Array(e)).set((u(),x).subarray(f>>>0,f+e.byteLength>>>0));I(f)});return f} +function Dc(a,b,c,d,e){a>>>=0;b=O(b);c=O(c);e>>>=0;var f=Y(a);X[a]=[];4294967295==e&&(e=void 0);M+=1;gh(b,f.mapAsync(c,d>>>0,e).then(()=>{--M;ze(b,1,0)},h=>{--M;L();var k=V(h.message);ze(b,"AbortError"===h.name?4:"OperationError"===h.name?3:0,k);delete X[a]}))}function Ec(a){a>>>=0;var b=Y(a),c=X[a];if(c){for(var d=0;d>>0]} +function Gc(a,b,c){a>>>=0;b>>>=0;c>>>=0;var d=!!(u(),C)[b+32>>>2>>>0];b={label:Z(b+4),usage:(u(),C)[b+16>>>2>>>0],size:4294967296*(u(),C)[b+28>>>2>>>0]+(u(),C)[b+24>>>2>>>0],mappedAtCreation:d};a=Y(a);try{var e=a.createBuffer(b)}catch(f){return!1}W(c,e);d&&(X[c]=[]);return!0} +function Hc(a,b,c,d){a>>>=0;b=O(b);d>>>=0;c=lh(c>>>0);a=Y(a);M+=1;gh(b,a.createComputePipelineAsync(c).then(e=>{--M;W(d,e);xe(b,1,d,0)},e=>{--M;var f=L(),h=V(e.message);xe(b,"validation"===e.reason?3:"internal"===e.reason?4:0,d,h);K(f)}))}function Ic(a,b,c){a>>>=0;b>>>=0;c>>>=0;var d=(u(),C)[b>>>2>>>0],e=(u(),C)[d+4>>>2>>>0];b={label:Z(b+4),code:""};switch(e){case 2:b.code=kh(d+8)}W(c,Y(a).createShaderModule(b))}var Jc=a=>{a=Y(a);a.onuncapturederror=null;a.destroy()}; +function Kc(a,b){b=O(b);a=Y(a>>>0);M+=1;gh(b,a.popErrorScope().then(c=>{--M;var d=5;c?c instanceof GPUValidationError?d=2:c instanceof GPUOutOfMemoryError?d=3:c instanceof GPUInternalError&&(d=4):d=1;var e=L();c=c?V(c.message):0;Ae(b,1,d,c);K(e)},c=>{--M;var d=L();c=V(c.message);Ae(b,1,5,c);K(d)}))} +function Lc(a,b,c,d){b=O(b);c>>>=0;d>>>=0;if(c){var e=(u(),C)[c+4>>>2>>>0];e={featureLevel:oh[e],powerPreference:qh[(u(),C)[c+8>>>2>>>0]],forceFallbackAdapter:!!(u(),C)[c+12>>>2>>>0]};c=(u(),C)[c>>>2>>>0];0!==c&&(u(),e.Qe=!!(u(),C)[c+8>>>2>>>0])}"gpu"in navigator?(M+=1,gh(b,navigator.gpu.requestAdapter(e).then(f=>{--M;if(f)W(d,f),Be(b,1,d,0);else{f=L();var h=V("WebGPU not available on this browser (requestAdapter returned null)");Be(b,3,d,h);K(f)}},f=>{--M;var h=L();f=V(f.message);Be(b,4,d,f);K(h)}))): +(c=L(),e=V("WebGPU not available on this browser (navigator.gpu is not available)"),Be(b,3,d,e),K(c))}function Mc(a,b,c){a>>>=0;b>>>=0;c>>>=0;return Ng(async()=>{var d=[];if(c){var e=(u(),B)[c>>>2>>>0];d.length=b+1;d[b]=new Promise(k=>setTimeout(k,e,0))}else d.length=b;for(var f=0;f>>2>>>0]+(u(),C)[a+8*f>>>2>>>0];if(!(h in fh))return h;d[f]=fh[h]}d=await Promise.race(d);delete fh[d];return d})} +var uh={},wh=()=>{if(!vh){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",_:fa||"./this.program"},b;for(b in uh)void 0===uh[b]?delete a[b]:a[b]=uh[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);vh=c}return vh},vh;function Nc(a,b){if(n)return N(19,1,a,b);a>>>=0;b>>>=0;var c=0,d=0,e;for(e of wh()){var f=b+c;(u(),C)[a+d>>>2>>>0]=f;c+=T(e,f,Infinity)+1;d+=4}return 0} +function Oc(a,b){if(n)return N(20,1,a,b);a>>>=0;b>>>=0;var c=wh();(u(),C)[a>>>2>>>0]=c.length;a=0;for(var d of c)a+=U(d)+1;(u(),C)[b>>>2>>>0]=a;return 0}function Qc(a){return n?N(21,1,a):52}function Rc(a,b,c,d){return n?N(22,1,a,b,c,d):52}function Sc(a,b,c,d){return n?N(23,1,a,b,c,d):70}var xh=[null,[],[]]; +function Tc(a,b,c,d){if(n)return N(24,1,a,b,c,d);b>>>=0;c>>>=0;d>>>=0;for(var e=0,f=0;f>>2>>>0],k=(u(),C)[b+4>>>2>>>0];b+=8;for(var m=0;m>>0],q=xh[p];0===z||10===z?((1===p?ra:t)(cg(q)),q.length=0):q.push(z)}e+=k}(u(),C)[d>>>2>>>0]=e;return 0}function Gd(a){return a>>>0}function Id(a,b){mh(Y(a>>>0).limits,b>>>0);return 1}function Jd(a,b){return Y(a>>>0).features.has(ph[b])}function Kd(a){return BigInt(Y(a>>>0).size)} +function Ld(a){return BigInt(Y(a>>>0).usage)}function Md(a,b){a>>>=0;b>>>=0;if(b){var c=Z(b+4);b=(u(),C)[b+12>>>2>>>0];b=0!==b?{querySet:Y((u(),C)[b+4>>>2>>>0]),beginningOfPassWriteIndex:(u(),C)[b+8>>>2>>>0],endOfPassWriteIndex:(u(),C)[b+12>>>2>>>0]}:void 0;c={label:c,timestampWrites:b}}a=Y(a);b=se(0);W(b,a.beginComputePass(c));return b}function Nd(a,b,c,d,e,f){c=O(c);e=O(e);f=O(f);Y(a>>>0).copyBufferToBuffer(Y(b>>>0),c,Y(d>>>0),e,f)} +function Od(a){a=Y(a>>>0);var b=qe(0);W(b,a.finish());return b}function Pd(a,b,c,d,e,f){f=O(f);Y(a>>>0).resolveQuerySet(Y(b>>>0),c,d,Y(e>>>0),f)}function Qd(a,b,c,d){Y(a>>>0).dispatchWorkgroups(b,c,d)}function Rd(a,b,c){c=O(c);Y(a>>>0).dispatchWorkgroupsIndirect(Y(b>>>0),c)}function Sd(a){Y(a>>>0).end()}function Td(a,b,c,d,e){d>>>=0;e>>>=0;a=Y(a>>>0);c=Y(c>>>0);0==d?a.setBindGroup(b,c):a.setBindGroup(b,c,(u(),C),e>>>2,d)}function Ud(a,b){Y(a>>>0).setPipeline(Y(b>>>0))} +function Vd(a,b,c){Y(a>>>0).Pe(Y(b>>>0),c)}function Wd(a,b){a=Y(a>>>0);var c=pe(0);W(c,a.getBindGroupLayout(b));return c} +function Xd(a,b){a>>>=0;b>>>=0;var c=Z(b+4),d=Y((u(),C)[b+12>>>2>>>0]),e=(u(),C)[b+16>>>2>>>0];b=(u(),C)[b+20>>>2>>>0];for(var f=[],h=0;h>>2>>>0],q=(u(),C)[p+32>>>2>>>0],y=(u(),C)[p+36>>>2>>>0],A=(u(),C)[p+4>>>2>>>0];z?(q=p+24,q=(u(),C)[q>>>2>>>0]+4294967296*(u(),B)[q+4>>>2>>>0],-1==q&&(q=void 0),p={binding:A,resource:{buffer:Y(z),offset:4294967296*(u(),C)[p+4+16>>>2>>>0]+(u(),C)[p+16>>>2>>>0],size:q}}):p=q?{binding:A,resource:Y(q)}:{binding:A, +resource:Y(y)};m.call(k,p)}c={label:c,layout:d,entries:f};a=Y(a);d=oe(0);W(d,a.createBindGroup(c));return d}function Yd(a,b){a>>>=0;b>>>=0;var c;b&&(c={label:Z(b+4)});a=Y(a);b=re(0);W(b,a.createCommandEncoder(c));return b}function Zd(a,b){a>>>=0;b>>>=0;b={type:rh[(u(),C)[b+12>>>2>>>0]],count:(u(),C)[b+16>>>2>>>0]};a=Y(a);var c=te(0);W(c,a.createQuerySet(b));return c} +function $d(a,b){a=Y(a>>>0).adapterInfo;b>>>=0;(u(),B)[b+52>>>2>>>0]=a.subgroupMinSize;(u(),B)[b+56>>>2>>>0]=a.subgroupMaxSize;var c=bh(a.vendor+a.architecture+a.device+a.description),d=U(a.vendor);jh(b+4,c,d);c+=d;d=U(a.architecture);jh(b+12,c,d);c+=d;d=U(a.device);jh(b+20,c,d);jh(b+28,c+d,U(a.description));(u(),B)[b+36>>>2>>>0]=2;a=a.isFallbackAdapter?3:4;(u(),B)[b+40>>>2>>>0]=a;(u(),B)[b+44>>>2>>>0]=0;(u(),B)[b+48>>>2>>>0]=0;return 1} +var yh={"core-features-and-limits":1,"depth-clip-control":2,"depth32float-stencil8":3,"texture-compression-bc":4,"texture-compression-bc-sliced-3d":5,"texture-compression-etc2":6,"texture-compression-astc":7,"texture-compression-astc-sliced-3d":8,"timestamp-query":9,"indirect-first-instance":10,"shader-f16":11,"rg11b10ufloat-renderable":12,"bgra8unorm-storage":13,"float32-filterable":14,"float32-blendable":15,"clip-distances":16,"dual-source-blending":17,subgroups:18,"texture-formats-tier1":19,"texture-formats-tier2":20, +"primitive-index":21,"chromium-experimental-unorm16-texture-formats":327692,"chromium-experimental-snorm16-texture-formats":327693,"chromium-experimental-multi-draw-indirect":327732};function ae(a,b){b>>>=0;a=Y(a>>>0);var c=le(4*a.features.size),d=0,e=0;a.features.forEach(f=>{f=yh[f];0<=f&&((u(),B)[c+d>>>2>>>0]=f,d+=4,e++)});(u(),C)[b+4>>>2>>>0]=c;(u(),C)[b>>>2>>>0]=e}function be(a,b){mh(Y(a>>>0).limits,b>>>0);return 1}function ce(a,b){Y(a>>>0).pushErrorScope(nh[b])} +function de(a,b,c){b>>>=0;c>>>=0;a=Y(a>>>0);b=Array.from((u(),B).subarray(c>>>2>>>0,c+4*b>>>2>>>0),d=>Y(d));a.submit(b)}function ee(a,b,c,d,e){c=O(c);d>>>=0;e>>>=0;a=Y(a>>>0);b=Y(b>>>0);d=(u(),x).subarray(d>>>0,d+e>>>0);a.writeBuffer(b,c,d,0,e)}n||Pf();n||(v=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),wa());g.wasmBinary&&(sa=g.wasmBinary);g.stackSave=()=>L();g.stackRestore=a=>K(a);g.stackAlloc=a=>Me(a); +g.setValue=function(a,b,c="i8"){c.endsWith("*")&&(c="*");switch(c){case "i1":(u(),w)[a>>>0]=b;break;case "i8":(u(),w)[a>>>0]=b;break;case "i16":(u(),Na)[a>>>1>>>0]=b;break;case "i32":(u(),B)[a>>>2>>>0]=b;break;case "i64":(u(),F)[a>>>3>>>0]=BigInt(b);break;case "float":(u(),Pa)[a>>>2>>>0]=b;break;case "double":(u(),E)[a>>>3>>>0]=b;break;case "*":(u(),C)[a>>>2>>>0]=b;break;default:H(`invalid type for setValue: ${c}`)}}; +g.getValue=function(a,b="i8"){b.endsWith("*")&&(b="*");switch(b){case "i1":return(u(),w)[a>>>0];case "i8":return(u(),w)[a>>>0];case "i16":return(u(),Na)[a>>>1>>>0];case "i32":return(u(),B)[a>>>2>>>0];case "i64":return(u(),F)[a>>>3>>>0];case "float":return(u(),Pa)[a>>>2>>>0];case "double":return(u(),E)[a>>>3>>>0];case "*":return(u(),C)[a>>>2>>>0];default:H(`invalid type for getValue: ${b}`)}};g.UTF8ToString=dg;g.stringToUTF8=T;g.lengthBytesUTF8=U; +var zg=[Hd,Of,$f,jb,kb,lb,mb,nb,ob,pb,qb,rb,sb,tb,ub,vb,gc,hc,ic,Nc,Oc,Qc,Rc,Sc,Tc],yg={1113148:(a,b,c,d,e)=>{if("undefined"==typeof g||!g.Zc)return 1;a=dg(Number(a>>>0));a.startsWith("./")&&(a=a.substring(2));a=g.Zc.get(a);if(!a)return 2;b=Number(b>>>0);c=Number(c>>>0);d=Number(d>>>0);if(b+c>a.byteLength)return 3;try{const f=a.subarray(b,b+c);switch(e){case 0:(u(),x).set(f,d>>>0);break;case 1:g.ie?g.ie(d,f):g.Ke(d,f);break;default:return 4}return 0}catch{return 4}},1113972:(a,b,c)=>{g.ke(a,(u(), +x).subarray(b>>>0,b+c>>>0))},1114036:()=>g.Ie(),1114078:a=>{g.je(a)},1114115:()=>"undefined"!==typeof wasmOffsetConverter};function Za(){return"undefined"!==typeof wasmOffsetConverter}var ie,Ja,je,ke,I,le,me,ne,oe,pe,qe,re,se,te,ue,ve,we,xe,ye,ze,Ae,Be,Ce,De,Ga,Ma,Ee,Fe,Ge,He,Ie,Je,J,Ke,Le,K,Me,L,Ne,Oe,Pe,Qe,dynCall_vii,Re,dynCall_v,Se,Te,Ue,dynCall_iii,Ve,We,Xe,dynCall_vi,Ye,Ze,$e,af,bf,cf,df,ef,ff,gf,hf,jf,kf,lf,mf,nf,of,pf,qf,rf,sf,tf,uf,vf,wf,xf,yf,zf,Af,Bf,Cf,Ya; +function ad(a,b,c,d){var e=L();try{return Xe(a,b,c,d)}catch(f){K(e);if(f!==f+0)throw f;J(1,0)}}function $c(a,b,c){var d=L();try{return dynCall_iii(a,b,c)}catch(e){K(d);if(e!==e+0)throw e;J(1,0)}}function sd(a,b,c){var d=L();try{dynCall_vii(a,b,c)}catch(e){K(d);if(e!==e+0)throw e;J(1,0)}}function Zc(a,b){var c=L();try{return Re(a,b)}catch(d){K(c);if(d!==d+0)throw d;J(1,0)}}function qd(a){var b=L();try{dynCall_v(a)}catch(c){K(b);if(c!==c+0)throw c;J(1,0)}} +function ed(a,b,c,d,e,f,h){var k=L();try{return Ue(a,b,c,d,e,f,h)}catch(m){K(k);if(m!==m+0)throw m;J(1,0)}}function rd(a,b){var c=L();try{dynCall_vi(a,b)}catch(d){K(c);if(d!==d+0)throw d;J(1,0)}}function wd(a,b,c,d,e,f){var h=L();try{Se(a,b,c,d,e,f)}catch(k){K(h);if(k!==k+0)throw k;J(1,0)}}function ud(a,b,c,d){var e=L();try{We(a,b,c,d)}catch(f){K(e);if(f!==f+0)throw f;J(1,0)}}function xd(a,b,c,d,e,f,h){var k=L();try{Ze(a,b,c,d,e,f,h)}catch(m){K(k);if(m!==m+0)throw m;J(1,0)}} +function Ed(a,b,c,d,e,f,h){var k=L();try{$e(a,b,c,d,e,f,h)}catch(m){K(k);if(m!==m+0)throw m;J(1,0)}}function Dd(a,b,c,d,e,f,h,k){var m=L();try{kf(a,b,c,d,e,f,h,k)}catch(p){K(m);if(p!==p+0)throw p;J(1,0)}}function vd(a,b,c,d,e){var f=L();try{Te(a,b,c,d,e)}catch(h){K(f);if(h!==h+0)throw h;J(1,0)}}function bd(a,b,c,d,e){var f=L();try{return Ye(a,b,c,d,e)}catch(h){K(f);if(h!==h+0)throw h;J(1,0)}}function yd(a,b,c,d,e,f,h,k){var m=L();try{lf(a,b,c,d,e,f,h,k)}catch(p){K(m);if(p!==p+0)throw p;J(1,0)}} +function Bd(a,b,c,d,e,f,h,k,m,p,z,q){var y=L();try{af(a,b,c,d,e,f,h,k,m,p,z,q)}catch(A){K(y);if(A!==A+0)throw A;J(1,0)}}function dd(a,b,c,d,e,f){var h=L();try{return hf(a,b,c,d,e,f)}catch(k){K(h);if(k!==k+0)throw k;J(1,0)}}function od(a,b,c){var d=L();try{return ef(a,b,c)}catch(e){K(d);if(e!==e+0)throw e;J(1,0);return 0n}}function zd(a,b,c,d,e,f,h,k,m){var p=L();try{Ve(a,b,c,d,e,f,h,k,m)}catch(z){K(p);if(z!==z+0)throw z;J(1,0)}} +function Yc(a){var b=L();try{return cf(a)}catch(c){K(b);if(c!==c+0)throw c;J(1,0)}}function ld(a,b,c){var d=L();try{return mf(a,b,c)}catch(e){K(d);if(e!==e+0)throw e;J(1,0)}}function nd(a,b){var c=L();try{return yf(a,b)}catch(d){K(c);if(d!==d+0)throw d;J(1,0);return 0n}}function Fd(a,b,c,d,e){var f=L();try{nf(a,b,c,d,e)}catch(h){K(f);if(h!==h+0)throw h;J(1,0)}}function md(a){var b=L();try{return bf(a)}catch(c){K(b);if(c!==c+0)throw c;J(1,0);return 0n}} +function hd(a,b,c,d,e,f){var h=L();try{return qf(a,b,c,d,e,f)}catch(k){K(h);if(k!==k+0)throw k;J(1,0)}}function cd(a,b,c,d,e,f){var h=L();try{return rf(a,b,c,d,e,f)}catch(k){K(h);if(k!==k+0)throw k;J(1,0)}}function fd(a,b,c,d,e,f,h,k){var m=L();try{return jf(a,b,c,d,e,f,h,k)}catch(p){K(m);if(p!==p+0)throw p;J(1,0)}}function pd(a,b,c,d,e){var f=L();try{return sf(a,b,c,d,e)}catch(h){K(f);if(h!==h+0)throw h;J(1,0);return 0n}} +function Xc(a,b,c,d){var e=L();try{return tf(a,b,c,d)}catch(f){K(e);if(f!==f+0)throw f;J(1,0)}}function Vc(a,b,c,d){var e=L();try{return uf(a,b,c,d)}catch(f){K(e);if(f!==f+0)throw f;J(1,0)}}function gd(a,b,c,d,e,f,h,k,m,p,z,q){var y=L();try{return vf(a,b,c,d,e,f,h,k,m,p,z,q)}catch(A){K(y);if(A!==A+0)throw A;J(1,0)}}function Ad(a,b,c,d,e,f,h,k,m,p,z){var q=L();try{of(a,b,c,d,e,f,h,k,m,p,z)}catch(y){K(q);if(y!==y+0)throw y;J(1,0)}} +function Cd(a,b,c,d,e,f,h,k,m,p,z,q,y,A,D,za){var Bb=L();try{pf(a,b,c,d,e,f,h,k,m,p,z,q,y,A,D,za)}catch(Eb){K(Bb);if(Eb!==Eb+0)throw Eb;J(1,0)}}function kd(a,b,c,d){var e=L();try{return wf(a,b,c,d)}catch(f){K(e);if(f!==f+0)throw f;J(1,0)}}function jd(a,b,c,d,e){var f=L();try{return xf(a,b,c,d,e)}catch(h){K(f);if(h!==h+0)throw h;J(1,0)}}function Wc(a,b,c){var d=L();try{return df(a,b,c)}catch(e){K(d);if(e!==e+0)throw e;J(1,0)}} +function Uc(a,b,c){var d=L();try{return ff(a,b,c)}catch(e){K(d);if(e!==e+0)throw e;J(1,0)}}function td(a,b,c,d){var e=L();try{gf(a,b,c,d)}catch(f){K(e);if(f!==f+0)throw f;J(1,0)}}function ge(){var a=G;a=Object.assign({},a);var b=d=>e=>d(e)>>>0,c=d=>()=>d()>>>0;a.ec=b(a.ec);a.Hc=c(a.Hc);a.Jc=b(a.Jc);a.vd=(d=>(e,f)=>d(e,f)>>>0)(a.vd);a.Ad=b(a.Ad);a.Bd=c(a.Bd);a.Fd=b(a.Fd);return a} +function Ea(){if(0{const b=new WeakMap;let c=1,d=void 0,e=void 0;g.webgpuRegisterDevice=k=>{if(void 0!==e)throw Error("another WebGPU EP inference session is being created.");if(k){var m=b.get(k);if(!m){m=ne(0);const p=ih(k,m);m=[c++,m,p];b.set(k,m)}d=k;e=m[0];return m}d=void 0;e=0};const f=new Map;g.webgpuOnCreateSession=k=>{if(void 0!==e){var m=e;e=void 0;if(k){const p=je(m);f.set(k,p);0===m&&a(d??Y(p))}d=void 0}};g.webgpuOnReleaseSession=k=>{f.delete(k)};const h=Symbol("gpuBufferMetadata");g.webgpuRegisterBuffer= +(k,m,p)=>{if(p)return k[h]=[p,NaN],p;if(p=k[h])return p[1]++,p[0];m=f.get(m);if(void 0===m)throw Error("Invalid session handle passed to webgpuRegisterBuffer");m=hh(k,m);k[h]=[m,1];return m};g.webgpuUnregisterBuffer=k=>{const m=k[h];if(!m)throw Error("Buffer is not registered");m[1]--;0===m[1]&&(me(m[0]),delete k[h])};g.webgpuGetBuffer=k=>Y(k);g.webgpuCreateDownloader=(k,m,p)=>{p=f.get(p);if(void 0===p)throw Error("Invalid session handle passed to webgpuRegisterBuffer");const z=Y(p),q=16*Math.ceil(Number(m)/ +16);return async()=>{const y=z.createBuffer({size:q,usage:9});try{const A=z.createCommandEncoder();A.copyBufferToBuffer(k,0,y,0,q);z.queue.submit([A.finish()]);await y.mapAsync(GPUMapMode.READ);return y.getMappedRange().slice(0,m)}finally{y.destroy()}}};g.ie=(k,m)=>{var p=m.buffer;const z=m.byteOffset,q=m.byteLength;m=16*Math.ceil(Number(q)/16);k=Y(k);if(!d){var y=je(e);d=Y(y)}y=d.createBuffer({mappedAtCreation:!0,size:m,usage:6});const A=y.getMappedRange();(new Uint8Array(A)).set(new Uint8Array(p, +z,q));y.unmap();p=d.createCommandEncoder();p.copyBufferToBuffer(y,0,k,0,m);d.queue.submit([p.finish()]);y.destroy()}}; +g.webnnInit=a=>{const b=a[0];[g.Ie,g.je,g.webnnEnsureTensor,g.ke,g.webnnDownloadTensor,g.He,g.webnnEnableTraceEvent]=a.slice(1);g.webnnReleaseTensorId=g.je;g.webnnUploadTensor=g.ke;g.webnnRegisterMLContext=g.He;g.webnnOnRunStart=c=>b.onRunStart(c);g.webnnOnRunEnd=b.onRunEnd.bind(b);g.webnnOnReleaseSession=c=>{b.onReleaseSession(c)};g.webnnCreateMLTensorDownloader=(c,d)=>b.createMLTensorDownloader(c,d);g.webnnRegisterMLTensor=(c,d,e,f)=>b.registerMLTensor(c,d,e,f);g.webnnCreateMLContext=c=>b.createMLContext(c); +g.webnnRegisterMLConstant=(c,d,e,f,h,k)=>b.registerMLConstant(c,d,e,f,h,g.Zc,k);g.webnnRegisterGraphInput=b.registerGraphInput.bind(b);g.webnnIsGraphInput=b.isGraphInput.bind(b);g.webnnRegisterGraphOutput=b.registerGraphOutput.bind(b);g.webnnIsGraphOutput=b.isGraphOutput.bind(b);g.webnnCreateTemporaryTensor=b.createTemporaryTensor.bind(b);g.webnnIsGraphInputOutputTypeSupported=b.isGraphInputOutputTypeSupported.bind(b)};Ra?moduleRtn=g:moduleRtn=new Promise((a,b)=>{xa=a;ya=b}); +;return moduleRtn}export default ortWasmThreaded;var isPthread=globalThis.self?.name?.startsWith("em-pthread");var isNode=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";if(isNode)isPthread=(await import("worker_threads")).workerData==="em-pthread";isPthread&&ortWasmThreaded(); diff --git a/vendor/onnxruntime-web/ort-wasm-simd-threaded.asyncify.wasm b/vendor/onnxruntime-web/ort-wasm-simd-threaded.asyncify.wasm new file mode 100644 index 0000000000000000000000000000000000000000..cf754881a3d8d83404ee98c9b8cc5eae49fd0861 --- /dev/null +++ b/vendor/onnxruntime-web/ort-wasm-simd-threaded.asyncify.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f33595b9f7ea51aa6f646dd5a2bde6fbb1c7bcde0b9d2b5f240011a09c1830d0 +size 27190919 diff --git a/vendor/onnxruntime-web/ort-wasm-simd-threaded.jsep.mjs b/vendor/onnxruntime-web/ort-wasm-simd-threaded.jsep.mjs new file mode 100644 index 0000000000000000000000000000000000000000..88f263892acc5eda8a035b61e45ece49c967961b --- /dev/null +++ b/vendor/onnxruntime-web/ort-wasm-simd-threaded.jsep.mjs @@ -0,0 +1,106 @@ +async function ortWasmThreaded(moduleArg={}){var moduleRtn;var f=moduleArg,aa=!!globalThis.window,ba=!!globalThis.WorkerGlobalScope,h=globalThis.process?.versions?.node&&"renderer"!=globalThis.process?.type,m=ba&&self.name?.startsWith("em-pthread");if(h){const {createRequire:a}=await import("module");var require=a(import.meta.url),ca=require("worker_threads");global.Worker=ca.Worker;m=(ba=!ca.$d)&&"em-pthread"==ca.workerData}f.mountExternalData=(a,b)=>{a.startsWith("./")&&(a=a.substring(2));(f.Zc||(f.Zc=new Map)).set(a,b)}; +f.unmountExternalData=()=>{delete f.Zc};var SharedArrayBuffer=globalThis.SharedArrayBuffer??(new WebAssembly.Memory({initial:0,maximum:0,ae:!0})).buffer.constructor;const da=a=>async(...b)=>{try{if(f.$c)throw Error("Session already started");const d=f.$c={Nd:b[0],errors:[]},c=await a(...b);if(f.$c!==d)throw Error("Session mismatch");f.gd?.flush();const e=d.errors;if(0k);if(0{if("webgpu"===a){[f.gd,f.Dd,f.Hd,f.jd,f.Gd,f.ac,f.Id,f.Kd,f.Ed,f.Fd,f.Jd]=b;const d=f.gd;f.jsepRegisterBuffer=(c,e,g,k)=>d.registerBuffer(c,e,g,k);f.jsepGetBuffer=c=>d.getBuffer(c);f.jsepCreateDownloader=(c,e,g)=>d.createDownloader(c,e,g);f.jsepOnCreateSession=c=>{d.onCreateSession(c)};f.jsepOnReleaseSession=c=>{d.onReleaseSession(c)};f.jsepOnRunStart=c=>d.onRunStart(c);f.Ld=(c,e)=>{d.upload(c,e)}}else if("webnn"===a){const d=b[0];[f.Zd,f.vd,f.webnnEnsureTensor,f.xd,f.webnnDownloadTensor, +f.Yd,f.webnnEnableTraceEvent]=b.slice(1);f.webnnReleaseTensorId=f.vd;f.webnnUploadTensor=f.xd;f.webnnRegisterMLContext=f.Yd;f.webnnOnRunStart=c=>d.onRunStart(c);f.webnnOnRunEnd=d.onRunEnd.bind(d);f.webnnOnReleaseSession=c=>{d.onReleaseSession(c)};f.webnnCreateMLTensorDownloader=(c,e)=>d.createMLTensorDownloader(c,e);f.webnnRegisterMLTensor=(c,e,g,k)=>d.registerMLTensor(c,e,g,k);f.webnnCreateMLContext=c=>d.createMLContext(c);f.webnnRegisterMLConstant=(c,e,g,k,l,n)=>d.registerMLConstant(c,e,g,k,l,f.Zc, +n);f.webnnRegisterGraphInput=d.registerGraphInput.bind(d);f.webnnIsGraphInput=d.isGraphInput.bind(d);f.webnnRegisterGraphOutput=d.registerGraphOutput.bind(d);f.webnnIsGraphOutput=d.isGraphOutput.bind(d);f.webnnCreateTemporaryTensor=d.createTemporaryTensor.bind(d);f.webnnIsGraphInputOutputTypeSupported=d.isGraphInputOutputTypeSupported.bind(d)}}; +let fa=()=>{const a=b=>(...d)=>{const c=q;d=b(...d);return q!=c?ea():d};(b=>{for(const d of b)f[d]=a(f[d])})(["_OrtAppendExecutionProvider","_OrtCreateSession","_OrtRun","_OrtRunWithBinding","_OrtBindInput"]);"undefined"!==typeof da&&(f._OrtRun=da(f._OrtRun),f._OrtRunWithBinding=da(f._OrtRunWithBinding));fa=void 0};f.asyncInit=()=>{fa?.()};var ha="./this.program",ia=(a,b)=>{throw b;},ja=import.meta.url,ka="",la,ma; +if(h){var fs=require("fs");ja.startsWith("file:")&&(ka=require("path").dirname(require("url").fileURLToPath(ja))+"/");ma=a=>{a=na(a)?new URL(a):a;return fs.readFileSync(a)};la=async a=>{a=na(a)?new URL(a):a;return fs.readFileSync(a,void 0)};1{process.exitCode=a;throw b;}}else if(aa||ba){try{ka=(new URL(".",ja)).href}catch{}h||(ba&&(ma=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer"; +b.send(null);return new Uint8Array(b.response)}),la=async a=>{if(na(a))return new Promise((d,c)=>{var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=()=>{200==e.status||0==e.status&&e.response?d(e.response):c(e.status)};e.onerror=c;e.send(null)});var b=await fetch(a,{credentials:"same-origin"});if(b.ok)return b.arrayBuffer();throw Error(b.status+" : "+b.url);})}var oa=console.log.bind(console),pa=console.error.bind(console); +if(h){var qa=require("util"),ra=a=>"object"==typeof a?qa.inspect(a):a;oa=(...a)=>fs.writeSync(1,a.map(ra).join(" ")+"\n");pa=(...a)=>fs.writeSync(2,a.map(ra).join(" ")+"\n")}var sa=oa,r=pa,ta,ua,t=!1,va,na=a=>a.startsWith("file://");function u(){x.buffer!=A.buffer&&wa()}var xa,ya; +if(h&&m){var za=ca.parentPort;za.on("message",a=>global.onmessage?.({data:a}));Object.assign(globalThis,{self:global,postMessage:a=>za.postMessage(a)});process.on("uncaughtException",a=>{postMessage({Uc:"uncaughtException",error:a});process.exit(1)})}var Aa; +if(m){var Ba=!1;self.onunhandledrejection=b=>{throw b.reason||b;};function a(b){try{var d=b.data,c=d.Uc;if("load"===c){let e=[];self.onmessage=g=>e.push(g);Aa=()=>{postMessage({Uc:"loaded"});for(let g of e)a(g);self.onmessage=a};for(const g of d.Ad)if(!f[g]||f[g].proxy)f[g]=(...k)=>{postMessage({Uc:"callHandler",zd:g,args:k})},"print"==g&&(sa=f[g]),"printErr"==g&&(r=f[g]);x=d.Vd;wa();ua=d.Wd;Ca();Da()}else if("run"===c){Ea(d.Tc);Fa(d.Tc,0,0,1,0,0);Ga();Ha(d.Tc);Ba||(Ia(),Ba=!0);try{Ja(d.Pd,d.dd)}catch(e){if("unwind"!= +e)throw e;}}else"setimmediate"!==d.target&&("checkMailbox"===c?Ba&&Ka():c&&(r(`worker: received unknown command ${c}`),r(d)))}catch(e){throw La(),e;}}self.onmessage=a}var A,B,Ma,Na,C,D,Oa,E,F,Pa,Qa=!1;function wa(){var a=x.buffer;f.HEAP8=A=new Int8Array(a);Ma=new Int16Array(a);f.HEAPU8=B=new Uint8Array(a);Na=new Uint16Array(a);f.HEAP32=C=new Int32Array(a);f.HEAPU32=D=new Uint32Array(a);Oa=new Float32Array(a);E=new Float64Array(a);F=new BigInt64Array(a);Pa=new BigUint64Array(a)} +function Ra(){Qa=!0;m?Aa():G.tb()}function H(a){a="Aborted("+a+")";r(a);t=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");ya?.(a);throw a;}var Sa;async function Ta(a){if(!ta)try{var b=await la(a);return new Uint8Array(b)}catch{}if(a==Sa&&ta)a=new Uint8Array(ta);else if(ma)a=ma(a);else throw"both async and sync fetching of the wasm failed";return a} +async function Ua(a,b){try{var d=await Ta(a);return await WebAssembly.instantiate(d,b)}catch(c){r(`failed to asynchronously prepare wasm: ${c}`),H(c)}}async function Va(a){var b=Sa;if(!ta&&!na(b)&&!h)try{var d=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(d,a)}catch(c){r(`wasm streaming compile failed: ${c}`),r("falling back to ArrayBuffer instantiation")}return Ua(b,a)} +function Wa(){Xa={ma:Ya,hb:Za,g:$a,J:ab,f:bb,o:cb,h:db,ha:eb,b:fb,T:gb,Ia:hb,n:ib,_:jb,Ya:mb,Ea:nb,Ga:ob,Za:pb,Wa:qb,Pa:rb,Va:sb,ka:tb,Fa:ub,Ca:vb,Xa:wb,Da:xb,cb:yb,ea:zb,xa:Ab,va:Bb,da:Cb,O:Db,H:Eb,wa:Fb,Z:Gb,ya:Hb,Sa:Ib,Aa:Jb,Ja:Kb,ta:Lb,fa:Mb,Ra:Ha,$a:Nb,R:Ob,s:Pb,c:Qb,ib:Rb,y:Sb,M:Tb,D:Ub,m:Vb,t:Wb,jb:Xb,I:Yb,S:Zb,j:$b,v:ac,r:bc,l:cc,Ma:dc,Na:ec,Oa:fc,Ka:gc,La:hc,ua:ic,eb:jc,bb:kc,u:lc,aa:mc,ga:nc,ab:oc,V:pc,_a:qc,Ba:rc,F:sc,U:tc,la:uc,za:vc,gb:wc,fb:xc,Ta:yc,Ua:zc,Ha:Ac,$:Bc,ja:Cc,Qa:Dc,ia:Ec, +lb:Fc,na:Gc,mb:Hc,oa:Ic,G:Jc,d:Kc,q:Lc,w:Mc,B:Nc,pb:Oc,K:Pc,x:Qc,pa:Rc,X:Sc,ba:Tc,nb:Uc,ob:Vc,ra:Wc,qa:Xc,qb:Yc,N:Zc,Y:$c,e:ad,A:bd,k:cd,kb:dd,p:ed,z:fd,C:gd,E:hd,L:jd,rb:kd,Q:ld,ca:md,W:nd,sb:od,sa:pd,P:qd,i:rd,a:x,db:sd};return{a:Xa}} +async function Ca(){function a(c,e){var g=G=c.exports;c={};for(let [k,l]of Object.entries(g))"function"==typeof l?(g=td(l),c[k]=g):c[k]=l;G=c;G=ud();vd.push(G.$b);c=G;wd=c.ub;Ia=c.vb;f._OrtInit=c.wb;f._OrtGetLastError=c.xb;f._OrtCreateSessionOptions=c.yb;f._OrtAppendExecutionProvider=c.zb;f._OrtAddFreeDimensionOverride=c.Ab;f._OrtAddSessionConfigEntry=c.Bb;f._OrtReleaseSessionOptions=c.Cb;f._OrtCreateSession=c.Db;f._OrtReleaseSession=c.Eb;f._OrtGetInputOutputCount=c.Fb;f._OrtGetInputOutputMetadata= +c.Gb;f._OrtFree=c.Hb;f._OrtCreateTensor=c.Ib;f._OrtGetTensorData=c.Jb;f._OrtReleaseTensor=c.Kb;f._OrtCreateRunOptions=c.Lb;f._OrtAddRunConfigEntry=c.Mb;f._OrtReleaseRunOptions=c.Nb;f._OrtCreateBinding=c.Ob;f._OrtBindInput=c.Pb;f._OrtBindOutput=c.Qb;f._OrtClearBoundOutputs=c.Rb;f._OrtReleaseBinding=c.Sb;f._OrtRunWithBinding=c.Tb;f._OrtRun=c.Ub;f._OrtEndProfiling=c.Vb;f._JsepOutput=c.Wb;f._JsepGetNodeName=c.Xb;xd=c.Yb;I=f._free=c.Zb;yd=f._malloc=c._b;Fa=c.bc;La=c.cc;zd=c.dc;Ad=c.ec;Bd=c.fc;Cd=c.gc; +Dd=c.hc;J=c.ic;Ed=c.jc;Fd=c.kc;K=c.lc;Gd=c.mc;L=c.nc;Hd=c.oc;Id=c.pc;Jd=c.qc;Kd=c.rc;dynCall_vii=c.sc;Ld=c.tc;dynCall_v=c.uc;Md=c.vc;Nd=c.wc;dynCall_iii=c.xc;Od=c.yc;Pd=c.zc;Qd=c.Ac;Rd=c.Bc;dynCall_vi=c.Cc;Sd=c.Dc;Td=c.Ec;Ud=c.Fc;Vd=c.Gc;Wd=c.Hc;Xd=c.Ic;Yd=c.Jc;Zd=c.Kc;$d=c.Lc;ae=c.Mc;be=c.Nc;ce=c.Oc;de=c.Pc;ee=c.Rc;fe=c.Sc;ge=c.bd;he=c.cd;ie=c.hd;je=c.kd;ke=c.ld;le=c.md;me=c.nd;ne=c.od;oe=c.pd;pe=c.qd;qe=c.rd;re=c.wd;se=c.Rd;te=c.Sd;ue=c.Td;ve=c.Ud;ua=e;return G}var b=Wa();if(f.instantiateWasm)return new Promise(c=> +{f.instantiateWasm(b,(e,g)=>{c(a(e,g))})});if(m){var d=new WebAssembly.Instance(ua,Wa());return a(d,ua)}Sa??=f.locateFile?f.locateFile?f.locateFile("ort-wasm-simd-threaded.jsep.wasm",ka):ka+"ort-wasm-simd-threaded.jsep.wasm":(new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url)).href;return function(c){return a(c.instance,c.module)}(await Va(b))}class we{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}} +var xe=a=>{a.terminate();a.onmessage=()=>{}},ye=[],ze=0,Ae=null,Ee=a=>{0==M.length&&(Be(),Ce(M[0]));var b=M.pop();if(!b)return 6;De.push(b);N[a.Tc]=b;b.Tc=a.Tc;var d={Uc:"run",Pd:a.Od,dd:a.dd,Tc:a.Tc};h&&b.unref();b.postMessage(d,a.ud);return 0},O=0,P=(a,b,...d)=>{var c=16*d.length,e=L(),g=Gd(c),k=g>>>3,l;for(l of d)"bigint"==typeof l?((u(),F)[k++>>>0]=1n,(u(),F)[k++>>>0]=l):((u(),F)[k++>>>0]=0n,(u(),E)[k++>>>0]=l);a=zd(a,0,c,g,b);K(e);return a}; +function sd(a){if(m)return P(0,1,a);va=a;if(!(0{va=a;if(m)throw Fe(a),"unwind";sd(a)},M=[],De=[],vd=[],N={};function Ge(){for(var a=f.numThreads-1;a--;)Be();ye.push(async()=>{var b=He();ze++;await b;ze--;0==ze&&Ae&&(b=Ae,Ae=null,b())})}var Ie=a=>{var b=a.Tc;delete N[b];M.push(a);De.splice(De.indexOf(a),1);a.Tc=0;Ad(b)};function Ga(){vd.forEach(a=>a())} +var Ce=a=>new Promise(b=>{a.onmessage=g=>{var k=g.data;g=k.Uc;if(k.ad&&k.ad!=xd()){var l=N[k.ad];l?l.postMessage(k,k.ud):r(`Internal error! Worker sent a message "${g}" to target pthread ${k.ad}, but that thread no longer exists!`)}else if("checkMailbox"===g)Ka();else if("spawnThread"===g)Ee(k);else if("cleanupThread"===g)Je(()=>{Ie(N[k.Qd])});else if("loaded"===g)a.loaded=!0,h&&!a.Tc&&a.unref(),b(a);else if("setimmediate"===k.target)a.postMessage(k);else if("uncaughtException"===g)a.onerror(k.error); +else if("callHandler"===g)f[k.zd](...k.args);else g&&r(`worker sent an unknown command ${g}`)};a.onerror=g=>{r(`${"worker sent an error!"} ${g.filename}:${g.lineno}: ${g.message}`);throw g;};h&&(a.on("message",g=>a.onmessage({data:g})),a.on("error",g=>a.onerror(g)));var d=[],c=[],e;for(e of c)f.propertyIsEnumerable(e)&&d.push(e);a.postMessage({Uc:"load",Ad:d,Vd:x,Wd:ua})});async function He(){if(!m)return Promise.all(M.map(Ce))} +function Be(){var a=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});M.push(a)}function Ea(a){var b=(u(),D)[a+52>>>2>>>0];a=(u(),D)[a+56>>>2>>>0];Fd(b,b-a);K(b)}var Ja=(a,b)=>{O=0;a=Ld(a,b);0>>=0;var b=new Me(a);0==(u(),A)[b.Vc+12>>>0]&&(Ne(b,!0),Le--);Oe(b,!1);Ke.push(b);return Kd(a)}var Q=0,ab=()=>{J(0,0);var a=Ke.pop();Hd(a.ed);Q=0}; +function Ne(a,b){b=b?1:0;(u(),A)[a.Vc+12>>>0]=b}function Oe(a,b){b=b?1:0;(u(),A)[a.Vc+13>>>0]=b}class Me{constructor(a){this.ed=a;this.Vc=a-24}}var Pe=a=>{var b=Q;if(!b)return Ed(0),0;var d=new Me(b);(u(),D)[d.Vc+16>>>2>>>0]=b;var c=(u(),D)[d.Vc+4>>>2>>>0];if(!c)return Ed(0),b;for(var e of a){if(0===e||e===c)break;if(Jd(e,c,d.Vc+16))return Ed(e),b}Ed(c);return b};function bb(){return Pe([])}function cb(a){return Pe([a>>>0])}function db(a,b,d,c){return Pe([a>>>0,b>>>0,d>>>0,c>>>0])} +var eb=()=>{var a=Ke.pop();a||H("no exception to throw");var b=a.ed;0==(u(),A)[a.Vc+13>>>0]&&(Ke.push(a),Oe(a,!0),Ne(a,!1),Le++);Id(b);Q=b;throw Q;};function fb(a,b,d){a>>>=0;var c=new Me(a);b>>>=0;d>>>=0;(u(),D)[c.Vc+16>>>2>>>0]=0;(u(),D)[c.Vc+4>>>2>>>0]=b;(u(),D)[c.Vc+8>>>2>>>0]=d;Id(a);Q=a;Le++;throw Q;}var gb=()=>Le;function Qe(a,b,d,c){return m?P(2,1,a,b,d,c):hb(a,b,d,c)} +function hb(a,b,d,c){a>>>=0;b>>>=0;d>>>=0;c>>>=0;if(!globalThis.SharedArrayBuffer)return 6;var e=[];if(m&&0===e.length)return Qe(a,b,d,c);a={Od:d,Tc:a,dd:c,ud:e};return m?(a.Uc="spawnThread",postMessage(a,e),0):Ee(a)}function ib(a){Q||=a>>>0;throw Q;} +var Re=globalThis.TextDecoder&&new TextDecoder,Se=(a,b,d,c)=>{d=b+d;if(c)return d;for(;a[b]&&!(b>=d);)++b;return b},Te=(a,b=0,d,c)=>{b>>>=0;d=Se(a,b,d,c);if(16e?c+=String.fromCharCode(e):(e-=65536,c+=String.fromCharCode(55296| +e>>10,56320|e&1023))}}else c+=String.fromCharCode(e)}return c},R=(a,b,d)=>(a>>>=0)?Te((u(),B),a,b,d):"";function jb(a,b,d){return m?P(3,1,a,b,d):0}function mb(a,b){if(m)return P(4,1,a,b)}function nb(a,b){if(m)return P(5,1,a,b)}function ob(a,b,d){if(m)return P(6,1,a,b,d)}function pb(a,b,d){return m?P(7,1,a,b,d):0}function qb(a,b){if(m)return P(8,1,a,b)}function rb(a,b,d){if(m)return P(9,1,a,b,d)}function sb(a,b,d,c){if(m)return P(10,1,a,b,d,c)}function tb(a,b,d,c){if(m)return P(11,1,a,b,d,c)} +function ub(a,b,d,c){if(m)return P(12,1,a,b,d,c)}function vb(a){if(m)return P(13,1,a)}function wb(a,b){if(m)return P(14,1,a,b)}function xb(a,b,d){if(m)return P(15,1,a,b,d)}var yb=()=>H(""),S=a=>{a>>>=0;for(var b="";;){var d=(u(),B)[a++>>>0];if(!d)return b;b+=String.fromCharCode(d)}},Ue={},Ve={},We={},Xe=class extends Error{constructor(a){super(a);this.name="BindingError"}}; +function Ye(a,b,d={}){var c=b.name;if(!a)throw new Xe(`type "${c}" must have a positive integer typeid pointer`);if(Ve.hasOwnProperty(a)){if(d.Bd)return;throw new Xe(`Cannot register type '${c}' twice`);}Ve[a]=b;delete We[a];Ue.hasOwnProperty(a)&&(b=Ue[a],delete Ue[a],b.forEach(e=>e()))}function T(a,b,d={}){return Ye(a,b,d)} +var Ze=(a,b,d)=>{switch(b){case 1:return d?c=>(u(),A)[c>>>0]:c=>(u(),B)[c>>>0];case 2:return d?c=>(u(),Ma)[c>>>1>>>0]:c=>(u(),Na)[c>>>1>>>0];case 4:return d?c=>(u(),C)[c>>>2>>>0]:c=>(u(),D)[c>>>2>>>0];case 8:return d?c=>(u(),F)[c>>>3>>>0]:c=>(u(),Pa)[c>>>3>>>0];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}}; +function zb(a,b,d,c,e){a>>>=0;d>>>=0;b=S(b>>>0);c=0n===c;let g=k=>k;if(c){const k=8*d;g=l=>BigInt.asUintN(k,l);e=g(e)}T(a,{name:b,Qc:g,Xc:(k,l)=>{"number"==typeof l&&(l=BigInt(l));return l},Wc:Ze(b,d,!c),Yc:null})}function Ab(a,b,d,c){a>>>=0;b=S(b>>>0);T(a,{name:b,Qc:function(e){return!!e},Xc:function(e,g){return g?d:c},Wc:function(e){return this.Qc((u(),B)[e>>>0])},Yc:null})}var $e=[],U=[0,1,,1,null,1,!0,1,!1,1];function Qb(a){a>>>=0;9{if(!a)throw new Xe(`Cannot use deleted val. handle = ${a}`);return U[a]},X=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=$e.pop()||U.length;U[b]=a;U[b+1]=1;return b}};function af(a){return this.Qc((u(),D)[a>>>2>>>0])}var bf={name:"emscripten::val",Qc:a=>{var b=V(a);Qb(a);return b},Xc:(a,b)=>X(b),Wc:af,Yc:null};function Bb(a){return T(a>>>0,bf)} +var cf=(a,b)=>{switch(b){case 4:return function(d){return this.Qc((u(),Oa)[d>>>2>>>0])};case 8:return function(d){return this.Qc((u(),E)[d>>>3>>>0])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}};function Cb(a,b,d){a>>>=0;d>>>=0;b=S(b>>>0);T(a,{name:b,Qc:c=>c,Xc:(c,e)=>e,Wc:cf(b,d),Yc:null})}function Db(a,b,d,c,e){a>>>=0;d>>>=0;b=S(b>>>0);let g=l=>l;if(0===c){var k=32-8*d;g=l=>l<>>k;e=g(e)}T(a,{name:b,Qc:g,Xc:(l,n)=>n,Wc:Ze(b,d,0!==c),Yc:null})} +function Eb(a,b,d){function c(g){var k=(u(),D)[g>>>2>>>0];g=(u(),D)[g+4>>>2>>>0];return new e((u(),A).buffer,g,k)}a>>>=0;var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][b];d=S(d>>>0);T(a,{name:d,Qc:c,Wc:c},{Bd:!0})} +var Y=(a,b,d)=>{var c=(u(),B);b>>>=0;if(0=k){if(b>=d)break;c[b++>>>0]=k}else if(2047>=k){if(b+1>=d)break;c[b++>>>0]=192|k>>6;c[b++>>>0]=128|k&63}else if(65535>=k){if(b+2>=d)break;c[b++>>>0]=224|k>>12;c[b++>>>0]=128|k>>6&63;c[b++>>>0]=128|k&63}else{if(b+3>=d)break;c[b++>>>0]=240|k>>18;c[b++>>>0]=128|k>>12&63;c[b++>>>0]=128|k>>6&63;c[b++>>>0]=128|k&63;g++}}c[b>>>0]=0;a=b-e}else a=0;return a},df=a=>{for(var b=0,d=0;d=c?b++:2047>=c?b+=2:55296<=c&&57343>=c?(b+=4,++d):b+=3}return b}; +function Fb(a,b){a>>>=0;b=S(b>>>0);T(a,{name:b,Qc(d){var c=(u(),D)[d>>>2>>>0];c=R(d+4,c,!0);I(d);return c},Xc(d,c){c instanceof ArrayBuffer&&(c=new Uint8Array(c));var e="string"==typeof c;if(!(e||ArrayBuffer.isView(c)&&1==c.BYTES_PER_ELEMENT))throw new Xe("Cannot pass non-string to std::string");var g=e?df(c):c.length;var k=yd(4+g+1),l=k+4;(u(),D)[k>>>2>>>0]=g;e?Y(c,l,g+1):(u(),B).set(c,l>>>0);null!==d&&d.push(I,k);return k},Wc:af,Yc(d){I(d)}})} +var ef=globalThis.TextDecoder?new TextDecoder("utf-16le"):void 0,ff=(a,b,d)=>{a>>>=1;b=Se((u(),Na),a,b/2,d);if(16>>0];d+=String.fromCharCode(c)}return d},gf=(a,b,d)=>{d??=2147483647;if(2>d)return 0;d-=2;var c=b;d=d<2*a.length?d/2:a.length;for(var e=0;e>>1>>>0]=g;b+=2}(u(),Ma)[b>>>1>>>0]=0;return b-c},hf=a=>2*a.length,jf=(a,b,d)=>{var c="";a>>>=2;for(var e=0;!(e>=b/4);e++){var g= +(u(),D)[a+e>>>0];if(!g&&!d)break;c+=String.fromCodePoint(g)}return c},kf=(a,b,d)=>{b>>>=0;d??=2147483647;if(4>d)return 0;var c=b;d=c+d-4;for(var e=0;e>>2>>>0]=g;b+=4;if(b+4>d)break}(u(),C)[b>>>2>>>0]=0;return b-c},lf=a=>{for(var b=0,d=0;d>>=0;b>>>=0;d>>>=0;d=S(d);if(2===b){var c=ff;var e=gf;var g=hf}else c=jf,e=kf,g=lf;T(a,{name:d,Qc:k=>{var l=(u(),D)[k>>>2>>>0];l=c(k+4,l*b,!0);I(k);return l},Xc:(k,l)=>{if("string"!=typeof l)throw new Xe(`Cannot pass non-string to C++ string type ${d}`);var n=g(l),p=yd(4+n+b);(u(),D)[p>>>2>>>0]=n/b;e(l,p+4,n+b);null!==k&&k.push(I,p);return p},Wc:af,Yc(k){I(k)}})}function Hb(a,b){a>>>=0;b=S(b>>>0);T(a,{Cd:!0,name:b,Qc:()=>{},Xc:()=>{}})} +function Ib(a){Fa(a>>>0,!ba,1,!aa,131072,!1);Ga()}var Je=a=>{if(!t)try{if(a(),!(0Number((navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)||[])[2]);function Ha(a){a>>>=0;mf||(Atomics.waitAsync((u(),C),a>>>2,a).value.then(Ka),a+=128,Atomics.store((u(),C),a>>>2,1))}var Ka=()=>Je(()=>{var a=xd();a&&(Ha(a),Dd())}); +function Jb(a,b){a>>>=0;a==b>>>0?setTimeout(Ka):m?postMessage({ad:a,Uc:"checkMailbox"}):(a=N[a])&&a.postMessage({Uc:"checkMailbox"})}var nf=[];function Kb(a,b,d,c,e){b>>>=0;e>>>=0;nf.length=0;d=e>>>3;for(c=e+c>>>3;d>>0]?g=(u(),F)[d++>>>0]:g=(u(),E)[d++>>>0];nf.push(g)}return(b?of[b]:pf[a])(...nf)}var Lb=()=>{O=0};function Mb(a){a>>>=0;m?postMessage({Uc:"cleanupThread",Qd:a}):Ie(N[a])}function Nb(a){h&&N[a>>>0].ref()}var qf=a=>{try{a()}catch(b){H(b)}}; +function td(a){var b=(...d)=>{rf.push(a);try{return a(...d)}finally{t||(rf.pop(),q&&1===Z&&0===rf.length&&(Z=0,O+=1,qf(te),"undefined"!=typeof Fibers&&Fibers.ce()))}};sf.set(a,b);return b}var Z=0,q=null,tf=0,rf=[],uf=new Map,vf=new Map,sf=new Map,wf=0,xf=null,yf=[];function ea(){return new Promise((a,b)=>{xf={resolve:a,reject:b}})} +function zf(){var a=yd(65548),b=a+12;(u(),D)[a>>>2>>>0]=b;(u(),D)[a+4>>>2>>>0]=b+65536;b=rf[0];if(!uf.has(b)){var d=wf++;uf.set(b,d);vf.set(d,b)}b=uf.get(b);(u(),C)[a+8>>>2>>>0]=b;return a}function Af(){var a=(u(),C)[q+8>>>2>>>0];a=vf.get(a);a=sf.get(a);--O;return a()} +function Bf(a){if(!t){if(0===Z){var b=!1,d=!1;a((c=0)=>{if(!t&&(tf=c,b=!0,d)){Z=2;qf(()=>ue(q));"undefined"!=typeof MainLoop&&MainLoop.yd&&MainLoop.resume();c=!1;try{var e=Af()}catch(l){e=l,c=!0}var g=!1;if(!q){var k=xf;k&&(xf=null,(c?k.reject:k.resolve)(e),g=!0)}if(c&&!g)throw e;}});d=!0;b||(Z=1,q=zf(),"undefined"!=typeof MainLoop&&MainLoop.yd&&MainLoop.pause(),qf(()=>se(q)))}else 2===Z?(Z=0,qf(ve),I(q),q=null,yf.forEach(Je)):H(`invalid state: ${Z}`);return tf}}var Cf=a=>Bf(b=>{a().then(b)}); +function Ob(a){a>>>=0;return Cf(async()=>{var b=await V(a);return X(b)})}var Df=[],Ef=a=>{var b=Df.length;Df.push(a);return b},Ff=(a,b)=>{for(var d=Array(a),c=0;c>>2>>>0],k=Ve[g];if(void 0===k)throw a=`parameter ${c}`,g=wd(g),b=S(g),I(g),new Xe(`${a} has unknown type ${b}`);d[e]=k}return d},Gf=(a,b,d)=>{var c=[];a=a(c,d);c.length&&((u(),D)[b>>>2>>>0]=X(c));return a},Hf={},If=a=>{var b=Hf[a];return void 0===b?S(a):b}; +function Pb(a,b,d){var [c,...e]=Ff(a,b>>>0);b=c.Xc.bind(c);var g=e.map(n=>n.Wc.bind(n));a--;var k={toValue:V};a=g.map((n,p)=>{var v=`argFromPtr${p}`;k[v]=n;return`${v}(args${p?"+"+8*p:""})`});switch(d){case 0:var l="toValue(handle)";break;case 2:l="new (toValue(handle))";break;case 3:l="";break;case 1:k.getStringOrSymbol=If,l="toValue(handle)[getStringOrSymbol(methodName)]"}l+=`(${a})`;c.Cd||(k.toReturnWire=b,k.emval_returnValue=Gf,l=`return emval_returnValue(toReturnWire, destructorsRef, ${l})`); +l=`return function (handle, methodName, destructorsRef, args) {\n ${l}\n }`;d=(new Function(Object.keys(k),l))(...Object.values(k));l=`methodCaller<(${e.map(n=>n.name)}) => ${c.name}>`;return Ef(Object.defineProperty(d,"name",{value:l}))}function Rb(a,b){b>>>=0;a=V(a>>>0);b=V(b);return a==b}function Sb(a){a>>>=0;if(!a)return X(globalThis);a=If(a);return X(globalThis[a])}function Tb(a){a=If(a>>>0);return X(f[a])}function Ub(a,b){b>>>=0;a=V(a>>>0);b=V(b);return X(a[b])} +function Vb(a){a>>>=0;9>>0](b>>>0,d>>>0,c>>>0,e>>>0)}function Xb(a,b,d,c,e){return Wb(a>>>0,b>>>0,d>>>0,c>>>0,e>>>0)}function Yb(){return X([])}function Zb(a){a=V(a>>>0);for(var b=Array(a.length),d=0;d>>0))}function ac(){return X({})}function bc(a){a>>>=0;for(var b=V(a);b.length;){var d=b.pop();b.pop()(d)}Qb(a)}function cc(a,b,d){b>>>=0;d>>>=0;a=V(a>>>0);b=V(b);d=V(d);a[b]=d} +function dc(a,b){a=-9007199254740992>a||9007199254740992>>=0;a=new Date(1E3*a);(u(),C)[b>>>2>>>0]=a.getUTCSeconds();(u(),C)[b+4>>>2>>>0]=a.getUTCMinutes();(u(),C)[b+8>>>2>>>0]=a.getUTCHours();(u(),C)[b+12>>>2>>>0]=a.getUTCDate();(u(),C)[b+16>>>2>>>0]=a.getUTCMonth();(u(),C)[b+20>>>2>>>0]=a.getUTCFullYear()-1900;(u(),C)[b+24>>>2>>>0]=a.getUTCDay();a=(a.getTime()-Date.UTC(a.getUTCFullYear(),0,1,0,0,0,0))/864E5|0;(u(),C)[b+28>>>2>>>0]=a} +var Jf=a=>0===a%4&&(0!==a%100||0===a%400),Kf=[0,31,60,91,121,152,182,213,244,274,305,335],Lf=[0,31,59,90,120,151,181,212,243,273,304,334]; +function ec(a,b){a=-9007199254740992>a||9007199254740992>>=0;a=new Date(1E3*a);(u(),C)[b>>>2>>>0]=a.getSeconds();(u(),C)[b+4>>>2>>>0]=a.getMinutes();(u(),C)[b+8>>>2>>>0]=a.getHours();(u(),C)[b+12>>>2>>>0]=a.getDate();(u(),C)[b+16>>>2>>>0]=a.getMonth();(u(),C)[b+20>>>2>>>0]=a.getFullYear()-1900;(u(),C)[b+24>>>2>>>0]=a.getDay();var d=(Jf(a.getFullYear())?Kf:Lf)[a.getMonth()]+a.getDate()-1|0;(u(),C)[b+28>>>2>>>0]=d;(u(),C)[b+36>>>2>>>0]=-(60*a.getTimezoneOffset());d=(new Date(a.getFullYear(), +6,1)).getTimezoneOffset();var c=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();a=(d!=c&&a.getTimezoneOffset()==Math.min(c,d))|0;(u(),C)[b+32>>>2>>>0]=a} +function fc(a){a>>>=0;var b=new Date((u(),C)[a+20>>>2>>>0]+1900,(u(),C)[a+16>>>2>>>0],(u(),C)[a+12>>>2>>>0],(u(),C)[a+8>>>2>>>0],(u(),C)[a+4>>>2>>>0],(u(),C)[a>>>2>>>0],0),d=(u(),C)[a+32>>>2>>>0],c=b.getTimezoneOffset(),e=(new Date(b.getFullYear(),6,1)).getTimezoneOffset(),g=(new Date(b.getFullYear(),0,1)).getTimezoneOffset(),k=Math.min(g,e);0>d?(u(),C)[a+32>>>2>>>0]=Number(e!=g&&k==c):0>>2>>>0]=b.getDay();d=(Jf(b.getFullYear())? +Kf:Lf)[b.getMonth()]+b.getDate()-1|0;(u(),C)[a+28>>>2>>>0]=d;(u(),C)[a>>>2>>>0]=b.getSeconds();(u(),C)[a+4>>>2>>>0]=b.getMinutes();(u(),C)[a+8>>>2>>>0]=b.getHours();(u(),C)[a+12>>>2>>>0]=b.getDate();(u(),C)[a+16>>>2>>>0]=b.getMonth();(u(),C)[a+20>>>2>>>0]=b.getYear();a=b.getTime();return BigInt(isNaN(a)?-1:a/1E3)}function gc(a,b,d,c,e,g,k){return m?P(16,1,a,b,d,c,e,g,k):-52}function hc(a,b,d,c,e,g){if(m)return P(17,1,a,b,d,c,e,g)}var Mf={},sc=()=>performance.timeOrigin+performance.now(); +function ic(a,b){if(m)return P(18,1,a,b);Mf[a]&&(clearTimeout(Mf[a].id),delete Mf[a]);if(!b)return 0;var d=setTimeout(()=>{delete Mf[a];Je(()=>Cd(a,performance.timeOrigin+performance.now()))},b);Mf[a]={id:d,be:b};return 0} +function jc(a,b,d,c){a>>>=0;b>>>=0;d>>>=0;c>>>=0;var e=(new Date).getFullYear(),g=(new Date(e,0,1)).getTimezoneOffset();e=(new Date(e,6,1)).getTimezoneOffset();var k=Math.max(g,e);(u(),D)[a>>>2>>>0]=60*k;(u(),C)[b>>>2>>>0]=Number(g!=e);b=l=>{var n=Math.abs(l);return`UTC${0<=l?"-":"+"}${String(Math.floor(n/60)).padStart(2,"0")}${String(n%60).padStart(2,"0")}`};a=b(g);b=b(e);eDate.now(),Nf=1; +function kc(a,b,d){d>>>=0;if(!(0<=a&&3>=a))return 28;if(0===a)a=Date.now();else if(Nf)a=performance.timeOrigin+performance.now();else return 52;a=Math.round(1E6*a);(u(),F)[d>>>3>>>0]=BigInt(a);return 0}var Of=[],Pf=(a,b)=>{Of.length=0;for(var d;d=(u(),B)[a++>>>0];){var c=105!=d;c&=112!=d;b+=c&&b%8?4:0;Of.push(112==d?(u(),D)[b>>>2>>>0]:106==d?(u(),F)[b>>>3>>>0]:105==d?(u(),C)[b>>>2>>>0]:(u(),E)[b>>>3>>>0]);b+=c?8:4}return Of};function lc(a,b,d){a>>>=0;b=Pf(b>>>0,d>>>0);return of[a](...b)} +function mc(a,b,d){a>>>=0;b=Pf(b>>>0,d>>>0);return of[a](...b)}var nc=()=>{};function pc(a,b){return r(R(a>>>0,b>>>0))}var qc=()=>{O+=1;throw"unwind";};function rc(){return 4294901760}var tc=()=>h?require("os").cpus().length:navigator.hardwareConcurrency,Qf={},Rf=a=>{var b;return(b=/\bwasm-function\[\d+\]:(0x[0-9a-f]+)/.exec(a))?+b[1]:(b=/:(\d+):\d+(?:\)|$)/.exec(a))?2147483648|+b[1]:0},Sf=a=>{for(var b of a)(a=Rf(b))&&(Qf[a]=b)}; +function wc(){var a=Error().stack.toString().split("\n");"Error"==a[0]&&a.shift();Sf(a);Qf.sd=Rf(a[3]);Qf.Md=a;return Qf.sd}function uc(a){a=Qf[a>>>0];if(!a)return 0;var b;if(b=/^\s+at .*\.wasm\.(.*) \(.*\)$/.exec(a))a=b[1];else if(b=/^\s+at (.*) \(.*\)$/.exec(a))a=b[1];else if(b=/^(.+?)@/.exec(a))a=b[1];else return 0;I(uc.td??0);b=df(a)+1;var d=yd(b);d&&Y(a,d,b);uc.td=d;return uc.td} +function vc(a){a>>>=0;var b=(u(),B).length;if(a<=b||4294901760=d;d*=2){var c=b*(1+.2/d);c=Math.min(c,a+100663296);a:{c=(Math.min(4294901760,65536*Math.ceil(Math.max(a,c)/65536))-x.buffer.byteLength+65535)/65536|0;try{x.grow(c);wa();var e=1;break a}catch(g){}e=void 0}if(e)return!0}return!1} +function xc(a,b,d){a>>>=0;b>>>=0;if(Qf.sd==a)var c=Qf.Md;else c=Error().stack.toString().split("\n"),"Error"==c[0]&&c.shift(),Sf(c);for(var e=3;c[e]&&Rf(c[e])!=a;)++e;for(a=0;a>>2>>>0]=Rf(c[a+e]);return a} +var Tf={},Vf=()=>{if(!Uf){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",_:ha||"./this.program"},b;for(b in Tf)void 0===Tf[b]?delete a[b]:a[b]=Tf[b];var d=[];for(b in a)d.push(`${b}=${a[b]}`);Uf=d}return Uf},Uf;function yc(a,b){if(m)return P(19,1,a,b);a>>>=0;b>>>=0;var d=0,c=0,e;for(e of Vf()){var g=b+d;(u(),D)[a+c>>>2>>>0]=g;d+=Y(e,g,Infinity)+1;c+=4}return 0} +function zc(a,b){if(m)return P(20,1,a,b);a>>>=0;b>>>=0;var d=Vf();(u(),D)[a>>>2>>>0]=d.length;a=0;for(var c of d)a+=df(c)+1;(u(),D)[b>>>2>>>0]=a;return 0}function Bc(a){return m?P(21,1,a):52}function Cc(a,b,d,c){return m?P(22,1,a,b,d,c):52}function Dc(a,b,d,c){return m?P(23,1,a,b,d,c):70}var Wf=[null,[],[]]; +function Ec(a,b,d,c){if(m)return P(24,1,a,b,d,c);b>>>=0;d>>>=0;c>>>=0;for(var e=0,g=0;g>>2>>>0],l=(u(),D)[b+4>>>2>>>0];b+=8;for(var n=0;n>>0],w=Wf[p];0===v||10===v?((1===p?sa:r)(Te(w)),w.length=0):w.push(v)}e+=l}(u(),D)[c>>>2>>>0]=e;return 0}function rd(a){return a>>>0}m||Ge();m||(x=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),wa());f.wasmBinary&&(ta=f.wasmBinary);f.stackSave=()=>L();f.stackRestore=a=>K(a);f.stackAlloc=a=>Gd(a); +f.setValue=function(a,b,d="i8"){d.endsWith("*")&&(d="*");switch(d){case "i1":(u(),A)[a>>>0]=b;break;case "i8":(u(),A)[a>>>0]=b;break;case "i16":(u(),Ma)[a>>>1>>>0]=b;break;case "i32":(u(),C)[a>>>2>>>0]=b;break;case "i64":(u(),F)[a>>>3>>>0]=BigInt(b);break;case "float":(u(),Oa)[a>>>2>>>0]=b;break;case "double":(u(),E)[a>>>3>>>0]=b;break;case "*":(u(),D)[a>>>2>>>0]=b;break;default:H(`invalid type for setValue: ${d}`)}}; +f.getValue=function(a,b="i8"){b.endsWith("*")&&(b="*");switch(b){case "i1":return(u(),A)[a>>>0];case "i8":return(u(),A)[a>>>0];case "i16":return(u(),Ma)[a>>>1>>>0];case "i32":return(u(),C)[a>>>2>>>0];case "i64":return(u(),F)[a>>>3>>>0];case "float":return(u(),Oa)[a>>>2>>>0];case "double":return(u(),E)[a>>>3>>>0];case "*":return(u(),D)[a>>>2>>>0];default:H(`invalid type for getValue: ${b}`)}};f.UTF8ToString=R;f.stringToUTF8=Y;f.lengthBytesUTF8=df; +var pf=[sd,Fe,Qe,jb,mb,nb,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,gc,hc,ic,yc,zc,Bc,Cc,Dc,Ec],of={929356:(a,b,d,c,e)=>{if("undefined"==typeof f||!f.Zc)return 1;a=R(Number(a>>>0));a.startsWith("./")&&(a=a.substring(2));a=f.Zc.get(a);if(!a)return 2;b=Number(b>>>0);d=Number(d>>>0);c=Number(c>>>0);if(b+d>a.byteLength)return 3;try{const g=a.subarray(b,b+d);switch(e){case 0:(u(),B).set(g,c>>>0);break;case 1:f.Xd?f.Xd(c,g):f.Ld(c,g);break;default:return 4}return 0}catch{return 4}},930180:(a,b,d)=>{f.xd(a,(u(),B).subarray(b>>> +0,b+d>>>0))},930244:()=>f.Zd(),930286:a=>{f.vd(a)},930323:()=>{f.Ed()},930354:()=>{f.Fd()},930383:()=>{f.Jd()},930408:a=>f.Dd(a),930441:a=>f.Hd(a),930473:(a,b,d)=>{f.jd(Number(a),Number(b),Number(d),!0)},930536:(a,b,d)=>{f.jd(Number(a),Number(b),Number(d))},930593:()=>"undefined"!==typeof wasmOffsetConverter,930650:a=>{f.ac("Abs",a,void 0)},930701:a=>{f.ac("Neg",a,void 0)},930752:a=>{f.ac("Floor",a,void 0)},930805:a=>{f.ac("Ceil",a,void 0)},930857:a=>{f.ac("Reciprocal",a,void 0)},930915:a=>{f.ac("Sqrt", +a,void 0)},930967:a=>{f.ac("Exp",a,void 0)},931018:a=>{f.ac("Erf",a,void 0)},931069:a=>{f.ac("Sigmoid",a,void 0)},931124:(a,b,d)=>{f.ac("HardSigmoid",a,{alpha:b,beta:d})},931203:a=>{f.ac("Log",a,void 0)},931254:a=>{f.ac("Sin",a,void 0)},931305:a=>{f.ac("Cos",a,void 0)},931356:a=>{f.ac("Tan",a,void 0)},931407:a=>{f.ac("Asin",a,void 0)},931459:a=>{f.ac("Acos",a,void 0)},931511:a=>{f.ac("Atan",a,void 0)},931563:a=>{f.ac("Sinh",a,void 0)},931615:a=>{f.ac("Cosh",a,void 0)},931667:a=>{f.ac("Asinh",a,void 0)}, +931720:a=>{f.ac("Acosh",a,void 0)},931773:a=>{f.ac("Atanh",a,void 0)},931826:a=>{f.ac("Tanh",a,void 0)},931878:a=>{f.ac("Not",a,void 0)},931929:(a,b,d)=>{f.ac("Clip",a,{min:b,max:d})},931998:a=>{f.ac("Clip",a,void 0)},932050:(a,b)=>{f.ac("Elu",a,{alpha:b})},932108:a=>{f.ac("Gelu",a,void 0)},932160:a=>{f.ac("Relu",a,void 0)},932212:(a,b)=>{f.ac("LeakyRelu",a,{alpha:b})},932276:(a,b)=>{f.ac("ThresholdedRelu",a,{alpha:b})},932346:(a,b)=>{f.ac("Cast",a,{to:b})},932404:a=>{f.ac("Add",a,void 0)},932455:a=> +{f.ac("Sub",a,void 0)},932506:a=>{f.ac("Mul",a,void 0)},932557:a=>{f.ac("Div",a,void 0)},932608:a=>{f.ac("Pow",a,void 0)},932659:a=>{f.ac("Equal",a,void 0)},932712:a=>{f.ac("Greater",a,void 0)},932767:a=>{f.ac("GreaterOrEqual",a,void 0)},932829:a=>{f.ac("Less",a,void 0)},932881:a=>{f.ac("LessOrEqual",a,void 0)},932940:(a,b,d,c,e)=>{f.ac("ReduceMean",a,{keepDims:!!b,noopWithEmptyAxes:!!d,axes:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},933115:(a,b,d,c,e)=>{f.ac("ReduceMax",a, +{keepDims:!!b,noopWithEmptyAxes:!!d,axes:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},933289:(a,b,d,c,e)=>{f.ac("ReduceMin",a,{keepDims:!!b,noopWithEmptyAxes:!!d,axes:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},933463:(a,b,d,c,e)=>{f.ac("ReduceProd",a,{keepDims:!!b,noopWithEmptyAxes:!!d,axes:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},933638:(a,b,d,c,e)=>{f.ac("ReduceSum",a,{keepDims:!!b,noopWithEmptyAxes:!!d,axes:c?Array.from((u(), +C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},933812:(a,b,d,c,e)=>{f.ac("ReduceL1",a,{keepDims:!!b,noopWithEmptyAxes:!!d,axes:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},933985:(a,b,d,c,e)=>{f.ac("ReduceL2",a,{keepDims:!!b,noopWithEmptyAxes:!!d,axes:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},934158:(a,b,d,c,e)=>{f.ac("ReduceLogSum",a,{keepDims:!!b,noopWithEmptyAxes:!!d,axes:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},934335:(a,b, +d,c,e)=>{f.ac("ReduceSumSquare",a,{keepDims:!!b,noopWithEmptyAxes:!!d,axes:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},934515:(a,b,d,c,e)=>{f.ac("ReduceLogSumExp",a,{keepDims:!!b,noopWithEmptyAxes:!!d,axes:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},934695:a=>{f.ac("Where",a,void 0)},934748:(a,b,d)=>{f.ac("Transpose",a,{perm:b?Array.from((u(),C).subarray(Number(b)>>>0,Number(d)>>>0)):[]})},934872:(a,b,d,c)=>{f.ac("DepthToSpace",a,{blocksize:b,mode:R(d), +format:c?"NHWC":"NCHW"})},935005:(a,b,d,c)=>{f.ac("DepthToSpace",a,{blocksize:b,mode:R(d),format:c?"NHWC":"NCHW"})},935138:(a,b,d,c,e,g,k,l,n,p,v,w,y,z,W)=>{f.ac("ConvTranspose",a,{format:n?"NHWC":"NCHW",autoPad:b,dilations:[d],group:c,kernelShape:[e],pads:[g,k],strides:[l],wIsConst:()=>!!(u(),A)[p>>>0],outputPadding:v?Array.from((u(),C).subarray(Number(v)>>>0,Number(w)>>>0)):[],outputShape:y?Array.from((u(),C).subarray(Number(y)>>>0,Number(z)>>>0)):[],activation:R(W)})},935571:(a,b,d,c,e,g,k,l,n, +p,v,w,y,z)=>{f.ac("ConvTranspose",a,{format:l?"NHWC":"NCHW",autoPad:b,dilations:Array.from((u(),C).subarray(Number(d)>>>0,(Number(d)>>>0)+2>>>0)),group:c,kernelShape:Array.from((u(),C).subarray(Number(e)>>>0,(Number(e)>>>0)+2>>>0)),pads:Array.from((u(),C).subarray(Number(g)>>>0,(Number(g)>>>0)+4>>>0)),strides:Array.from((u(),C).subarray(Number(k)>>>0,(Number(k)>>>0)+2>>>0)),wIsConst:()=>!!(u(),A)[n>>>0],outputPadding:p?Array.from((u(),C).subarray(Number(p)>>>0,Number(v)>>>0)):[],outputShape:w?Array.from((u(), +C).subarray(Number(w)>>>0,Number(y)>>>0)):[],activation:R(z)})},936232:(a,b,d,c,e,g,k,l,n,p,v,w,y,z,W)=>{f.ac("ConvTranspose",a,{format:n?"NHWC":"NCHW",autoPad:b,dilations:[d],group:c,kernelShape:[e],pads:[g,k],strides:[l],wIsConst:()=>!!(u(),A)[p>>>0],outputPadding:v?Array.from((u(),C).subarray(Number(v)>>>0,Number(w)>>>0)):[],outputShape:y?Array.from((u(),C).subarray(Number(y)>>>0,Number(z)>>>0)):[],activation:R(W)})},936665:(a,b,d,c,e,g,k,l,n,p,v,w,y,z)=>{f.ac("ConvTranspose",a,{format:l?"NHWC": +"NCHW",autoPad:b,dilations:Array.from((u(),C).subarray(Number(d)>>>0,(Number(d)>>>0)+2>>>0)),group:c,kernelShape:Array.from((u(),C).subarray(Number(e)>>>0,(Number(e)>>>0)+2>>>0)),pads:Array.from((u(),C).subarray(Number(g)>>>0,(Number(g)>>>0)+4>>>0)),strides:Array.from((u(),C).subarray(Number(k)>>>0,(Number(k)>>>0)+2>>>0)),wIsConst:()=>!!(u(),A)[n>>>0],outputPadding:p?Array.from((u(),C).subarray(Number(p)>>>0,Number(v)>>>0)):[],outputShape:w?Array.from((u(),C).subarray(Number(w)>>>0,Number(y)>>>0)): +[],activation:R(z)})},937326:(a,b)=>{f.ac("GlobalAveragePool",a,{format:b?"NHWC":"NCHW"})},937417:(a,b,d,c,e,g,k,l,n,p,v,w,y,z)=>{f.ac("AveragePool",a,{format:z?"NHWC":"NCHW",auto_pad:b,ceil_mode:d,count_include_pad:c,storage_order:e,dilations:g?Array.from((u(),C).subarray(Number(g)>>>0,Number(k)>>>0)):[],kernel_shape:l?Array.from((u(),C).subarray(Number(l)>>>0,Number(n)>>>0)):[],pads:p?Array.from((u(),C).subarray(Number(p)>>>0,Number(v)>>>0)):[],strides:w?Array.from((u(),C).subarray(Number(w)>>> +0,Number(y)>>>0)):[]})},937896:(a,b)=>{f.ac("GlobalAveragePool",a,{format:b?"NHWC":"NCHW"})},937987:(a,b,d,c,e,g,k,l,n,p,v,w,y,z)=>{f.ac("AveragePool",a,{format:z?"NHWC":"NCHW",auto_pad:b,ceil_mode:d,count_include_pad:c,storage_order:e,dilations:g?Array.from((u(),C).subarray(Number(g)>>>0,Number(k)>>>0)):[],kernel_shape:l?Array.from((u(),C).subarray(Number(l)>>>0,Number(n)>>>0)):[],pads:p?Array.from((u(),C).subarray(Number(p)>>>0,Number(v)>>>0)):[],strides:w?Array.from((u(),C).subarray(Number(w)>>> +0,Number(y)>>>0)):[]})},938466:(a,b)=>{f.ac("GlobalMaxPool",a,{format:b?"NHWC":"NCHW"})},938553:(a,b,d,c,e,g,k,l,n,p,v,w,y,z)=>{f.ac("MaxPool",a,{format:z?"NHWC":"NCHW",auto_pad:b,ceil_mode:d,count_include_pad:c,storage_order:e,dilations:g?Array.from((u(),C).subarray(Number(g)>>>0,Number(k)>>>0)):[],kernel_shape:l?Array.from((u(),C).subarray(Number(l)>>>0,Number(n)>>>0)):[],pads:p?Array.from((u(),C).subarray(Number(p)>>>0,Number(v)>>>0)):[],strides:w?Array.from((u(),C).subarray(Number(w)>>>0,Number(y)>>> +0)):[]})},939028:(a,b)=>{f.ac("GlobalMaxPool",a,{format:b?"NHWC":"NCHW"})},939115:(a,b,d,c,e,g,k,l,n,p,v,w,y,z)=>{f.ac("MaxPool",a,{format:z?"NHWC":"NCHW",auto_pad:b,ceil_mode:d,count_include_pad:c,storage_order:e,dilations:g?Array.from((u(),C).subarray(Number(g)>>>0,Number(k)>>>0)):[],kernel_shape:l?Array.from((u(),C).subarray(Number(l)>>>0,Number(n)>>>0)):[],pads:p?Array.from((u(),C).subarray(Number(p)>>>0,Number(v)>>>0)):[],strides:w?Array.from((u(),C).subarray(Number(w)>>>0,Number(y)>>>0)):[]})}, +939590:(a,b,d,c,e)=>{f.ac("Gemm",a,{alpha:b,beta:d,transA:c,transB:e})},939694:a=>{f.ac("MatMul",a,void 0)},939748:(a,b,d,c)=>{f.ac("ArgMax",a,{keepDims:!!b,selectLastIndex:!!d,axis:c})},939856:(a,b,d,c)=>{f.ac("ArgMin",a,{keepDims:!!b,selectLastIndex:!!d,axis:c})},939964:(a,b)=>{f.ac("Softmax",a,{axis:b})},940027:(a,b)=>{f.ac("Concat",a,{axis:b})},940087:(a,b,d,c,e)=>{f.ac("Split",a,{axis:b,numOutputs:d,splitSizes:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},940243:a=>{f.ac("Expand", +a,void 0)},940297:(a,b)=>{f.ac("Gather",a,{axis:Number(b)})},940368:(a,b)=>{f.ac("GatherElements",a,{axis:Number(b)})},940447:(a,b)=>{f.ac("GatherND",a,{batch_dims:Number(b)})},940526:(a,b,d,c,e,g,k,l,n,p,v)=>{f.ac("Resize",a,{antialias:b,axes:d?Array.from((u(),C).subarray(Number(d)>>>0,Number(c)>>>0)):[],coordinateTransformMode:R(e),cubicCoeffA:g,excludeOutside:k,extrapolationValue:l,keepAspectRatioPolicy:R(n),mode:R(p),nearestMode:R(v)})},940888:(a,b,d,c,e,g,k)=>{f.ac("Slice",a,{starts:b?Array.from((u(), +C).subarray(Number(b)>>>0,Number(d)>>>0)):[],ends:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[],axes:g?Array.from((u(),C).subarray(Number(g)>>>0,Number(k)>>>0)):[]})},941152:a=>{f.ac("Tile",a,void 0)},941204:(a,b,d)=>{f.ac("InstanceNormalization",a,{epsilon:b,format:d?"NHWC":"NCHW"})},941318:(a,b,d)=>{f.ac("InstanceNormalization",a,{epsilon:b,format:d?"NHWC":"NCHW"})},941432:a=>{f.ac("Range",a,void 0)},941485:(a,b)=>{f.ac("Einsum",a,{equation:R(b)})},941566:(a,b,d,c,e)=>{f.ac("Pad", +a,{mode:b,value:d,pads:c?Array.from((u(),C).subarray(Number(c)>>>0,Number(e)>>>0)):[]})},941709:(a,b,d,c,e,g)=>{f.ac("BatchNormalization",a,{epsilon:b,momentum:d,spatial:!!e,trainingMode:!!c,format:g?"NHWC":"NCHW"})},941878:(a,b,d,c,e,g)=>{f.ac("BatchNormalization",a,{epsilon:b,momentum:d,spatial:!!e,trainingMode:!!c,format:g?"NHWC":"NCHW"})},942047:(a,b,d)=>{f.ac("CumSum",a,{exclusive:Number(b),reverse:Number(d)})},942144:(a,b,d)=>{f.ac("DequantizeLinear",a,{axis:b,blockSize:d})},942234:(a,b,d,c, +e)=>{f.ac("GridSample",a,{align_corners:b,mode:R(d),padding_mode:R(c),format:e?"NHWC":"NCHW"})},942404:(a,b,d,c,e)=>{f.ac("GridSample",a,{align_corners:b,mode:R(d),padding_mode:R(c),format:e?"NHWC":"NCHW"})},942574:(a,b)=>{f.ac("ScatterND",a,{reduction:R(b)})},942659:(a,b,d,c,e,g,k,l,n)=>{f.ac("Attention",a,{numHeads:b,isUnidirectional:d,maskFilterValue:c,scale:e,doRotary:g,qkvHiddenSizes:k?Array.from((u(),C).subarray(Number(l)>>>0,Number(l)+k>>>0)):[],pastPresentShareBuffer:!!n})},942931:a=>{f.ac("BiasAdd", +a,void 0)},942986:a=>{f.ac("BiasSplitGelu",a,void 0)},943047:a=>{f.ac("FastGelu",a,void 0)},943103:(a,b,d,c,e,g,k,l,n,p,v,w,y,z,W,kb)=>{f.ac("Conv",a,{format:w?"NHWC":"NCHW",auto_pad:b,dilations:d?Array.from((u(),C).subarray(Number(d)>>>0,Number(c)>>>0)):[],group:e,kernel_shape:g?Array.from((u(),C).subarray(Number(g)>>>0,Number(k)>>>0)):[],pads:l?Array.from((u(),C).subarray(Number(l)>>>0,Number(n)>>>0)):[],strides:p?Array.from((u(),C).subarray(Number(p)>>>0,Number(v)>>>0)):[],w_is_const:()=>!!(u(), +A)[Number(y)>>>0],activation:R(z),activation_params:W?Array.from((u(),Oa).subarray(Number(W)>>>0,Number(kb)>>>0)):[]})},943687:a=>{f.ac("Gelu",a,void 0)},943739:(a,b,d,c,e,g,k,l,n)=>{f.ac("GroupQueryAttention",a,{numHeads:b,kvNumHeads:d,scale:c,softcap:e,doRotary:g,rotaryInterleaved:k,smoothSoftmax:l,localWindowSize:n})},943956:(a,b,d,c)=>{f.ac("LayerNormalization",a,{axis:b,epsilon:d,simplified:!!c})},944067:(a,b,d,c)=>{f.ac("LayerNormalization",a,{axis:b,epsilon:d,simplified:!!c})},944178:(a,b, +d,c,e,g)=>{f.ac("MatMulNBits",a,{k:b,n:d,accuracyLevel:c,bits:e,blockSize:g})},944305:(a,b,d,c,e,g)=>{f.ac("MultiHeadAttention",a,{numHeads:b,isUnidirectional:d,maskFilterValue:c,scale:e,doRotary:g})},944464:(a,b)=>{f.ac("QuickGelu",a,{alpha:b})},944528:(a,b,d,c,e)=>{f.ac("RotaryEmbedding",a,{interleaved:!!b,numHeads:d,rotaryEmbeddingDim:c,scale:e})},944667:(a,b,d)=>{f.ac("SkipLayerNormalization",a,{epsilon:b,simplified:!!d})},944769:(a,b,d)=>{f.ac("SkipLayerNormalization",a,{epsilon:b,simplified:!!d})}, +944871:(a,b,d,c)=>{f.ac("GatherBlockQuantized",a,{gatherAxis:b,quantizeAxis:d,blockSize:c})},944992:a=>{f.Id(a)},945026:(a,b)=>f.Kd(Number(a),Number(b),f.$c.Nd,f.$c.errors)};function Za(a,b,d){return Cf(async()=>{await f.Gd(Number(a),Number(b),Number(d))})}function Ya(){return"undefined"!==typeof wasmOffsetConverter} +var wd,Ia,xd,I,yd,Fa,La,zd,Ad,Bd,Cd,Dd,J,Ed,Fd,K,Gd,L,Hd,Id,Jd,Kd,dynCall_vii,Ld,dynCall_v,Md,Nd,dynCall_iii,Od,Pd,Qd,Rd,dynCall_vi,Sd,Td,Ud,Vd,Wd,Xd,Yd,Zd,$d,ae,be,ce,de,ee,fe,ge,he,ie,je,ke,le,me,ne,oe,pe,qe,re,se,te,ue,ve,Xa;function Mc(a,b,d,c){var e=L();try{return Rd(a,b,d,c)}catch(g){K(e);if(g!==g+0)throw g;J(1,0)}}function Lc(a,b,d){var c=L();try{return dynCall_iii(a,b,d)}catch(e){K(c);if(e!==e+0)throw e;J(1,0)}} +function cd(a,b,d){var c=L();try{dynCall_vii(a,b,d)}catch(e){K(c);if(e!==e+0)throw e;J(1,0)}}function Kc(a,b){var d=L();try{return Ld(a,b)}catch(c){K(d);if(c!==c+0)throw c;J(1,0)}}function ad(a){var b=L();try{dynCall_v(a)}catch(d){K(b);if(d!==d+0)throw d;J(1,0)}}function Qc(a,b,d,c,e,g,k){var l=L();try{return Pd(a,b,d,c,e,g,k)}catch(n){K(l);if(n!==n+0)throw n;J(1,0)}}function bd(a,b){var d=L();try{dynCall_vi(a,b)}catch(c){K(d);if(c!==c+0)throw c;J(1,0)}} +function gd(a,b,d,c,e,g){var k=L();try{Md(a,b,d,c,e,g)}catch(l){K(k);if(l!==l+0)throw l;J(1,0)}}function ed(a,b,d,c){var e=L();try{Qd(a,b,d,c)}catch(g){K(e);if(g!==g+0)throw g;J(1,0)}}function fd(a,b,d,c,e){var g=L();try{Nd(a,b,d,c,e)}catch(k){K(g);if(k!==k+0)throw k;J(1,0)}}function hd(a,b,d,c,e,g,k){var l=L();try{Td(a,b,d,c,e,g,k)}catch(n){K(l);if(n!==n+0)throw n;J(1,0)}}function pd(a,b,d,c,e,g,k){var l=L();try{Ud(a,b,d,c,e,g,k)}catch(n){K(l);if(n!==n+0)throw n;J(1,0)}} +function od(a,b,d,c,e,g,k,l){var n=L();try{Yd(a,b,d,c,e,g,k,l)}catch(p){K(n);if(p!==p+0)throw p;J(1,0)}}function Nc(a,b,d,c,e){var g=L();try{return Sd(a,b,d,c,e)}catch(k){K(g);if(k!==k+0)throw k;J(1,0)}}function jd(a,b,d,c,e,g,k,l){var n=L();try{Zd(a,b,d,c,e,g,k,l)}catch(p){K(n);if(p!==p+0)throw p;J(1,0)}}function md(a,b,d,c,e,g,k,l,n,p,v,w){var y=L();try{Vd(a,b,d,c,e,g,k,l,n,p,v,w)}catch(z){K(y);if(z!==z+0)throw z;J(1,0)}} +function Pc(a,b,d,c,e,g){var k=L();try{return Wd(a,b,d,c,e,g)}catch(l){K(k);if(l!==l+0)throw l;J(1,0)}}function Zc(a,b,d){var c=L();try{return $d(a,b,d)}catch(e){K(c);if(e!==e+0)throw e;J(1,0);return 0n}}function kd(a,b,d,c,e,g,k,l,n){var p=L();try{Od(a,b,d,c,e,g,k,l,n)}catch(v){K(p);if(v!==v+0)throw v;J(1,0)}}function Jc(a){var b=L();try{return ae(a)}catch(d){K(b);if(d!==d+0)throw d;J(1,0)}}function Wc(a,b,d){var c=L();try{return be(a,b,d)}catch(e){K(c);if(e!==e+0)throw e;J(1,0)}} +function Yc(a,b){var d=L();try{return re(a,b)}catch(c){K(d);if(c!==c+0)throw c;J(1,0);return 0n}}function qd(a,b,d,c,e){var g=L();try{ce(a,b,d,c,e)}catch(k){K(g);if(k!==k+0)throw k;J(1,0)}}function Xc(a){var b=L();try{return de(a)}catch(d){K(b);if(d!==d+0)throw d;J(1,0);return 0n}}function Tc(a,b,d,c,e,g){var k=L();try{return je(a,b,d,c,e,g)}catch(l){K(k);if(l!==l+0)throw l;J(1,0)}}function Oc(a,b,d,c,e,g){var k=L();try{return ke(a,b,d,c,e,g)}catch(l){K(k);if(l!==l+0)throw l;J(1,0)}} +function Rc(a,b,d,c,e,g,k,l){var n=L();try{return Xd(a,b,d,c,e,g,k,l)}catch(p){K(n);if(p!==p+0)throw p;J(1,0)}}function $c(a,b,d,c,e){var g=L();try{return le(a,b,d,c,e)}catch(k){K(g);if(k!==k+0)throw k;J(1,0);return 0n}}function Ic(a,b,d,c){var e=L();try{return me(a,b,d,c)}catch(g){K(e);if(g!==g+0)throw g;J(1,0)}}function Gc(a,b,d,c){var e=L();try{return ne(a,b,d,c)}catch(g){K(e);if(g!==g+0)throw g;J(1,0)}} +function Sc(a,b,d,c,e,g,k,l,n,p,v,w){var y=L();try{return oe(a,b,d,c,e,g,k,l,n,p,v,w)}catch(z){K(y);if(z!==z+0)throw z;J(1,0)}}function ld(a,b,d,c,e,g,k,l,n,p,v){var w=L();try{he(a,b,d,c,e,g,k,l,n,p,v)}catch(y){K(w);if(y!==y+0)throw y;J(1,0)}}function nd(a,b,d,c,e,g,k,l,n,p,v,w,y,z,W,kb){var Xf=L();try{ie(a,b,d,c,e,g,k,l,n,p,v,w,y,z,W,kb)}catch(lb){K(Xf);if(lb!==lb+0)throw lb;J(1,0)}}function Vc(a,b,d,c){var e=L();try{return pe(a,b,d,c)}catch(g){K(e);if(g!==g+0)throw g;J(1,0)}} +function Uc(a,b,d,c,e){var g=L();try{return qe(a,b,d,c,e)}catch(k){K(g);if(k!==k+0)throw k;J(1,0)}}function Hc(a,b,d){var c=L();try{return ee(a,b,d)}catch(e){K(c);if(e!==e+0)throw e;J(1,0)}}function Fc(a,b,d){var c=L();try{return fe(a,b,d)}catch(e){K(c);if(e!==e+0)throw e;J(1,0)}}function dd(a,b,d,c){var e=L();try{ge(a,b,d,c)}catch(g){K(e);if(g!==g+0)throw g;J(1,0)}} +function ud(){var a=G;a=Object.assign({},a);var b=c=>e=>c(e)>>>0,d=c=>()=>c()>>>0;a.ub=b(a.ub);a.Yb=d(a.Yb);a._b=b(a._b);a.mc=b(a.mc);a.nc=d(a.nc);a.rc=b(a.rc);return a}function Da(){if(0{xa=a;ya=b}); +;return moduleRtn}export default ortWasmThreaded;var isPthread=globalThis.self?.name?.startsWith("em-pthread");var isNode=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";if(isNode)isPthread=(await import("worker_threads")).workerData==="em-pthread";isPthread&&ortWasmThreaded(); diff --git a/vendor/onnxruntime-web/ort-wasm-simd-threaded.jsep.wasm b/vendor/onnxruntime-web/ort-wasm-simd-threaded.jsep.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d945a8367b78c77c413a76015869884665a25820 --- /dev/null +++ b/vendor/onnxruntime-web/ort-wasm-simd-threaded.jsep.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e0a3d0e3f6b7c13ecfaba38c13691fd19c9ed470e72f9d7d8416ca59ab6dbcd +size 25014754 diff --git a/vendor/onnxruntime-web/ort-wasm-simd-threaded.jspi.mjs b/vendor/onnxruntime-web/ort-wasm-simd-threaded.jspi.mjs new file mode 100644 index 0000000000000000000000000000000000000000..123d1bca34588af0db623d3df7f02ad4b3ba5ed1 --- /dev/null +++ b/vendor/onnxruntime-web/ort-wasm-simd-threaded.jspi.mjs @@ -0,0 +1,110 @@ +async function ortWasmThreaded(moduleArg={}){var moduleRtn;var g=moduleArg,aa=!!globalThis.window,ba=!!globalThis.WorkerGlobalScope,k=globalThis.process?.versions?.node&&"renderer"!=globalThis.process?.type,m=ba&&self.name?.startsWith("em-pthread");if(k){const {createRequire:a}=await import("module");var require=a(import.meta.url),ca=require("worker_threads");global.Worker=ca.Worker;m=(ba=!ca.W)&&"em-pthread"==ca.workerData}g.mountExternalData=(a,b)=>{a.startsWith("./")&&(a=a.substring(2));(g.o||(g.o=new Map)).set(a,b)}; +g.unmountExternalData=()=>{delete g.o};var SharedArrayBuffer=globalThis.SharedArrayBuffer??(new WebAssembly.Memory({initial:0,maximum:0,Z:!0})).buffer.constructor,da="./this.program",ea=(a,b)=>{throw b;},fa=import.meta.url,ha="",ia,ja; +if(k){var fs=require("fs");fa.startsWith("file:")&&(ha=require("path").dirname(require("url").fileURLToPath(fa))+"/");ja=a=>{a=ka(a)?new URL(a):a;return fs.readFileSync(a)};ia=async a=>{a=ka(a)?new URL(a):a;return fs.readFileSync(a,void 0)};1{process.exitCode=a;throw b;}}else if(aa||ba){try{ha=(new URL(".",fa)).href}catch{}k||(ba&&(ja=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer"; +b.send(null);return new Uint8Array(b.response)}),ia=async a=>{if(ka(a))return new Promise((c,d)=>{var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=()=>{200==e.status||0==e.status&&e.response?c(e.response):d(e.status)};e.onerror=d;e.send(null)});var b=await fetch(a,{credentials:"same-origin"});if(b.ok)return b.arrayBuffer();throw Error(b.status+" : "+b.url);})}var la=console.log.bind(console),ma=console.error.bind(console); +if(k){var na=require("util"),oa=a=>"object"==typeof a?na.inspect(a):a;la=(...a)=>fs.writeSync(1,a.map(oa).join(" ")+"\n");ma=(...a)=>fs.writeSync(2,a.map(oa).join(" ")+"\n")}var pa=la,q=ma,qa,ra,sa=!1,ta,ka=a=>a.startsWith("file://");function r(){u.buffer!=w.buffer&&ua()}var va,wa; +if(k&&m){var xa=ca.parentPort;xa.on("message",a=>global.onmessage?.({data:a}));Object.assign(globalThis,{self:global,postMessage:a=>xa.postMessage(a)});process.on("uncaughtException",a=>{postMessage({i:"uncaughtException",error:a});process.exit(1)})}var ya; +if(m){var za=!1;self.onunhandledrejection=b=>{throw b.reason||b;};async function a(b){try{var c=b.data,d=c.i;if("load"===d){let e=[];self.onmessage=f=>e.push(f);ya=()=>{postMessage({i:"loaded"});for(let f of e)a(f);self.onmessage=a};for(const f of c.K)if(!g[f]||g[f].proxy)g[f]=(...h)=>{postMessage({i:"callHandler",J:f,args:h})},"print"==f&&(pa=g[f]),"printErr"==f&&(q=g[f]);u=c.S;ua();ra=c.T;Aa();Ba()}else if("run"===d){Ca(c.h);Da(c.h,0,0,1,0,0);Ea();Fa(c.h);za||(Ga(),za=!0);try{await Ha(c.P,c.u)}catch(e){if("unwind"!= +e)throw e;}}else"setimmediate"!==c.target&&("checkMailbox"===d?za&&Ia():d&&(q(`worker: received unknown command ${d}`),q(c)))}catch(e){throw Ja(),e;}}self.onmessage=a}var w,x,Ka,La,B,C,Ma,D,E,Na,Oa=!1;function ua(){var a=u.buffer;g.HEAP8=w=new Int8Array(a);Ka=new Int16Array(a);g.HEAPU8=x=new Uint8Array(a);La=new Uint16Array(a);g.HEAP32=B=new Int32Array(a);g.HEAPU32=C=new Uint32Array(a);Ma=new Float32Array(a);D=new Float64Array(a);E=new BigInt64Array(a);Na=new BigUint64Array(a)} +function Pa(){Oa=!0;m?ya():F.__wasm_call_ctors()}function Qa(a){a="Aborted("+a+")";q(a);sa=!0;a+=". Build with -sASSERTIONS for more info.";Oa&&Ra();a=new WebAssembly.RuntimeError(a);wa?.(a);throw a;}var Sa;async function Ta(a){if(!qa)try{var b=await ia(a);return new Uint8Array(b)}catch{}if(a==Sa&&qa)a=new Uint8Array(qa);else if(ja)a=ja(a);else throw"both async and sync fetching of the wasm failed";return a} +async function Ua(a,b){try{var c=await Ta(a);return await WebAssembly.instantiate(c,b)}catch(d){q(`failed to asynchronously prepare wasm: ${d}`),Qa(d)}}async function Va(a){var b=Sa;if(!qa&&!ka(b)&&!k)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){q(`wasm streaming compile failed: ${d}`),q("falling back to ArrayBuffer instantiation")}return Ua(b,a)} +function Wa(){Xa={HaveOffsetConverter:Ya,__pthread_create_js:Za,__syscall_fcntl64:$a,__syscall_fstat64:ab,__syscall_getcwd:bb,__syscall_getdents64:cb,__syscall_ioctl:db,__syscall_lstat64:eb,__syscall_mkdirat:fb,__syscall_newfstatat:gb,__syscall_openat:hb,__syscall_readlinkat:ib,__syscall_rmdir:jb,__syscall_stat64:kb,__syscall_unlinkat:lb,_abort_js:mb,_embind_register_bigint:nb,_embind_register_bool:ob,_embind_register_emval:qb,_embind_register_float:rb,_embind_register_integer:sb,_embind_register_memory_view:tb, +_embind_register_std_string:ub,_embind_register_std_wstring:vb,_embind_register_void:wb,_emscripten_init_main_thread_js:xb,_emscripten_notify_mailbox_postmessage:yb,_emscripten_receive_on_main_thread_js:zb,_emscripten_runtime_keepalive_clear:Ab,_emscripten_thread_cleanup:Bb,_emscripten_thread_mailbox_await:Fa,_emscripten_thread_set_strongref:Cb,_emval_await:Db,_emval_create_invoker:Eb,_emval_decref:Fb,_emval_equals:Gb,_emval_get_global:Hb,_emval_get_module_property:Ib,_emval_get_property:Jb,_emval_incref:Kb, +_emval_invoke:Lb,_emval_invoke_i64:Mb,_emval_new_array:Nb,_emval_new_array_from_memory_view:Ob,_emval_new_cstring:Pb,_emval_new_object:Qb,_emval_run_destructors:Rb,_emval_set_property:Sb,_gmtime_js:Tb,_localtime_js:Ub,_mktime_js:Vb,_mmap_js:Wb,_munmap_js:Xb,_setitimer_js:Yb,_tzset_js:Zb,clock_time_get:$b,emscripten_asm_const_int:ac,emscripten_asm_const_ptr:bc,emscripten_check_blocking_allowed:cc,emscripten_date_now:dc,emscripten_errn:ec,emscripten_exit_with_live_runtime:fc,emscripten_get_heap_max:gc, +emscripten_get_now:hc,emscripten_has_asyncify:ic,emscripten_num_logical_cores:jc,emscripten_pc_get_function:kc,emscripten_resize_heap:lc,emscripten_stack_snapshot:mc,emscripten_stack_unwind_buffer:nc,emwgpuAdapterRequestDevice:oc,emwgpuBufferDestroy:pc,emwgpuBufferGetConstMappedRange:qc,emwgpuBufferGetMappedRange:rc,emwgpuBufferMapAsync:sc,emwgpuBufferUnmap:tc,emwgpuDelete:uc,emwgpuDeviceCreateBuffer:vc,emwgpuDeviceCreateComputePipelineAsync:wc,emwgpuDeviceCreateShaderModule:xc,emwgpuDeviceDestroy:yc, +emwgpuDevicePopErrorScope:zc,emwgpuInstanceRequestAdapter:Ac,emwgpuWaitAny:Bc,environ_get:Cc,environ_sizes_get:Dc,exit:Ec,fd_close:Fc,fd_read:Gc,fd_seek:Hc,fd_write:Ic,memory:u,proc_exit:Jc,wgpuAdapterGetLimits:Kc,wgpuAdapterHasFeature:Lc,wgpuBufferGetSize:Mc,wgpuBufferGetUsage:Nc,wgpuCommandEncoderBeginComputePass:Oc,wgpuCommandEncoderCopyBufferToBuffer:Pc,wgpuCommandEncoderFinish:Qc,wgpuCommandEncoderResolveQuerySet:Rc,wgpuComputePassEncoderDispatchWorkgroups:Sc,wgpuComputePassEncoderDispatchWorkgroupsIndirect:Tc, +wgpuComputePassEncoderEnd:Uc,wgpuComputePassEncoderSetBindGroup:Vc,wgpuComputePassEncoderSetPipeline:Wc,wgpuComputePassEncoderWriteTimestamp:Xc,wgpuComputePipelineGetBindGroupLayout:Yc,wgpuDeviceCreateBindGroup:Zc,wgpuDeviceCreateCommandEncoder:$c,wgpuDeviceCreateQuerySet:ad,wgpuDeviceGetAdapterInfo:bd,wgpuDeviceGetFeatures:cd,wgpuDeviceGetLimits:dd,wgpuDevicePushErrorScope:ed,wgpuQueueSubmit:fd,wgpuQueueWriteBuffer:gd};if(!Xa.I){Xa.I=!0;var a=Xa,b=/^(invoke_.*|__asyncjs__.*)$/;for(let [c,d]of Object.entries(a))"function"== +typeof d&&(d.A||b.test(c))&&(a[c]=d=new WebAssembly.Suspending(d))}return{env:Xa,wasi_snapshot_preview1:Xa}} +async function Aa(){function a(d,e){d=F=d.exports;var f=/^(OrtAppendExecutionProvider|OrtCreateSession|OrtRun|OrtRunWithBinding|OrtBindInput|main|__main_argc_argv)$/;hd=new Set;var h={};for(let [l,n]of Object.entries(d))"function"==typeof n?(f.test(l)&&(hd.add(n),n=WebAssembly.promising(n)),h[l]=jd(n)):h[l]=n;F=h;F=kd();ld.push(F._emscripten_tls_init);d=F;md=d.__getTypeName;Ga=d._embind_initialize_bindings;g._OrtInit=d.OrtInit;g._OrtGetLastError=d.OrtGetLastError;g._OrtCreateSessionOptions=d.OrtCreateSessionOptions; +g._OrtAppendExecutionProvider=d.OrtAppendExecutionProvider;g._OrtAddFreeDimensionOverride=d.OrtAddFreeDimensionOverride;g._OrtAddSessionConfigEntry=d.OrtAddSessionConfigEntry;g._OrtReleaseSessionOptions=d.OrtReleaseSessionOptions;g._OrtCreateSession=d.OrtCreateSession;g._OrtReleaseSession=d.OrtReleaseSession;g._OrtGetInputOutputCount=d.OrtGetInputOutputCount;g._OrtGetInputOutputMetadata=d.OrtGetInputOutputMetadata;g._OrtFree=d.OrtFree;g._OrtCreateTensor=d.OrtCreateTensor;g._OrtGetTensorData=d.OrtGetTensorData; +g._OrtReleaseTensor=d.OrtReleaseTensor;g._OrtCreateRunOptions=d.OrtCreateRunOptions;g._OrtAddRunConfigEntry=d.OrtAddRunConfigEntry;g._OrtReleaseRunOptions=d.OrtReleaseRunOptions;g._OrtCreateBinding=d.OrtCreateBinding;g._OrtBindInput=d.OrtBindInput;g._OrtBindOutput=d.OrtBindOutput;g._OrtClearBoundOutputs=d.OrtClearBoundOutputs;g._OrtReleaseBinding=d.OrtReleaseBinding;g._OrtRunWithBinding=d.OrtRunWithBinding;g._OrtRun=d.OrtRun;g._OrtEndProfiling=d.OrtEndProfiling;nd=g._OrtGetWebGpuDevice=d.OrtGetWebGpuDevice; +od=d.pthread_self;G=g._free=d.free;pd=g._malloc=d.malloc;qd=g._wgpuBufferRelease=d.wgpuBufferRelease;rd=g._wgpuCreateInstance=d.wgpuCreateInstance;sd=d.emwgpuCreateBindGroup;td=d.emwgpuCreateBindGroupLayout;ud=d.emwgpuCreateCommandBuffer;vd=d.emwgpuCreateCommandEncoder;wd=d.emwgpuCreateComputePassEncoder;xd=d.emwgpuCreateQuerySet;yd=d.emwgpuCreateBuffer;zd=d.emwgpuCreateDevice;Ad=d.emwgpuCreateQueue;Bd=d.emwgpuOnCreateComputePipelineCompleted;Cd=d.emwgpuOnDeviceLostCompleted;Dd=d.emwgpuOnMapAsyncCompleted; +Ed=d.emwgpuOnPopErrorScopeCompleted;Fd=d.emwgpuOnRequestAdapterCompleted;Gd=d.emwgpuOnRequestDeviceCompleted;Hd=d.emwgpuOnUncapturedError;Da=d._emscripten_thread_init;Ja=d._emscripten_thread_crashed;Id=d._emscripten_run_js_on_main_thread;Jd=d._emscripten_thread_free_data;Kd=d._emscripten_thread_exit;Ld=d._emscripten_timeout;Md=d._emscripten_check_mailbox;Nd=d.memalign;Ra=d.__trap;Od=d.emscripten_stack_set_limits;H=d._emscripten_stack_restore;Pd=d._emscripten_stack_alloc;I=d.emscripten_stack_get_current; +Qd=d.__indirect_function_table;ra=e;return F}var b=Wa();if(g.instantiateWasm)return new Promise(d=>{g.instantiateWasm(b,(e,f)=>{d(a(e,f))})});if(m){var c=new WebAssembly.Instance(ra,Wa());return a(c,ra)}Sa??=g.locateFile?g.locateFile?g.locateFile("ort-wasm-simd-threaded.jspi.wasm",ha):ha+"ort-wasm-simd-threaded.jspi.wasm":(new URL("ort-wasm-simd-threaded.jspi.wasm",import.meta.url)).href;return function(d){return a(d.instance,d.module)}(await Va(b))} +class Rd{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}} +var Sd=a=>{a.terminate();a.onmessage=()=>{}},Ud=()=>{for(var a=Td;0{0==J.length&&(Xd(),Yd(J[0]));var b=J.pop();if(!b)return 6;Zd.push(b);K[a.h]=b;b.h=a.h;var c={i:"run",P:a.O,u:a.u,h:a.h};k&&b.unref();b.postMessage(c,a.D);return 0},L=0,M=(a,b,...c)=>{var d=16*c.length,e=I(),f=Pd(d),h=f>>>3,l;for(l of c)"bigint"==typeof l?((r(),E)[h++>>>0]=1n,(r(),E)[h++>>>0]=l):((r(),E)[h++>>>0]=0n,(r(),D)[h++>>>0]=l);a=Id(a,0,d,f,b);H(e);return a}; +function Jc(a){if(m)return M(0,1,a);ta=a;if(!(0{ta=a;if(m)throw ae(a),"unwind";Jc(a)},J=[],Zd=[],ld=[],K={};function be(){for(var a=g.numThreads-1;a--;)Xd();Td.push(async()=>{var b=ce();Vd++;await b;Vd--;0==Vd&&Wd&&(b=Wd,Wd=null,b())})}var de=a=>{var b=a.h;delete K[b];J.push(a);Zd.splice(Zd.indexOf(a),1);a.h=0;Jd(b)};function Ea(){ld.forEach(a=>a())} +var Yd=a=>new Promise(b=>{a.onmessage=f=>{var h=f.data;f=h.i;if(h.s&&h.s!=od()){var l=K[h.s];l?l.postMessage(h,h.D):q(`Internal error! Worker sent a message "${f}" to target pthread ${h.s}, but that thread no longer exists!`)}else if("checkMailbox"===f)Ia();else if("spawnThread"===f)$d(h);else if("cleanupThread"===f)ee(()=>{de(K[h.R])});else if("loaded"===f)a.loaded=!0,k&&!a.h&&a.unref(),b(a);else if("setimmediate"===h.target)a.postMessage(h);else if("uncaughtException"===f)a.onerror(h.error);else if("callHandler"=== +f)g[h.J](...h.args);else f&&q(`worker sent an unknown command ${f}`)};a.onerror=f=>{q(`${"worker sent an error!"} ${f.filename}:${f.lineno}: ${f.message}`);throw f;};k&&(a.on("message",f=>a.onmessage({data:f})),a.on("error",f=>a.onerror(f)));var c=[],d=[],e;for(e of d)g.propertyIsEnumerable(e)&&c.push(e);a.postMessage({i:"load",K:c,S:u,T:ra})});async function ce(){if(!m)return Promise.all(J.map(Yd))} +function Xd(){var a=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});J.push(a)}function Ca(a){var b=(r(),C)[a+52>>>2>>>0];a=(r(),C)[a+56>>>2>>>0];Od(b,b-a);H(b)}var fe=[],Ha=async(a,b)=>{L=0;var c=WebAssembly,d=c.promising,e=fe[a];e||(fe[a]=e=Qd.get(a),hd?.has(e)&&(fe[a]=e=WebAssembly.promising(e)));a=d.call(c,e)(b);a=await a;0-9007199254740992>a||9007199254740992>>=0;b>>>=0;c>>>=0;d>>>=0;if(!globalThis.SharedArrayBuffer)return 6;var e=[];if(m&&0===e.length)return ge(a,b,c,d);a={O:c,h:a,u:d,D:e};return m?(a.i="spawnThread",postMessage(a,e),0):$d(a)} +var he=globalThis.TextDecoder&&new TextDecoder,ie=(a,b,c,d)=>{c=b+c;if(d)return c;for(;a[b]&&!(b>=c);)++b;return b},je=(a,b=0,c,d)=>{b>>>=0;c=ie(a,b,c,d);if(16e?d+=String.fromCharCode(e):(e-=65536,d+=String.fromCharCode(55296| +e>>10,56320|e&1023))}}else d+=String.fromCharCode(e)}return d},ke=(a,b,c)=>(a>>>=0)?je((r(),x),a,b,c):"";function $a(a,b,c){return m?M(3,1,a,b,c):0}function ab(a,b){if(m)return M(4,1,a,b)}function bb(a,b){if(m)return M(5,1,a,b)}function cb(a,b,c){if(m)return M(6,1,a,b,c)}function db(a,b,c){return m?M(7,1,a,b,c):0}function eb(a,b){if(m)return M(8,1,a,b)}function fb(a,b,c){if(m)return M(9,1,a,b,c)}function gb(a,b,c,d){if(m)return M(10,1,a,b,c,d)}function hb(a,b,c,d){if(m)return M(11,1,a,b,c,d)} +function ib(a,b,c,d){if(m)return M(12,1,a,b,c,d)}function jb(a){if(m)return M(13,1,a)}function kb(a,b){if(m)return M(14,1,a,b)}function lb(a,b,c){if(m)return M(15,1,a,b,c)}var mb=()=>Qa(""),O=a=>{a>>>=0;for(var b="";;){var c=(r(),x)[a++>>>0];if(!c)return b;b+=String.fromCharCode(c)}},le={},me={},ne={},oe=class extends Error{constructor(a){super(a);this.name="BindingError"}}; +function pe(a,b,c={}){var d=b.name;if(!a)throw new oe(`type "${d}" must have a positive integer typeid pointer`);if(me.hasOwnProperty(a)){if(c.L)return;throw new oe(`Cannot register type '${d}' twice`);}me[a]=b;delete ne[a];le.hasOwnProperty(a)&&(b=le[a],delete le[a],b.forEach(e=>e()))}function P(a,b,c={}){return pe(a,b,c)} +var qe=(a,b,c)=>{switch(b){case 1:return c?d=>(r(),w)[d>>>0]:d=>(r(),x)[d>>>0];case 2:return c?d=>(r(),Ka)[d>>>1>>>0]:d=>(r(),La)[d>>>1>>>0];case 4:return c?d=>(r(),B)[d>>>2>>>0]:d=>(r(),C)[d>>>2>>>0];case 8:return c?d=>(r(),E)[d>>>3>>>0]:d=>(r(),Na)[d>>>3>>>0];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}}; +function nb(a,b,c,d,e){a>>>=0;c>>>=0;b=O(b>>>0);d=0n===d;let f=h=>h;if(d){const h=8*c;f=l=>BigInt.asUintN(h,l);e=f(e)}P(a,{name:b,g:f,l:(h,l)=>{"number"==typeof l&&(l=BigInt(l));return l},j:qe(b,c,!d),m:null})}function ob(a,b,c,d){a>>>=0;b=O(b>>>0);P(a,{name:b,g:function(e){return!!e},l:function(e,f){return f?c:d},j:function(e){return this.g((r(),x)[e>>>0])},m:null})}var re=[],Q=[0,1,,1,null,1,!0,1,!1,1];function Fb(a){a>>>=0;9{if(!a)throw new oe(`Cannot use deleted val. handle = ${a}`);return Q[a]},S=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=re.pop()||Q.length;Q[b]=a;Q[b+1]=1;return b}};function se(a){return this.g((r(),C)[a>>>2>>>0])}var te={name:"emscripten::val",g:a=>{var b=R(a);Fb(a);return b},l:(a,b)=>S(b),j:se,m:null};function qb(a){return P(a>>>0,te)} +var ue=(a,b)=>{switch(b){case 4:return function(c){return this.g((r(),Ma)[c>>>2>>>0])};case 8:return function(c){return this.g((r(),D)[c>>>3>>>0])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}};function rb(a,b,c){a>>>=0;c>>>=0;b=O(b>>>0);P(a,{name:b,g:d=>d,l:(d,e)=>e,j:ue(b,c),m:null})}function sb(a,b,c,d,e){a>>>=0;c>>>=0;b=O(b>>>0);let f=l=>l;if(0===d){var h=32-8*c;f=l=>l<>>h;e=f(e)}P(a,{name:b,g:f,l:(l,n)=>n,j:qe(b,c,0!==d),m:null})} +function tb(a,b,c){function d(f){var h=(r(),C)[f>>>2>>>0];f=(r(),C)[f+4>>>2>>>0];return new e((r(),w).buffer,f,h)}a>>>=0;var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][b];c=O(c>>>0);P(a,{name:c,g:d,j:d},{L:!0})} +var T=(a,b,c)=>{var d=(r(),x);b>>>=0;if(0=h){if(b>=c)break;d[b++>>>0]=h}else if(2047>=h){if(b+1>=c)break;d[b++>>>0]=192|h>>6;d[b++>>>0]=128|h&63}else if(65535>=h){if(b+2>=c)break;d[b++>>>0]=224|h>>12;d[b++>>>0]=128|h>>6&63;d[b++>>>0]=128|h&63}else{if(b+3>=c)break;d[b++>>>0]=240|h>>18;d[b++>>>0]=128|h>>12&63;d[b++>>>0]=128|h>>6&63;d[b++>>>0]=128|h&63;f++}}d[b>>>0]=0;a=b-e}else a=0;return a},U=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}return b}; +function ub(a,b){a>>>=0;b=O(b>>>0);P(a,{name:b,g(c){var d=(r(),C)[c>>>2>>>0];d=ke(c+4,d,!0);G(c);return d},l(c,d){d instanceof ArrayBuffer&&(d=new Uint8Array(d));var e="string"==typeof d;if(!(e||ArrayBuffer.isView(d)&&1==d.BYTES_PER_ELEMENT))throw new oe("Cannot pass non-string to std::string");var f=e?U(d):d.length;var h=pd(4+f+1),l=h+4;(r(),C)[h>>>2>>>0]=f;e?T(d,l,f+1):(r(),x).set(d,l>>>0);null!==c&&c.push(G,h);return h},j:se,m(c){G(c)}})} +var ve=globalThis.TextDecoder?new TextDecoder("utf-16le"):void 0,we=(a,b,c)=>{a>>>=1;b=ie((r(),La),a,b/2,c);if(16>>0];c+=String.fromCharCode(d)}return c},xe=(a,b,c)=>{c??=2147483647;if(2>c)return 0;c-=2;var d=b;c=c<2*a.length?c/2:a.length;for(var e=0;e>>1>>>0]=f;b+=2}(r(),Ka)[b>>>1>>>0]=0;return b-d},ye=a=>2*a.length,ze=(a,b,c)=>{var d="";a>>>=2;for(var e=0;!(e>=b/4);e++){var f= +(r(),C)[a+e>>>0];if(!f&&!c)break;d+=String.fromCodePoint(f)}return d},Ae=(a,b,c)=>{b>>>=0;c??=2147483647;if(4>c)return 0;var d=b;c=d+c-4;for(var e=0;e>>2>>>0]=f;b+=4;if(b+4>c)break}(r(),B)[b>>>2>>>0]=0;return b-d},Be=a=>{for(var b=0,c=0;c>>=0;b>>>=0;c>>>=0;c=O(c);if(2===b){var d=we;var e=xe;var f=ye}else d=ze,e=Ae,f=Be;P(a,{name:c,g:h=>{var l=(r(),C)[h>>>2>>>0];l=d(h+4,l*b,!0);G(h);return l},l:(h,l)=>{if("string"!=typeof l)throw new oe(`Cannot pass non-string to C++ string type ${c}`);var n=f(l),t=pd(4+n+b);(r(),C)[t>>>2>>>0]=n/b;e(l,t+4,n+b);null!==h&&h.push(G,t);return t},j:se,m(h){G(h)}})}function wb(a,b){a>>>=0;b=O(b>>>0);P(a,{M:!0,name:b,g:()=>{},l:()=>{}})} +function xb(a){Da(a>>>0,!ba,1,!aa,131072,!1);Ea()}var ee=a=>{if(!sa)try{if(a(),!(0Number((navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)||[])[2]);function Fa(a){a>>>=0;Ce||(Atomics.waitAsync((r(),B),a>>>2,a).value.then(Ia),a+=128,Atomics.store((r(),B),a>>>2,1))}var Ia=()=>ee(()=>{var a=od();a&&(Fa(a),Md())}); +function yb(a,b){a>>>=0;a==b>>>0?setTimeout(Ia):m?postMessage({s:a,i:"checkMailbox"}):(a=K[a])&&a.postMessage({i:"checkMailbox"})}var De=[];function zb(a,b,c,d,e){b>>>=0;e>>>=0;De.length=0;c=e>>>3;for(d=e+d>>>3;c>>0]?f=(r(),E)[c++>>>0]:f=(r(),D)[c++>>>0];De.push(f)}return(b?Ee[b]:Fe[a])(...De)}var Ab=()=>{L=0};function Bb(a){a>>>=0;m?postMessage({i:"cleanupThread",R:a}):de(K[a])}function Cb(a){k&&K[a>>>0].ref()}function jd(a){return(...b)=>a(...b)} +var hd=null,Ge=async a=>{L+=1;try{return await a()}finally{--L}};function Db(a){a>>>=0;return Ge(async()=>{var b=await R(a);return S(b)})}Db.A=!0; +var He=[],Ie=a=>{var b=He.length;He.push(a);return b},Je=(a,b)=>{for(var c=Array(a),d=0;d>>2>>>0],h=me[f];if(void 0===h)throw a=`parameter ${d}`,f=md(f),b=O(f),G(f),new oe(`${a} has unknown type ${b}`);c[e]=h}return c},Ke=(a,b,c)=>{var d=[];a=a(d,c);d.length&&((r(),C)[b>>>2>>>0]=S(d));return a},Le={},Me=a=>{var b=Le[a];return void 0===b?O(a):b}; +function Eb(a,b,c){var [d,...e]=Je(a,b>>>0);b=d.l.bind(d);var f=e.map(n=>n.j.bind(n));a--;var h={toValue:R};a=f.map((n,t)=>{var y=`argFromPtr${t}`;h[y]=n;return`${y}(args${t?"+"+8*t:""})`});switch(c){case 0:var l="toValue(handle)";break;case 2:l="new (toValue(handle))";break;case 3:l="";break;case 1:h.getStringOrSymbol=Me,l="toValue(handle)[getStringOrSymbol(methodName)]"}l+=`(${a})`;d.M||(h.toReturnWire=b,h.emval_returnValue=Ke,l=`return emval_returnValue(toReturnWire, destructorsRef, ${l})`);l= +`return function (handle, methodName, destructorsRef, args) {\n ${l}\n }`;c=(new Function(Object.keys(h),l))(...Object.values(h));l=`methodCaller<(${e.map(n=>n.name)}) => ${d.name}>`;return Ie(Object.defineProperty(c,"name",{value:l}))}function Gb(a,b){b>>>=0;a=R(a>>>0);b=R(b);return a==b}function Hb(a){a>>>=0;if(!a)return S(globalThis);a=Me(a);return S(globalThis[a])}function Ib(a){a=Me(a>>>0);return S(g[a])}function Jb(a,b){b>>>=0;a=R(a>>>0);b=R(b);return S(a[b])} +function Kb(a){a>>>=0;9>>0](b>>>0,c>>>0,d>>>0,e>>>0)}function Mb(a,b,c,d,e){return Lb(a>>>0,b>>>0,c>>>0,d>>>0,e>>>0)}function Nb(){return S([])}function Ob(a){a=R(a>>>0);for(var b=Array(a.length),c=0;c>>0))}function Qb(){return S({})}function Rb(a){a>>>=0;for(var b=R(a);b.length;){var c=b.pop();b.pop()(c)}Fb(a)}function Sb(a,b,c){b>>>=0;c>>>=0;a=R(a>>>0);b=R(b);c=R(c);a[b]=c} +function Tb(a,b){a=N(a);b>>>=0;a=new Date(1E3*a);(r(),B)[b>>>2>>>0]=a.getUTCSeconds();(r(),B)[b+4>>>2>>>0]=a.getUTCMinutes();(r(),B)[b+8>>>2>>>0]=a.getUTCHours();(r(),B)[b+12>>>2>>>0]=a.getUTCDate();(r(),B)[b+16>>>2>>>0]=a.getUTCMonth();(r(),B)[b+20>>>2>>>0]=a.getUTCFullYear()-1900;(r(),B)[b+24>>>2>>>0]=a.getUTCDay();a=(a.getTime()-Date.UTC(a.getUTCFullYear(),0,1,0,0,0,0))/864E5|0;(r(),B)[b+28>>>2>>>0]=a} +var Ne=a=>0===a%4&&(0!==a%100||0===a%400),Oe=[0,31,60,91,121,152,182,213,244,274,305,335],Pe=[0,31,59,90,120,151,181,212,243,273,304,334]; +function Ub(a,b){a=N(a);b>>>=0;a=new Date(1E3*a);(r(),B)[b>>>2>>>0]=a.getSeconds();(r(),B)[b+4>>>2>>>0]=a.getMinutes();(r(),B)[b+8>>>2>>>0]=a.getHours();(r(),B)[b+12>>>2>>>0]=a.getDate();(r(),B)[b+16>>>2>>>0]=a.getMonth();(r(),B)[b+20>>>2>>>0]=a.getFullYear()-1900;(r(),B)[b+24>>>2>>>0]=a.getDay();var c=(Ne(a.getFullYear())?Oe:Pe)[a.getMonth()]+a.getDate()-1|0;(r(),B)[b+28>>>2>>>0]=c;(r(),B)[b+36>>>2>>>0]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();var d=(new Date(a.getFullYear(), +0,1)).getTimezoneOffset();a=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0;(r(),B)[b+32>>>2>>>0]=a} +function Vb(a){a>>>=0;var b=new Date((r(),B)[a+20>>>2>>>0]+1900,(r(),B)[a+16>>>2>>>0],(r(),B)[a+12>>>2>>>0],(r(),B)[a+8>>>2>>>0],(r(),B)[a+4>>>2>>>0],(r(),B)[a>>>2>>>0],0),c=(r(),B)[a+32>>>2>>>0],d=b.getTimezoneOffset(),e=(new Date(b.getFullYear(),6,1)).getTimezoneOffset(),f=(new Date(b.getFullYear(),0,1)).getTimezoneOffset(),h=Math.min(f,e);0>c?(r(),B)[a+32>>>2>>>0]=Number(e!=f&&h==d):0>>2>>>0]=b.getDay();c=(Ne(b.getFullYear())? +Oe:Pe)[b.getMonth()]+b.getDate()-1|0;(r(),B)[a+28>>>2>>>0]=c;(r(),B)[a>>>2>>>0]=b.getSeconds();(r(),B)[a+4>>>2>>>0]=b.getMinutes();(r(),B)[a+8>>>2>>>0]=b.getHours();(r(),B)[a+12>>>2>>>0]=b.getDate();(r(),B)[a+16>>>2>>>0]=b.getMonth();(r(),B)[a+20>>>2>>>0]=b.getYear();a=b.getTime();return BigInt(isNaN(a)?-1:a/1E3)}function Wb(a,b,c,d,e,f,h){return m?M(16,1,a,b,c,d,e,f,h):-52}function Xb(a,b,c,d,e,f){if(m)return M(17,1,a,b,c,d,e,f)}var Qe={},hc=()=>performance.timeOrigin+performance.now(); +function Yb(a,b){if(m)return M(18,1,a,b);Qe[a]&&(clearTimeout(Qe[a].id),delete Qe[a]);if(!b)return 0;var c=setTimeout(()=>{delete Qe[a];ee(()=>Ld(a,performance.timeOrigin+performance.now()))},b);Qe[a]={id:c,$:b};return 0} +function Zb(a,b,c,d){a>>>=0;b>>>=0;c>>>=0;d>>>=0;var e=(new Date).getFullYear(),f=(new Date(e,0,1)).getTimezoneOffset();e=(new Date(e,6,1)).getTimezoneOffset();var h=Math.max(f,e);(r(),C)[a>>>2>>>0]=60*h;(r(),B)[b>>>2>>>0]=Number(f!=e);b=l=>{var n=Math.abs(l);return`UTC${0<=l?"-":"+"}${String(Math.floor(n/60)).padStart(2,"0")}${String(n%60).padStart(2,"0")}`};a=b(f);b=b(e);eDate.now(),Re=1; +function $b(a,b,c){c>>>=0;if(!(0<=a&&3>=a))return 28;if(0===a)a=Date.now();else if(Re)a=performance.timeOrigin+performance.now();else return 52;a=Math.round(1E6*a);(r(),E)[c>>>3>>>0]=BigInt(a);return 0}var Se=[],Te=(a,b)=>{Se.length=0;for(var c;c=(r(),x)[a++>>>0];){var d=105!=c;d&=112!=c;b+=d&&b%8?4:0;Se.push(112==c?(r(),C)[b>>>2>>>0]:106==c?(r(),E)[b>>>3>>>0]:105==c?(r(),B)[b>>>2>>>0]:(r(),D)[b>>>3>>>0]);b+=d?8:4}return Se};function ac(a,b,c){a>>>=0;b=Te(b>>>0,c>>>0);return Ee[a](...b)} +function bc(a,b,c){a>>>=0;b=Te(b>>>0,c>>>0);return Ee[a](...b)}var cc=()=>{};function ec(a,b){return q(ke(a>>>0,b>>>0))}var fc=()=>{L+=1;throw"unwind";};function gc(){return 4294901760}var ic=()=>2,jc=()=>k?require("os").cpus().length:navigator.hardwareConcurrency,Ue={},Ve=a=>{var b=U(a)+1,c=pd(b);c&&T(a,c,b);return c},We=a=>{var b;return(b=/\bwasm-function\[\d+\]:(0x[0-9a-f]+)/.exec(a))?+b[1]:(b=/:(\d+):\d+(?:\)|$)/.exec(a))?2147483648|+b[1]:0},Xe=a=>{for(var b of a)(a=We(b))&&(Ue[a]=b)}; +function mc(){var a=Error().stack.toString().split("\n");"Error"==a[0]&&a.shift();Xe(a);Ue.B=We(a[3]);Ue.N=a;return Ue.B}function kc(a){a=Ue[a>>>0];if(!a)return 0;var b;if(b=/^\s+at .*\.wasm\.(.*) \(.*\)$/.exec(a))a=b[1];else if(b=/^\s+at (.*) \(.*\)$/.exec(a))a=b[1];else if(b=/^(.+?)@/.exec(a))a=b[1];else return 0;G(kc.C??0);kc.C=Ve(a);return kc.C} +function lc(a){a>>>=0;var b=(r(),x).length;if(a<=b||4294901760=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(4294901760,65536*Math.ceil(Math.max(a,d)/65536))-u.buffer.byteLength+65535)/65536|0;try{u.grow(d);ua();var e=1;break a}catch(f){}e=void 0}if(e)return!0}return!1} +function nc(a,b,c){a>>>=0;b>>>=0;if(Ue.B==a)var d=Ue.N;else d=Error().stack.toString().split("\n"),"Error"==d[0]&&d.shift(),Xe(d);for(var e=3;d[e]&&We(d[e])!=a;)++e;for(a=0;a>>2>>>0]=We(d[a+e]);return a} +var V=a=>{var b=U(a)+1,c=Pd(b);T(a,c,b);return c},Ye=[],W=(a,b)=>{Ye[a>>>=0]=b},X=[],Ze=[],$e=(a,b)=>{Ze[a]=new Promise(c=>b.finally(()=>c(a)))},Y=a=>{if(a)return Ye[a>>>0]},af=(a,b=0)=>{"pending"!=a.mapState||Qa();b=yd(b,"mapped"==a.mapState?3:1);W(b,a);"mapped"==a.mapState&&(X[b]=[]);return b},bf=(a,b=0)=>{var c=Ad(b);b=zd(b,c);W(c,a.queue);W(b,a);return b},cf=(a,b,c)=>{(r(),C)[a>>>2>>>0]=b;(r(),C)[a+4>>>2>>>0]=c},df=a=>{var b=(r(),C)[a>>>2>>>0];a=(r(),C)[a+4>>>2>>>0];return ke(b,a)},Z=a=>{var b= +(r(),C)[a>>>2>>>0];a=(r(),C)[a+4>>>2>>>0];if(b)return ke(b,a);if(0===a)return""},ef=a=>{var b=Z(a+4);var c=(c=(r(),C)[a+12>>>2>>>0])?Y(c):"auto";if(a+=16){var d=Y((r(),C)[a+4>>>2>>>0]);var e=(r(),C)[a+16>>>2>>>0];var f=(r(),C)[a+20>>>2>>>0];if(e){for(var h={},l=0;l>>3>>>0]}e=h}else e=void 0;a={module:d,constants:e,entryPoint:Z(a+8)}}else a=void 0;return{label:b,layout:c,compute:a}},ff=(a,b)=>{function c(e,f){e=a[e];(r(),B)[b+f>>>2>>>0]=e}function d(e, +f){e=a[e];(r(),E)[b+f>>>3>>>0]=BigInt(e)}c("maxTextureDimension1D",4);c("maxTextureDimension2D",8);c("maxTextureDimension3D",12);c("maxTextureArrayLayers",16);c("maxBindGroups",20);c("maxBindGroupsPlusVertexBuffers",24);c("maxBindingsPerBindGroup",28);c("maxDynamicUniformBuffersPerPipelineLayout",32);c("maxDynamicStorageBuffersPerPipelineLayout",36);c("maxSampledTexturesPerShaderStage",40);c("maxSamplersPerShaderStage",44);c("maxStorageBuffersPerShaderStage",48);c("maxStorageTexturesPerShaderStage", +52);c("maxUniformBuffersPerShaderStage",56);c("minUniformBufferOffsetAlignment",80);c("minStorageBufferOffsetAlignment",84);d("maxUniformBufferBindingSize",64);d("maxStorageBufferBindingSize",72);c("maxVertexBuffers",88);d("maxBufferSize",96);c("maxVertexAttributes",104);c("maxVertexBufferArrayStride",108);c("maxInterStageShaderVariables",112);c("maxColorAttachments",116);c("maxColorAttachmentBytesPerSample",120);c("maxComputeWorkgroupStorageSize",124);c("maxComputeInvocationsPerWorkgroup",128);c("maxComputeWorkgroupSizeX", +132);c("maxComputeWorkgroupSizeY",136);c("maxComputeWorkgroupSizeZ",140);c("maxComputeWorkgroupsPerDimension",144);void 0!==a.Y&&c("maxImmediateSize",148)},gf=[,"validation","out-of-memory","internal"],hf=[,"compatibility","core"],jf={1:"core-features-and-limits",2:"depth-clip-control",3:"depth32float-stencil8",4:"texture-compression-bc",5:"texture-compression-bc-sliced-3d",6:"texture-compression-etc2",7:"texture-compression-astc",8:"texture-compression-astc-sliced-3d",9:"timestamp-query",10:"indirect-first-instance", +11:"shader-f16",12:"rg11b10ufloat-renderable",13:"bgra8unorm-storage",14:"float32-filterable",15:"float32-blendable",16:"clip-distances",17:"dual-source-blending",18:"subgroups",19:"texture-formats-tier1",20:"texture-formats-tier2",21:"primitive-index",327692:"chromium-experimental-unorm16-texture-formats",327693:"chromium-experimental-snorm16-texture-formats",327732:"chromium-experimental-multi-draw-indirect"},kf=[,"low-power","high-performance"],lf=[,"occlusion","timestamp"],mf={undefined:1,unknown:1, +destroyed:2}; +function oc(a,b,c,d,e,f){b=N(b);c=N(c);d>>>=0;e>>>=0;f>>>=0;var h=Y(a>>>0);a={};if(f){var l=(r(),C)[f+12>>>2>>>0];if(l){var n=(r(),C)[f+16>>>2>>>0];a.requiredFeatures=Array.from((r(),C).subarray(n>>>2>>>0,n+4*l>>>2>>>0),p=>jf[p])}var t=(r(),C)[f+20>>>2>>>0];if(t){var y={};function p(z,A,pb=!1){A=t+A;A=(r(),C)[A>>>2>>>0];4294967295==A||pb&&0==A||(y[z]=A)}function v(z,A){A=t+A;var pb=(r(),C)[A>>>2>>>0],rf=(r(),C)[A+4>>>2>>>0];if(4294967295!=pb||4294967295!=rf)y[z]=4294967296*(r(),C)[A+4>>>2>>>0]+(r(), +C)[A>>>2>>>0]}p("maxTextureDimension1D",4);p("maxTextureDimension2D",8);p("maxTextureDimension3D",12);p("maxTextureArrayLayers",16);p("maxBindGroups",20);p("maxBindGroupsPlusVertexBuffers",24);p("maxDynamicUniformBuffersPerPipelineLayout",32);p("maxDynamicStorageBuffersPerPipelineLayout",36);p("maxSampledTexturesPerShaderStage",40);p("maxSamplersPerShaderStage",44);p("maxStorageBuffersPerShaderStage",48);p("maxStorageTexturesPerShaderStage",52);p("maxUniformBuffersPerShaderStage",56);p("minUniformBufferOffsetAlignment", +80);p("minStorageBufferOffsetAlignment",84);v("maxUniformBufferBindingSize",64);v("maxStorageBufferBindingSize",72);p("maxVertexBuffers",88);v("maxBufferSize",96);p("maxVertexAttributes",104);p("maxVertexBufferArrayStride",108);p("maxInterStageShaderVariables",112);p("maxColorAttachments",116);p("maxColorAttachmentBytesPerSample",120);p("maxComputeWorkgroupStorageSize",124);p("maxComputeInvocationsPerWorkgroup",128);p("maxComputeWorkgroupSizeX",132);p("maxComputeWorkgroupSizeY",136);p("maxComputeWorkgroupSizeZ", +140);p("maxComputeWorkgroupsPerDimension",144);p("maxImmediateSize",148,!0);a.requiredLimits=y}if(l=(r(),C)[f+24>>>2>>>0])l={label:Z(l+4)},a.defaultQueue=l;a.label=Z(f+4)}L+=1;$e(b,h.requestDevice(a).then(p=>{--L;W(e,p.queue);W(d,p);c&&(L+=1,$e(c,p.lost.then(v=>{--L;p.onuncapturederror=()=>{};var z=I(),A=V(v.message);Cd(c,mf[v.reason],A);H(z)})));p.onuncapturederror=v=>{var z=5;v.error instanceof GPUValidationError?z=2:v.error instanceof GPUOutOfMemoryError?z=3:v.error instanceof GPUInternalError&& +(z=4);var A=I();v=V(v.error.message);Hd(d,z,v);H(A)};"adapterInfo"in p||(p.adapterInfo=h.info);Gd(b,1,d,0)},p=>{--L;var v=I();p=V(p.message);Gd(b,3,d,p);c&&Cd(c,4,p);H(v)}))}function pc(a){a>>>=0;var b=Y(a),c=X[a];if(c){for(var d=0;d{var a="getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE";nf.v||(nf.v={});nf.v[a]||(nf.v[a]=1,k&&(a="warning: "+a),q(a))}; +function qc(a,b,c){a>>>=0;b>>>=0;c>>>=0;var d=Y(a);0===c&&nf();4294967295==c&&(c=void 0);try{var e=d.getMappedRange(b,c)}catch(h){return 0}var f=Nd(16,e.byteLength);(r(),x).set(new Uint8Array(e),f>>>0);X[a].push(()=>G(f));return f} +function rc(a,b,c){a>>>=0;b>>>=0;c>>>=0;var d=Y(a);0===c&&nf();4294967295==c&&(c=void 0);try{var e=d.getMappedRange(b,c)}catch(h){return 0}var f=Nd(16,e.byteLength);(r(),x).fill(0,f,e.byteLength);X[a].push(()=>{(new Uint8Array(e)).set((r(),x).subarray(f>>>0,f+e.byteLength>>>0));G(f)});return f} +function sc(a,b,c,d,e){a>>>=0;b=N(b);c=N(c);e>>>=0;var f=Y(a);X[a]=[];4294967295==e&&(e=void 0);L+=1;$e(b,f.mapAsync(c,d>>>0,e).then(()=>{--L;Dd(b,1,0)},h=>{--L;I();var l=V(h.message);Dd(b,"AbortError"===h.name?4:"OperationError"===h.name?3:0,l);delete X[a]}))}function tc(a){a>>>=0;var b=Y(a),c=X[a];if(c){for(var d=0;d>>0]} +function vc(a,b,c){a>>>=0;b>>>=0;c>>>=0;var d=!!(r(),C)[b+32>>>2>>>0];b={label:Z(b+4),usage:(r(),C)[b+16>>>2>>>0],size:4294967296*(r(),C)[b+28>>>2>>>0]+(r(),C)[b+24>>>2>>>0],mappedAtCreation:d};a=Y(a);try{var e=a.createBuffer(b)}catch(f){return!1}W(c,e);d&&(X[c]=[]);return!0} +function wc(a,b,c,d){a>>>=0;b=N(b);d>>>=0;c=ef(c>>>0);a=Y(a);L+=1;$e(b,a.createComputePipelineAsync(c).then(e=>{--L;W(d,e);Bd(b,1,d,0)},e=>{--L;var f=I(),h=V(e.message);Bd(b,"validation"===e.reason?3:"internal"===e.reason?4:0,d,h);H(f)}))}function xc(a,b,c){a>>>=0;b>>>=0;c>>>=0;var d=(r(),C)[b>>>2>>>0],e=(r(),C)[d+4>>>2>>>0];b={label:Z(b+4),code:""};switch(e){case 2:b.code=df(d+8)}W(c,Y(a).createShaderModule(b))}var yc=a=>{a=Y(a);a.onuncapturederror=null;a.destroy()}; +function zc(a,b){b=N(b);a=Y(a>>>0);L+=1;$e(b,a.popErrorScope().then(c=>{--L;var d=5;c?c instanceof GPUValidationError?d=2:c instanceof GPUOutOfMemoryError?d=3:c instanceof GPUInternalError&&(d=4):d=1;var e=I();c=c?V(c.message):0;Ed(b,1,d,c);H(e)},c=>{--L;var d=I();c=V(c.message);Ed(b,1,5,c);H(d)}))} +function Ac(a,b,c,d){b=N(b);c>>>=0;d>>>=0;if(c){var e=(r(),C)[c+4>>>2>>>0];e={featureLevel:hf[e],powerPreference:kf[(r(),C)[c+8>>>2>>>0]],forceFallbackAdapter:!!(r(),C)[c+12>>>2>>>0]};c=(r(),C)[c>>>2>>>0];0!==c&&(r(),e.ba=!!(r(),C)[c+8>>>2>>>0])}"gpu"in navigator?(L+=1,$e(b,navigator.gpu.requestAdapter(e).then(f=>{--L;if(f)W(d,f),Fd(b,1,d,0);else{f=I();var h=V("WebGPU not available on this browser (requestAdapter returned null)");Fd(b,3,d,h);H(f)}},f=>{--L;var h=I();f=V(f.message);Fd(b,4,d,f);H(h)}))): +(c=I(),e=V("WebGPU not available on this browser (navigator.gpu is not available)"),Fd(b,3,d,e),H(c))}function Bc(a,b,c){a>>>=0;b>>>=0;c>>>=0;return Ge(async()=>{var d=[];if(c){var e=(r(),B)[c>>>2>>>0];d.length=b+1;d[b]=new Promise(l=>setTimeout(l,e,0))}else d.length=b;for(var f=0;f>>2>>>0]+(r(),C)[a+8*f>>>2>>>0];if(!(h in Ze))return h;d[f]=Ze[h]}d=await Promise.race(d);delete Ze[d];return d})}Bc.A=!0; +var of={},qf=()=>{if(!pf){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",_:da||"./this.program"},b;for(b in of)void 0===of[b]?delete a[b]:a[b]=of[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);pf=c}return pf},pf;function Cc(a,b){if(m)return M(19,1,a,b);a>>>=0;b>>>=0;var c=0,d=0,e;for(e of qf()){var f=b+c;(r(),C)[a+d>>>2>>>0]=f;c+=T(e,f,Infinity)+1;d+=4}return 0} +function Dc(a,b){if(m)return M(20,1,a,b);a>>>=0;b>>>=0;var c=qf();(r(),C)[a>>>2>>>0]=c.length;a=0;for(var d of c)a+=U(d)+1;(r(),C)[b>>>2>>>0]=a;return 0}function Fc(a){return m?M(21,1,a):52}function Gc(a,b,c,d){return m?M(22,1,a,b,c,d):52}function Hc(a,b,c,d){return m?M(23,1,a,b,c,d):70}var sf=[null,[],[]]; +function Ic(a,b,c,d){if(m)return M(24,1,a,b,c,d);b>>>=0;c>>>=0;d>>>=0;for(var e=0,f=0;f>>2>>>0],l=(r(),C)[b+4>>>2>>>0];b+=8;for(var n=0;n>>0],p=sf[t];0===y||10===y?((1===t?pa:q)(je(p)),p.length=0):p.push(y)}e+=l}(r(),C)[d>>>2>>>0]=e;return 0}function Kc(a,b){ff(Y(a>>>0).limits,b>>>0);return 1}function Lc(a,b){return Y(a>>>0).features.has(jf[b])}function Mc(a){return BigInt(Y(a>>>0).size)}function Nc(a){return BigInt(Y(a>>>0).usage)} +function Oc(a,b){a>>>=0;b>>>=0;if(b){var c=Z(b+4);b=(r(),C)[b+12>>>2>>>0];b=0!==b?{querySet:Y((r(),C)[b+4>>>2>>>0]),beginningOfPassWriteIndex:(r(),C)[b+8>>>2>>>0],endOfPassWriteIndex:(r(),C)[b+12>>>2>>>0]}:void 0;c={label:c,timestampWrites:b}}a=Y(a);b=wd(0);W(b,a.beginComputePass(c));return b}function Pc(a,b,c,d,e,f){c=N(c);e=N(e);f=N(f);Y(a>>>0).copyBufferToBuffer(Y(b>>>0),c,Y(d>>>0),e,f)}function Qc(a){a=Y(a>>>0);var b=ud(0);W(b,a.finish());return b} +function Rc(a,b,c,d,e,f){f=N(f);Y(a>>>0).resolveQuerySet(Y(b>>>0),c,d,Y(e>>>0),f)}function Sc(a,b,c,d){Y(a>>>0).dispatchWorkgroups(b,c,d)}function Tc(a,b,c){c=N(c);Y(a>>>0).dispatchWorkgroupsIndirect(Y(b>>>0),c)}function Uc(a){Y(a>>>0).end()}function Vc(a,b,c,d,e){d>>>=0;e>>>=0;a=Y(a>>>0);c=Y(c>>>0);0==d?a.setBindGroup(b,c):a.setBindGroup(b,c,(r(),C),e>>>2,d)}function Wc(a,b){Y(a>>>0).setPipeline(Y(b>>>0))}function Xc(a,b,c){Y(a>>>0).aa(Y(b>>>0),c)} +function Yc(a,b){a=Y(a>>>0);var c=td(0);W(c,a.getBindGroupLayout(b));return c} +function Zc(a,b){a>>>=0;b>>>=0;var c=Z(b+4),d=Y((r(),C)[b+12>>>2>>>0]),e=(r(),C)[b+16>>>2>>>0];b=(r(),C)[b+20>>>2>>>0];for(var f=[],h=0;h>>2>>>0],p=(r(),C)[t+32>>>2>>>0],v=(r(),C)[t+36>>>2>>>0],z=(r(),C)[t+4>>>2>>>0];y?(p=t+24,p=(r(),C)[p>>>2>>>0]+4294967296*(r(),B)[p+4>>>2>>>0],-1==p&&(p=void 0),t={binding:z,resource:{buffer:Y(y),offset:4294967296*(r(),C)[t+4+16>>>2>>>0]+(r(),C)[t+16>>>2>>>0],size:p}}):t=p?{binding:z,resource:Y(p)}:{binding:z, +resource:Y(v)};n.call(l,t)}c={label:c,layout:d,entries:f};a=Y(a);d=sd(0);W(d,a.createBindGroup(c));return d}function $c(a,b){a>>>=0;b>>>=0;var c;b&&(c={label:Z(b+4)});a=Y(a);b=vd(0);W(b,a.createCommandEncoder(c));return b}function ad(a,b){a>>>=0;b>>>=0;b={type:lf[(r(),C)[b+12>>>2>>>0]],count:(r(),C)[b+16>>>2>>>0]};a=Y(a);var c=xd(0);W(c,a.createQuerySet(b));return c} +function bd(a,b){a=Y(a>>>0).adapterInfo;b>>>=0;(r(),B)[b+52>>>2>>>0]=a.subgroupMinSize;(r(),B)[b+56>>>2>>>0]=a.subgroupMaxSize;var c=Ve(a.vendor+a.architecture+a.device+a.description),d=U(a.vendor);cf(b+4,c,d);c+=d;d=U(a.architecture);cf(b+12,c,d);c+=d;d=U(a.device);cf(b+20,c,d);cf(b+28,c+d,U(a.description));(r(),B)[b+36>>>2>>>0]=2;a=a.isFallbackAdapter?3:4;(r(),B)[b+40>>>2>>>0]=a;(r(),B)[b+44>>>2>>>0]=0;(r(),B)[b+48>>>2>>>0]=0;return 1} +var tf={"core-features-and-limits":1,"depth-clip-control":2,"depth32float-stencil8":3,"texture-compression-bc":4,"texture-compression-bc-sliced-3d":5,"texture-compression-etc2":6,"texture-compression-astc":7,"texture-compression-astc-sliced-3d":8,"timestamp-query":9,"indirect-first-instance":10,"shader-f16":11,"rg11b10ufloat-renderable":12,"bgra8unorm-storage":13,"float32-filterable":14,"float32-blendable":15,"clip-distances":16,"dual-source-blending":17,subgroups:18,"texture-formats-tier1":19,"texture-formats-tier2":20, +"primitive-index":21,"chromium-experimental-unorm16-texture-formats":327692,"chromium-experimental-snorm16-texture-formats":327693,"chromium-experimental-multi-draw-indirect":327732};function cd(a,b){b>>>=0;a=Y(a>>>0);var c=pd(4*a.features.size),d=0,e=0;a.features.forEach(f=>{f=tf[f];0<=f&&((r(),B)[c+d>>>2>>>0]=f,d+=4,e++)});(r(),C)[b+4>>>2>>>0]=c;(r(),C)[b>>>2>>>0]=e}function dd(a,b){ff(Y(a>>>0).limits,b>>>0);return 1}function ed(a,b){Y(a>>>0).pushErrorScope(gf[b])} +function fd(a,b,c){b>>>=0;c>>>=0;a=Y(a>>>0);b=Array.from((r(),B).subarray(c>>>2>>>0,c+4*b>>>2>>>0),d=>Y(d));a.submit(b)}function gd(a,b,c,d,e){c=N(c);d>>>=0;e>>>=0;a=Y(a>>>0);b=Y(b>>>0);d=(r(),x).subarray(d>>>0,d+e>>>0);a.writeBuffer(b,c,d,0,e)}m||be();m||(u=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),ua());g.wasmBinary&&(qa=g.wasmBinary);g.stackSave=()=>I();g.stackRestore=a=>H(a);g.stackAlloc=a=>Pd(a); +g.setValue=function(a,b,c="i8"){c.endsWith("*")&&(c="*");switch(c){case "i1":(r(),w)[a>>>0]=b;break;case "i8":(r(),w)[a>>>0]=b;break;case "i16":(r(),Ka)[a>>>1>>>0]=b;break;case "i32":(r(),B)[a>>>2>>>0]=b;break;case "i64":(r(),E)[a>>>3>>>0]=BigInt(b);break;case "float":(r(),Ma)[a>>>2>>>0]=b;break;case "double":(r(),D)[a>>>3>>>0]=b;break;case "*":(r(),C)[a>>>2>>>0]=b;break;default:Qa(`invalid type for setValue: ${c}`)}}; +g.getValue=function(a,b="i8"){b.endsWith("*")&&(b="*");switch(b){case "i1":return(r(),w)[a>>>0];case "i8":return(r(),w)[a>>>0];case "i16":return(r(),Ka)[a>>>1>>>0];case "i32":return(r(),B)[a>>>2>>>0];case "i64":return(r(),E)[a>>>3>>>0];case "float":return(r(),Ma)[a>>>2>>>0];case "double":return(r(),D)[a>>>3>>>0];case "*":return(r(),C)[a>>>2>>>0];default:Qa(`invalid type for getValue: ${b}`)}};g.UTF8ToString=ke;g.stringToUTF8=T;g.lengthBytesUTF8=U; +var Fe=[Jc,ae,ge,$a,ab,bb,cb,db,eb,fb,gb,hb,ib,jb,kb,lb,Wb,Xb,Yb,Cc,Dc,Fc,Gc,Hc,Ic],Ee={1127952:(a,b,c,d,e)=>{if("undefined"==typeof g||!g.o)return 1;a=ke(Number(a>>>0));a.startsWith("./")&&(a=a.substring(2));a=g.o.get(a);if(!a)return 2;b=Number(b>>>0);c=Number(c>>>0);d=Number(d>>>0);if(b+c>a.byteLength)return 3;try{const f=a.subarray(b,b+c);switch(e){case 0:(r(),x).set(f,d>>>0);break;case 1:g.F?g.F(d,f):g.X(d,f);break;default:return 4}return 0}catch{return 4}},1128776:(a,b,c)=>{g.H(a,(r(),x).subarray(b>>> +0,b+c>>>0))},1128840:()=>g.V(),1128882:a=>{g.G(a)},1128919:()=>"undefined"!==typeof wasmOffsetConverter};function Ya(){return"undefined"!==typeof wasmOffsetConverter}var md,Ga,nd,od,G,pd,qd,rd,sd,td,ud,vd,wd,xd,yd,zd,Ad,Bd,Cd,Dd,Ed,Fd,Gd,Hd,Da,Ja,Id,Jd,Kd,Ld,Md,Nd,Ra,Od,H,Pd,I,Qd,Xa; +function kd(){var a=F;a=Object.assign({},a);var b=d=>e=>d(e)>>>0,c=d=>()=>d()>>>0;a.__getTypeName=b(a.__getTypeName);a.pthread_self=c(a.pthread_self);a.malloc=b(a.malloc);a.memalign=(d=>(e,f)=>d(e,f)>>>0)(a.memalign);a._emscripten_stack_alloc=b(a._emscripten_stack_alloc);a.emscripten_stack_get_current=c(a.emscripten_stack_get_current);return a}function Ba(){0{const b=new WeakMap;let c=1,d=void 0,e=void 0;g.webgpuRegisterDevice=l=>{if(void 0!==e)throw Error("another WebGPU EP inference session is being created.");if(l){var n=b.get(l);if(!n){n=rd(0);const t=bf(l,n);n=[c++,n,t];b.set(l,n)}d=l;e=n[0];return n}d=void 0;e=0};const f=new Map;g.webgpuOnCreateSession=l=>{if(void 0!==e){var n=e;e=void 0;if(l){const t=nd(n);f.set(l,t);0===n&&a(d??Y(t))}d=void 0}};g.webgpuOnReleaseSession=l=>{f.delete(l)};const h=Symbol("gpuBufferMetadata");g.webgpuRegisterBuffer= +(l,n,t)=>{if(t)return l[h]=[t,NaN],t;if(t=l[h])return t[1]++,t[0];n=f.get(n);if(void 0===n)throw Error("Invalid session handle passed to webgpuRegisterBuffer");n=af(l,n);l[h]=[n,1];return n};g.webgpuUnregisterBuffer=l=>{const n=l[h];if(!n)throw Error("Buffer is not registered");n[1]--;0===n[1]&&(qd(n[0]),delete l[h])};g.webgpuGetBuffer=l=>Y(l);g.webgpuCreateDownloader=(l,n,t)=>{t=f.get(t);if(void 0===t)throw Error("Invalid session handle passed to webgpuRegisterBuffer");const y=Y(t),p=16*Math.ceil(Number(n)/ +16);return async()=>{const v=y.createBuffer({size:p,usage:9});try{const z=y.createCommandEncoder();z.copyBufferToBuffer(l,0,v,0,p);y.queue.submit([z.finish()]);await v.mapAsync(GPUMapMode.READ);return v.getMappedRange().slice(0,n)}finally{v.destroy()}}};g.F=(l,n)=>{var t=n.buffer;const y=n.byteOffset,p=n.byteLength;n=16*Math.ceil(Number(p)/16);l=Y(l);if(!d){var v=nd(e);d=Y(v)}v=d.createBuffer({mappedAtCreation:!0,size:n,usage:6});const z=v.getMappedRange();(new Uint8Array(z)).set(new Uint8Array(t, +y,p));v.unmap();t=d.createCommandEncoder();t.copyBufferToBuffer(v,0,l,0,n);d.queue.submit([t.finish()]);v.destroy()}}; +g.webnnInit=a=>{const b=a[0];[g.V,g.G,g.webnnEnsureTensor,g.H,g.webnnDownloadTensor,g.U,g.webnnEnableTraceEvent]=a.slice(1);g.webnnReleaseTensorId=g.G;g.webnnUploadTensor=g.H;g.webnnRegisterMLContext=g.U;g.webnnOnRunStart=c=>b.onRunStart(c);g.webnnOnRunEnd=b.onRunEnd.bind(b);g.webnnOnReleaseSession=c=>{b.onReleaseSession(c)};g.webnnCreateMLTensorDownloader=(c,d)=>b.createMLTensorDownloader(c,d);g.webnnRegisterMLTensor=(c,d,e,f)=>b.registerMLTensor(c,d,e,f);g.webnnCreateMLContext=c=>b.createMLContext(c); +g.webnnRegisterMLConstant=(c,d,e,f,h,l)=>b.registerMLConstant(c,d,e,f,h,g.o,l);g.webnnRegisterGraphInput=b.registerGraphInput.bind(b);g.webnnIsGraphInput=b.isGraphInput.bind(b);g.webnnRegisterGraphOutput=b.registerGraphOutput.bind(b);g.webnnIsGraphOutput=b.isGraphOutput.bind(b);g.webnnCreateTemporaryTensor=b.createTemporaryTensor.bind(b);g.webnnIsGraphInputOutputTypeSupported=b.isGraphInputOutputTypeSupported.bind(b)};Oa?moduleRtn=g:moduleRtn=new Promise((a,b)=>{va=a;wa=b}); +;return moduleRtn}export default ortWasmThreaded;var isPthread=globalThis.self?.name?.startsWith("em-pthread");var isNode=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";if(isNode)isPthread=(await import("worker_threads")).workerData==="em-pthread";isPthread&&ortWasmThreaded(); diff --git a/vendor/onnxruntime-web/ort-wasm-simd-threaded.jspi.wasm b/vendor/onnxruntime-web/ort-wasm-simd-threaded.jspi.wasm new file mode 100644 index 0000000000000000000000000000000000000000..0bcd247b5f2e1daeef229375e007ea03e155350d --- /dev/null +++ b/vendor/onnxruntime-web/ort-wasm-simd-threaded.jspi.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47989653e231e7184f580c42199463bd6b77470e89d8241e27446193eadeb98b +size 16894865 diff --git a/vendor/onnxruntime-web/ort-wasm-simd-threaded.mjs b/vendor/onnxruntime-web/ort-wasm-simd-threaded.mjs new file mode 100644 index 0000000000000000000000000000000000000000..6b5b22c36426db6dd4ab144166b30c96f403fd0d --- /dev/null +++ b/vendor/onnxruntime-web/ort-wasm-simd-threaded.mjs @@ -0,0 +1,59 @@ +async function ortWasmThreaded(moduleArg={}){var moduleRtn;var h=moduleArg,aa=!!globalThis.window,k=!!globalThis.WorkerGlobalScope,m=globalThis.process?.versions?.node&&"renderer"!=globalThis.process?.type,n=k&&self.name?.startsWith("em-pthread");if(m){const {createRequire:a}=await import("module");var require=a(import.meta.url),ba=require("worker_threads");global.Worker=ba.Worker;n=(k=!ba.ic)&&"em-pthread"==ba.workerData}h.mountExternalData=(a,b)=>{a.startsWith("./")&&(a=a.substring(2));(h.Sb||(h.Sb=new Map)).set(a,b)}; +h.unmountExternalData=()=>{delete h.Sb};var SharedArrayBuffer=globalThis.SharedArrayBuffer??(new WebAssembly.Memory({initial:0,maximum:0,kc:!0})).buffer.constructor,ca="./this.program",da=(a,b)=>{throw b;},ea=import.meta.url,fa="",ha,ia; +if(m){var fs=require("fs");ea.startsWith("file:")&&(fa=require("path").dirname(require("url").fileURLToPath(ea))+"/");ia=a=>{a=ja(a)?new URL(a):a;return fs.readFileSync(a)};ha=async a=>{a=ja(a)?new URL(a):a;return fs.readFileSync(a,void 0)};1{process.exitCode=a;throw b;}}else if(aa||k){try{fa=(new URL(".",ea)).href}catch{}m||(k&&(ia=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer"; +b.send(null);return new Uint8Array(b.response)}),ha=async a=>{if(ja(a))return new Promise((d,c)=>{var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=()=>{200==e.status||0==e.status&&e.response?d(e.response):c(e.status)};e.onerror=c;e.send(null)});var b=await fetch(a,{credentials:"same-origin"});if(b.ok)return b.arrayBuffer();throw Error(b.status+" : "+b.url);})}var ka=console.log.bind(console),la=console.error.bind(console); +if(m){var ma=require("util"),na=a=>"object"==typeof a?ma.inspect(a):a;ka=(...a)=>fs.writeSync(1,a.map(na).join(" ")+"\n");la=(...a)=>fs.writeSync(2,a.map(na).join(" ")+"\n")}var oa=ka,p=la,q,r,pa=!1,t,ja=a=>a.startsWith("file://");function v(){x.buffer!=z.buffer&&qa()}var ra,sa; +if(m&&n){var ta=ba.parentPort;ta.on("message",a=>global.onmessage?.({data:a}));Object.assign(globalThis,{self:global,postMessage:a=>ta.postMessage(a)});process.on("uncaughtException",a=>{postMessage({Qb:"uncaughtException",error:a});process.exit(1)})}var ua; +if(n){var va=!1;self.onunhandledrejection=b=>{throw b.reason||b;};function a(b){try{var d=b.data,c=d.Qb;if("load"===c){let e=[];self.onmessage=f=>e.push(f);ua=()=>{postMessage({Qb:"loaded"});for(let f of e)a(f);self.onmessage=a};for(const f of d.$b)if(!h[f]||h[f].proxy)h[f]=(...g)=>{postMessage({Qb:"callHandler",Zb:f,args:g})},"print"==f&&(oa=h[f]),"printErr"==f&&(p=h[f]);x=d.ec;qa();r=d.fc;wa();xa()}else if("run"===c){ya(d.Pb);za(d.Pb,0,0,1,0,0);Aa();Ba(d.Pb);va||=!0;try{Ca(d.cc,d.Ub)}catch(e){if("unwind"!= +e)throw e;}}else"setimmediate"!==d.target&&("checkMailbox"===c?va&&Da():c&&(p(`worker: received unknown command ${c}`),p(d)))}catch(e){throw Ea(),e;}}self.onmessage=a}var z,A,Fa,C,D,Ga,G,H,Ha=!1;function qa(){var a=x.buffer;h.HEAP8=z=new Int8Array(a);Fa=new Int16Array(a);h.HEAPU8=A=new Uint8Array(a);new Uint16Array(a);h.HEAP32=C=new Int32Array(a);h.HEAPU32=D=new Uint32Array(a);Ga=new Float32Array(a);G=new Float64Array(a);H=new BigInt64Array(a);new BigUint64Array(a)} +function Ia(){Ha=!0;n?ua():I.Ua()}function J(a){a="Aborted("+a+")";p(a);pa=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");sa?.(a);throw a;}var Ja;async function Ka(a){if(!q)try{var b=await ha(a);return new Uint8Array(b)}catch{}if(a==Ja&&q)a=new Uint8Array(q);else if(ia)a=ia(a);else throw"both async and sync fetching of the wasm failed";return a} +async function La(a,b){try{var d=await Ka(a);return await WebAssembly.instantiate(d,b)}catch(c){p(`failed to asynchronously prepare wasm: ${c}`),J(c)}}async function Na(a){var b=Ja;if(!q&&!ja(b)&&!m)try{var d=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(d,a)}catch(c){p(`wasm streaming compile failed: ${c}`),p("falling back to ArrayBuffer instantiation")}return La(b,a)} +function Oa(){Pa={S:Qa,f:Ra,w:Sa,e:Ta,j:Ua,g:Va,T:Wa,b:Xa,G:Ya,ua:Za,k:$a,K:ab,Ka:bb,qa:cb,sa:db,La:eb,Ia:fb,Ba:gb,Ha:hb,Z:ib,ra:jb,oa:kb,Ja:lb,pa:mb,Qa:nb,Ea:ob,ma:pb,va:qb,ja:rb,U:sb,Da:Ba,Na:tb,ya:ub,za:vb,Aa:wb,wa:xb,xa:yb,ka:zb,Sa:Ab,Pa:Bb,W:Cb,V:Db,Oa:Eb,F:Fb,Ma:Gb,na:Hb,u:Ib,H:Jb,R:Kb,la:Lb,da:Mb,Ta:Nb,Fa:Ob,Ga:Pb,ta:Qb,L:Rb,Y:Sb,Ca:Tb,X:Ub,$:Vb,M:Wb,aa:Xb,N:Yb,v:Zb,c:$b,m:ac,n:bc,r:cc,ea:dc,x:ec,o:fc,O:gc,D:hc,I:ic,ba:jc,ca:kc,Q:lc,P:mc,fa:nc,z:oc,E:pc,d:qc,q:rc,i:sc,_:tc,l:uc,p:vc,s:wc,t:xc, +y:yc,ga:zc,B:Ac,J:Bc,C:Cc,ha:Dc,ia:Ec,A:Fc,h:Gc,a:x,Ra:Hc};return{a:Pa}} +async function wa(){function a(c,e){I=c.exports;I=Ic();Jc.push(I.wb);c=I;h._OrtInit=c.Va;h._OrtGetLastError=c.Wa;h._OrtCreateSessionOptions=c.Xa;h._OrtAppendExecutionProvider=c.Ya;h._OrtAddFreeDimensionOverride=c.Za;h._OrtAddSessionConfigEntry=c._a;h._OrtReleaseSessionOptions=c.$a;h._OrtCreateSession=c.ab;h._OrtReleaseSession=c.bb;h._OrtGetInputOutputCount=c.cb;h._OrtGetInputOutputMetadata=c.db;h._OrtFree=c.eb;h._OrtCreateTensor=c.fb;h._OrtGetTensorData=c.gb;h._OrtReleaseTensor=c.hb;h._OrtCreateRunOptions= +c.ib;h._OrtAddRunConfigEntry=c.jb;h._OrtReleaseRunOptions=c.kb;h._OrtCreateBinding=c.lb;h._OrtBindInput=c.mb;h._OrtBindOutput=c.nb;h._OrtClearBoundOutputs=c.ob;h._OrtReleaseBinding=c.pb;h._OrtRunWithBinding=c.qb;h._OrtRun=c.rb;h._OrtEndProfiling=c.sb;Kc=c.tb;Lc=h._free=c.ub;Mc=h._malloc=c.vb;za=c.yb;Ea=c.zb;Nc=c.Ab;Oc=c.Bb;Pc=c.Cb;Qc=c.Db;Rc=c.Eb;K=c.Fb;L=c.Gb;Sc=c.Hb;M=c.Ib;Tc=c.Jb;N=c.Kb;Uc=c.Lb;Vc=c.Mb;Wc=c.Nb;Xc=c.Ob;Yc=c.xb;r=e;return I}var b=Oa();if(h.instantiateWasm)return new Promise(c=>{h.instantiateWasm(b, +(e,f)=>{c(a(e,f))})});if(n){var d=new WebAssembly.Instance(r,Oa());return a(d,r)}Ja??=h.locateFile?h.locateFile?h.locateFile("ort-wasm-simd-threaded.wasm",fa):fa+"ort-wasm-simd-threaded.wasm":(new URL("ort-wasm-simd-threaded.wasm",import.meta.url)).href;return function(c){return a(c.instance,c.module)}(await Na(b))}class Zc{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}} +var $c=a=>{a.terminate();a.onmessage=()=>{}},ad=[],O=0,P=null,dd=a=>{0==Q.length&&(bd(),cd(Q[0]));var b=Q.pop();if(!b)return 6;R.push(b);S[a.Pb]=b;b.Pb=a.Pb;var d={Qb:"run",cc:a.bc,Ub:a.Ub,Pb:a.Pb};m&&b.unref();b.postMessage(d,a.Yb);return 0},T=0,U=(a,b,...d)=>{var c=16*d.length,e=N(),f=Tc(c),g=f>>>3,l;for(l of d)"bigint"==typeof l?((v(),H)[g++>>>0]=1n,(v(),H)[g++>>>0]=l):((v(),H)[g++>>>0]=0n,(v(),G)[g++>>>0]=l);a=Nc(a,0,c,f,b);M(e);return a}; +function Hc(a){if(n)return U(0,1,a);t=a;if(!(0{t=a;if(n)throw ed(a),"unwind";Hc(a)},Q=[],R=[],Jc=[],S={};function fd(){for(var a=h.numThreads-1;a--;)bd();ad.push(async()=>{var b=gd();O++;await b;O--;0==O&&P&&(b=P,P=null,b())})}var hd=a=>{var b=a.Pb;delete S[b];Q.push(a);R.splice(R.indexOf(a),1);a.Pb=0;Oc(b)};function Aa(){Jc.forEach(a=>a())} +var cd=a=>new Promise(b=>{a.onmessage=f=>{var g=f.data;f=g.Qb;if(g.Tb&&g.Tb!=Kc()){var l=S[g.Tb];l?l.postMessage(g,g.Yb):p(`Internal error! Worker sent a message "${f}" to target pthread ${g.Tb}, but that thread no longer exists!`)}else if("checkMailbox"===f)Da();else if("spawnThread"===f)dd(g);else if("cleanupThread"===f)jd(()=>{hd(S[g.dc])});else if("loaded"===f)a.loaded=!0,m&&!a.Pb&&a.unref(),b(a);else if("setimmediate"===g.target)a.postMessage(g);else if("uncaughtException"===f)a.onerror(g.error); +else if("callHandler"===f)h[g.Zb](...g.args);else f&&p(`worker sent an unknown command ${f}`)};a.onerror=f=>{p(`${"worker sent an error!"} ${f.filename}:${f.lineno}: ${f.message}`);throw f;};m&&(a.on("message",f=>a.onmessage({data:f})),a.on("error",f=>a.onerror(f)));var d=[],c=[],e;for(e of c)h.propertyIsEnumerable(e)&&d.push(e);a.postMessage({Qb:"load",$b:d,ec:x,fc:r})});async function gd(){if(!n)return Promise.all(Q.map(cd))} +function bd(){var a=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});Q.push(a)}function ya(a){var b=(v(),D)[a+52>>>2>>>0];a=(v(),D)[a+56>>>2>>>0];Sc(b,b-a);M(b)}var kd=[],V=a=>{var b=kd[a];b||(kd[a]=b=Yc.get(a));return b},Ca=(a,b)=>{T=0;a=V(a)(b);0>>=0;var b=new nd(a);0==(v(),z)[b.Rb+12>>>0]&&(od(b,!0),md--);pd(b,!1);ld.push(b);return Xc(a)} +var W=0,Sa=()=>{K(0,0);var a=ld.pop();Uc(a.Vb);W=0};function od(a,b){b=b?1:0;(v(),z)[a.Rb+12>>>0]=b}function pd(a,b){b=b?1:0;(v(),z)[a.Rb+13>>>0]=b}class nd{constructor(a){this.Vb=a;this.Rb=a-24}}var qd=a=>{var b=W;if(!b)return L(0),0;var d=new nd(b);(v(),D)[d.Rb+16>>>2>>>0]=b;var c=(v(),D)[d.Rb+4>>>2>>>0];if(!c)return L(0),b;for(var e of a){if(0===e||e===c)break;if(Wc(e,c,d.Rb+16))return L(e),b}L(c);return b};function Ta(){return qd([])}function Ua(a){return qd([a>>>0])} +function Va(a,b,d,c){return qd([a>>>0,b>>>0,d>>>0,c>>>0])}var Wa=()=>{var a=ld.pop();a||J("no exception to throw");var b=a.Vb;0==(v(),z)[a.Rb+13>>>0]&&(ld.push(a),pd(a,!0),od(a,!1),md++);Vc(b);W=b;throw W;};function Xa(a,b,d){a>>>=0;var c=new nd(a);b>>>=0;d>>>=0;(v(),D)[c.Rb+16>>>2>>>0]=0;(v(),D)[c.Rb+4>>>2>>>0]=b;(v(),D)[c.Rb+8>>>2>>>0]=d;Vc(a);W=a;md++;throw W;}var Ya=()=>md;function rd(a,b,d,c){return n?U(2,1,a,b,d,c):Za(a,b,d,c)} +function Za(a,b,d,c){a>>>=0;b>>>=0;d>>>=0;c>>>=0;if(!globalThis.SharedArrayBuffer)return 6;var e=[];if(n&&0===e.length)return rd(a,b,d,c);a={bc:d,Pb:a,Ub:c,Yb:e};return n?(a.Qb="spawnThread",postMessage(a,e),0):dd(a)}function $a(a){W||=a>>>0;throw W;} +var sd=globalThis.TextDecoder&&new TextDecoder,td=(a,b=0,d,c)=>{b>>>=0;var e=b;d=e+d;if(c)c=d;else{for(;a[e]&&!(e>=d);)++e;c=e}if(16d?e+=String.fromCharCode(d):(d-=65536,e+=String.fromCharCode(55296|d>>10,56320| +d&1023))}}else e+=String.fromCharCode(d);return e},ud=(a,b,d)=>(a>>>=0)?td((v(),A),a,b,d):"";function ab(a,b,d){return n?U(3,1,a,b,d):0}function bb(a,b){if(n)return U(4,1,a,b)}function cb(a,b){if(n)return U(5,1,a,b)}function db(a,b,d){if(n)return U(6,1,a,b,d)}function eb(a,b,d){return n?U(7,1,a,b,d):0}function fb(a,b){if(n)return U(8,1,a,b)}function gb(a,b,d){if(n)return U(9,1,a,b,d)}function hb(a,b,d,c){if(n)return U(10,1,a,b,d,c)}function ib(a,b,d,c){if(n)return U(11,1,a,b,d,c)} +function jb(a,b,d,c){if(n)return U(12,1,a,b,d,c)}function kb(a){if(n)return U(13,1,a)}function lb(a,b){if(n)return U(14,1,a,b)}function mb(a,b,d){if(n)return U(15,1,a,b,d)}var nb=()=>J("");function ob(a){za(a>>>0,!k,1,!aa,131072,!1);Aa()} +var jd=a=>{if(!pa)try{if(a(),!(0Number((navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)||[])[2]);function Ba(a){a>>>=0;vd||(Atomics.waitAsync((v(),C),a>>>2,a).value.then(Da),a+=128,Atomics.store((v(),C),a>>>2,1))}var Da=()=>jd(()=>{var a=Kc();a&&(Ba(a),Rc())}); +function pb(a,b){a>>>=0;a==b>>>0?setTimeout(Da):n?postMessage({Tb:a,Qb:"checkMailbox"}):(a=S[a])&&a.postMessage({Qb:"checkMailbox"})}var wd=[];function qb(a,b,d,c,e){b>>>=0;e>>>=0;wd.length=0;d=e>>>3;for(c=e+c>>>3;d>>0]?f=(v(),H)[d++>>>0]:f=(v(),G)[d++>>>0];wd.push(f)}return(b?xd[b]:yd[a])(...wd)}var rb=()=>{T=0};function sb(a){a>>>=0;n?postMessage({Qb:"cleanupThread",dc:a}):hd(S[a])}function tb(a){m&&S[a>>>0].ref()} +function ub(a,b){a=-9007199254740992>a||9007199254740992>>=0;a=new Date(1E3*a);(v(),C)[b>>>2>>>0]=a.getUTCSeconds();(v(),C)[b+4>>>2>>>0]=a.getUTCMinutes();(v(),C)[b+8>>>2>>>0]=a.getUTCHours();(v(),C)[b+12>>>2>>>0]=a.getUTCDate();(v(),C)[b+16>>>2>>>0]=a.getUTCMonth();(v(),C)[b+20>>>2>>>0]=a.getUTCFullYear()-1900;(v(),C)[b+24>>>2>>>0]=a.getUTCDay();a=(a.getTime()-Date.UTC(a.getUTCFullYear(),0,1,0,0,0,0))/864E5|0;(v(),C)[b+28>>>2>>>0]=a} +var zd=a=>0===a%4&&(0!==a%100||0===a%400),Ad=[0,31,60,91,121,152,182,213,244,274,305,335],Bd=[0,31,59,90,120,151,181,212,243,273,304,334]; +function vb(a,b){a=-9007199254740992>a||9007199254740992>>=0;a=new Date(1E3*a);(v(),C)[b>>>2>>>0]=a.getSeconds();(v(),C)[b+4>>>2>>>0]=a.getMinutes();(v(),C)[b+8>>>2>>>0]=a.getHours();(v(),C)[b+12>>>2>>>0]=a.getDate();(v(),C)[b+16>>>2>>>0]=a.getMonth();(v(),C)[b+20>>>2>>>0]=a.getFullYear()-1900;(v(),C)[b+24>>>2>>>0]=a.getDay();var d=(zd(a.getFullYear())?Ad:Bd)[a.getMonth()]+a.getDate()-1|0;(v(),C)[b+28>>>2>>>0]=d;(v(),C)[b+36>>>2>>>0]=-(60*a.getTimezoneOffset());d=(new Date(a.getFullYear(), +6,1)).getTimezoneOffset();var c=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();a=(d!=c&&a.getTimezoneOffset()==Math.min(c,d))|0;(v(),C)[b+32>>>2>>>0]=a} +function wb(a){a>>>=0;var b=new Date((v(),C)[a+20>>>2>>>0]+1900,(v(),C)[a+16>>>2>>>0],(v(),C)[a+12>>>2>>>0],(v(),C)[a+8>>>2>>>0],(v(),C)[a+4>>>2>>>0],(v(),C)[a>>>2>>>0],0),d=(v(),C)[a+32>>>2>>>0],c=b.getTimezoneOffset(),e=(new Date(b.getFullYear(),6,1)).getTimezoneOffset(),f=(new Date(b.getFullYear(),0,1)).getTimezoneOffset(),g=Math.min(f,e);0>d?(v(),C)[a+32>>>2>>>0]=Number(e!=f&&g==c):0>>2>>>0]=b.getDay();d=(zd(b.getFullYear())? +Ad:Bd)[b.getMonth()]+b.getDate()-1|0;(v(),C)[a+28>>>2>>>0]=d;(v(),C)[a>>>2>>>0]=b.getSeconds();(v(),C)[a+4>>>2>>>0]=b.getMinutes();(v(),C)[a+8>>>2>>>0]=b.getHours();(v(),C)[a+12>>>2>>>0]=b.getDate();(v(),C)[a+16>>>2>>>0]=b.getMonth();(v(),C)[a+20>>>2>>>0]=b.getYear();a=b.getTime();return BigInt(isNaN(a)?-1:a/1E3)}function xb(a,b,d,c,e,f,g){return n?U(16,1,a,b,d,c,e,f,g):-52}function yb(a,b,d,c,e,f){if(n)return U(17,1,a,b,d,c,e,f)}var X={},Ib=()=>performance.timeOrigin+performance.now(); +function zb(a,b){if(n)return U(18,1,a,b);X[a]&&(clearTimeout(X[a].id),delete X[a]);if(!b)return 0;var d=setTimeout(()=>{delete X[a];jd(()=>Qc(a,performance.timeOrigin+performance.now()))},b);X[a]={id:d,lc:b};return 0} +var Y=(a,b,d)=>{var c=(v(),A);b>>>=0;if(0=g){if(b>=d)break;c[b++>>>0]=g}else if(2047>=g){if(b+1>=d)break;c[b++>>>0]=192|g>>6;c[b++>>>0]=128|g&63}else if(65535>=g){if(b+2>=d)break;c[b++>>>0]=224|g>>12;c[b++>>>0]=128|g>>6&63;c[b++>>>0]=128|g&63}else{if(b+3>=d)break;c[b++>>>0]=240|g>>18;c[b++>>>0]=128|g>>12&63;c[b++>>>0]=128|g>>6&63;c[b++>>>0]=128|g&63;f++}}c[b>>>0]=0;a=b-e}else a=0;return a}; +function Ab(a,b,d,c){a>>>=0;b>>>=0;d>>>=0;c>>>=0;var e=(new Date).getFullYear(),f=(new Date(e,0,1)).getTimezoneOffset();e=(new Date(e,6,1)).getTimezoneOffset();var g=Math.max(f,e);(v(),D)[a>>>2>>>0]=60*g;(v(),C)[b>>>2>>>0]=Number(f!=e);b=l=>{var u=Math.abs(l);return`UTC${0<=l?"-":"+"}${String(Math.floor(u/60)).padStart(2,"0")}${String(u%60).padStart(2,"0")}`};a=b(f);b=b(e);eDate.now(),Cd=1; +function Bb(a,b,d){d>>>=0;if(!(0<=a&&3>=a))return 28;if(0===a)a=Date.now();else if(Cd)a=performance.timeOrigin+performance.now();else return 52;a=Math.round(1E6*a);(v(),H)[d>>>3>>>0]=BigInt(a);return 0}var Dd=[];function Cb(a,b,d){a>>>=0;b>>>=0;d>>>=0;Dd.length=0;for(var c;c=(v(),A)[b++>>>0];){var e=105!=c;e&=112!=c;d+=e&&d%8?4:0;Dd.push(112==c?(v(),D)[d>>>2>>>0]:106==c?(v(),H)[d>>>3>>>0]:105==c?(v(),C)[d>>>2>>>0]:(v(),G)[d>>>3>>>0]);d+=e?8:4}return xd[a](...Dd)}var Db=()=>{}; +function Fb(a,b){return p(ud(a>>>0,b>>>0))}var Gb=()=>{T+=1;throw"unwind";};function Hb(){return 4294901760}var Jb=()=>m?require("os").cpus().length:navigator.hardwareConcurrency,Z={},Ed=a=>{for(var b=0,d=0;d=c?b++:2047>=c?b+=2:55296<=c&&57343>=c?(b+=4,++d):b+=3}return b},Fd=a=>{var b;return(b=/\bwasm-function\[\d+\]:(0x[0-9a-f]+)/.exec(a))?+b[1]:(b=/:(\d+):\d+(?:\)|$)/.exec(a))?2147483648|+b[1]:0},Gd=a=>{for(var b of a)(a=Fd(b))&&(Z[a]=b)}; +function Mb(){var a=Error().stack.toString().split("\n");"Error"==a[0]&&a.shift();Gd(a);Z.Wb=Fd(a[3]);Z.ac=a;return Z.Wb}function Kb(a){a=Z[a>>>0];if(!a)return 0;var b;if(b=/^\s+at .*\.wasm\.(.*) \(.*\)$/.exec(a))a=b[1];else if(b=/^\s+at (.*) \(.*\)$/.exec(a))a=b[1];else if(b=/^(.+?)@/.exec(a))a=b[1];else return 0;Lc(Kb.Xb??0);b=Ed(a)+1;var d=Mc(b);d&&Y(a,d,b);Kb.Xb=d;return Kb.Xb} +function Lb(a){a>>>=0;var b=(v(),A).length;if(a<=b||4294901760=d;d*=2){var c=b*(1+.2/d);c=Math.min(c,a+100663296);a:{c=(Math.min(4294901760,65536*Math.ceil(Math.max(a,c)/65536))-x.buffer.byteLength+65535)/65536|0;try{x.grow(c);qa();var e=1;break a}catch(f){}e=void 0}if(e)return!0}return!1} +function Nb(a,b,d){a>>>=0;b>>>=0;if(Z.Wb==a)var c=Z.ac;else c=Error().stack.toString().split("\n"),"Error"==c[0]&&c.shift(),Gd(c);for(var e=3;c[e]&&Fd(c[e])!=a;)++e;for(a=0;a>>2>>>0]=Fd(c[a+e]);return a} +var Hd={},Jd=()=>{if(!Id){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",_:ca||"./this.program"},b;for(b in Hd)void 0===Hd[b]?delete a[b]:a[b]=Hd[b];var d=[];for(b in a)d.push(`${b}=${a[b]}`);Id=d}return Id},Id;function Ob(a,b){if(n)return U(19,1,a,b);a>>>=0;b>>>=0;var d=0,c=0,e;for(e of Jd()){var f=b+d;(v(),D)[a+c>>>2>>>0]=f;d+=Y(e,f,Infinity)+1;c+=4}return 0} +function Pb(a,b){if(n)return U(20,1,a,b);a>>>=0;b>>>=0;var d=Jd();(v(),D)[a>>>2>>>0]=d.length;a=0;for(var c of d)a+=Ed(c)+1;(v(),D)[b>>>2>>>0]=a;return 0}function Rb(a){return n?U(21,1,a):52}function Sb(a,b,d,c){return n?U(22,1,a,b,d,c):52}function Tb(a,b,d,c){return n?U(23,1,a,b,d,c):70}var Kd=[null,[],[]]; +function Ub(a,b,d,c){if(n)return U(24,1,a,b,d,c);b>>>=0;d>>>=0;c>>>=0;for(var e=0,f=0;f>>2>>>0],l=(v(),D)[b+4>>>2>>>0];b+=8;for(var u=0;u>>0],B=Kd[w];0===y||10===y?((1===w?oa:p)(td(B)),B.length=0):B.push(y)}e+=l}(v(),D)[c>>>2>>>0]=e;return 0}function Gc(a){return a>>>0}n||fd();n||(x=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),qa());h.wasmBinary&&(q=h.wasmBinary);h.stackSave=()=>N();h.stackRestore=a=>M(a);h.stackAlloc=a=>Tc(a); +h.setValue=function(a,b,d="i8"){d.endsWith("*")&&(d="*");switch(d){case "i1":(v(),z)[a>>>0]=b;break;case "i8":(v(),z)[a>>>0]=b;break;case "i16":(v(),Fa)[a>>>1>>>0]=b;break;case "i32":(v(),C)[a>>>2>>>0]=b;break;case "i64":(v(),H)[a>>>3>>>0]=BigInt(b);break;case "float":(v(),Ga)[a>>>2>>>0]=b;break;case "double":(v(),G)[a>>>3>>>0]=b;break;case "*":(v(),D)[a>>>2>>>0]=b;break;default:J(`invalid type for setValue: ${d}`)}}; +h.getValue=function(a,b="i8"){b.endsWith("*")&&(b="*");switch(b){case "i1":return(v(),z)[a>>>0];case "i8":return(v(),z)[a>>>0];case "i16":return(v(),Fa)[a>>>1>>>0];case "i32":return(v(),C)[a>>>2>>>0];case "i64":return(v(),H)[a>>>3>>>0];case "float":return(v(),Ga)[a>>>2>>>0];case "double":return(v(),G)[a>>>3>>>0];case "*":return(v(),D)[a>>>2>>>0];default:J(`invalid type for getValue: ${b}`)}};h.UTF8ToString=ud;h.stringToUTF8=Y;h.lengthBytesUTF8=Ed; +var yd=[Hc,ed,rd,ab,bb,cb,db,eb,fb,gb,hb,ib,jb,kb,lb,mb,xb,yb,zb,Ob,Pb,Rb,Sb,Tb,Ub],xd={887900:(a,b,d,c,e)=>{if("undefined"==typeof h||!h.Sb)return 1;a=ud(Number(a>>>0));a.startsWith("./")&&(a=a.substring(2));a=h.Sb.get(a);if(!a)return 2;b=Number(b>>>0);d=Number(d>>>0);c=Number(c>>>0);if(b+d>a.byteLength)return 3;try{const f=a.subarray(b,b+d);switch(e){case 0:(v(),A).set(f,c>>>0);break;case 1:h.hc?h.hc(c,f):h.jc(c,f);break;default:return 4}return 0}catch{return 4}},888724:()=>"undefined"!==typeof wasmOffsetConverter}; +function Qa(){return"undefined"!==typeof wasmOffsetConverter}var Kc,Lc,Mc,za,Ea,Nc,Oc,Pc,Qc,Rc,K,L,Sc,M,Tc,N,Uc,Vc,Wc,Xc,Yc,Pa;function bc(a,b,d,c){var e=N();try{return V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}function ac(a,b,d){var c=N();try{return V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0)}}function sc(a,b,d){var c=N();try{V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0)}}function $b(a,b){var d=N();try{return V(a)(b)}catch(c){M(d);if(c!==c+0)throw c;K(1,0)}} +function qc(a){var b=N();try{V(a)()}catch(d){M(b);if(d!==d+0)throw d;K(1,0)}}function fc(a,b,d,c,e,f,g){var l=N();try{return V(a)(b,d,c,e,f,g)}catch(u){M(l);if(u!==u+0)throw u;K(1,0)}}function rc(a,b){var d=N();try{V(a)(b)}catch(c){M(d);if(c!==c+0)throw c;K(1,0)}}function wc(a,b,d,c,e,f){var g=N();try{V(a)(b,d,c,e,f)}catch(l){M(g);if(l!==l+0)throw l;K(1,0)}}function uc(a,b,d,c){var e=N();try{V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}} +function vc(a,b,d,c,e){var f=N();try{V(a)(b,d,c,e)}catch(g){M(f);if(g!==g+0)throw g;K(1,0)}}function xc(a,b,d,c,e,f,g){var l=N();try{V(a)(b,d,c,e,f,g)}catch(u){M(l);if(u!==u+0)throw u;K(1,0)}}function Ec(a,b,d,c,e,f,g){var l=N();try{V(a)(b,d,c,e,f,g)}catch(u){M(l);if(u!==u+0)throw u;K(1,0)}}function Dc(a,b,d,c,e,f,g,l){var u=N();try{V(a)(b,d,c,e,f,g,l)}catch(w){M(u);if(w!==w+0)throw w;K(1,0)}}function cc(a,b,d,c,e){var f=N();try{return V(a)(b,d,c,e)}catch(g){M(f);if(g!==g+0)throw g;K(1,0)}} +function yc(a,b,d,c,e,f,g,l){var u=N();try{V(a)(b,d,c,e,f,g,l)}catch(w){M(u);if(w!==w+0)throw w;K(1,0)}}function Bc(a,b,d,c,e,f,g,l,u,w,y,B){var E=N();try{V(a)(b,d,c,e,f,g,l,u,w,y,B)}catch(F){M(E);if(F!==F+0)throw F;K(1,0)}}function ec(a,b,d,c,e,f){var g=N();try{return V(a)(b,d,c,e,f)}catch(l){M(g);if(l!==l+0)throw l;K(1,0)}}function oc(a,b,d){var c=N();try{return V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0);return 0n}} +function zc(a,b,d,c,e,f,g,l,u){var w=N();try{V(a)(b,d,c,e,f,g,l,u)}catch(y){M(w);if(y!==y+0)throw y;K(1,0)}}function Zb(a){var b=N();try{return V(a)()}catch(d){M(b);if(d!==d+0)throw d;K(1,0)}}function lc(a,b,d){var c=N();try{return V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0)}}function nc(a,b){var d=N();try{return V(a)(b)}catch(c){M(d);if(c!==c+0)throw c;K(1,0);return 0n}}function Fc(a,b,d,c,e){var f=N();try{V(a)(b,d,c,e)}catch(g){M(f);if(g!==g+0)throw g;K(1,0)}} +function mc(a){var b=N();try{return V(a)()}catch(d){M(b);if(d!==d+0)throw d;K(1,0);return 0n}}function ic(a,b,d,c,e,f){var g=N();try{return V(a)(b,d,c,e,f)}catch(l){M(g);if(l!==l+0)throw l;K(1,0)}}function dc(a,b,d,c,e,f){var g=N();try{return V(a)(b,d,c,e,f)}catch(l){M(g);if(l!==l+0)throw l;K(1,0)}}function gc(a,b,d,c,e,f,g,l){var u=N();try{return V(a)(b,d,c,e,f,g,l)}catch(w){M(u);if(w!==w+0)throw w;K(1,0)}} +function pc(a,b,d,c,e){var f=N();try{return V(a)(b,d,c,e)}catch(g){M(f);if(g!==g+0)throw g;K(1,0);return 0n}}function Yb(a,b,d,c){var e=N();try{return V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}function Wb(a,b,d,c){var e=N();try{return V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}function hc(a,b,d,c,e,f,g,l,u,w,y,B){var E=N();try{return V(a)(b,d,c,e,f,g,l,u,w,y,B)}catch(F){M(E);if(F!==F+0)throw F;K(1,0)}} +function Ac(a,b,d,c,e,f,g,l,u,w,y){var B=N();try{V(a)(b,d,c,e,f,g,l,u,w,y)}catch(E){M(B);if(E!==E+0)throw E;K(1,0)}}function Cc(a,b,d,c,e,f,g,l,u,w,y,B,E,F,Ld,Md){var Nd=N();try{V(a)(b,d,c,e,f,g,l,u,w,y,B,E,F,Ld,Md)}catch(Ma){M(Nd);if(Ma!==Ma+0)throw Ma;K(1,0)}}function kc(a,b,d,c){var e=N();try{return V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}function jc(a,b,d,c,e){var f=N();try{return V(a)(b,d,c,e)}catch(g){M(f);if(g!==g+0)throw g;K(1,0)}} +function Xb(a,b,d){var c=N();try{return V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0)}}function Vb(a,b,d){var c=N();try{return V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0)}}function tc(a,b,d,c){var e=N();try{V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}function Ic(){var a=I;a=Object.assign({},a);var b=c=>()=>c()>>>0,d=c=>e=>c(e)>>>0;a.tb=b(a.tb);a.vb=d(a.vb);a.Jb=d(a.Jb);a.Kb=b(a.Kb);a.Ob=d(a.Ob);return a} +function xa(){if(0{ra=a;sa=b}); +;return moduleRtn}export default ortWasmThreaded;var isPthread=globalThis.self?.name?.startsWith("em-pthread");var isNode=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";if(isNode)isPthread=(await import("worker_threads")).workerData==="em-pthread";isPthread&&ortWasmThreaded(); diff --git a/vendor/onnxruntime-web/ort-wasm-simd-threaded.wasm b/vendor/onnxruntime-web/ort-wasm-simd-threaded.wasm new file mode 100644 index 0000000000000000000000000000000000000000..20d4b0079b25d0e6b228fe9121470e118e10e2ff --- /dev/null +++ b/vendor/onnxruntime-web/ort-wasm-simd-threaded.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be0e129949062ad50290ef94683fac8be5bb6156f709e030b7a5f1661a2f6c17 +size 12361745 diff --git a/vendor/onnxruntime-web/ort.all.min.js b/vendor/onnxruntime-web/ort.all.min.js new file mode 100644 index 0000000000000000000000000000000000000000..f8824eec73f1f77a8e2263742c89f67c97de7483 --- /dev/null +++ b/vendor/onnxruntime-web/ort.all.min.js @@ -0,0 +1,4658 @@ +/*! + * ONNX Runtime Web v1.24.3 + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ +"use strict";var ort=(()=>{var $x=Object.create;var lo=Object.defineProperty;var Ax=Object.getOwnPropertyDescriptor;var Px=Object.getOwnPropertyNames;var Ox=Object.getPrototypeOf,Ex=Object.prototype.hasOwnProperty;var ua=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var $=(r,e)=>()=>(r&&(e=r(r=0)),e);var G=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Wn=(r,e)=>{for(var n in e)lo(r,n,{get:e[n],enumerable:!0})},$l=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Px(e))!Ex.call(r,o)&&o!==n&&lo(r,o,{get:()=>e[o],enumerable:!(t=Ax(e,o))||t.enumerable});return r};var se=(r,e,n)=>(n=r!=null?$x(Ox(r)):{},$l(e||!r||!r.__esModule?lo(n,"default",{value:r,enumerable:!0}):n,r)),pr=r=>$l(lo({},"__esModule",{value:!0}),r);var co,Hn,Tn,Cx,Al,la=$(()=>{"use strict";co=new Map,Hn=[],Tn=(r,e,n)=>{if(e&&typeof e.init=="function"&&typeof e.createInferenceSessionHandler=="function"){let t=co.get(r);if(t===void 0)co.set(r,{backend:e,priority:n});else{if(t.priority>n)return;if(t.priority===n&&t.backend!==e)throw new Error(`cannot register backend "${r}" using priority ${n}`)}if(n>=0){let o=Hn.indexOf(r);o!==-1&&Hn.splice(o,1);for(let i=0;i{let e=co.get(r);if(!e)return"backend not found.";if(e.initialized)return e.backend;if(e.aborted)return e.error;{let n=!!e.initPromise;try{return n||(e.initPromise=e.backend.init(r)),await e.initPromise,e.initialized=!0,e.backend}catch(t){return n||(e.error=`${t}`,e.aborted=!0),e.error}finally{delete e.initPromise}}},Al=async r=>{let e=r.executionProviders||[],n=e.map(u=>typeof u=="string"?u:u.name),t=n.length===0?Hn:n,o,i=[],a=new Set;for(let u of t){let l=await Cx(u);typeof l=="string"?i.push({name:u,err:l}):(o||(o=l),o===l&&a.add(u))}if(!o)throw new Error(`no available backend found. ERR: ${i.map(u=>`[${u.name}] ${u.err}`).join(", ")}`);for(let{name:u,err:l}of i)n.includes(u)&&console.warn(`removing requested execution provider "${u}" from session options because it is not available: ${l}`);let s=e.filter(u=>a.has(typeof u=="string"?u:u.name));return[o,new Proxy(r,{get:(u,l)=>l==="executionProviders"?s:Reflect.get(u,l)})]}});var Pl=$(()=>{"use strict";la()});var Ol,El=$(()=>{"use strict";Ol="1.24.3"});var Cl,Be,ca=$(()=>{"use strict";El();Cl="warning",Be={wasm:{},webgl:{},webgpu:{},versions:{common:Ol},set logLevel(r){if(r!==void 0){if(typeof r!="string"||["verbose","info","warning","error","fatal"].indexOf(r)===-1)throw new Error(`Unsupported logging level: ${r}`);Cl=r}},get logLevel(){return Cl}};Object.defineProperty(Be,"logLevel",{enumerable:!0})});var ee,Dl=$(()=>{"use strict";ca();ee=Be});var kl,Ll,Rl=$(()=>{"use strict";kl=(r,e)=>{let n=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);n.width=r.dims[3],n.height=r.dims[2];let t=n.getContext("2d");if(t!=null){let o,i;e?.tensorLayout!==void 0&&e.tensorLayout==="NHWC"?(o=r.dims[2],i=r.dims[3]):(o=r.dims[3],i=r.dims[2]);let a=e?.format!==void 0?e.format:"RGB",s=e?.norm,u,l;s===void 0||s.mean===void 0?u=[255,255,255,255]:typeof s.mean=="number"?u=[s.mean,s.mean,s.mean,s.mean]:(u=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(u[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias=="number"?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let c=i*o,d=0,p=c,f=c*2,h=-1;a==="RGBA"?(d=0,p=c,f=c*2,h=c*3):a==="RGB"?(d=0,p=c,f=c*2):a==="RBG"&&(d=0,f=c,p=c*2);for(let m=0;m{let n=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),t;if(n!=null){let o,i,a;e?.tensorLayout!==void 0&&e.tensorLayout==="NHWC"?(o=r.dims[2],i=r.dims[1],a=r.dims[3]):(o=r.dims[3],i=r.dims[2],a=r.dims[1]);let s=e!==void 0&&e.format!==void 0?e.format:"RGB",u=e?.norm,l,c;u===void 0||u.mean===void 0?l=[255,255,255,255]:typeof u.mean=="number"?l=[u.mean,u.mean,u.mean,u.mean]:(l=[u.mean[0],u.mean[1],u.mean[2],255],u.mean[3]!==void 0&&(l[3]=u.mean[3])),u===void 0||u.bias===void 0?c=[0,0,0,0]:typeof u.bias=="number"?c=[u.bias,u.bias,u.bias,u.bias]:(c=[u.bias[0],u.bias[1],u.bias[2],0],u.bias[3]!==void 0&&(c[3]=u.bias[3]));let d=i*o;if(e!==void 0&&(e.format!==void 0&&a===4&&e.format!=="RGBA"||a===3&&e.format!=="RGB"&&e.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let p=4,f=0,h=1,m=2,y=3,g=0,b=d,x=d*2,w=-1;s==="RGBA"?(g=0,b=d,x=d*2,w=d*3):s==="RGB"?(g=0,b=d,x=d*2):s==="RBG"&&(g=0,x=d,b=d*2),t=n.createImageData(o,i);for(let v=0;v{"use strict";po();da=(r,e)=>{if(r===void 0)throw new Error("Image buffer must be defined");if(e.height===void 0||e.width===void 0)throw new Error("Image height and width must be defined");if(e.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:n,width:t}=e,o=e.norm??{mean:255,bias:0},i,a;typeof o.mean=="number"?i=[o.mean,o.mean,o.mean,o.mean]:i=[o.mean[0],o.mean[1],o.mean[2],o.mean[3]??255],typeof o.bias=="number"?a=[o.bias,o.bias,o.bias,o.bias]:a=[o.bias[0],o.bias[1],o.bias[2],o.bias[3]??0];let s=e.format!==void 0?e.format:"RGBA",u=e.tensorFormat!==void 0&&e.tensorFormat!==void 0?e.tensorFormat:"RGB",l=n*t,c=u==="RGBA"?new Float32Array(l*4):new Float32Array(l*3),d=4,p=0,f=1,h=2,m=3,y=0,g=l,b=l*2,x=-1;s==="RGB"&&(d=3,p=0,f=1,h=2,m=-1),u==="RGBA"?x=l*3:u==="RBG"?(y=0,b=l,g=l*2):u==="BGR"&&(b=0,g=l,y=l*2);for(let v=0;v{let n=typeof HTMLImageElement<"u"&&r instanceof HTMLImageElement,t=typeof ImageData<"u"&&r instanceof ImageData,o=typeof ImageBitmap<"u"&&r instanceof ImageBitmap,i=typeof r=="string",a,s=e??{},u=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},l=c=>typeof HTMLCanvasElement<"u"&&c instanceof HTMLCanvasElement||c instanceof OffscreenCanvas?c.getContext("2d"):null;if(n){let c=u();c.width=r.width,c.height=r.height;let d=l(c);if(d!=null){let p=r.height,f=r.width;if(e!==void 0&&e.resizedHeight!==void 0&&e.resizedWidth!==void 0&&(p=e.resizedHeight,f=e.resizedWidth),e!==void 0){if(s=e,e.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");s.tensorFormat="RGBA",s.height=p,s.width=f}else s.tensorFormat="RGBA",s.height=p,s.width=f;d.drawImage(r,0,0),a=d.getImageData(0,0,f,p).data}else throw new Error("Can not access image data")}else if(t){let c,d;if(e!==void 0&&e.resizedWidth!==void 0&&e.resizedHeight!==void 0?(c=e.resizedHeight,d=e.resizedWidth):(c=r.height,d=r.width),e!==void 0&&(s=e),s.format="RGBA",s.height=c,s.width=d,e!==void 0){let p=u();p.width=d,p.height=c;let f=l(p);if(f!=null)f.putImageData(r,0,0),a=f.getImageData(0,0,d,c).data;else throw new Error("Can not access image data")}else a=r.data}else if(o){if(e===void 0)throw new Error("Please provide image config with format for Imagebitmap");let c=u();c.width=r.width,c.height=r.height;let d=l(c);if(d!=null){let p=r.height,f=r.width;return d.drawImage(r,0,0,f,p),a=d.getImageData(0,0,f,p).data,s.height=p,s.width=f,da(a,s)}else throw new Error("Can not access image data")}else{if(i)return new Promise((c,d)=>{let p=u(),f=l(p);if(!r||!f)return d();let h=new Image;h.crossOrigin="Anonymous",h.src=r,h.onload=()=>{p.width=h.width,p.height=h.height,f.drawImage(h,0,0,p.width,p.height);let m=f.getImageData(0,0,p.width,p.height);s.height=p.height,s.width=p.width,c(da(m.data,s))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(a!==void 0)return da(a,s);throw new Error("Input data provided is not supported - aborted tensor creation")},zl=(r,e)=>{let{width:n,height:t,download:o,dispose:i}=e,a=[1,t,n,4];return new He({location:"texture",type:"float32",texture:r,dims:a,download:o,dispose:i})},Ml=(r,e)=>{let{dataType:n,dims:t,download:o,dispose:i}=e;return new He({location:"gpu-buffer",type:n??"float32",gpuBuffer:r,dims:t,download:o,dispose:i})},Bl=(r,e)=>{let{dataType:n,dims:t,download:o,dispose:i}=e;return new He({location:"ml-tensor",type:n??"float32",mlTensor:r,dims:t,download:o,dispose:i})},Vl=(r,e,n)=>new He({location:"cpu-pinned",type:r,data:e,dims:n??[e.length]})});var qn,Cr,Gl,Ul,Wl=$(()=>{"use strict";qn=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array],["int4",Uint8Array],["uint4",Uint8Array]]),Cr=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),Gl=!1,Ul=()=>{if(!Gl){Gl=!0;let r=typeof BigInt64Array<"u"&&BigInt64Array.from,e=typeof BigUint64Array<"u"&&BigUint64Array.from,n=globalThis.Float16Array,t=typeof n<"u"&&n.from;r&&(qn.set("int64",BigInt64Array),Cr.set(BigInt64Array,"int64")),e&&(qn.set("uint64",BigUint64Array),Cr.set(BigUint64Array,"uint64")),t?(qn.set("float16",n),Cr.set(n,"float16")):qn.set("float16",Uint16Array)}}});var Hl,ql,jl=$(()=>{"use strict";po();Hl=r=>{let e=1;for(let n=0;n{switch(r.location){case"cpu":return new He(r.type,r.data,e);case"cpu-pinned":return new He({location:"cpu-pinned",data:r.data,type:r.type,dims:e});case"texture":return new He({location:"texture",texture:r.texture,type:r.type,dims:e});case"gpu-buffer":return new He({location:"gpu-buffer",gpuBuffer:r.gpuBuffer,type:r.type,dims:e});case"ml-tensor":return new He({location:"ml-tensor",mlTensor:r.mlTensor,type:r.type,dims:e});default:throw new Error(`tensorReshape: tensor location ${r.location} is not supported`)}}});var He,po=$(()=>{"use strict";Rl();Fl();Wl();jl();He=class{constructor(e,n,t){Ul();let o,i;if(typeof e=="object"&&"location"in e)switch(this.dataLocation=e.location,o=e.type,i=e.dims,e.location){case"cpu-pinned":{let s=qn.get(o);if(!s)throw new TypeError(`unsupported type "${o}" to create tensor from pinned buffer`);if(!(e.data instanceof s))throw new TypeError(`buffer should be of type ${s.name}`);this.cpuData=e.data;break}case"texture":{if(o!=="float32")throw new TypeError(`unsupported type "${o}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break}case"gpu-buffer":{if(o!=="float32"&&o!=="float16"&&o!=="int32"&&o!=="int64"&&o!=="uint32"&&o!=="uint8"&&o!=="bool"&&o!=="uint4"&&o!=="int4")throw new TypeError(`unsupported type "${o}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break}case"ml-tensor":{if(o!=="float32"&&o!=="float16"&&o!=="int32"&&o!=="int64"&&o!=="uint32"&&o!=="uint64"&&o!=="int8"&&o!=="uint8"&&o!=="bool"&&o!=="uint4"&&o!=="int4")throw new TypeError(`unsupported type "${o}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let s,u;if(typeof e=="string")if(o=e,u=t,e==="string"){if(!Array.isArray(n))throw new TypeError("A string tensor's data must be a string array.");s=n}else{let l=qn.get(e);if(l===void 0)throw new TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(n)){if(e==="float16"&&l===Uint16Array||e==="uint4"||e==="int4")throw new TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${l.name} as data.`);e==="uint64"||e==="int64"?s=l.from(n,BigInt):s=l.from(n)}else if(n instanceof l)s=n;else if(n instanceof Uint8ClampedArray)if(e==="uint8")s=Uint8Array.from(n);else throw new TypeError("A Uint8ClampedArray tensor's data must be type of uint8");else if(e==="float16"&&n instanceof Uint16Array&&l!==Uint16Array)s=new globalThis.Float16Array(n.buffer,n.byteOffset,n.length);else throw new TypeError(`A ${o} tensor's data must be type of ${l}`)}else if(u=n,Array.isArray(e)){if(e.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let l=typeof e[0];if(l==="string")o="string",s=e;else if(l==="boolean")o="bool",s=Uint8Array.from(e);else throw new TypeError(`Invalid element type of data array: ${l}.`)}else if(e instanceof Uint8ClampedArray)o="uint8",s=Uint8Array.from(e);else{let l=Cr.get(e.constructor);if(l===void 0)throw new TypeError(`Unsupported type for tensor data: ${e.constructor}.`);o=l,s=e}if(u===void 0)u=[s.length];else if(!Array.isArray(u))throw new TypeError("A tensor's dims must be a number array");i=u,this.cpuData=s,this.dataLocation="cpu"}let a=Hl(i);if(this.cpuData&&a!==this.cpuData.length&&!((o==="uint4"||o==="int4")&&Math.ceil(a/2)===this.cpuData.length))throw new Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=o,this.dims=i,this.size=a}static async fromImage(e,n){return Nl(e,n)}static fromTexture(e,n){return zl(e,n)}static fromGpuBuffer(e,n){return Ml(e,n)}static fromMLTensor(e,n){return Bl(e,n)}static fromPinnedBuffer(e,n,t){return Vl(e,n,t)}toDataURL(e){return kl(this,e)}toImageData(e){return Ll(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw new Error("The data is not stored as a WebNN MLTensor.");return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":case"ml-tensor":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let n=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=n,e&&this.disposer&&(this.disposer(),this.disposer=void 0),n}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return ql(this,e)}}});var Ye,pa=$(()=>{"use strict";po();Ye=He});var Dr,Kl,et,Xe,vn,In,fa=$(()=>{"use strict";ca();Dr=(r,e)=>{(typeof Be.trace>"u"?!Be.wasm.trace:!Be.trace)||console.timeStamp(`${r}::ORT::${e}`)},Kl=(r,e)=>{let n=new Error().stack?.split(/\r\n|\r|\n/g)||[],t=!1;for(let o=0;o{(typeof Be.trace>"u"?!Be.wasm.trace:!Be.trace)||Kl("BEGIN",r)},Xe=r=>{(typeof Be.trace>"u"?!Be.wasm.trace:!Be.trace)||Kl("END",r)},vn=r=>{(typeof Be.trace>"u"?!Be.wasm.trace:!Be.trace)||console.time(`ORT::${r}`)},In=r=>{(typeof Be.trace>"u"?!Be.wasm.trace:!Be.trace)||console.timeEnd(`ORT::${r}`)}});var fo,Xl=$(()=>{"use strict";la();pa();fa();fo=class r{constructor(e){this.handler=e}async run(e,n,t){et(),vn("InferenceSession.run");let o={},i={};if(typeof e!="object"||e===null||e instanceof Ye||Array.isArray(e))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let a=!0;if(typeof n=="object"){if(n===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(n instanceof Ye)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(n)){if(n.length===0)throw new TypeError("'fetches' cannot be an empty array.");a=!1;for(let l of n){if(typeof l!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(l)===-1)throw new RangeError(`'fetches' contains invalid output name: ${l}.`);o[l]=null}if(typeof t=="object"&&t!==null)i=t;else if(typeof t<"u")throw new TypeError("'options' must be an object.")}else{let l=!1,c=Object.getOwnPropertyNames(n);for(let d of this.outputNames)if(c.indexOf(d)!==-1){let p=n[d];(p===null||p instanceof Ye)&&(l=!0,a=!1,o[d]=p)}if(l){if(typeof t=="object"&&t!==null)i=t;else if(typeof t<"u")throw new TypeError("'options' must be an object.")}else i=n}}else if(typeof n<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let l of this.inputNames)if(typeof e[l]>"u")throw new Error(`input '${l}' is missing in 'feeds'.`);if(a)for(let l of this.outputNames)o[l]=null;let s=await this.handler.run(e,o,i),u={};for(let l in s)if(Object.hasOwnProperty.call(s,l)){let c=s[l];c instanceof Ye?u[l]=c:u[l]=new Ye(c.type,c.data,c.dims)}return In("InferenceSession.run"),Xe(),u}async release(){return this.handler.dispose()}static async create(e,n,t,o){et(),vn("InferenceSession.create");let i,a={};if(typeof e=="string"){if(i=e,typeof n=="object"&&n!==null)a=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(e instanceof Uint8Array){if(i=e,typeof n=="object"&&n!==null)a=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(e instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&e instanceof SharedArrayBuffer){let c=e,d=0,p=e.byteLength;if(typeof n=="object"&&n!==null)a=n;else if(typeof n=="number"){if(d=n,!Number.isSafeInteger(d))throw new RangeError("'byteOffset' must be an integer.");if(d<0||d>=c.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${c.byteLength}).`);if(p=e.byteLength-d,typeof t=="number"){if(p=t,!Number.isSafeInteger(p))throw new RangeError("'byteLength' must be an integer.");if(p<=0||d+p>c.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${c.byteLength-d}].`);if(typeof o=="object"&&o!==null)a=o;else if(typeof o<"u")throw new TypeError("'options' must be an object.")}else if(typeof t<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof n<"u")throw new TypeError("'options' must be an object.");i=new Uint8Array(c,d,p)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[s,u]=await Al(a),l=await s.createInferenceSessionHandler(i,u);return In("InferenceSession.create"),Xe(),new r(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}});var Zl,Jl=$(()=>{"use strict";Xl();Zl=fo});var Ql=$(()=>{"use strict"});var Yl=$(()=>{"use strict"});var ec=$(()=>{"use strict"});var tc=$(()=>{"use strict"});var ha={};Wn(ha,{InferenceSession:()=>Zl,TRACE:()=>Dr,TRACE_EVENT_BEGIN:()=>vn,TRACE_EVENT_END:()=>In,TRACE_FUNC_BEGIN:()=>et,TRACE_FUNC_END:()=>Xe,Tensor:()=>Ye,env:()=>ee,registerBackend:()=>Tn});var qe=$(()=>{"use strict";Pl();Dl();Jl();pa();Ql();Yl();fa();ec();tc()});function En(r,e,n,t){if(e===void 0)return kx(r);if(n===void 0)ho(r,e,1);else if(typeof n=="number"&&t===void 0)ho(r,e,n);else if(typeof n=="string"&&t===void 0)ho(r,n,1,e);else if(typeof n=="string"&&typeof t=="number")ho(r,n,t,e);else throw new TypeError("input is valid")}function kx(r){return{verbose:En.verbose.bind(null,r),info:En.info.bind(null,r),warning:En.warning.bind(null,r),error:En.error.bind(null,r),fatal:En.fatal.bind(null,r)}}function ho(r,e,n,t){let o=kr[t||""]||kr[""];rc[r]{"use strict";ma=class{log(e,n,t){}},ga=class{log(e,n,t){console.log(`${this.color(e)} ${t?"\x1B[35m"+t+"\x1B[0m ":""}${n}`)}color(e){switch(e){case"verbose":return"\x1B[34;40mv\x1B[0m";case"info":return"\x1B[32mi\x1B[0m";case"warning":return"\x1B[30;43mw\x1B[0m";case"error":return"\x1B[31;40me\x1B[0m";case"fatal":return"\x1B[101mf\x1B[0m";default:throw new Error(`unsupported severity: ${e}`)}}},rc={verbose:1e3,info:2e3,warning:4e3,error:5e3,fatal:6e3},Dx={none:new ma,console:new ga},oc={provider:"console",minimalSeverity:"warning",logDateTime:!0,logSourceLocation:!1},kr={"":oc};(u=>{function r(l,c){u("verbose",l,c)}u.verbose=r;function e(l,c){u("info",l,c)}u.info=e;function n(l,c){u("warning",l,c)}u.warning=n;function t(l,c){u("error",l,c)}u.error=t;function o(l,c){u("fatal",l,c)}u.fatal=o;function i(l){kr={},a("",l||{})}u.reset=i;function a(l,c){if(l==="*")i(c);else{let d=kr[l]||oc;kr[l]={provider:c.provider||d.provider,minimalSeverity:c.minimalSeverity||d.minimalSeverity,logDateTime:c.logDateTime===void 0?d.logDateTime:c.logDateTime,logSourceLocation:c.logSourceLocation===void 0?d.logSourceLocation:c.logSourceLocation}}}u.set=a;function s(l){let c={};l.logLevel&&(c.minimalSeverity=l.logLevel),a("",c)}u.setWithEnv=s})(En||={});Te=En,go=class{constructor(e,n,t,o,i,a){this.category=e;this.name=n;this.startTime=t;this.endCallback=o;this.timer=i;this.ctx=a}async end(){return this.endCallback(this)}async checkTimer(){if(this.ctx===void 0||this.timer===void 0)throw new Error("No webgl timer found");return this.ctx.endTimer(),this.ctx.waitForQueryAndGetTime(this.timer)}},bo=class{constructor(e,n,t,o){this.category=e;this.name=n;this.startTime=t;this.endTime=o}},yo=class{constructor(e,n,t){this._started=!1;this._flushPointer=0;this._started=!1,this._maxNumberEvents=e===void 0?1e4:e,this._flushBatchSize=n===void 0?10:n,this._flushIntervalInMilliseconds=t===void 0?5e3:t}static create(e){return e===void 0?new this:new this(e.maxNumberEvents,e.flushBatchSize,e.flushIntervalInMilliseconds)}start(){this._started=!0,this._timingEvents=[],this._flushTime=mo(),this._flushPointer=0}stop(){for(this._started=!1;this._flushPointer{s.then(async c=>{i&&await i.end(),u(c)},async c=>{i&&await i.end(),l(c)})});if(!a&&i){let u=i.end();if(u&&typeof u.then=="function")return new Promise((l,c)=>{u.then(()=>{l(s)},d=>{c(d)})})}return s}begin(e,n,t){if(!this._started)throw new Error("profiler is not started yet");if(t===void 0){let o=mo();return this.flush(o),new go(e,n,o,i=>this.endSync(i))}else{let o=t.beginTimer();return new go(e,n,0,async i=>this.end(i),o,t)}}async end(e){let n=await e.checkTimer();this._timingEvents.length=this._flushBatchSize||e-this._flushTime>=this._flushIntervalInMilliseconds){for(let n=this._flushPointer;this._flushPointerperformance.now():Date.now});function ic(r,e,n){for(let t of n){let o=t[0],i=t[1],a=t[2],s=t[3],u=t[4];if(r.opType===o){for(let l of e)if((l.domain===i||l.domain==="ai.onnx"&&i==="")&&Lx(l.version,a))return{opImpl:s,opInit:u}}}throw new TypeError(`cannot resolve operator '${r.opType}' with opsets: ${e.map(t=>`${t.domain||"ai.onnx"} v${t.version}`).join(", ")}`)}function Lx(r,e){if(e.endsWith("+")){let n=Number.parseInt(e.substring(0,e.length-1),10);return!isNaN(n)&&n<=r}else if(e.split("-").length===2){let n=e.split("-"),t=Number.parseInt(n[0],10),o=Number.parseInt(n[1],10);return!isNaN(t)&&!isNaN(o)&&t<=r&&r<=o}else return Number.parseInt(e,10)===r}var ac=$(()=>{"use strict"});var sc=G(ba=>{"use strict";ba.__esModule=!0;var Rx=function(){function r(e){if(!e)throw new TypeError("Invalid argument; `value` has no value.");this.value=r.EMPTY,e&&r.isGuid(e)&&(this.value=e)}return r.isGuid=function(e){var n=e.toString();return e&&(e instanceof r||r.validator.test(n))},r.create=function(){return new r([r.gen(2),r.gen(1),r.gen(1),r.gen(1),r.gen(3)].join("-"))},r.createEmpty=function(){return new r("emptyguid")},r.parse=function(e){return new r(e)},r.raw=function(){return[r.gen(2),r.gen(1),r.gen(1),r.gen(1),r.gen(3)].join("-")},r.gen=function(e){for(var n="",t=0;t>>=0,(o=0<=r&&r<256)&&(t=cc[r],t)?t:(n=ye(r,0,!0),o&&(cc[r]=n),n)):(r|=0,(o=-128<=r&&r<128)&&(t=lc[r],t)?t:(n=ye(r,r<0?-1:0,!1),o&&(lc[r]=n),n))}function pt(r,e){if(isNaN(r))return e?Sn:xt;if(e){if(r<0)return Sn;if(r>=hc)return bc}else{if(r<=-pc)return tt;if(r+1>=pc)return gc}return r<0?pt(-r,e).neg():ye(r%hr|0,r/hr|0,e)}function ye(r,e,n){return new Se(r,e,n)}function _a(r,e,n){if(r.length===0)throw Error("empty string");if(typeof e=="number"?(n=e,e=!1):e=!!e,r==="NaN"||r==="Infinity"||r==="+Infinity"||r==="-Infinity")return e?Sn:xt;if(n=n||10,n<2||360)throw Error("interior hyphen");if(t===0)return _a(r.substring(1),e,n).neg();for(var o=pt(_o(n,8)),i=xt,a=0;a{dt=null;try{dt=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch{}Se.prototype.__isLong__;Object.defineProperty(Se.prototype,"__isLong__",{value:!0});Se.isLong=Ke;lc={},cc={};Se.fromInt=jn;Se.fromNumber=pt;Se.fromBits=ye;_o=Math.pow;Se.fromString=_a;Se.fromValue=wt;dc=65536,Nx=1<<24,hr=dc*dc,hc=hr*hr,pc=hc/2,fc=jn(Nx),xt=jn(0);Se.ZERO=xt;Sn=jn(0,!0);Se.UZERO=Sn;fr=jn(1);Se.ONE=fr;mc=jn(1,!0);Se.UONE=mc;ya=jn(-1);Se.NEG_ONE=ya;gc=ye(-1,2147483647,!1);Se.MAX_VALUE=gc;bc=ye(-1,-1,!0);Se.MAX_UNSIGNED_VALUE=bc;tt=ye(0,-2147483648,!1);Se.MIN_VALUE=tt;L=Se.prototype;L.toInt=function(){return this.unsigned?this.low>>>0:this.low};L.toNumber=function(){return this.unsigned?(this.high>>>0)*hr+(this.low>>>0):this.high*hr+(this.low>>>0)};L.toString=function(e){if(e=e||10,e<2||36>>0,c=l.toString(e);if(a=u,a.isZero())return c+s;for(;c.length<6;)c="0"+c;s=""+c+s}};L.getHighBits=function(){return this.high};L.getHighBitsUnsigned=function(){return this.high>>>0};L.getLowBits=function(){return this.low};L.getLowBitsUnsigned=function(){return this.low>>>0};L.getNumBitsAbs=function(){if(this.isNegative())return this.eq(tt)?64:this.neg().getNumBitsAbs();for(var e=this.high!=0?this.high:this.low,n=31;n>0&&(e&1<=0};L.isOdd=function(){return(this.low&1)===1};L.isEven=function(){return(this.low&1)===0};L.equals=function(e){return Ke(e)||(e=wt(e)),this.unsigned!==e.unsigned&&this.high>>>31===1&&e.high>>>31===1?!1:this.high===e.high&&this.low===e.low};L.eq=L.equals;L.notEquals=function(e){return!this.eq(e)};L.neq=L.notEquals;L.ne=L.notEquals;L.lessThan=function(e){return this.comp(e)<0};L.lt=L.lessThan;L.lessThanOrEqual=function(e){return this.comp(e)<=0};L.lte=L.lessThanOrEqual;L.le=L.lessThanOrEqual;L.greaterThan=function(e){return this.comp(e)>0};L.gt=L.greaterThan;L.greaterThanOrEqual=function(e){return this.comp(e)>=0};L.gte=L.greaterThanOrEqual;L.ge=L.greaterThanOrEqual;L.compare=function(e){if(Ke(e)||(e=wt(e)),this.eq(e))return 0;var n=this.isNegative(),t=e.isNegative();return n&&!t?-1:!n&&t?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1};L.comp=L.compare;L.negate=function(){return!this.unsigned&&this.eq(tt)?tt:this.not().add(fr)};L.neg=L.negate;L.add=function(e){Ke(e)||(e=wt(e));var n=this.high>>>16,t=this.high&65535,o=this.low>>>16,i=this.low&65535,a=e.high>>>16,s=e.high&65535,u=e.low>>>16,l=e.low&65535,c=0,d=0,p=0,f=0;return f+=i+l,p+=f>>>16,f&=65535,p+=o+u,d+=p>>>16,p&=65535,d+=t+s,c+=d>>>16,d&=65535,c+=n+a,c&=65535,ye(p<<16|f,c<<16|d,this.unsigned)};L.subtract=function(e){return Ke(e)||(e=wt(e)),this.add(e.neg())};L.sub=L.subtract;L.multiply=function(e){if(this.isZero())return this;if(Ke(e)||(e=wt(e)),dt){var n=dt.mul(this.low,this.high,e.low,e.high);return ye(n,dt.get_high(),this.unsigned)}if(e.isZero())return this.unsigned?Sn:xt;if(this.eq(tt))return e.isOdd()?tt:xt;if(e.eq(tt))return this.isOdd()?tt:xt;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(fc)&&e.lt(fc))return pt(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,o=this.high&65535,i=this.low>>>16,a=this.low&65535,s=e.high>>>16,u=e.high&65535,l=e.low>>>16,c=e.low&65535,d=0,p=0,f=0,h=0;return h+=a*c,f+=h>>>16,h&=65535,f+=i*c,p+=f>>>16,f&=65535,f+=a*l,p+=f>>>16,f&=65535,p+=o*c,d+=p>>>16,p&=65535,p+=i*l,d+=p>>>16,p&=65535,p+=a*u,d+=p>>>16,p&=65535,d+=t*c+o*l+i*u+a*s,d&=65535,ye(f<<16|h,d<<16|p,this.unsigned)};L.mul=L.multiply;L.divide=function(e){if(Ke(e)||(e=wt(e)),e.isZero())throw Error("division by zero");if(dt){if(!this.unsigned&&this.high===-2147483648&&e.low===-1&&e.high===-1)return this;var n=(this.unsigned?dt.div_u:dt.div_s)(this.low,this.high,e.low,e.high);return ye(n,dt.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?Sn:xt;var t,o,i;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return Sn;if(e.gt(this.shru(1)))return mc;i=Sn}else{if(this.eq(tt)){if(e.eq(fr)||e.eq(ya))return tt;if(e.eq(tt))return fr;var a=this.shr(1);return t=a.div(e).shl(1),t.eq(xt)?e.isNegative()?fr:ya:(o=this.sub(e.mul(t)),i=t.add(o.div(e)),i)}else if(e.eq(tt))return this.unsigned?Sn:xt;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();i=xt}for(o=this;o.gte(e);){t=Math.max(1,Math.floor(o.toNumber()/e.toNumber()));for(var s=Math.ceil(Math.log(t)/Math.LN2),u=s<=48?1:_o(2,s-48),l=pt(t),c=l.mul(e);c.isNegative()||c.gt(o);)t-=u,l=pt(t,this.unsigned),c=l.mul(e);l.isZero()&&(l=fr),i=i.add(l),o=o.sub(c)}return i};L.div=L.divide;L.modulo=function(e){if(Ke(e)||(e=wt(e)),dt){var n=(this.unsigned?dt.rem_u:dt.rem_s)(this.low,this.high,e.low,e.high);return ye(n,dt.get_high(),this.unsigned)}return this.sub(this.div(e).mul(e))};L.mod=L.modulo;L.rem=L.modulo;L.not=function(){return ye(~this.low,~this.high,this.unsigned)};L.countLeadingZeros=function(){return this.high?Math.clz32(this.high):Math.clz32(this.low)+32};L.clz=L.countLeadingZeros;L.countTrailingZeros=function(){return this.low?uc(this.low):uc(this.high)+32};L.ctz=L.countTrailingZeros;L.and=function(e){return Ke(e)||(e=wt(e)),ye(this.low&e.low,this.high&e.high,this.unsigned)};L.or=function(e){return Ke(e)||(e=wt(e)),ye(this.low|e.low,this.high|e.high,this.unsigned)};L.xor=function(e){return Ke(e)||(e=wt(e)),ye(this.low^e.low,this.high^e.high,this.unsigned)};L.shiftLeft=function(e){return Ke(e)&&(e=e.toInt()),(e&=63)===0?this:e<32?ye(this.low<>>32-e,this.unsigned):ye(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):ye(this.high>>e-32,this.high>=0?0:-1,this.unsigned)};L.shr=L.shiftRight;L.shiftRightUnsigned=function(e){return Ke(e)&&(e=e.toInt()),(e&=63)===0?this:e<32?ye(this.low>>>e|this.high<<32-e,this.high>>>e,this.unsigned):e===32?ye(this.high,0,this.unsigned):ye(this.high>>>e-32,0,this.unsigned)};L.shru=L.shiftRightUnsigned;L.shr_u=L.shiftRightUnsigned;L.rotateLeft=function(e){var n;return Ke(e)&&(e=e.toInt()),(e&=63)===0?this:e===32?ye(this.high,this.low,this.unsigned):e<32?(n=32-e,ye(this.low<>>n,this.high<>>n,this.unsigned)):(e-=32,n=32-e,ye(this.high<>>n,this.low<>>n,this.unsigned))};L.rotl=L.rotateLeft;L.rotateRight=function(e){var n;return Ke(e)&&(e=e.toInt()),(e&=63)===0?this:e===32?ye(this.high,this.low,this.unsigned):e<32?(n=32-e,ye(this.high<>>e,this.low<>>e,this.unsigned)):(e-=32,n=32-e,ye(this.low<>>e,this.high<>>e,this.unsigned))};L.rotr=L.rotateRight;L.toSigned=function(){return this.unsigned?ye(this.low,this.high,!1):this};L.toUnsigned=function(){return this.unsigned?this:ye(this.low,this.high,!0)};L.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()};L.toBytesLE=function(){var e=this.high,n=this.low;return[n&255,n>>>8&255,n>>>16&255,n>>>24,e&255,e>>>8&255,e>>>16&255,e>>>24]};L.toBytesBE=function(){var e=this.high,n=this.low;return[e>>>24,e>>>16&255,e>>>8&255,e&255,n>>>24,n>>>16&255,n>>>8&255,n&255]};Se.fromBytes=function(e,n,t){return t?Se.fromBytesLE(e,n):Se.fromBytesBE(e,n)};Se.fromBytesLE=function(e,n){return new Se(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,n)};Se.fromBytesBE=function(e,n){return new Se(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],n)};Cn=Se});var wa=G(xo=>{"use strict";Object.defineProperty(xo,"__esModule",{value:!0});xo.ArgType=void 0;var yc;(function(r){r[r.INPUT=0]="INPUT",r[r.OUTPUT=1]="OUTPUT"})(yc||(xo.ArgType=yc={}))});var Kn=G(Et=>{"use strict";Object.defineProperty(Et,"__esModule",{value:!0});Et.SIZE_PREFIX_LENGTH=Et.FILE_IDENTIFIER_LENGTH=Et.SIZEOF_INT=Et.SIZEOF_SHORT=void 0;Et.SIZEOF_SHORT=2;Et.SIZEOF_INT=4;Et.FILE_IDENTIFIER_LENGTH=4;Et.SIZE_PREFIX_LENGTH=4});var Ta=G(ft=>{"use strict";Object.defineProperty(ft,"__esModule",{value:!0});ft.isLittleEndian=ft.float64=ft.float32=ft.int32=void 0;ft.int32=new Int32Array(2);ft.float32=new Float32Array(ft.int32.buffer);ft.float64=new Float64Array(ft.int32.buffer);ft.isLittleEndian=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1});var va=G(wo=>{"use strict";Object.defineProperty(wo,"__esModule",{value:!0});wo.Encoding=void 0;var _c;(function(r){r[r.UTF8_BYTES=1]="UTF8_BYTES",r[r.UTF16_STRING=2]="UTF16_STRING"})(_c||(wo.Encoding=_c={}))});var Sa=G(To=>{"use strict";Object.defineProperty(To,"__esModule",{value:!0});To.ByteBuffer=void 0;var Ct=Kn(),nt=Ta(),zx=va(),Ia=class r{constructor(e){this.bytes_=e,this.position_=0,this.text_decoder_=new TextDecoder}static allocate(e){return new r(new Uint8Array(e))}clear(){this.position_=0}bytes(){return this.bytes_}position(){return this.position_}setPosition(e){this.position_=e}capacity(){return this.bytes_.length}readInt8(e){return this.readUint8(e)<<24>>24}readUint8(e){return this.bytes_[e]}readInt16(e){return this.readUint16(e)<<16>>16}readUint16(e){return this.bytes_[e]|this.bytes_[e+1]<<8}readInt32(e){return this.bytes_[e]|this.bytes_[e+1]<<8|this.bytes_[e+2]<<16|this.bytes_[e+3]<<24}readUint32(e){return this.readInt32(e)>>>0}readInt64(e){return BigInt.asIntN(64,BigInt(this.readUint32(e))+(BigInt(this.readUint32(e+4))<>8}writeUint16(e,n){this.bytes_[e]=n,this.bytes_[e+1]=n>>8}writeInt32(e,n){this.bytes_[e]=n,this.bytes_[e+1]=n>>8,this.bytes_[e+2]=n>>16,this.bytes_[e+3]=n>>24}writeUint32(e,n){this.bytes_[e]=n,this.bytes_[e+1]=n>>8,this.bytes_[e+2]=n>>16,this.bytes_[e+3]=n>>24}writeInt64(e,n){this.writeInt32(e,Number(BigInt.asIntN(32,n))),this.writeInt32(e+4,Number(BigInt.asIntN(32,n>>BigInt(32))))}writeUint64(e,n){this.writeUint32(e,Number(BigInt.asUintN(32,n))),this.writeUint32(e+4,Number(BigInt.asUintN(32,n>>BigInt(32))))}writeFloat32(e,n){nt.float32[0]=n,this.writeInt32(e,nt.int32[0])}writeFloat64(e,n){nt.float64[0]=n,this.writeInt32(e,nt.int32[nt.isLittleEndian?0:1]),this.writeInt32(e+4,nt.int32[nt.isLittleEndian?1:0])}getBufferIdentifier(){if(this.bytes_.length{"use strict";Object.defineProperty(vo,"__esModule",{value:!0});vo.Builder=void 0;var xc=Sa(),at=Kn(),$a=class r{constructor(e){this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1,this.string_maps=null,this.text_encoder=new TextEncoder;let n;e?n=e:n=1024,this.bb=xc.ByteBuffer.allocate(n),this.space=n}clear(){this.bb.clear(),this.space=this.bb.capacity(),this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1,this.string_maps=null}forceDefaults(e){this.force_defaults=e}dataBuffer(){return this.bb}asUint8Array(){return this.bb.bytes().subarray(this.bb.position(),this.bb.position()+this.offset())}prep(e,n){e>this.minalign&&(this.minalign=e);let t=~(this.bb.capacity()-this.space+n)+1&e-1;for(;this.space=0&&this.vtable[n]==0;n--);let t=n+1;for(;n>=0;n--)this.addInt16(this.vtable[n]!=0?e-this.vtable[n]:0);let o=2;this.addInt16(e-this.object_start);let i=(t+o)*at.SIZEOF_SHORT;this.addInt16(i);let a=0,s=this.space;e:for(n=0;n=0;a--)this.writeInt8(i.charCodeAt(a))}this.prep(this.minalign,at.SIZEOF_INT+o),this.addOffset(e),o&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)}finishSizePrefixed(e,n){this.finish(e,n,!0)}requiredField(e,n){let t=this.bb.capacity()-e,o=t-this.bb.readInt32(t);if(!(n{"use strict";Object.defineProperty(Pe,"__esModule",{value:!0});Pe.ByteBuffer=Pe.Builder=Pe.Encoding=Pe.isLittleEndian=Pe.float64=Pe.float32=Pe.int32=Pe.SIZE_PREFIX_LENGTH=Pe.FILE_IDENTIFIER_LENGTH=Pe.SIZEOF_INT=Pe.SIZEOF_SHORT=void 0;var Mx=Kn();Object.defineProperty(Pe,"SIZEOF_SHORT",{enumerable:!0,get:function(){return Mx.SIZEOF_SHORT}});var Bx=Kn();Object.defineProperty(Pe,"SIZEOF_INT",{enumerable:!0,get:function(){return Bx.SIZEOF_INT}});var Vx=Kn();Object.defineProperty(Pe,"FILE_IDENTIFIER_LENGTH",{enumerable:!0,get:function(){return Vx.FILE_IDENTIFIER_LENGTH}});var Fx=Kn();Object.defineProperty(Pe,"SIZE_PREFIX_LENGTH",{enumerable:!0,get:function(){return Fx.SIZE_PREFIX_LENGTH}});var Io=Ta();Object.defineProperty(Pe,"int32",{enumerable:!0,get:function(){return Io.int32}});Object.defineProperty(Pe,"float32",{enumerable:!0,get:function(){return Io.float32}});Object.defineProperty(Pe,"float64",{enumerable:!0,get:function(){return Io.float64}});Object.defineProperty(Pe,"isLittleEndian",{enumerable:!0,get:function(){return Io.isLittleEndian}});var Gx=va();Object.defineProperty(Pe,"Encoding",{enumerable:!0,get:function(){return Gx.Encoding}});var Ux=wc();Object.defineProperty(Pe,"Builder",{enumerable:!0,get:function(){return Ux.Builder}});var Wx=Sa();Object.defineProperty(Pe,"ByteBuffer",{enumerable:!0,get:function(){return Wx.ByteBuffer}})});var Pa=G(Dt=>{"use strict";var Hx=Dt&&Dt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),qx=Dt&&Dt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),jx=Dt&&Dt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&Hx(e,r,n);return qx(e,r),e};Object.defineProperty(Dt,"__esModule",{value:!0});Dt.ArgTypeAndIndex=void 0;var Kx=jx(_e()),Tc=wa(),Aa=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsArgTypeAndIndex(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsArgTypeAndIndex(e,n){return e.setPosition(e.position()+Kx.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}argType(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.readInt8(this.bb_pos+e):Tc.ArgType.INPUT}index(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.readUint32(this.bb_pos+e):0}static startArgTypeAndIndex(e){e.startObject(2)}static addArgType(e,n){e.addFieldInt8(0,n,Tc.ArgType.INPUT)}static addIndex(e,n){e.addFieldInt32(1,n,0)}static endArgTypeAndIndex(e){return e.endObject()}static createArgTypeAndIndex(e,n,t){return r.startArgTypeAndIndex(e),r.addArgType(e,n),r.addIndex(e,t),r.endArgTypeAndIndex(e)}};Dt.ArgTypeAndIndex=Aa});var Oa=G(So=>{"use strict";Object.defineProperty(So,"__esModule",{value:!0});So.AttributeType=void 0;var vc;(function(r){r[r.UNDEFINED=0]="UNDEFINED",r[r.FLOAT=1]="FLOAT",r[r.INT=2]="INT",r[r.STRING=3]="STRING",r[r.TENSOR=4]="TENSOR",r[r.GRAPH=5]="GRAPH",r[r.FLOATS=6]="FLOATS",r[r.INTS=7]="INTS",r[r.STRINGS=8]="STRINGS",r[r.TENSORS=9]="TENSORS",r[r.GRAPHS=10]="GRAPHS",r[r.SPARSE_TENSOR=11]="SPARSE_TENSOR",r[r.SPARSE_TENSORS=12]="SPARSE_TENSORS"})(vc||(So.AttributeType=vc={}))});var Ea=G($o=>{"use strict";Object.defineProperty($o,"__esModule",{value:!0});$o.NodeType=void 0;var Ic;(function(r){r[r.Primitive=0]="Primitive",r[r.Fused=1]="Fused"})(Ic||($o.NodeType=Ic={}))});var Da=G(kt=>{"use strict";var Xx=kt&&kt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),Zx=kt&&kt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Jx=kt&&kt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&Xx(e,r,n);return Zx(e,r),e};Object.defineProperty(kt,"__esModule",{value:!0});kt.Node=void 0;var Qx=Jx(_e()),Yx=ka(),Sc=Ea(),Ca=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsNode(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsNode(e,n){return e.setPosition(e.position()+Qx.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}name(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}docString(e){let n=this.bb.__offset(this.bb_pos,6);return n?this.bb.__string(this.bb_pos+n,e):null}domain(e){let n=this.bb.__offset(this.bb_pos,8);return n?this.bb.__string(this.bb_pos+n,e):null}sinceVersion(){let e=this.bb.__offset(this.bb_pos,10);return e?this.bb.readInt32(this.bb_pos+e):0}index(){let e=this.bb.__offset(this.bb_pos,12);return e?this.bb.readUint32(this.bb_pos+e):0}opType(e){let n=this.bb.__offset(this.bb_pos,14);return n?this.bb.__string(this.bb_pos+n,e):null}type(){let e=this.bb.__offset(this.bb_pos,16);return e?this.bb.readInt32(this.bb_pos+e):Sc.NodeType.Primitive}executionProviderType(e){let n=this.bb.__offset(this.bb_pos,18);return n?this.bb.__string(this.bb_pos+n,e):null}inputs(e,n){let t=this.bb.__offset(this.bb_pos,20);return t?this.bb.__string(this.bb.__vector(this.bb_pos+t)+e*4,n):null}inputsLength(){let e=this.bb.__offset(this.bb_pos,20);return e?this.bb.__vector_len(this.bb_pos+e):0}outputs(e,n){let t=this.bb.__offset(this.bb_pos,22);return t?this.bb.__string(this.bb.__vector(this.bb_pos+t)+e*4,n):null}outputsLength(){let e=this.bb.__offset(this.bb_pos,22);return e?this.bb.__vector_len(this.bb_pos+e):0}attributes(e,n){let t=this.bb.__offset(this.bb_pos,24);return t?(n||new Yx.Attribute).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}attributesLength(){let e=this.bb.__offset(this.bb_pos,24);return e?this.bb.__vector_len(this.bb_pos+e):0}inputArgCounts(e){let n=this.bb.__offset(this.bb_pos,26);return n?this.bb.readInt32(this.bb.__vector(this.bb_pos+n)+e*4):0}inputArgCountsLength(){let e=this.bb.__offset(this.bb_pos,26);return e?this.bb.__vector_len(this.bb_pos+e):0}inputArgCountsArray(){let e=this.bb.__offset(this.bb_pos,26);return e?new Int32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+e),this.bb.__vector_len(this.bb_pos+e)):null}implicitInputs(e,n){let t=this.bb.__offset(this.bb_pos,28);return t?this.bb.__string(this.bb.__vector(this.bb_pos+t)+e*4,n):null}implicitInputsLength(){let e=this.bb.__offset(this.bb_pos,28);return e?this.bb.__vector_len(this.bb_pos+e):0}static startNode(e){e.startObject(13)}static addName(e,n){e.addFieldOffset(0,n,0)}static addDocString(e,n){e.addFieldOffset(1,n,0)}static addDomain(e,n){e.addFieldOffset(2,n,0)}static addSinceVersion(e,n){e.addFieldInt32(3,n,0)}static addIndex(e,n){e.addFieldInt32(4,n,0)}static addOpType(e,n){e.addFieldOffset(5,n,0)}static addType(e,n){e.addFieldInt32(6,n,Sc.NodeType.Primitive)}static addExecutionProviderType(e,n){e.addFieldOffset(7,n,0)}static addInputs(e,n){e.addFieldOffset(8,n,0)}static createInputsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startInputsVector(e,n){e.startVector(4,n,4)}static addOutputs(e,n){e.addFieldOffset(9,n,0)}static createOutputsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startOutputsVector(e,n){e.startVector(4,n,4)}static addAttributes(e,n){e.addFieldOffset(10,n,0)}static createAttributesVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startAttributesVector(e,n){e.startVector(4,n,4)}static addInputArgCounts(e,n){e.addFieldOffset(11,n,0)}static createInputArgCountsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addInt32(n[t]);return e.endVector()}static startInputArgCountsVector(e,n){e.startVector(4,n,4)}static addImplicitInputs(e,n){e.addFieldOffset(12,n,0)}static createImplicitInputsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startImplicitInputsVector(e,n){e.startVector(4,n,4)}static endNode(e){return e.endObject()}static createNode(e,n,t,o,i,a,s,u,l,c,d,p,f,h){return r.startNode(e),r.addName(e,n),r.addDocString(e,t),r.addDomain(e,o),r.addSinceVersion(e,i),r.addIndex(e,a),r.addOpType(e,s),r.addType(e,u),r.addExecutionProviderType(e,l),r.addInputs(e,c),r.addOutputs(e,d),r.addAttributes(e,p),r.addInputArgCounts(e,f),r.addImplicitInputs(e,h),r.endNode(e)}};kt.Node=Ca});var Ra=G(Ao=>{"use strict";Object.defineProperty(Ao,"__esModule",{value:!0});Ao.EdgeEnd=void 0;var La=class{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}nodeIndex(){return this.bb.readUint32(this.bb_pos)}srcArgIndex(){return this.bb.readInt32(this.bb_pos+4)}dstArgIndex(){return this.bb.readInt32(this.bb_pos+8)}static sizeOf(){return 12}static createEdgeEnd(e,n,t,o){return e.prep(4,12),e.writeInt32(o),e.writeInt32(t),e.writeInt32(n),e.offset()}};Ao.EdgeEnd=La});var za=G(Lt=>{"use strict";var ew=Lt&&Lt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),tw=Lt&&Lt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),nw=Lt&&Lt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&ew(e,r,n);return tw(e,r),e};Object.defineProperty(Lt,"__esModule",{value:!0});Lt.NodeEdge=void 0;var rw=nw(_e()),$c=Ra(),Na=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsNodeEdge(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsNodeEdge(e,n){return e.setPosition(e.position()+rw.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}nodeIndex(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.readUint32(this.bb_pos+e):0}inputEdges(e,n){let t=this.bb.__offset(this.bb_pos,6);return t?(n||new $c.EdgeEnd).__init(this.bb.__vector(this.bb_pos+t)+e*12,this.bb):null}inputEdgesLength(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__vector_len(this.bb_pos+e):0}outputEdges(e,n){let t=this.bb.__offset(this.bb_pos,8);return t?(n||new $c.EdgeEnd).__init(this.bb.__vector(this.bb_pos+t)+e*12,this.bb):null}outputEdgesLength(){let e=this.bb.__offset(this.bb_pos,8);return e?this.bb.__vector_len(this.bb_pos+e):0}static startNodeEdge(e){e.startObject(3)}static addNodeIndex(e,n){e.addFieldInt32(0,n,0)}static addInputEdges(e,n){e.addFieldOffset(1,n,0)}static startInputEdgesVector(e,n){e.startVector(12,n,4)}static addOutputEdges(e,n){e.addFieldOffset(2,n,0)}static startOutputEdgesVector(e,n){e.startVector(12,n,4)}static endNodeEdge(e){return e.endObject()}static createNodeEdge(e,n,t,o){return r.startNodeEdge(e),r.addNodeIndex(e,n),r.addInputEdges(e,t),r.addOutputEdges(e,o),r.endNodeEdge(e)}};Lt.NodeEdge=Na});var Ba=G(Rt=>{"use strict";var ow=Rt&&Rt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),iw=Rt&&Rt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),aw=Rt&&Rt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&ow(e,r,n);return iw(e,r),e};Object.defineProperty(Rt,"__esModule",{value:!0});Rt.NodesToOptimizeIndices=void 0;var sw=aw(_e()),Ma=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsNodesToOptimizeIndices(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsNodesToOptimizeIndices(e,n){return e.setPosition(e.position()+sw.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}nodeIndices(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.readUint32(this.bb.__vector(this.bb_pos+n)+e*4):0}nodeIndicesLength(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.__vector_len(this.bb_pos+e):0}nodeIndicesArray(){let e=this.bb.__offset(this.bb_pos,4);return e?new Uint32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+e),this.bb.__vector_len(this.bb_pos+e)):null}numInputs(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.readUint32(this.bb_pos+e):0}numOutputs(){let e=this.bb.__offset(this.bb_pos,8);return e?this.bb.readUint32(this.bb_pos+e):0}hasVariadicInput(){let e=this.bb.__offset(this.bb_pos,10);return e?!!this.bb.readInt8(this.bb_pos+e):!1}hasVariadicOutput(){let e=this.bb.__offset(this.bb_pos,12);return e?!!this.bb.readInt8(this.bb_pos+e):!1}numVariadicInputs(){let e=this.bb.__offset(this.bb_pos,14);return e?this.bb.readUint32(this.bb_pos+e):0}numVariadicOutputs(){let e=this.bb.__offset(this.bb_pos,16);return e?this.bb.readUint32(this.bb_pos+e):0}static startNodesToOptimizeIndices(e){e.startObject(7)}static addNodeIndices(e,n){e.addFieldOffset(0,n,0)}static createNodeIndicesVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addInt32(n[t]);return e.endVector()}static startNodeIndicesVector(e,n){e.startVector(4,n,4)}static addNumInputs(e,n){e.addFieldInt32(1,n,0)}static addNumOutputs(e,n){e.addFieldInt32(2,n,0)}static addHasVariadicInput(e,n){e.addFieldInt8(3,+n,0)}static addHasVariadicOutput(e,n){e.addFieldInt8(4,+n,0)}static addNumVariadicInputs(e,n){e.addFieldInt32(5,n,0)}static addNumVariadicOutputs(e,n){e.addFieldInt32(6,n,0)}static endNodesToOptimizeIndices(e){return e.endObject()}static createNodesToOptimizeIndices(e,n,t,o,i,a,s,u){return r.startNodesToOptimizeIndices(e),r.addNodeIndices(e,n),r.addNumInputs(e,t),r.addNumOutputs(e,o),r.addHasVariadicInput(e,i),r.addHasVariadicOutput(e,a),r.addNumVariadicInputs(e,s),r.addNumVariadicOutputs(e,u),r.endNodesToOptimizeIndices(e)}};Rt.NodesToOptimizeIndices=Ma});var Fa=G(Nt=>{"use strict";var uw=Nt&&Nt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),lw=Nt&&Nt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),cw=Nt&&Nt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&uw(e,r,n);return lw(e,r),e};Object.defineProperty(Nt,"__esModule",{value:!0});Nt.RuntimeOptimizationRecord=void 0;var dw=cw(_e()),pw=Ba(),Va=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsRuntimeOptimizationRecord(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsRuntimeOptimizationRecord(e,n){return e.setPosition(e.position()+dw.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}actionId(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}nodesToOptimizeIndices(e){let n=this.bb.__offset(this.bb_pos,6);return n?(e||new pw.NodesToOptimizeIndices).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}producedOpIds(e,n){let t=this.bb.__offset(this.bb_pos,10);return t?this.bb.__string(this.bb.__vector(this.bb_pos+t)+e*4,n):null}producedOpIdsLength(){let e=this.bb.__offset(this.bb_pos,10);return e?this.bb.__vector_len(this.bb_pos+e):0}static startRuntimeOptimizationRecord(e){e.startObject(4)}static addActionId(e,n){e.addFieldOffset(0,n,0)}static addNodesToOptimizeIndices(e,n){e.addFieldOffset(1,n,0)}static addProducedOpIds(e,n){e.addFieldOffset(3,n,0)}static createProducedOpIdsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startProducedOpIdsVector(e,n){e.startVector(4,n,4)}static endRuntimeOptimizationRecord(e){return e.endObject()}};Nt.RuntimeOptimizationRecord=Va});var Ua=G(zt=>{"use strict";var fw=zt&&zt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),hw=zt&&zt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),mw=zt&&zt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&fw(e,r,n);return hw(e,r),e};Object.defineProperty(zt,"__esModule",{value:!0});zt.RuntimeOptimizationRecordContainerEntry=void 0;var gw=mw(_e()),bw=Fa(),Ga=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsRuntimeOptimizationRecordContainerEntry(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsRuntimeOptimizationRecordContainerEntry(e,n){return e.setPosition(e.position()+gw.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}optimizerName(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}runtimeOptimizationRecords(e,n){let t=this.bb.__offset(this.bb_pos,6);return t?(n||new bw.RuntimeOptimizationRecord).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}runtimeOptimizationRecordsLength(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__vector_len(this.bb_pos+e):0}static startRuntimeOptimizationRecordContainerEntry(e){e.startObject(2)}static addOptimizerName(e,n){e.addFieldOffset(0,n,0)}static addRuntimeOptimizationRecords(e,n){e.addFieldOffset(1,n,0)}static createRuntimeOptimizationRecordsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startRuntimeOptimizationRecordsVector(e,n){e.startVector(4,n,4)}static endRuntimeOptimizationRecordContainerEntry(e){let n=e.endObject();return e.requiredField(n,4),n}static createRuntimeOptimizationRecordContainerEntry(e,n,t){return r.startRuntimeOptimizationRecordContainerEntry(e),r.addOptimizerName(e,n),r.addRuntimeOptimizationRecords(e,t),r.endRuntimeOptimizationRecordContainerEntry(e)}};zt.RuntimeOptimizationRecordContainerEntry=Ga});var Ha=G(Mt=>{"use strict";var yw=Mt&&Mt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),_w=Mt&&Mt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),xw=Mt&&Mt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&yw(e,r,n);return _w(e,r),e};Object.defineProperty(Mt,"__esModule",{value:!0});Mt.RuntimeOptimizations=void 0;var ww=xw(_e()),Tw=Ua(),Wa=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsRuntimeOptimizations(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsRuntimeOptimizations(e,n){return e.setPosition(e.position()+ww.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}records(e,n){let t=this.bb.__offset(this.bb_pos,4);return t?(n||new Tw.RuntimeOptimizationRecordContainerEntry).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}recordsLength(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.__vector_len(this.bb_pos+e):0}static startRuntimeOptimizations(e){e.startObject(1)}static addRecords(e,n){e.addFieldOffset(0,n,0)}static createRecordsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startRecordsVector(e,n){e.startVector(4,n,4)}static endRuntimeOptimizations(e){return e.endObject()}static createRuntimeOptimizations(e,n){return r.startRuntimeOptimizations(e),r.addRecords(e,n),r.endRuntimeOptimizations(e)}};Mt.RuntimeOptimizations=Wa});var Lr=G(Po=>{"use strict";Object.defineProperty(Po,"__esModule",{value:!0});Po.TensorDataType=void 0;var Ac;(function(r){r[r.UNDEFINED=0]="UNDEFINED",r[r.FLOAT=1]="FLOAT",r[r.UINT8=2]="UINT8",r[r.INT8=3]="INT8",r[r.UINT16=4]="UINT16",r[r.INT16=5]="INT16",r[r.INT32=6]="INT32",r[r.INT64=7]="INT64",r[r.STRING=8]="STRING",r[r.BOOL=9]="BOOL",r[r.FLOAT16=10]="FLOAT16",r[r.DOUBLE=11]="DOUBLE",r[r.UINT32=12]="UINT32",r[r.UINT64=13]="UINT64",r[r.COMPLEX64=14]="COMPLEX64",r[r.COMPLEX128=15]="COMPLEX128",r[r.BFLOAT16=16]="BFLOAT16",r[r.FLOAT8E4M3FN=17]="FLOAT8E4M3FN",r[r.FLOAT8E4M3FNUZ=18]="FLOAT8E4M3FNUZ",r[r.FLOAT8E5M2=19]="FLOAT8E5M2",r[r.FLOAT8E5M2FNUZ=20]="FLOAT8E5M2FNUZ"})(Ac||(Po.TensorDataType=Ac={}))});var Rr=G(Bt=>{"use strict";var vw=Bt&&Bt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),Iw=Bt&&Bt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Sw=Bt&&Bt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&vw(e,r,n);return Iw(e,r),e};Object.defineProperty(Bt,"__esModule",{value:!0});Bt.Tensor=void 0;var $w=Sw(_e()),Pc=Lr(),qa=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsTensor(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsTensor(e,n){return e.setPosition(e.position()+$w.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}name(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}docString(e){let n=this.bb.__offset(this.bb_pos,6);return n?this.bb.__string(this.bb_pos+n,e):null}dims(e){let n=this.bb.__offset(this.bb_pos,8);return n?this.bb.readInt64(this.bb.__vector(this.bb_pos+n)+e*8):BigInt(0)}dimsLength(){let e=this.bb.__offset(this.bb_pos,8);return e?this.bb.__vector_len(this.bb_pos+e):0}dataType(){let e=this.bb.__offset(this.bb_pos,10);return e?this.bb.readInt32(this.bb_pos+e):Pc.TensorDataType.UNDEFINED}rawData(e){let n=this.bb.__offset(this.bb_pos,12);return n?this.bb.readUint8(this.bb.__vector(this.bb_pos+n)+e):0}rawDataLength(){let e=this.bb.__offset(this.bb_pos,12);return e?this.bb.__vector_len(this.bb_pos+e):0}rawDataArray(){let e=this.bb.__offset(this.bb_pos,12);return e?new Uint8Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+e),this.bb.__vector_len(this.bb_pos+e)):null}stringData(e,n){let t=this.bb.__offset(this.bb_pos,14);return t?this.bb.__string(this.bb.__vector(this.bb_pos+t)+e*4,n):null}stringDataLength(){let e=this.bb.__offset(this.bb_pos,14);return e?this.bb.__vector_len(this.bb_pos+e):0}externalDataOffset(){let e=this.bb.__offset(this.bb_pos,16);return e?this.bb.readInt64(this.bb_pos+e):BigInt("-1")}static startTensor(e){e.startObject(7)}static addName(e,n){e.addFieldOffset(0,n,0)}static addDocString(e,n){e.addFieldOffset(1,n,0)}static addDims(e,n){e.addFieldOffset(2,n,0)}static createDimsVector(e,n){e.startVector(8,n.length,8);for(let t=n.length-1;t>=0;t--)e.addInt64(n[t]);return e.endVector()}static startDimsVector(e,n){e.startVector(8,n,8)}static addDataType(e,n){e.addFieldInt32(3,n,Pc.TensorDataType.UNDEFINED)}static addRawData(e,n){e.addFieldOffset(4,n,0)}static createRawDataVector(e,n){e.startVector(1,n.length,1);for(let t=n.length-1;t>=0;t--)e.addInt8(n[t]);return e.endVector()}static startRawDataVector(e,n){e.startVector(1,n,1)}static addStringData(e,n){e.addFieldOffset(5,n,0)}static createStringDataVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startStringDataVector(e,n){e.startVector(4,n,4)}static addExternalDataOffset(e,n){e.addFieldInt64(6,n,BigInt("-1"))}static endTensor(e){return e.endObject()}static createTensor(e,n,t,o,i,a,s,u){return r.startTensor(e),r.addName(e,n),r.addDocString(e,t),r.addDims(e,o),r.addDataType(e,i),r.addRawData(e,a),r.addStringData(e,s),r.addExternalDataOffset(e,u),r.endTensor(e)}};Bt.Tensor=qa});var Ka=G(Vt=>{"use strict";var Aw=Vt&&Vt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),Pw=Vt&&Vt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Ow=Vt&&Vt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&Aw(e,r,n);return Pw(e,r),e};Object.defineProperty(Vt,"__esModule",{value:!0});Vt.SparseTensor=void 0;var Ew=Ow(_e()),Oc=Rr(),ja=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsSparseTensor(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSparseTensor(e,n){return e.setPosition(e.position()+Ew.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}values(e){let n=this.bb.__offset(this.bb_pos,4);return n?(e||new Oc.Tensor).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}indices(e){let n=this.bb.__offset(this.bb_pos,6);return n?(e||new Oc.Tensor).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}dims(e){let n=this.bb.__offset(this.bb_pos,8);return n?this.bb.readInt64(this.bb.__vector(this.bb_pos+n)+e*8):BigInt(0)}dimsLength(){let e=this.bb.__offset(this.bb_pos,8);return e?this.bb.__vector_len(this.bb_pos+e):0}static startSparseTensor(e){e.startObject(3)}static addValues(e,n){e.addFieldOffset(0,n,0)}static addIndices(e,n){e.addFieldOffset(1,n,0)}static addDims(e,n){e.addFieldOffset(2,n,0)}static createDimsVector(e,n){e.startVector(8,n.length,8);for(let t=n.length-1;t>=0;t--)e.addInt64(n[t]);return e.endVector()}static startDimsVector(e,n){e.startVector(8,n,8)}static endSparseTensor(e){return e.endObject()}};Vt.SparseTensor=ja});var Za=G(Ft=>{"use strict";var Cw=Ft&&Ft.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),Dw=Ft&&Ft.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),kw=Ft&&Ft.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&Cw(e,r,n);return Dw(e,r),e};Object.defineProperty(Ft,"__esModule",{value:!0});Ft.MapType=void 0;var Lw=kw(_e()),Ec=Lr(),Rw=Nr(),Xa=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsMapType(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsMapType(e,n){return e.setPosition(e.position()+Lw.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}keyType(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.readInt32(this.bb_pos+e):Ec.TensorDataType.UNDEFINED}valueType(e){let n=this.bb.__offset(this.bb_pos,6);return n?(e||new Rw.TypeInfo).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}static startMapType(e){e.startObject(2)}static addKeyType(e,n){e.addFieldInt32(0,n,Ec.TensorDataType.UNDEFINED)}static addValueType(e,n){e.addFieldOffset(1,n,0)}static endMapType(e){return e.endObject()}};Ft.MapType=Xa});var Qa=G(Gt=>{"use strict";var Nw=Gt&&Gt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),zw=Gt&&Gt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Mw=Gt&&Gt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&Nw(e,r,n);return zw(e,r),e};Object.defineProperty(Gt,"__esModule",{value:!0});Gt.SequenceType=void 0;var Bw=Mw(_e()),Vw=Nr(),Ja=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsSequenceType(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSequenceType(e,n){return e.setPosition(e.position()+Bw.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}elemType(e){let n=this.bb.__offset(this.bb_pos,4);return n?(e||new Vw.TypeInfo).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}static startSequenceType(e){e.startObject(1)}static addElemType(e,n){e.addFieldOffset(0,n,0)}static endSequenceType(e){return e.endObject()}static createSequenceType(e,n){return r.startSequenceType(e),r.addElemType(e,n),r.endSequenceType(e)}};Gt.SequenceType=Ja});var Ya=G(Oo=>{"use strict";Object.defineProperty(Oo,"__esModule",{value:!0});Oo.DimensionValueType=void 0;var Cc;(function(r){r[r.UNKNOWN=0]="UNKNOWN",r[r.VALUE=1]="VALUE",r[r.PARAM=2]="PARAM"})(Cc||(Oo.DimensionValueType=Cc={}))});var ts=G(Ut=>{"use strict";var Fw=Ut&&Ut.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),Gw=Ut&&Ut.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Uw=Ut&&Ut.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&Fw(e,r,n);return Gw(e,r),e};Object.defineProperty(Ut,"__esModule",{value:!0});Ut.DimensionValue=void 0;var Ww=Uw(_e()),Dc=Ya(),es=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsDimensionValue(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsDimensionValue(e,n){return e.setPosition(e.position()+Ww.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}dimType(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.readInt8(this.bb_pos+e):Dc.DimensionValueType.UNKNOWN}dimValue(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.readInt64(this.bb_pos+e):BigInt("0")}dimParam(e){let n=this.bb.__offset(this.bb_pos,8);return n?this.bb.__string(this.bb_pos+n,e):null}static startDimensionValue(e){e.startObject(3)}static addDimType(e,n){e.addFieldInt8(0,n,Dc.DimensionValueType.UNKNOWN)}static addDimValue(e,n){e.addFieldInt64(1,n,BigInt("0"))}static addDimParam(e,n){e.addFieldOffset(2,n,0)}static endDimensionValue(e){return e.endObject()}static createDimensionValue(e,n,t,o){return r.startDimensionValue(e),r.addDimType(e,n),r.addDimValue(e,t),r.addDimParam(e,o),r.endDimensionValue(e)}};Ut.DimensionValue=es});var rs=G(Wt=>{"use strict";var Hw=Wt&&Wt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),qw=Wt&&Wt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),jw=Wt&&Wt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&Hw(e,r,n);return qw(e,r),e};Object.defineProperty(Wt,"__esModule",{value:!0});Wt.Dimension=void 0;var Kw=jw(_e()),Xw=ts(),ns=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsDimension(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsDimension(e,n){return e.setPosition(e.position()+Kw.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}value(e){let n=this.bb.__offset(this.bb_pos,4);return n?(e||new Xw.DimensionValue).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}denotation(e){let n=this.bb.__offset(this.bb_pos,6);return n?this.bb.__string(this.bb_pos+n,e):null}static startDimension(e){e.startObject(2)}static addValue(e,n){e.addFieldOffset(0,n,0)}static addDenotation(e,n){e.addFieldOffset(1,n,0)}static endDimension(e){return e.endObject()}static createDimension(e,n,t){return r.startDimension(e),r.addValue(e,n),r.addDenotation(e,t),r.endDimension(e)}};Wt.Dimension=ns});var is=G(Ht=>{"use strict";var Zw=Ht&&Ht.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),Jw=Ht&&Ht.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Qw=Ht&&Ht.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&Zw(e,r,n);return Jw(e,r),e};Object.defineProperty(Ht,"__esModule",{value:!0});Ht.Shape=void 0;var Yw=Qw(_e()),eT=rs(),os=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsShape(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsShape(e,n){return e.setPosition(e.position()+Yw.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}dim(e,n){let t=this.bb.__offset(this.bb_pos,4);return t?(n||new eT.Dimension).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}dimLength(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.__vector_len(this.bb_pos+e):0}static startShape(e){e.startObject(1)}static addDim(e,n){e.addFieldOffset(0,n,0)}static createDimVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startDimVector(e,n){e.startVector(4,n,4)}static endShape(e){return e.endObject()}static createShape(e,n){return r.startShape(e),r.addDim(e,n),r.endShape(e)}};Ht.Shape=os});var ss=G(qt=>{"use strict";var tT=qt&&qt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),nT=qt&&qt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),rT=qt&&qt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&tT(e,r,n);return nT(e,r),e};Object.defineProperty(qt,"__esModule",{value:!0});qt.TensorTypeAndShape=void 0;var oT=rT(_e()),iT=is(),kc=Lr(),as=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsTensorTypeAndShape(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsTensorTypeAndShape(e,n){return e.setPosition(e.position()+oT.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}elemType(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.readInt32(this.bb_pos+e):kc.TensorDataType.UNDEFINED}shape(e){let n=this.bb.__offset(this.bb_pos,6);return n?(e||new iT.Shape).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}static startTensorTypeAndShape(e){e.startObject(2)}static addElemType(e,n){e.addFieldInt32(0,n,kc.TensorDataType.UNDEFINED)}static addShape(e,n){e.addFieldOffset(1,n,0)}static endTensorTypeAndShape(e){return e.endObject()}};qt.TensorTypeAndShape=as});var us=G(Dn=>{"use strict";Object.defineProperty(Dn,"__esModule",{value:!0});Dn.unionListToTypeInfoValue=Dn.unionToTypeInfoValue=Dn.TypeInfoValue=void 0;var Lc=Za(),Rc=Qa(),Nc=ss(),Eo;(function(r){r[r.NONE=0]="NONE",r[r.tensor_type=1]="tensor_type",r[r.sequence_type=2]="sequence_type",r[r.map_type=3]="map_type"})(Eo||(Dn.TypeInfoValue=Eo={}));function aT(r,e){switch(Eo[r]){case"NONE":return null;case"tensor_type":return e(new Nc.TensorTypeAndShape);case"sequence_type":return e(new Rc.SequenceType);case"map_type":return e(new Lc.MapType);default:return null}}Dn.unionToTypeInfoValue=aT;function sT(r,e,n){switch(Eo[r]){case"NONE":return null;case"tensor_type":return e(n,new Nc.TensorTypeAndShape);case"sequence_type":return e(n,new Rc.SequenceType);case"map_type":return e(n,new Lc.MapType);default:return null}}Dn.unionListToTypeInfoValue=sT});var Nr=G(jt=>{"use strict";var uT=jt&&jt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),lT=jt&&jt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),cT=jt&&jt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&uT(e,r,n);return lT(e,r),e};Object.defineProperty(jt,"__esModule",{value:!0});jt.TypeInfo=void 0;var dT=cT(_e()),zc=us(),ls=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsTypeInfo(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsTypeInfo(e,n){return e.setPosition(e.position()+dT.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}denotation(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}valueType(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.readUint8(this.bb_pos+e):zc.TypeInfoValue.NONE}value(e){let n=this.bb.__offset(this.bb_pos,8);return n?this.bb.__union(e,this.bb_pos+n):null}static startTypeInfo(e){e.startObject(3)}static addDenotation(e,n){e.addFieldOffset(0,n,0)}static addValueType(e,n){e.addFieldInt8(1,n,zc.TypeInfoValue.NONE)}static addValue(e,n){e.addFieldOffset(2,n,0)}static endTypeInfo(e){return e.endObject()}static createTypeInfo(e,n,t,o){return r.startTypeInfo(e),r.addDenotation(e,n),r.addValueType(e,t),r.addValue(e,o),r.endTypeInfo(e)}};jt.TypeInfo=ls});var ds=G(Kt=>{"use strict";var pT=Kt&&Kt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),fT=Kt&&Kt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),hT=Kt&&Kt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&pT(e,r,n);return fT(e,r),e};Object.defineProperty(Kt,"__esModule",{value:!0});Kt.ValueInfo=void 0;var mT=hT(_e()),gT=Nr(),cs=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsValueInfo(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsValueInfo(e,n){return e.setPosition(e.position()+mT.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}name(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}docString(e){let n=this.bb.__offset(this.bb_pos,6);return n?this.bb.__string(this.bb_pos+n,e):null}type(e){let n=this.bb.__offset(this.bb_pos,8);return n?(e||new gT.TypeInfo).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}static startValueInfo(e){e.startObject(3)}static addName(e,n){e.addFieldOffset(0,n,0)}static addDocString(e,n){e.addFieldOffset(1,n,0)}static addType(e,n){e.addFieldOffset(2,n,0)}static endValueInfo(e){return e.endObject()}};Kt.ValueInfo=cs});var Co=G(Xt=>{"use strict";var bT=Xt&&Xt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),yT=Xt&&Xt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),_T=Xt&&Xt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&bT(e,r,n);return yT(e,r),e};Object.defineProperty(Xt,"__esModule",{value:!0});Xt.Graph=void 0;var xT=_T(_e()),wT=Da(),TT=za(),vT=Ha(),IT=Ka(),ST=Rr(),$T=ds(),ps=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsGraph(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsGraph(e,n){return e.setPosition(e.position()+xT.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}initializers(e,n){let t=this.bb.__offset(this.bb_pos,4);return t?(n||new ST.Tensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}initializersLength(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.__vector_len(this.bb_pos+e):0}nodeArgs(e,n){let t=this.bb.__offset(this.bb_pos,6);return t?(n||new $T.ValueInfo).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}nodeArgsLength(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__vector_len(this.bb_pos+e):0}nodes(e,n){let t=this.bb.__offset(this.bb_pos,8);return t?(n||new wT.Node).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}nodesLength(){let e=this.bb.__offset(this.bb_pos,8);return e?this.bb.__vector_len(this.bb_pos+e):0}maxNodeIndex(){let e=this.bb.__offset(this.bb_pos,10);return e?this.bb.readUint32(this.bb_pos+e):0}nodeEdges(e,n){let t=this.bb.__offset(this.bb_pos,12);return t?(n||new TT.NodeEdge).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}nodeEdgesLength(){let e=this.bb.__offset(this.bb_pos,12);return e?this.bb.__vector_len(this.bb_pos+e):0}inputs(e,n){let t=this.bb.__offset(this.bb_pos,14);return t?this.bb.__string(this.bb.__vector(this.bb_pos+t)+e*4,n):null}inputsLength(){let e=this.bb.__offset(this.bb_pos,14);return e?this.bb.__vector_len(this.bb_pos+e):0}outputs(e,n){let t=this.bb.__offset(this.bb_pos,16);return t?this.bb.__string(this.bb.__vector(this.bb_pos+t)+e*4,n):null}outputsLength(){let e=this.bb.__offset(this.bb_pos,16);return e?this.bb.__vector_len(this.bb_pos+e):0}sparseInitializers(e,n){let t=this.bb.__offset(this.bb_pos,18);return t?(n||new IT.SparseTensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}sparseInitializersLength(){let e=this.bb.__offset(this.bb_pos,18);return e?this.bb.__vector_len(this.bb_pos+e):0}runtimeOptimizations(e){let n=this.bb.__offset(this.bb_pos,20);return n?(e||new vT.RuntimeOptimizations).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}static startGraph(e){e.startObject(9)}static addInitializers(e,n){e.addFieldOffset(0,n,0)}static createInitializersVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startInitializersVector(e,n){e.startVector(4,n,4)}static addNodeArgs(e,n){e.addFieldOffset(1,n,0)}static createNodeArgsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startNodeArgsVector(e,n){e.startVector(4,n,4)}static addNodes(e,n){e.addFieldOffset(2,n,0)}static createNodesVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startNodesVector(e,n){e.startVector(4,n,4)}static addMaxNodeIndex(e,n){e.addFieldInt32(3,n,0)}static addNodeEdges(e,n){e.addFieldOffset(4,n,0)}static createNodeEdgesVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startNodeEdgesVector(e,n){e.startVector(4,n,4)}static addInputs(e,n){e.addFieldOffset(5,n,0)}static createInputsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startInputsVector(e,n){e.startVector(4,n,4)}static addOutputs(e,n){e.addFieldOffset(6,n,0)}static createOutputsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startOutputsVector(e,n){e.startVector(4,n,4)}static addSparseInitializers(e,n){e.addFieldOffset(7,n,0)}static createSparseInitializersVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startSparseInitializersVector(e,n){e.startVector(4,n,4)}static addRuntimeOptimizations(e,n){e.addFieldOffset(8,n,0)}static endGraph(e){return e.endObject()}};Xt.Graph=ps});var ka=G(Zt=>{"use strict";var AT=Zt&&Zt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),PT=Zt&&Zt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),OT=Zt&&Zt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&AT(e,r,n);return PT(e,r),e};Object.defineProperty(Zt,"__esModule",{value:!0});Zt.Attribute=void 0;var ET=OT(_e()),Mc=Oa(),Bc=Co(),Vc=Rr(),fs=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsAttribute(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsAttribute(e,n){return e.setPosition(e.position()+ET.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}name(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}docString(e){let n=this.bb.__offset(this.bb_pos,6);return n?this.bb.__string(this.bb_pos+n,e):null}type(){let e=this.bb.__offset(this.bb_pos,8);return e?this.bb.readInt32(this.bb_pos+e):Mc.AttributeType.UNDEFINED}f(){let e=this.bb.__offset(this.bb_pos,10);return e?this.bb.readFloat32(this.bb_pos+e):0}i(){let e=this.bb.__offset(this.bb_pos,12);return e?this.bb.readInt64(this.bb_pos+e):BigInt("0")}s(e){let n=this.bb.__offset(this.bb_pos,14);return n?this.bb.__string(this.bb_pos+n,e):null}t(e){let n=this.bb.__offset(this.bb_pos,16);return n?(e||new Vc.Tensor).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}g(e){let n=this.bb.__offset(this.bb_pos,18);return n?(e||new Bc.Graph).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}floats(e){let n=this.bb.__offset(this.bb_pos,20);return n?this.bb.readFloat32(this.bb.__vector(this.bb_pos+n)+e*4):0}floatsLength(){let e=this.bb.__offset(this.bb_pos,20);return e?this.bb.__vector_len(this.bb_pos+e):0}floatsArray(){let e=this.bb.__offset(this.bb_pos,20);return e?new Float32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+e),this.bb.__vector_len(this.bb_pos+e)):null}ints(e){let n=this.bb.__offset(this.bb_pos,22);return n?this.bb.readInt64(this.bb.__vector(this.bb_pos+n)+e*8):BigInt(0)}intsLength(){let e=this.bb.__offset(this.bb_pos,22);return e?this.bb.__vector_len(this.bb_pos+e):0}strings(e,n){let t=this.bb.__offset(this.bb_pos,24);return t?this.bb.__string(this.bb.__vector(this.bb_pos+t)+e*4,n):null}stringsLength(){let e=this.bb.__offset(this.bb_pos,24);return e?this.bb.__vector_len(this.bb_pos+e):0}tensors(e,n){let t=this.bb.__offset(this.bb_pos,26);return t?(n||new Vc.Tensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}tensorsLength(){let e=this.bb.__offset(this.bb_pos,26);return e?this.bb.__vector_len(this.bb_pos+e):0}graphs(e,n){let t=this.bb.__offset(this.bb_pos,28);return t?(n||new Bc.Graph).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}graphsLength(){let e=this.bb.__offset(this.bb_pos,28);return e?this.bb.__vector_len(this.bb_pos+e):0}static startAttribute(e){e.startObject(13)}static addName(e,n){e.addFieldOffset(0,n,0)}static addDocString(e,n){e.addFieldOffset(1,n,0)}static addType(e,n){e.addFieldInt32(2,n,Mc.AttributeType.UNDEFINED)}static addF(e,n){e.addFieldFloat32(3,n,0)}static addI(e,n){e.addFieldInt64(4,n,BigInt("0"))}static addS(e,n){e.addFieldOffset(5,n,0)}static addT(e,n){e.addFieldOffset(6,n,0)}static addG(e,n){e.addFieldOffset(7,n,0)}static addFloats(e,n){e.addFieldOffset(8,n,0)}static createFloatsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addFloat32(n[t]);return e.endVector()}static startFloatsVector(e,n){e.startVector(4,n,4)}static addInts(e,n){e.addFieldOffset(9,n,0)}static createIntsVector(e,n){e.startVector(8,n.length,8);for(let t=n.length-1;t>=0;t--)e.addInt64(n[t]);return e.endVector()}static startIntsVector(e,n){e.startVector(8,n,8)}static addStrings(e,n){e.addFieldOffset(10,n,0)}static createStringsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startStringsVector(e,n){e.startVector(4,n,4)}static addTensors(e,n){e.addFieldOffset(11,n,0)}static createTensorsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startTensorsVector(e,n){e.startVector(4,n,4)}static addGraphs(e,n){e.addFieldOffset(12,n,0)}static createGraphsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startGraphsVector(e,n){e.startVector(4,n,4)}static endAttribute(e){return e.endObject()}};Zt.Attribute=fs});var ms=G(Jt=>{"use strict";var CT=Jt&&Jt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),DT=Jt&&Jt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),kT=Jt&&Jt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&CT(e,r,n);return DT(e,r),e};Object.defineProperty(Jt,"__esModule",{value:!0});Jt.DeprecatedKernelCreateInfos=void 0;var LT=kT(_e()),hs=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsDeprecatedKernelCreateInfos(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsDeprecatedKernelCreateInfos(e,n){return e.setPosition(e.position()+LT.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}nodeIndices(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.readUint32(this.bb.__vector(this.bb_pos+n)+e*4):0}nodeIndicesLength(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.__vector_len(this.bb_pos+e):0}nodeIndicesArray(){let e=this.bb.__offset(this.bb_pos,4);return e?new Uint32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+e),this.bb.__vector_len(this.bb_pos+e)):null}kernelDefHashes(e){let n=this.bb.__offset(this.bb_pos,6);return n?this.bb.readUint64(this.bb.__vector(this.bb_pos+n)+e*8):BigInt(0)}kernelDefHashesLength(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__vector_len(this.bb_pos+e):0}static startDeprecatedKernelCreateInfos(e){e.startObject(2)}static addNodeIndices(e,n){e.addFieldOffset(0,n,0)}static createNodeIndicesVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addInt32(n[t]);return e.endVector()}static startNodeIndicesVector(e,n){e.startVector(4,n,4)}static addKernelDefHashes(e,n){e.addFieldOffset(1,n,0)}static createKernelDefHashesVector(e,n){e.startVector(8,n.length,8);for(let t=n.length-1;t>=0;t--)e.addInt64(n[t]);return e.endVector()}static startKernelDefHashesVector(e,n){e.startVector(8,n,8)}static endDeprecatedKernelCreateInfos(e){return e.endObject()}static createDeprecatedKernelCreateInfos(e,n,t){return r.startDeprecatedKernelCreateInfos(e),r.addNodeIndices(e,n),r.addKernelDefHashes(e,t),r.endDeprecatedKernelCreateInfos(e)}};Jt.DeprecatedKernelCreateInfos=hs});var Fc=G(Qt=>{"use strict";var RT=Qt&&Qt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),NT=Qt&&Qt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),zT=Qt&&Qt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&RT(e,r,n);return NT(e,r),e};Object.defineProperty(Qt,"__esModule",{value:!0});Qt.DeprecatedNodeIndexAndKernelDefHash=void 0;var MT=zT(_e()),gs=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsDeprecatedNodeIndexAndKernelDefHash(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsDeprecatedNodeIndexAndKernelDefHash(e,n){return e.setPosition(e.position()+MT.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}nodeIndex(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.readUint32(this.bb_pos+e):0}kernelDefHash(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.readUint64(this.bb_pos+e):BigInt("0")}static startDeprecatedNodeIndexAndKernelDefHash(e){e.startObject(2)}static addNodeIndex(e,n){e.addFieldInt32(0,n,0)}static addKernelDefHash(e,n){e.addFieldInt64(1,n,BigInt("0"))}static endDeprecatedNodeIndexAndKernelDefHash(e){return e.endObject()}static createDeprecatedNodeIndexAndKernelDefHash(e,n,t){return r.startDeprecatedNodeIndexAndKernelDefHash(e),r.addNodeIndex(e,n),r.addKernelDefHash(e,t),r.endDeprecatedNodeIndexAndKernelDefHash(e)}};Qt.DeprecatedNodeIndexAndKernelDefHash=gs});var ys=G(Yt=>{"use strict";var BT=Yt&&Yt.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),VT=Yt&&Yt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),FT=Yt&&Yt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&BT(e,r,n);return VT(e,r),e};Object.defineProperty(Yt,"__esModule",{value:!0});Yt.DeprecatedSubGraphSessionState=void 0;var GT=FT(_e()),UT=_s(),bs=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsDeprecatedSubGraphSessionState(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsDeprecatedSubGraphSessionState(e,n){return e.setPosition(e.position()+GT.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}graphId(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}sessionState(e){let n=this.bb.__offset(this.bb_pos,6);return n?(e||new UT.DeprecatedSessionState).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}static startDeprecatedSubGraphSessionState(e){e.startObject(2)}static addGraphId(e,n){e.addFieldOffset(0,n,0)}static addSessionState(e,n){e.addFieldOffset(1,n,0)}static endDeprecatedSubGraphSessionState(e){let n=e.endObject();return e.requiredField(n,4),n}};Yt.DeprecatedSubGraphSessionState=bs});var _s=G(en=>{"use strict";var WT=en&&en.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),HT=en&&en.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),qT=en&&en.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&WT(e,r,n);return HT(e,r),e};Object.defineProperty(en,"__esModule",{value:!0});en.DeprecatedSessionState=void 0;var jT=qT(_e()),KT=ms(),XT=ys(),xs=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsDeprecatedSessionState(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsDeprecatedSessionState(e,n){return e.setPosition(e.position()+jT.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}kernels(e){let n=this.bb.__offset(this.bb_pos,4);return n?(e||new KT.DeprecatedKernelCreateInfos).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}subGraphSessionStates(e,n){let t=this.bb.__offset(this.bb_pos,6);return t?(n||new XT.DeprecatedSubGraphSessionState).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}subGraphSessionStatesLength(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__vector_len(this.bb_pos+e):0}static startDeprecatedSessionState(e){e.startObject(2)}static addKernels(e,n){e.addFieldOffset(0,n,0)}static addSubGraphSessionStates(e,n){e.addFieldOffset(1,n,0)}static createSubGraphSessionStatesVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startSubGraphSessionStatesVector(e,n){e.startVector(4,n,4)}static endDeprecatedSessionState(e){return e.endObject()}static createDeprecatedSessionState(e,n,t){return r.startDeprecatedSessionState(e),r.addKernels(e,n),r.addSubGraphSessionStates(e,t),r.endDeprecatedSessionState(e)}};en.DeprecatedSessionState=xs});var Ts=G(tn=>{"use strict";var ZT=tn&&tn.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),JT=tn&&tn.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),QT=tn&&tn.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&ZT(e,r,n);return JT(e,r),e};Object.defineProperty(tn,"__esModule",{value:!0});tn.KernelTypeStrArgsEntry=void 0;var YT=QT(_e()),ev=Pa(),ws=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsKernelTypeStrArgsEntry(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsKernelTypeStrArgsEntry(e,n){return e.setPosition(e.position()+YT.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}kernelTypeStr(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}args(e,n){let t=this.bb.__offset(this.bb_pos,6);return t?(n||new ev.ArgTypeAndIndex).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}argsLength(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__vector_len(this.bb_pos+e):0}static startKernelTypeStrArgsEntry(e){e.startObject(2)}static addKernelTypeStr(e,n){e.addFieldOffset(0,n,0)}static addArgs(e,n){e.addFieldOffset(1,n,0)}static createArgsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startArgsVector(e,n){e.startVector(4,n,4)}static endKernelTypeStrArgsEntry(e){let n=e.endObject();return e.requiredField(n,4),n}static createKernelTypeStrArgsEntry(e,n,t){return r.startKernelTypeStrArgsEntry(e),r.addKernelTypeStr(e,n),r.addArgs(e,t),r.endKernelTypeStrArgsEntry(e)}};tn.KernelTypeStrArgsEntry=ws});var Is=G(nn=>{"use strict";var tv=nn&&nn.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),nv=nn&&nn.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),rv=nn&&nn.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&tv(e,r,n);return nv(e,r),e};Object.defineProperty(nn,"__esModule",{value:!0});nn.OpIdKernelTypeStrArgsEntry=void 0;var ov=rv(_e()),iv=Ts(),vs=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsOpIdKernelTypeStrArgsEntry(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsOpIdKernelTypeStrArgsEntry(e,n){return e.setPosition(e.position()+ov.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}opId(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}kernelTypeStrArgs(e,n){let t=this.bb.__offset(this.bb_pos,6);return t?(n||new iv.KernelTypeStrArgsEntry).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}kernelTypeStrArgsLength(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__vector_len(this.bb_pos+e):0}static startOpIdKernelTypeStrArgsEntry(e){e.startObject(2)}static addOpId(e,n){e.addFieldOffset(0,n,0)}static addKernelTypeStrArgs(e,n){e.addFieldOffset(1,n,0)}static createKernelTypeStrArgsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startKernelTypeStrArgsVector(e,n){e.startVector(4,n,4)}static endOpIdKernelTypeStrArgsEntry(e){let n=e.endObject();return e.requiredField(n,4),n}static createOpIdKernelTypeStrArgsEntry(e,n,t){return r.startOpIdKernelTypeStrArgsEntry(e),r.addOpId(e,n),r.addKernelTypeStrArgs(e,t),r.endOpIdKernelTypeStrArgsEntry(e)}};nn.OpIdKernelTypeStrArgsEntry=vs});var $s=G(rn=>{"use strict";var av=rn&&rn.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),sv=rn&&rn.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),uv=rn&&rn.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&av(e,r,n);return sv(e,r),e};Object.defineProperty(rn,"__esModule",{value:!0});rn.KernelTypeStrResolver=void 0;var lv=uv(_e()),cv=Is(),Ss=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsKernelTypeStrResolver(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsKernelTypeStrResolver(e,n){return e.setPosition(e.position()+lv.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}opKernelTypeStrArgs(e,n){let t=this.bb.__offset(this.bb_pos,4);return t?(n||new cv.OpIdKernelTypeStrArgsEntry).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}opKernelTypeStrArgsLength(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.__vector_len(this.bb_pos+e):0}static startKernelTypeStrResolver(e){e.startObject(1)}static addOpKernelTypeStrArgs(e,n){e.addFieldOffset(0,n,0)}static createOpKernelTypeStrArgsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startOpKernelTypeStrArgsVector(e,n){e.startVector(4,n,4)}static endKernelTypeStrResolver(e){return e.endObject()}static createKernelTypeStrResolver(e,n){return r.startKernelTypeStrResolver(e),r.addOpKernelTypeStrArgs(e,n),r.endKernelTypeStrResolver(e)}};rn.KernelTypeStrResolver=Ss});var Ps=G(on=>{"use strict";var dv=on&&on.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),pv=on&&on.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),fv=on&&on.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&dv(e,r,n);return pv(e,r),e};Object.defineProperty(on,"__esModule",{value:!0});on.OperatorSetId=void 0;var hv=fv(_e()),As=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsOperatorSetId(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsOperatorSetId(e,n){return e.setPosition(e.position()+hv.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}domain(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}version(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.readInt64(this.bb_pos+e):BigInt("0")}static startOperatorSetId(e){e.startObject(2)}static addDomain(e,n){e.addFieldOffset(0,n,0)}static addVersion(e,n){e.addFieldInt64(1,n,BigInt("0"))}static endOperatorSetId(e){return e.endObject()}static createOperatorSetId(e,n,t){return r.startOperatorSetId(e),r.addDomain(e,n),r.addVersion(e,t),r.endOperatorSetId(e)}};on.OperatorSetId=As});var Es=G(an=>{"use strict";var mv=an&&an.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),gv=an&&an.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),bv=an&&an.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&mv(e,r,n);return gv(e,r),e};Object.defineProperty(an,"__esModule",{value:!0});an.StringStringEntry=void 0;var yv=bv(_e()),Os=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsStringStringEntry(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsStringStringEntry(e,n){return e.setPosition(e.position()+yv.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}key(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}value(e){let n=this.bb.__offset(this.bb_pos,6);return n?this.bb.__string(this.bb_pos+n,e):null}static startStringStringEntry(e){e.startObject(2)}static addKey(e,n){e.addFieldOffset(0,n,0)}static addValue(e,n){e.addFieldOffset(1,n,0)}static endStringStringEntry(e){return e.endObject()}static createStringStringEntry(e,n,t){return r.startStringStringEntry(e),r.addKey(e,n),r.addValue(e,t),r.endStringStringEntry(e)}};an.StringStringEntry=Os});var Ds=G(sn=>{"use strict";var _v=sn&&sn.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),xv=sn&&sn.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),wv=sn&&sn.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&_v(e,r,n);return xv(e,r),e};Object.defineProperty(sn,"__esModule",{value:!0});sn.Model=void 0;var Tv=wv(_e()),vv=Co(),Iv=Ps(),Sv=Es(),Cs=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsModel(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsModel(e,n){return e.setPosition(e.position()+Tv.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}irVersion(){let e=this.bb.__offset(this.bb_pos,4);return e?this.bb.readInt64(this.bb_pos+e):BigInt("0")}opsetImport(e,n){let t=this.bb.__offset(this.bb_pos,6);return t?(n||new Iv.OperatorSetId).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}opsetImportLength(){let e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__vector_len(this.bb_pos+e):0}producerName(e){let n=this.bb.__offset(this.bb_pos,8);return n?this.bb.__string(this.bb_pos+n,e):null}producerVersion(e){let n=this.bb.__offset(this.bb_pos,10);return n?this.bb.__string(this.bb_pos+n,e):null}domain(e){let n=this.bb.__offset(this.bb_pos,12);return n?this.bb.__string(this.bb_pos+n,e):null}modelVersion(){let e=this.bb.__offset(this.bb_pos,14);return e?this.bb.readInt64(this.bb_pos+e):BigInt("0")}docString(e){let n=this.bb.__offset(this.bb_pos,16);return n?this.bb.__string(this.bb_pos+n,e):null}graph(e){let n=this.bb.__offset(this.bb_pos,18);return n?(e||new vv.Graph).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}graphDocString(e){let n=this.bb.__offset(this.bb_pos,20);return n?this.bb.__string(this.bb_pos+n,e):null}metadataProps(e,n){let t=this.bb.__offset(this.bb_pos,22);return t?(n||new Sv.StringStringEntry).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+t)+e*4),this.bb):null}metadataPropsLength(){let e=this.bb.__offset(this.bb_pos,22);return e?this.bb.__vector_len(this.bb_pos+e):0}static startModel(e){e.startObject(10)}static addIrVersion(e,n){e.addFieldInt64(0,n,BigInt("0"))}static addOpsetImport(e,n){e.addFieldOffset(1,n,0)}static createOpsetImportVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startOpsetImportVector(e,n){e.startVector(4,n,4)}static addProducerName(e,n){e.addFieldOffset(2,n,0)}static addProducerVersion(e,n){e.addFieldOffset(3,n,0)}static addDomain(e,n){e.addFieldOffset(4,n,0)}static addModelVersion(e,n){e.addFieldInt64(5,n,BigInt("0"))}static addDocString(e,n){e.addFieldOffset(6,n,0)}static addGraph(e,n){e.addFieldOffset(7,n,0)}static addGraphDocString(e,n){e.addFieldOffset(8,n,0)}static addMetadataProps(e,n){e.addFieldOffset(9,n,0)}static createMetadataPropsVector(e,n){e.startVector(4,n.length,4);for(let t=n.length-1;t>=0;t--)e.addOffset(n[t]);return e.endVector()}static startMetadataPropsVector(e,n){e.startVector(4,n,4)}static endModel(e){return e.endObject()}};sn.Model=Cs});var Gc=G(un=>{"use strict";var $v=un&&un.__createBinding||(Object.create?function(r,e,n,t){t===void 0&&(t=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,o)}:function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]}),Av=un&&un.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Pv=un&&un.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var n in r)n!=="default"&&Object.prototype.hasOwnProperty.call(r,n)&&$v(e,r,n);return Av(e,r),e};Object.defineProperty(un,"__esModule",{value:!0});un.InferenceSession=void 0;var Ov=Pv(_e()),Ev=$s(),Cv=Ds(),ks=class r{constructor(){this.bb=null,this.bb_pos=0}__init(e,n){return this.bb_pos=e,this.bb=n,this}static getRootAsInferenceSession(e,n){return(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsInferenceSession(e,n){return e.setPosition(e.position()+Ov.SIZE_PREFIX_LENGTH),(n||new r).__init(e.readInt32(e.position())+e.position(),e)}static bufferHasIdentifier(e){return e.__has_identifier("ORTM")}ortVersion(e){let n=this.bb.__offset(this.bb_pos,4);return n?this.bb.__string(this.bb_pos+n,e):null}model(e){let n=this.bb.__offset(this.bb_pos,6);return n?(e||new Cv.Model).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}kernelTypeStrResolver(e){let n=this.bb.__offset(this.bb_pos,10);return n?(e||new Ev.KernelTypeStrResolver).__init(this.bb.__indirect(this.bb_pos+n),this.bb):null}static startInferenceSession(e){e.startObject(4)}static addOrtVersion(e,n){e.addFieldOffset(0,n,0)}static addModel(e,n){e.addFieldOffset(1,n,0)}static addKernelTypeStrResolver(e,n){e.addFieldOffset(3,n,0)}static endInferenceSession(e){return e.endObject()}static finishInferenceSessionBuffer(e,n){e.finish(n,"ORTM")}static finishSizePrefixedInferenceSessionBuffer(e,n){e.finish(n,"ORTM",!0)}};un.InferenceSession=ks});var Dv,kv,Do,ht,Lv,Rv,Nv,zv,Mv,Bv,Vv,Fv,Ls,Rs,Gv,Uv,Wv,Hv,Ns,qv,jv,Kv,Xv,Zv,Jv,Qv,Yv,e0,t0,n0,r0,o0,zr,zs,i0,Ms,a0,Uc=$(()=>{"use strict";Dv=se(wa()),kv=se(Pa()),Do=se(ka()),ht=se(Oa()),Lv=se(ms()),Rv=se(Fc()),Nv=se(_s()),zv=se(ys()),Mv=se(rs()),Bv=se(ts()),Vv=se(Ya()),Fv=se(Ra()),Ls=se(Co()),Rs=se(Gc()),Gv=se(Ts()),Uv=se($s()),Wv=se(Za()),Hv=se(Ds()),Ns=se(Da()),qv=se(za()),jv=se(Ea()),Kv=se(Ba()),Xv=se(Is()),Zv=se(Ps()),Jv=se(Fa()),Qv=se(Ua()),Yv=se(Ha()),e0=se(Qa()),t0=se(is()),n0=se(Ka()),r0=se(Es()),o0=se(Rr()),zr=se(Lr()),zs=se(ss()),i0=se(Nr()),Ms=se(us()),a0=se(ds())});var Mr=$(()=>{"use strict";Uc()});var Hc=G((zO,Wc)=>{"use strict";Wc.exports=s0;function s0(r,e){for(var n=new Array(arguments.length-1),t=0,o=2,i=!0;o{"use strict";var Lo=Kc;Lo.length=function(e){var n=e.length;if(!n)return 0;for(var t=0;--n%4>1&&e.charAt(n)==="=";)++t;return Math.ceil(e.length*3)/4-t};var mr=new Array(64),jc=new Array(123);for(Tt=0;Tt<64;)jc[mr[Tt]=Tt<26?Tt+65:Tt<52?Tt+71:Tt<62?Tt-4:Tt-59|43]=Tt++;var Tt;Lo.encode=function(e,n,t){for(var o=null,i=[],a=0,s=0,u;n>2],u=(l&3)<<4,s=1;break;case 1:i[a++]=mr[u|l>>4],u=(l&15)<<2,s=2;break;case 2:i[a++]=mr[u|l>>6],i[a++]=mr[l&63],s=0;break}a>8191&&((o||(o=[])).push(String.fromCharCode.apply(String,i)),a=0)}return s&&(i[a++]=mr[u],i[a++]=61,s===1&&(i[a++]=61)),o?(a&&o.push(String.fromCharCode.apply(String,i.slice(0,a))),o.join("")):String.fromCharCode.apply(String,i.slice(0,a))};var qc="invalid encoding";Lo.decode=function(e,n,t){for(var o=t,i=0,a,s=0;s1)break;if((u=jc[u])===void 0)throw Error(qc);switch(i){case 0:a=u,i=1;break;case 1:n[t++]=a<<2|(u&48)>>4,a=u,i=2;break;case 2:n[t++]=(a&15)<<4|(u&60)>>2,a=u,i=3;break;case 3:n[t++]=(a&3)<<6|u,i=0;break}}if(i===1)throw Error(qc);return t-o};Lo.test=function(e){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e)}});var Jc=G((BO,Zc)=>{"use strict";Zc.exports=Ro;function Ro(){this._listeners={}}Ro.prototype.on=function(e,n,t){return(this._listeners[e]||(this._listeners[e]=[])).push({fn:n,ctx:t||this}),this};Ro.prototype.off=function(e,n){if(e===void 0)this._listeners={};else if(n===void 0)this._listeners[e]=[];else for(var t=this._listeners[e],o=0;o{"use strict";rd.exports=Qc(Qc);function Qc(r){return typeof Float32Array<"u"?function(){var e=new Float32Array([-0]),n=new Uint8Array(e.buffer),t=n[3]===128;function o(u,l,c){e[0]=u,l[c]=n[0],l[c+1]=n[1],l[c+2]=n[2],l[c+3]=n[3]}function i(u,l,c){e[0]=u,l[c]=n[3],l[c+1]=n[2],l[c+2]=n[1],l[c+3]=n[0]}r.writeFloatLE=t?o:i,r.writeFloatBE=t?i:o;function a(u,l){return n[0]=u[l],n[1]=u[l+1],n[2]=u[l+2],n[3]=u[l+3],e[0]}function s(u,l){return n[3]=u[l],n[2]=u[l+1],n[1]=u[l+2],n[0]=u[l+3],e[0]}r.readFloatLE=t?a:s,r.readFloatBE=t?s:a}():function(){function e(t,o,i,a){var s=o<0?1:0;if(s&&(o=-o),o===0)t(1/o>0?0:2147483648,i,a);else if(isNaN(o))t(2143289344,i,a);else if(o>34028234663852886e22)t((s<<31|2139095040)>>>0,i,a);else if(o<11754943508222875e-54)t((s<<31|Math.round(o/1401298464324817e-60))>>>0,i,a);else{var u=Math.floor(Math.log(o)/Math.LN2),l=Math.round(o*Math.pow(2,-u)*8388608)&8388607;t((s<<31|u+127<<23|l)>>>0,i,a)}}r.writeFloatLE=e.bind(null,Yc),r.writeFloatBE=e.bind(null,ed);function n(t,o,i){var a=t(o,i),s=(a>>31)*2+1,u=a>>>23&255,l=a&8388607;return u===255?l?NaN:s*(1/0):u===0?s*1401298464324817e-60*l:s*Math.pow(2,u-150)*(l+8388608)}r.readFloatLE=n.bind(null,td),r.readFloatBE=n.bind(null,nd)}(),typeof Float64Array<"u"?function(){var e=new Float64Array([-0]),n=new Uint8Array(e.buffer),t=n[7]===128;function o(u,l,c){e[0]=u,l[c]=n[0],l[c+1]=n[1],l[c+2]=n[2],l[c+3]=n[3],l[c+4]=n[4],l[c+5]=n[5],l[c+6]=n[6],l[c+7]=n[7]}function i(u,l,c){e[0]=u,l[c]=n[7],l[c+1]=n[6],l[c+2]=n[5],l[c+3]=n[4],l[c+4]=n[3],l[c+5]=n[2],l[c+6]=n[1],l[c+7]=n[0]}r.writeDoubleLE=t?o:i,r.writeDoubleBE=t?i:o;function a(u,l){return n[0]=u[l],n[1]=u[l+1],n[2]=u[l+2],n[3]=u[l+3],n[4]=u[l+4],n[5]=u[l+5],n[6]=u[l+6],n[7]=u[l+7],e[0]}function s(u,l){return n[7]=u[l],n[6]=u[l+1],n[5]=u[l+2],n[4]=u[l+3],n[3]=u[l+4],n[2]=u[l+5],n[1]=u[l+6],n[0]=u[l+7],e[0]}r.readDoubleLE=t?a:s,r.readDoubleBE=t?s:a}():function(){function e(t,o,i,a,s,u){var l=a<0?1:0;if(l&&(a=-a),a===0)t(0,s,u+o),t(1/a>0?0:2147483648,s,u+i);else if(isNaN(a))t(0,s,u+o),t(2146959360,s,u+i);else if(a>17976931348623157e292)t(0,s,u+o),t((l<<31|2146435072)>>>0,s,u+i);else{var c;if(a<22250738585072014e-324)c=a/5e-324,t(c>>>0,s,u+o),t((l<<31|c/4294967296)>>>0,s,u+i);else{var d=Math.floor(Math.log(a)/Math.LN2);d===1024&&(d=1023),c=a*Math.pow(2,-d),t(c*4503599627370496>>>0,s,u+o),t((l<<31|d+1023<<20|c*1048576&1048575)>>>0,s,u+i)}}}r.writeDoubleLE=e.bind(null,Yc,0,4),r.writeDoubleBE=e.bind(null,ed,4,0);function n(t,o,i,a,s){var u=t(a,s+o),l=t(a,s+i),c=(l>>31)*2+1,d=l>>>20&2047,p=4294967296*(l&1048575)+u;return d===2047?p?NaN:c*(1/0):d===0?c*5e-324*p:c*Math.pow(2,d-1075)*(p+4503599627370496)}r.readDoubleLE=n.bind(null,td,0,4),r.readDoubleBE=n.bind(null,nd,4,0)}(),r}function Yc(r,e,n){e[n]=r&255,e[n+1]=r>>>8&255,e[n+2]=r>>>16&255,e[n+3]=r>>>24}function ed(r,e,n){e[n]=r>>>24,e[n+1]=r>>>16&255,e[n+2]=r>>>8&255,e[n+3]=r&255}function td(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0}function nd(r,e){return(r[e]<<24|r[e+1]<<16|r[e+2]<<8|r[e+3])>>>0}});var id=G((exports,module)=>{"use strict";module.exports=inquire;function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(r){}return null}});var sd=G(ad=>{"use strict";var Bs=ad;Bs.length=function(e){for(var n=0,t=0,o=0;o191&&u<224?a[s++]=(u&31)<<6|e[n++]&63:u>239&&u<365?(u=((u&7)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)-65536,a[s++]=55296+(u>>10),a[s++]=56320+(u&1023)):a[s++]=(u&15)<<12|(e[n++]&63)<<6|e[n++]&63,s>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,a)),s=0);return i?(s&&i.push(String.fromCharCode.apply(String,a.slice(0,s))),i.join("")):String.fromCharCode.apply(String,a.slice(0,s))};Bs.write=function(e,n,t){for(var o=t,i,a,s=0;s>6|192,n[t++]=i&63|128):(i&64512)===55296&&((a=e.charCodeAt(s+1))&64512)===56320?(i=65536+((i&1023)<<10)+(a&1023),++s,n[t++]=i>>18|240,n[t++]=i>>12&63|128,n[t++]=i>>6&63|128,n[t++]=i&63|128):(n[t++]=i>>12|224,n[t++]=i>>6&63|128,n[t++]=i&63|128);return t-o}});var ld=G((GO,ud)=>{"use strict";ud.exports=u0;function u0(r,e,n){var t=n||8192,o=t>>>1,i=null,a=t;return function(u){if(u<1||u>o)return r(u);a+u>t&&(i=r(t),a=0);var l=e.call(i,a,a+=u);return a&7&&(a=(a|7)+1),l}}});var dd=G((UO,cd)=>{"use strict";cd.exports=Ue;var Br=Ln();function Ue(r,e){this.lo=r>>>0,this.hi=e>>>0}var Xn=Ue.zero=new Ue(0,0);Xn.toNumber=function(){return 0};Xn.zzEncode=Xn.zzDecode=function(){return this};Xn.length=function(){return 1};var l0=Ue.zeroHash="\0\0\0\0\0\0\0\0";Ue.fromNumber=function(e){if(e===0)return Xn;var n=e<0;n&&(e=-e);var t=e>>>0,o=(e-t)/4294967296>>>0;return n&&(o=~o>>>0,t=~t>>>0,++t>4294967295&&(t=0,++o>4294967295&&(o=0))),new Ue(t,o)};Ue.from=function(e){if(typeof e=="number")return Ue.fromNumber(e);if(Br.isString(e))if(Br.Long)e=Br.Long.fromString(e);else return Ue.fromNumber(parseInt(e,10));return e.low||e.high?new Ue(e.low>>>0,e.high>>>0):Xn};Ue.prototype.toNumber=function(e){if(!e&&this.hi>>>31){var n=~this.lo+1>>>0,t=~this.hi>>>0;return n||(t=t+1>>>0),-(n+t*4294967296)}return this.lo+this.hi*4294967296};Ue.prototype.toLong=function(e){return Br.Long?new Br.Long(this.lo|0,this.hi|0,!!e):{low:this.lo|0,high:this.hi|0,unsigned:!!e}};var kn=String.prototype.charCodeAt;Ue.fromHash=function(e){return e===l0?Xn:new Ue((kn.call(e,0)|kn.call(e,1)<<8|kn.call(e,2)<<16|kn.call(e,3)<<24)>>>0,(kn.call(e,4)|kn.call(e,5)<<8|kn.call(e,6)<<16|kn.call(e,7)<<24)>>>0)};Ue.prototype.toHash=function(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)};Ue.prototype.zzEncode=function(){var e=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^e)>>>0,this.lo=(this.lo<<1^e)>>>0,this};Ue.prototype.zzDecode=function(){var e=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^e)>>>0,this.hi=(this.hi>>>1^e)>>>0,this};Ue.prototype.length=function(){var e=this.lo,n=(this.lo>>>28|this.hi<<4)>>>0,t=this.hi>>>24;return t===0?n===0?e<16384?e<128?1:2:e<2097152?3:4:n<16384?n<128?5:6:n<2097152?7:8:t<128?9:10}});var Ln=G(Vs=>{"use strict";var H=Vs;H.asPromise=Hc();H.base64=Xc();H.EventEmitter=Jc();H.float=od();H.inquire=id();H.utf8=sd();H.pool=ld();H.LongBits=dd();H.isNode=!!(typeof global<"u"&&global&&global.process&&global.process.versions&&global.process.versions.node);H.global=H.isNode&&global||typeof window<"u"&&window||typeof self<"u"&&self||Vs;H.emptyArray=Object.freeze?Object.freeze([]):[];H.emptyObject=Object.freeze?Object.freeze({}):{};H.isInteger=Number.isInteger||function(e){return typeof e=="number"&&isFinite(e)&&Math.floor(e)===e};H.isString=function(e){return typeof e=="string"||e instanceof String};H.isObject=function(e){return e&&typeof e=="object"};H.isset=H.isSet=function(e,n){var t=e[n];return t!=null&&e.hasOwnProperty(n)?typeof t!="object"||(Array.isArray(t)?t.length:Object.keys(t).length)>0:!1};H.Buffer=function(){try{var r=H.inquire("buffer").Buffer;return r.prototype.utf8Write?r:null}catch{return null}}();H._Buffer_from=null;H._Buffer_allocUnsafe=null;H.newBuffer=function(e){return typeof e=="number"?H.Buffer?H._Buffer_allocUnsafe(e):new H.Array(e):H.Buffer?H._Buffer_from(e):typeof Uint8Array>"u"?e:new Uint8Array(e)};H.Array=typeof Uint8Array<"u"?Uint8Array:Array;H.Long=H.global.dcodeIO&&H.global.dcodeIO.Long||H.global.Long||H.inquire("long");H.key2Re=/^true|false|0|1$/;H.key32Re=/^-?(?:0|[1-9][0-9]*)$/;H.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;H.longToHash=function(e){return e?H.LongBits.from(e).toHash():H.LongBits.zeroHash};H.longFromHash=function(e,n){var t=H.LongBits.fromHash(e);return H.Long?H.Long.fromBits(t.lo,t.hi,n):t.toNumber(!!n)};function pd(r,e,n){for(var t=Object.keys(e),o=0;o-1;--i)if(n[o[i]]===1&&this[o[i]]!==void 0&&this[o[i]]!==null)return o[i]}};H.oneOfSetter=function(e){return function(n){for(var t=0;t{"use strict";bd.exports=me;var mt=Ln(),Fs,No=mt.LongBits,hd=mt.base64,md=mt.utf8;function Vr(r,e,n){this.fn=r,this.len=e,this.next=void 0,this.val=n}function Us(){}function c0(r){this.head=r.head,this.tail=r.tail,this.len=r.len,this.next=r.states}function me(){this.len=0,this.head=new Vr(Us,0,0),this.tail=this.head,this.states=null}var gd=function(){return mt.Buffer?function(){return(me.create=function(){return new Fs})()}:function(){return new me}};me.create=gd();me.alloc=function(e){return new mt.Array(e)};mt.Array!==Array&&(me.alloc=mt.pool(me.alloc,mt.Array.prototype.subarray));me.prototype._push=function(e,n,t){return this.tail=this.tail.next=new Vr(e,n,t),this.len+=n,this};function Ws(r,e,n){e[n]=r&255}function d0(r,e,n){for(;r>127;)e[n++]=r&127|128,r>>>=7;e[n]=r}function Hs(r,e){this.len=r,this.next=void 0,this.val=e}Hs.prototype=Object.create(Vr.prototype);Hs.prototype.fn=d0;me.prototype.uint32=function(e){return this.len+=(this.tail=this.tail.next=new Hs((e=e>>>0)<128?1:e<16384?2:e<2097152?3:e<268435456?4:5,e)).len,this};me.prototype.int32=function(e){return e<0?this._push(qs,10,No.fromNumber(e)):this.uint32(e)};me.prototype.sint32=function(e){return this.uint32((e<<1^e>>31)>>>0)};function qs(r,e,n){for(;r.hi;)e[n++]=r.lo&127|128,r.lo=(r.lo>>>7|r.hi<<25)>>>0,r.hi>>>=7;for(;r.lo>127;)e[n++]=r.lo&127|128,r.lo=r.lo>>>7;e[n++]=r.lo}me.prototype.uint64=function(e){var n=No.from(e);return this._push(qs,n.length(),n)};me.prototype.int64=me.prototype.uint64;me.prototype.sint64=function(e){var n=No.from(e).zzEncode();return this._push(qs,n.length(),n)};me.prototype.bool=function(e){return this._push(Ws,1,e?1:0)};function Gs(r,e,n){e[n]=r&255,e[n+1]=r>>>8&255,e[n+2]=r>>>16&255,e[n+3]=r>>>24}me.prototype.fixed32=function(e){return this._push(Gs,4,e>>>0)};me.prototype.sfixed32=me.prototype.fixed32;me.prototype.fixed64=function(e){var n=No.from(e);return this._push(Gs,4,n.lo)._push(Gs,4,n.hi)};me.prototype.sfixed64=me.prototype.fixed64;me.prototype.float=function(e){return this._push(mt.float.writeFloatLE,4,e)};me.prototype.double=function(e){return this._push(mt.float.writeDoubleLE,8,e)};var p0=mt.Array.prototype.set?function(e,n,t){n.set(e,t)}:function(e,n,t){for(var o=0;o>>0;if(!n)return this._push(Ws,1,0);if(mt.isString(e)){var t=me.alloc(n=hd.length(e));hd.decode(e,t,0),e=t}return this.uint32(n)._push(p0,n,e)};me.prototype.string=function(e){var n=md.length(e);return n?this.uint32(n)._push(md.write,n,e):this._push(Ws,1,0)};me.prototype.fork=function(){return this.states=new c0(this),this.head=this.tail=new Vr(Us,0,0),this.len=0,this};me.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Vr(Us,0,0),this.len=0),this};me.prototype.ldelim=function(){var e=this.head,n=this.tail,t=this.len;return this.reset().uint32(t),t&&(this.tail.next=e.next,this.tail=n,this.len+=t),this};me.prototype.finish=function(){for(var e=this.head.next,n=this.constructor.alloc(this.len),t=0;e;)e.fn(e.val,n,t),t+=e.len,e=e.next;return n};me._configure=function(r){Fs=r,me.create=gd(),Fs._configure()}});var xd=G((qO,_d)=>{"use strict";_d.exports=ln;var yd=js();(ln.prototype=Object.create(yd.prototype)).constructor=ln;var Rn=Ln();function ln(){yd.call(this)}ln._configure=function(){ln.alloc=Rn._Buffer_allocUnsafe,ln.writeBytesBuffer=Rn.Buffer&&Rn.Buffer.prototype instanceof Uint8Array&&Rn.Buffer.prototype.set.name==="set"?function(e,n,t){n.set(e,t)}:function(e,n,t){if(e.copy)e.copy(n,t,0,e.length);else for(var o=0;o>>0;return this.uint32(n),n&&this._push(ln.writeBytesBuffer,n,e),this};function f0(r,e,n){r.length<40?Rn.utf8.write(r,e,n):e.utf8Write?e.utf8Write(r,n):e.write(r,n)}ln.prototype.string=function(e){var n=Rn.Buffer.byteLength(e);return this.uint32(n),n&&this._push(f0,n,e),this};ln._configure()});var Zs=G((jO,Sd)=>{"use strict";Sd.exports=ke;var vt=Ln(),Xs,vd=vt.LongBits,h0=vt.utf8;function It(r,e){return RangeError("index out of range: "+r.pos+" + "+(e||1)+" > "+r.len)}function ke(r){this.buf=r,this.pos=0,this.len=r.length}var wd=typeof Uint8Array<"u"?function(e){if(e instanceof Uint8Array||Array.isArray(e))return new ke(e);throw Error("illegal buffer")}:function(e){if(Array.isArray(e))return new ke(e);throw Error("illegal buffer")},Id=function(){return vt.Buffer?function(n){return(ke.create=function(o){return vt.Buffer.isBuffer(o)?new Xs(o):wd(o)})(n)}:wd};ke.create=Id();ke.prototype._slice=vt.Array.prototype.subarray||vt.Array.prototype.slice;ke.prototype.uint32=function(){var e=4294967295;return function(){if(e=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(e=(e|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return e;if((this.pos+=5)>this.len)throw this.pos=this.len,It(this,10);return e}}();ke.prototype.int32=function(){return this.uint32()|0};ke.prototype.sint32=function(){var e=this.uint32();return e>>>1^-(e&1)|0};function Ks(){var r=new vd(0,0),e=0;if(this.len-this.pos>4){for(;e<4;++e)if(r.lo=(r.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r;if(r.lo=(r.lo|(this.buf[this.pos]&127)<<28)>>>0,r.hi=(r.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return r;e=0}else{for(;e<3;++e){if(this.pos>=this.len)throw It(this);if(r.lo=(r.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}return r.lo=(r.lo|(this.buf[this.pos++]&127)<>>0,r}if(this.len-this.pos>4){for(;e<5;++e)if(r.hi=(r.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}else for(;e<5;++e){if(this.pos>=this.len)throw It(this);if(r.hi=(r.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}throw Error("invalid varint encoding")}ke.prototype.bool=function(){return this.uint32()!==0};function zo(r,e){return(r[e-4]|r[e-3]<<8|r[e-2]<<16|r[e-1]<<24)>>>0}ke.prototype.fixed32=function(){if(this.pos+4>this.len)throw It(this,4);return zo(this.buf,this.pos+=4)};ke.prototype.sfixed32=function(){if(this.pos+4>this.len)throw It(this,4);return zo(this.buf,this.pos+=4)|0};function Td(){if(this.pos+8>this.len)throw It(this,8);return new vd(zo(this.buf,this.pos+=4),zo(this.buf,this.pos+=4))}ke.prototype.float=function(){if(this.pos+4>this.len)throw It(this,4);var e=vt.float.readFloatLE(this.buf,this.pos);return this.pos+=4,e};ke.prototype.double=function(){if(this.pos+8>this.len)throw It(this,4);var e=vt.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,e};ke.prototype.bytes=function(){var e=this.uint32(),n=this.pos,t=this.pos+e;if(t>this.len)throw It(this,e);if(this.pos+=e,Array.isArray(this.buf))return this.buf.slice(n,t);if(n===t){var o=vt.Buffer;return o?o.alloc(0):new this.buf.constructor(0)}return this._slice.call(this.buf,n,t)};ke.prototype.string=function(){var e=this.bytes();return h0.read(e,0,e.length)};ke.prototype.skip=function(e){if(typeof e=="number"){if(this.pos+e>this.len)throw It(this,e);this.pos+=e}else do if(this.pos>=this.len)throw It(this);while(this.buf[this.pos++]&128);return this};ke.prototype.skipType=function(r){switch(r){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;(r=this.uint32()&7)!==4;)this.skipType(r);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+r+" at offset "+this.pos)}return this};ke._configure=function(r){Xs=r,ke.create=Id(),Xs._configure();var e=vt.Long?"toLong":"toNumber";vt.merge(ke.prototype,{int64:function(){return Ks.call(this)[e](!1)},uint64:function(){return Ks.call(this)[e](!0)},sint64:function(){return Ks.call(this).zzDecode()[e](!1)},fixed64:function(){return Td.call(this)[e](!0)},sfixed64:function(){return Td.call(this)[e](!1)}})}});var Od=G((KO,Pd)=>{"use strict";Pd.exports=Zn;var Ad=Zs();(Zn.prototype=Object.create(Ad.prototype)).constructor=Zn;var $d=Ln();function Zn(r){Ad.call(this,r)}Zn._configure=function(){$d.Buffer&&(Zn.prototype._slice=$d.Buffer.prototype.slice)};Zn.prototype.string=function(){var e=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+e,this.len)):this.buf.toString("utf-8",this.pos,this.pos=Math.min(this.pos+e,this.len))};Zn._configure()});var Cd=G((XO,Ed)=>{"use strict";Ed.exports=Fr;var Js=Ln();(Fr.prototype=Object.create(Js.EventEmitter.prototype)).constructor=Fr;function Fr(r,e,n){if(typeof r!="function")throw TypeError("rpcImpl must be a function");Js.EventEmitter.call(this),this.rpcImpl=r,this.requestDelimited=!!e,this.responseDelimited=!!n}Fr.prototype.rpcCall=function r(e,n,t,o,i){if(!o)throw TypeError("request must be specified");var a=this;if(!i)return Js.asPromise(r,a,e,n,t,o);if(!a.rpcImpl){setTimeout(function(){i(Error("already ended"))},0);return}try{return a.rpcImpl(e,n[a.requestDelimited?"encodeDelimited":"encode"](o).finish(),function(u,l){if(u)return a.emit("error",u,e),i(u);if(l===null){a.end(!0);return}if(!(l instanceof t))try{l=t[a.responseDelimited?"decodeDelimited":"decode"](l)}catch(c){return a.emit("error",c,e),i(c)}return a.emit("data",l,e),i(null,l)})}catch(s){a.emit("error",s,e),setTimeout(function(){i(s)},0);return}};Fr.prototype.end=function(e){return this.rpcImpl&&(e||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}});var kd=G(Dd=>{"use strict";var m0=Dd;m0.Service=Cd()});var Rd=G((JO,Ld)=>{"use strict";Ld.exports={}});var Md=G(zd=>{"use strict";var rt=zd;rt.build="minimal";rt.Writer=js();rt.BufferWriter=xd();rt.Reader=Zs();rt.BufferReader=Od();rt.util=Ln();rt.rpc=kd();rt.roots=Rd();rt.configure=Nd;function Nd(){rt.util._configure(),rt.Writer._configure(rt.BufferWriter),rt.Reader._configure(rt.BufferReader)}Nd()});var Vd=G((YO,Bd)=>{"use strict";Bd.exports=Md()});var gr=G((eE,Fd)=>{"use strict";var $e=Vd(),N=$e.Reader,Le=$e.Writer,T=$e.util,_=$e.roots.default||($e.roots.default={});_.onnx=function(){var r={};return r.Version=function(){var e={},n=Object.create(e);return n[e[0]="_START_VERSION"]=0,n[e[1]="IR_VERSION_2017_10_10"]=1,n[e[2]="IR_VERSION_2017_10_30"]=2,n[e[3]="IR_VERSION_2017_11_3"]=3,n[e[4]="IR_VERSION_2019_1_22"]=4,n[e[5]="IR_VERSION_2019_3_18"]=5,n[e[6]="IR_VERSION_2019_9_19"]=6,n[e[7]="IR_VERSION_2020_5_8"]=7,n[e[8]="IR_VERSION_2021_7_30"]=8,n[e[9]="IR_VERSION"]=9,n}(),r.AttributeProto=function(){function e(n){if(this.floats=[],this.ints=[],this.strings=[],this.tensors=[],this.graphs=[],this.sparseTensors=[],this.typeProtos=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{a.name=t.string();break}case 21:{a.refAttrName=t.string();break}case 13:{a.docString=t.string();break}case 20:{a.type=t.int32();break}case 2:{a.f=t.float();break}case 3:{a.i=t.int64();break}case 4:{a.s=t.bytes();break}case 5:{a.t=_.onnx.TensorProto.decode(t,t.uint32());break}case 6:{a.g=_.onnx.GraphProto.decode(t,t.uint32());break}case 22:{a.sparseTensor=_.onnx.SparseTensorProto.decode(t,t.uint32());break}case 14:{a.tp=_.onnx.TypeProto.decode(t,t.uint32());break}case 7:{if(a.floats&&a.floats.length||(a.floats=[]),(s&7)===2)for(var u=t.uint32()+t.pos;t.pos>>0,t.i.high>>>0).toNumber())),t.s!=null&&(typeof t.s=="string"?T.base64.decode(t.s,o.s=T.newBuffer(T.base64.length(t.s)),0):t.s.length>=0&&(o.s=t.s)),t.t!=null){if(typeof t.t!="object")throw TypeError(".onnx.AttributeProto.t: object expected");o.t=_.onnx.TensorProto.fromObject(t.t)}if(t.g!=null){if(typeof t.g!="object")throw TypeError(".onnx.AttributeProto.g: object expected");o.g=_.onnx.GraphProto.fromObject(t.g)}if(t.sparseTensor!=null){if(typeof t.sparseTensor!="object")throw TypeError(".onnx.AttributeProto.sparseTensor: object expected");o.sparseTensor=_.onnx.SparseTensorProto.fromObject(t.sparseTensor)}if(t.tp!=null){if(typeof t.tp!="object")throw TypeError(".onnx.AttributeProto.tp: object expected");o.tp=_.onnx.TypeProto.fromObject(t.tp)}if(t.floats){if(!Array.isArray(t.floats))throw TypeError(".onnx.AttributeProto.floats: array expected");o.floats=[];for(var i=0;i>>0,t.ints[i].high>>>0).toNumber())}if(t.strings){if(!Array.isArray(t.strings))throw TypeError(".onnx.AttributeProto.strings: array expected");o.strings=[];for(var i=0;i=0&&(o.strings[i]=t.strings[i])}if(t.tensors){if(!Array.isArray(t.tensors))throw TypeError(".onnx.AttributeProto.tensors: array expected");o.tensors=[];for(var i=0;i>>0,t.i.high>>>0).toNumber():t.i),t.s!=null&&t.hasOwnProperty("s")&&(i.s=o.bytes===String?T.base64.encode(t.s,0,t.s.length):o.bytes===Array?Array.prototype.slice.call(t.s):t.s),t.t!=null&&t.hasOwnProperty("t")&&(i.t=_.onnx.TensorProto.toObject(t.t,o)),t.g!=null&&t.hasOwnProperty("g")&&(i.g=_.onnx.GraphProto.toObject(t.g,o)),t.floats&&t.floats.length){i.floats=[];for(var s=0;s>>0,t.ints[s].high>>>0).toNumber():t.ints[s]}if(t.strings&&t.strings.length){i.strings=[];for(var s=0;s>>3){case 1:{a.name=t.string();break}case 2:{a.type=_.onnx.TypeProto.decode(t,t.uint32());break}case 3:{a.docString=t.string();break}default:t.skipType(s&7);break}}return a},e.decodeDelimited=function(t){return t instanceof N||(t=new N(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.name!=null&&t.hasOwnProperty("name")&&!T.isString(t.name))return"name: string expected";if(t.type!=null&&t.hasOwnProperty("type")){var o=_.onnx.TypeProto.verify(t.type);if(o)return"type."+o}return t.docString!=null&&t.hasOwnProperty("docString")&&!T.isString(t.docString)?"docString: string expected":null},e.fromObject=function(t){if(t instanceof _.onnx.ValueInfoProto)return t;var o=new _.onnx.ValueInfoProto;if(t.name!=null&&(o.name=String(t.name)),t.type!=null){if(typeof t.type!="object")throw TypeError(".onnx.ValueInfoProto.type: object expected");o.type=_.onnx.TypeProto.fromObject(t.type)}return t.docString!=null&&(o.docString=String(t.docString)),o},e.toObject=function(t,o){o||(o={});var i={};return o.defaults&&(i.name="",i.type=null,i.docString=""),t.name!=null&&t.hasOwnProperty("name")&&(i.name=t.name),t.type!=null&&t.hasOwnProperty("type")&&(i.type=_.onnx.TypeProto.toObject(t.type,o)),t.docString!=null&&t.hasOwnProperty("docString")&&(i.docString=t.docString),i},e.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.ValueInfoProto"},e}(),r.NodeProto=function(){function e(n){if(this.input=[],this.output=[],this.attribute=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{a.input&&a.input.length||(a.input=[]),a.input.push(t.string());break}case 2:{a.output&&a.output.length||(a.output=[]),a.output.push(t.string());break}case 3:{a.name=t.string();break}case 4:{a.opType=t.string();break}case 7:{a.domain=t.string();break}case 5:{a.attribute&&a.attribute.length||(a.attribute=[]),a.attribute.push(_.onnx.AttributeProto.decode(t,t.uint32()));break}case 6:{a.docString=t.string();break}default:t.skipType(s&7);break}}return a},e.decodeDelimited=function(t){return t instanceof N||(t=new N(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.input!=null&&t.hasOwnProperty("input")){if(!Array.isArray(t.input))return"input: array expected";for(var o=0;o>>3){case 1:{a.initialization=_.onnx.GraphProto.decode(t,t.uint32());break}case 2:{a.algorithm=_.onnx.GraphProto.decode(t,t.uint32());break}case 3:{a.initializationBinding&&a.initializationBinding.length||(a.initializationBinding=[]),a.initializationBinding.push(_.onnx.StringStringEntryProto.decode(t,t.uint32()));break}case 4:{a.updateBinding&&a.updateBinding.length||(a.updateBinding=[]),a.updateBinding.push(_.onnx.StringStringEntryProto.decode(t,t.uint32()));break}default:t.skipType(s&7);break}}return a},e.decodeDelimited=function(t){return t instanceof N||(t=new N(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.initialization!=null&&t.hasOwnProperty("initialization")){var o=_.onnx.GraphProto.verify(t.initialization);if(o)return"initialization."+o}if(t.algorithm!=null&&t.hasOwnProperty("algorithm")){var o=_.onnx.GraphProto.verify(t.algorithm);if(o)return"algorithm."+o}if(t.initializationBinding!=null&&t.hasOwnProperty("initializationBinding")){if(!Array.isArray(t.initializationBinding))return"initializationBinding: array expected";for(var i=0;i>>3){case 1:{a.irVersion=t.int64();break}case 8:{a.opsetImport&&a.opsetImport.length||(a.opsetImport=[]),a.opsetImport.push(_.onnx.OperatorSetIdProto.decode(t,t.uint32()));break}case 2:{a.producerName=t.string();break}case 3:{a.producerVersion=t.string();break}case 4:{a.domain=t.string();break}case 5:{a.modelVersion=t.int64();break}case 6:{a.docString=t.string();break}case 7:{a.graph=_.onnx.GraphProto.decode(t,t.uint32());break}case 14:{a.metadataProps&&a.metadataProps.length||(a.metadataProps=[]),a.metadataProps.push(_.onnx.StringStringEntryProto.decode(t,t.uint32()));break}case 20:{a.trainingInfo&&a.trainingInfo.length||(a.trainingInfo=[]),a.trainingInfo.push(_.onnx.TrainingInfoProto.decode(t,t.uint32()));break}case 25:{a.functions&&a.functions.length||(a.functions=[]),a.functions.push(_.onnx.FunctionProto.decode(t,t.uint32()));break}default:t.skipType(s&7);break}}return a},e.decodeDelimited=function(t){return t instanceof N||(t=new N(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.irVersion!=null&&t.hasOwnProperty("irVersion")&&!T.isInteger(t.irVersion)&&!(t.irVersion&&T.isInteger(t.irVersion.low)&&T.isInteger(t.irVersion.high)))return"irVersion: integer|Long expected";if(t.opsetImport!=null&&t.hasOwnProperty("opsetImport")){if(!Array.isArray(t.opsetImport))return"opsetImport: array expected";for(var o=0;o>>0,t.irVersion.high>>>0).toNumber())),t.opsetImport){if(!Array.isArray(t.opsetImport))throw TypeError(".onnx.ModelProto.opsetImport: array expected");o.opsetImport=[];for(var i=0;i>>0,t.modelVersion.high>>>0).toNumber())),t.docString!=null&&(o.docString=String(t.docString)),t.graph!=null){if(typeof t.graph!="object")throw TypeError(".onnx.ModelProto.graph: object expected");o.graph=_.onnx.GraphProto.fromObject(t.graph)}if(t.metadataProps){if(!Array.isArray(t.metadataProps))throw TypeError(".onnx.ModelProto.metadataProps: array expected");o.metadataProps=[];for(var i=0;i>>0,t.irVersion.high>>>0).toNumber():t.irVersion),t.producerName!=null&&t.hasOwnProperty("producerName")&&(i.producerName=t.producerName),t.producerVersion!=null&&t.hasOwnProperty("producerVersion")&&(i.producerVersion=t.producerVersion),t.domain!=null&&t.hasOwnProperty("domain")&&(i.domain=t.domain),t.modelVersion!=null&&t.hasOwnProperty("modelVersion")&&(typeof t.modelVersion=="number"?i.modelVersion=o.longs===String?String(t.modelVersion):t.modelVersion:i.modelVersion=o.longs===String?T.Long.prototype.toString.call(t.modelVersion):o.longs===Number?new T.LongBits(t.modelVersion.low>>>0,t.modelVersion.high>>>0).toNumber():t.modelVersion),t.docString!=null&&t.hasOwnProperty("docString")&&(i.docString=t.docString),t.graph!=null&&t.hasOwnProperty("graph")&&(i.graph=_.onnx.GraphProto.toObject(t.graph,o)),t.opsetImport&&t.opsetImport.length){i.opsetImport=[];for(var s=0;s>>3){case 1:{a.key=t.string();break}case 2:{a.value=t.string();break}default:t.skipType(s&7);break}}return a},e.decodeDelimited=function(t){return t instanceof N||(t=new N(t)),this.decode(t,t.uint32())},e.verify=function(t){return typeof t!="object"||t===null?"object expected":t.key!=null&&t.hasOwnProperty("key")&&!T.isString(t.key)?"key: string expected":t.value!=null&&t.hasOwnProperty("value")&&!T.isString(t.value)?"value: string expected":null},e.fromObject=function(t){if(t instanceof _.onnx.StringStringEntryProto)return t;var o=new _.onnx.StringStringEntryProto;return t.key!=null&&(o.key=String(t.key)),t.value!=null&&(o.value=String(t.value)),o},e.toObject=function(t,o){o||(o={});var i={};return o.defaults&&(i.key="",i.value=""),t.key!=null&&t.hasOwnProperty("key")&&(i.key=t.key),t.value!=null&&t.hasOwnProperty("value")&&(i.value=t.value),i},e.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.StringStringEntryProto"},e}(),r.TensorAnnotation=function(){function e(n){if(this.quantParameterTensorNames=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{a.tensorName=t.string();break}case 2:{a.quantParameterTensorNames&&a.quantParameterTensorNames.length||(a.quantParameterTensorNames=[]),a.quantParameterTensorNames.push(_.onnx.StringStringEntryProto.decode(t,t.uint32()));break}default:t.skipType(s&7);break}}return a},e.decodeDelimited=function(t){return t instanceof N||(t=new N(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.tensorName!=null&&t.hasOwnProperty("tensorName")&&!T.isString(t.tensorName))return"tensorName: string expected";if(t.quantParameterTensorNames!=null&&t.hasOwnProperty("quantParameterTensorNames")){if(!Array.isArray(t.quantParameterTensorNames))return"quantParameterTensorNames: array expected";for(var o=0;o>>3){case 1:{a.node&&a.node.length||(a.node=[]),a.node.push(_.onnx.NodeProto.decode(t,t.uint32()));break}case 2:{a.name=t.string();break}case 5:{a.initializer&&a.initializer.length||(a.initializer=[]),a.initializer.push(_.onnx.TensorProto.decode(t,t.uint32()));break}case 15:{a.sparseInitializer&&a.sparseInitializer.length||(a.sparseInitializer=[]),a.sparseInitializer.push(_.onnx.SparseTensorProto.decode(t,t.uint32()));break}case 10:{a.docString=t.string();break}case 11:{a.input&&a.input.length||(a.input=[]),a.input.push(_.onnx.ValueInfoProto.decode(t,t.uint32()));break}case 12:{a.output&&a.output.length||(a.output=[]),a.output.push(_.onnx.ValueInfoProto.decode(t,t.uint32()));break}case 13:{a.valueInfo&&a.valueInfo.length||(a.valueInfo=[]),a.valueInfo.push(_.onnx.ValueInfoProto.decode(t,t.uint32()));break}case 14:{a.quantizationAnnotation&&a.quantizationAnnotation.length||(a.quantizationAnnotation=[]),a.quantizationAnnotation.push(_.onnx.TensorAnnotation.decode(t,t.uint32()));break}default:t.skipType(s&7);break}}return a},e.decodeDelimited=function(t){return t instanceof N||(t=new N(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.node!=null&&t.hasOwnProperty("node")){if(!Array.isArray(t.node))return"node: array expected";for(var o=0;o>>3){case 1:{if(a.dims&&a.dims.length||(a.dims=[]),(s&7)===2)for(var u=t.uint32()+t.pos;t.pos>>0,t.dims[i].high>>>0).toNumber())}if(t.dataType!=null&&(o.dataType=t.dataType|0),t.segment!=null){if(typeof t.segment!="object")throw TypeError(".onnx.TensorProto.segment: object expected");o.segment=_.onnx.TensorProto.Segment.fromObject(t.segment)}if(t.floatData){if(!Array.isArray(t.floatData))throw TypeError(".onnx.TensorProto.floatData: array expected");o.floatData=[];for(var i=0;i=0&&(o.stringData[i]=t.stringData[i])}if(t.int64Data){if(!Array.isArray(t.int64Data))throw TypeError(".onnx.TensorProto.int64Data: array expected");o.int64Data=[];for(var i=0;i>>0,t.int64Data[i].high>>>0).toNumber())}if(t.name!=null&&(o.name=String(t.name)),t.docString!=null&&(o.docString=String(t.docString)),t.rawData!=null&&(typeof t.rawData=="string"?T.base64.decode(t.rawData,o.rawData=T.newBuffer(T.base64.length(t.rawData)),0):t.rawData.length>=0&&(o.rawData=t.rawData)),t.externalData){if(!Array.isArray(t.externalData))throw TypeError(".onnx.TensorProto.externalData: array expected");o.externalData=[];for(var i=0;i>>0,t.uint64Data[i].high>>>0).toNumber(!0))}return o},e.toObject=function(t,o){o||(o={});var i={};if((o.arrays||o.defaults)&&(i.dims=[],i.floatData=[],i.int32Data=[],i.stringData=[],i.int64Data=[],i.doubleData=[],i.uint64Data=[],i.externalData=[]),o.defaults&&(i.dataType=0,i.segment=null,i.name="",o.bytes===String?i.rawData="":(i.rawData=[],o.bytes!==Array&&(i.rawData=T.newBuffer(i.rawData))),i.docString="",i.dataLocation=o.enums===String?"DEFAULT":0),t.dims&&t.dims.length){i.dims=[];for(var a=0;a>>0,t.dims[a].high>>>0).toNumber():t.dims[a]}if(t.dataType!=null&&t.hasOwnProperty("dataType")&&(i.dataType=t.dataType),t.segment!=null&&t.hasOwnProperty("segment")&&(i.segment=_.onnx.TensorProto.Segment.toObject(t.segment,o)),t.floatData&&t.floatData.length){i.floatData=[];for(var a=0;a>>0,t.int64Data[a].high>>>0).toNumber():t.int64Data[a]}if(t.name!=null&&t.hasOwnProperty("name")&&(i.name=t.name),t.rawData!=null&&t.hasOwnProperty("rawData")&&(i.rawData=o.bytes===String?T.base64.encode(t.rawData,0,t.rawData.length):o.bytes===Array?Array.prototype.slice.call(t.rawData):t.rawData),t.doubleData&&t.doubleData.length){i.doubleData=[];for(var a=0;a>>0,t.uint64Data[a].high>>>0).toNumber(!0):t.uint64Data[a]}if(t.docString!=null&&t.hasOwnProperty("docString")&&(i.docString=t.docString),t.externalData&&t.externalData.length){i.externalData=[];for(var a=0;a>>3){case 1:{s.begin=o.int64();break}case 2:{s.end=o.int64();break}default:o.skipType(u&7);break}}return s},n.decodeDelimited=function(o){return o instanceof N||(o=new N(o)),this.decode(o,o.uint32())},n.verify=function(o){return typeof o!="object"||o===null?"object expected":o.begin!=null&&o.hasOwnProperty("begin")&&!T.isInteger(o.begin)&&!(o.begin&&T.isInteger(o.begin.low)&&T.isInteger(o.begin.high))?"begin: integer|Long expected":o.end!=null&&o.hasOwnProperty("end")&&!T.isInteger(o.end)&&!(o.end&&T.isInteger(o.end.low)&&T.isInteger(o.end.high))?"end: integer|Long expected":null},n.fromObject=function(o){if(o instanceof _.onnx.TensorProto.Segment)return o;var i=new _.onnx.TensorProto.Segment;return o.begin!=null&&(T.Long?(i.begin=T.Long.fromValue(o.begin)).unsigned=!1:typeof o.begin=="string"?i.begin=parseInt(o.begin,10):typeof o.begin=="number"?i.begin=o.begin:typeof o.begin=="object"&&(i.begin=new T.LongBits(o.begin.low>>>0,o.begin.high>>>0).toNumber())),o.end!=null&&(T.Long?(i.end=T.Long.fromValue(o.end)).unsigned=!1:typeof o.end=="string"?i.end=parseInt(o.end,10):typeof o.end=="number"?i.end=o.end:typeof o.end=="object"&&(i.end=new T.LongBits(o.end.low>>>0,o.end.high>>>0).toNumber())),i},n.toObject=function(o,i){i||(i={});var a={};if(i.defaults){if(T.Long){var s=new T.Long(0,0,!1);a.begin=i.longs===String?s.toString():i.longs===Number?s.toNumber():s}else a.begin=i.longs===String?"0":0;if(T.Long){var s=new T.Long(0,0,!1);a.end=i.longs===String?s.toString():i.longs===Number?s.toNumber():s}else a.end=i.longs===String?"0":0}return o.begin!=null&&o.hasOwnProperty("begin")&&(typeof o.begin=="number"?a.begin=i.longs===String?String(o.begin):o.begin:a.begin=i.longs===String?T.Long.prototype.toString.call(o.begin):i.longs===Number?new T.LongBits(o.begin.low>>>0,o.begin.high>>>0).toNumber():o.begin),o.end!=null&&o.hasOwnProperty("end")&&(typeof o.end=="number"?a.end=i.longs===String?String(o.end):o.end:a.end=i.longs===String?T.Long.prototype.toString.call(o.end):i.longs===Number?new T.LongBits(o.end.low>>>0,o.end.high>>>0).toNumber():o.end),a},n.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},n.getTypeUrl=function(o){return o===void 0&&(o="type.googleapis.com"),o+"/onnx.TensorProto.Segment"},n}(),e.DataLocation=function(){var n={},t=Object.create(n);return t[n[0]="DEFAULT"]=0,t[n[1]="EXTERNAL"]=1,t}(),e}(),r.SparseTensorProto=function(){function e(n){if(this.dims=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{a.values=_.onnx.TensorProto.decode(t,t.uint32());break}case 2:{a.indices=_.onnx.TensorProto.decode(t,t.uint32());break}case 3:{if(a.dims&&a.dims.length||(a.dims=[]),(s&7)===2)for(var u=t.uint32()+t.pos;t.pos>>0,t.dims[i].high>>>0).toNumber())}return o},e.toObject=function(t,o){o||(o={});var i={};if((o.arrays||o.defaults)&&(i.dims=[]),o.defaults&&(i.values=null,i.indices=null),t.values!=null&&t.hasOwnProperty("values")&&(i.values=_.onnx.TensorProto.toObject(t.values,o)),t.indices!=null&&t.hasOwnProperty("indices")&&(i.indices=_.onnx.TensorProto.toObject(t.indices,o)),t.dims&&t.dims.length){i.dims=[];for(var a=0;a>>0,t.dims[a].high>>>0).toNumber():t.dims[a]}return i},e.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.SparseTensorProto"},e}(),r.TensorShapeProto=function(){function e(n){if(this.dim=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{a.dim&&a.dim.length||(a.dim=[]),a.dim.push(_.onnx.TensorShapeProto.Dimension.decode(t,t.uint32()));break}default:t.skipType(s&7);break}}return a},e.decodeDelimited=function(t){return t instanceof N||(t=new N(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.dim!=null&&t.hasOwnProperty("dim")){if(!Array.isArray(t.dim))return"dim: array expected";for(var o=0;o>>3){case 1:{u.dimValue=i.int64();break}case 2:{u.dimParam=i.string();break}case 3:{u.denotation=i.string();break}default:i.skipType(l&7);break}}return u},n.decodeDelimited=function(i){return i instanceof N||(i=new N(i)),this.decode(i,i.uint32())},n.verify=function(i){if(typeof i!="object"||i===null)return"object expected";var a={};if(i.dimValue!=null&&i.hasOwnProperty("dimValue")&&(a.value=1,!T.isInteger(i.dimValue)&&!(i.dimValue&&T.isInteger(i.dimValue.low)&&T.isInteger(i.dimValue.high))))return"dimValue: integer|Long expected";if(i.dimParam!=null&&i.hasOwnProperty("dimParam")){if(a.value===1)return"value: multiple values";if(a.value=1,!T.isString(i.dimParam))return"dimParam: string expected"}return i.denotation!=null&&i.hasOwnProperty("denotation")&&!T.isString(i.denotation)?"denotation: string expected":null},n.fromObject=function(i){if(i instanceof _.onnx.TensorShapeProto.Dimension)return i;var a=new _.onnx.TensorShapeProto.Dimension;return i.dimValue!=null&&(T.Long?(a.dimValue=T.Long.fromValue(i.dimValue)).unsigned=!1:typeof i.dimValue=="string"?a.dimValue=parseInt(i.dimValue,10):typeof i.dimValue=="number"?a.dimValue=i.dimValue:typeof i.dimValue=="object"&&(a.dimValue=new T.LongBits(i.dimValue.low>>>0,i.dimValue.high>>>0).toNumber())),i.dimParam!=null&&(a.dimParam=String(i.dimParam)),i.denotation!=null&&(a.denotation=String(i.denotation)),a},n.toObject=function(i,a){a||(a={});var s={};return a.defaults&&(s.denotation=""),i.dimValue!=null&&i.hasOwnProperty("dimValue")&&(typeof i.dimValue=="number"?s.dimValue=a.longs===String?String(i.dimValue):i.dimValue:s.dimValue=a.longs===String?T.Long.prototype.toString.call(i.dimValue):a.longs===Number?new T.LongBits(i.dimValue.low>>>0,i.dimValue.high>>>0).toNumber():i.dimValue,a.oneofs&&(s.value="dimValue")),i.dimParam!=null&&i.hasOwnProperty("dimParam")&&(s.dimParam=i.dimParam,a.oneofs&&(s.value="dimParam")),i.denotation!=null&&i.hasOwnProperty("denotation")&&(s.denotation=i.denotation),s},n.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},n.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TensorShapeProto.Dimension"},n}(),e}(),r.TypeProto=function(){function e(t){if(t)for(var o=Object.keys(t),i=0;i>>3){case 1:{s.tensorType=_.onnx.TypeProto.Tensor.decode(o,o.uint32());break}case 4:{s.sequenceType=_.onnx.TypeProto.Sequence.decode(o,o.uint32());break}case 5:{s.mapType=_.onnx.TypeProto.Map.decode(o,o.uint32());break}case 9:{s.optionalType=_.onnx.TypeProto.Optional.decode(o,o.uint32());break}case 8:{s.sparseTensorType=_.onnx.TypeProto.SparseTensor.decode(o,o.uint32());break}case 6:{s.denotation=o.string();break}default:o.skipType(u&7);break}}return s},e.decodeDelimited=function(o){return o instanceof N||(o=new N(o)),this.decode(o,o.uint32())},e.verify=function(o){if(typeof o!="object"||o===null)return"object expected";var i={};if(o.tensorType!=null&&o.hasOwnProperty("tensorType")){i.value=1;{var a=_.onnx.TypeProto.Tensor.verify(o.tensorType);if(a)return"tensorType."+a}}if(o.sequenceType!=null&&o.hasOwnProperty("sequenceType")){if(i.value===1)return"value: multiple values";i.value=1;{var a=_.onnx.TypeProto.Sequence.verify(o.sequenceType);if(a)return"sequenceType."+a}}if(o.mapType!=null&&o.hasOwnProperty("mapType")){if(i.value===1)return"value: multiple values";i.value=1;{var a=_.onnx.TypeProto.Map.verify(o.mapType);if(a)return"mapType."+a}}if(o.optionalType!=null&&o.hasOwnProperty("optionalType")){if(i.value===1)return"value: multiple values";i.value=1;{var a=_.onnx.TypeProto.Optional.verify(o.optionalType);if(a)return"optionalType."+a}}if(o.sparseTensorType!=null&&o.hasOwnProperty("sparseTensorType")){if(i.value===1)return"value: multiple values";i.value=1;{var a=_.onnx.TypeProto.SparseTensor.verify(o.sparseTensorType);if(a)return"sparseTensorType."+a}}return o.denotation!=null&&o.hasOwnProperty("denotation")&&!T.isString(o.denotation)?"denotation: string expected":null},e.fromObject=function(o){if(o instanceof _.onnx.TypeProto)return o;var i=new _.onnx.TypeProto;if(o.tensorType!=null){if(typeof o.tensorType!="object")throw TypeError(".onnx.TypeProto.tensorType: object expected");i.tensorType=_.onnx.TypeProto.Tensor.fromObject(o.tensorType)}if(o.sequenceType!=null){if(typeof o.sequenceType!="object")throw TypeError(".onnx.TypeProto.sequenceType: object expected");i.sequenceType=_.onnx.TypeProto.Sequence.fromObject(o.sequenceType)}if(o.mapType!=null){if(typeof o.mapType!="object")throw TypeError(".onnx.TypeProto.mapType: object expected");i.mapType=_.onnx.TypeProto.Map.fromObject(o.mapType)}if(o.optionalType!=null){if(typeof o.optionalType!="object")throw TypeError(".onnx.TypeProto.optionalType: object expected");i.optionalType=_.onnx.TypeProto.Optional.fromObject(o.optionalType)}if(o.sparseTensorType!=null){if(typeof o.sparseTensorType!="object")throw TypeError(".onnx.TypeProto.sparseTensorType: object expected");i.sparseTensorType=_.onnx.TypeProto.SparseTensor.fromObject(o.sparseTensorType)}return o.denotation!=null&&(i.denotation=String(o.denotation)),i},e.toObject=function(o,i){i||(i={});var a={};return i.defaults&&(a.denotation=""),o.tensorType!=null&&o.hasOwnProperty("tensorType")&&(a.tensorType=_.onnx.TypeProto.Tensor.toObject(o.tensorType,i),i.oneofs&&(a.value="tensorType")),o.sequenceType!=null&&o.hasOwnProperty("sequenceType")&&(a.sequenceType=_.onnx.TypeProto.Sequence.toObject(o.sequenceType,i),i.oneofs&&(a.value="sequenceType")),o.mapType!=null&&o.hasOwnProperty("mapType")&&(a.mapType=_.onnx.TypeProto.Map.toObject(o.mapType,i),i.oneofs&&(a.value="mapType")),o.denotation!=null&&o.hasOwnProperty("denotation")&&(a.denotation=o.denotation),o.sparseTensorType!=null&&o.hasOwnProperty("sparseTensorType")&&(a.sparseTensorType=_.onnx.TypeProto.SparseTensor.toObject(o.sparseTensorType,i),i.oneofs&&(a.value="sparseTensorType")),o.optionalType!=null&&o.hasOwnProperty("optionalType")&&(a.optionalType=_.onnx.TypeProto.Optional.toObject(o.optionalType,i),i.oneofs&&(a.value="optionalType")),a},e.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},e.getTypeUrl=function(o){return o===void 0&&(o="type.googleapis.com"),o+"/onnx.TypeProto"},e.Tensor=function(){function t(o){if(o)for(var i=Object.keys(o),a=0;a>>3){case 1:{u.elemType=i.int32();break}case 2:{u.shape=_.onnx.TensorShapeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof N||(i=new N(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")&&!T.isInteger(i.elemType))return"elemType: integer expected";if(i.shape!=null&&i.hasOwnProperty("shape")){var a=_.onnx.TensorShapeProto.verify(i.shape);if(a)return"shape."+a}return null},t.fromObject=function(i){if(i instanceof _.onnx.TypeProto.Tensor)return i;var a=new _.onnx.TypeProto.Tensor;if(i.elemType!=null&&(a.elemType=i.elemType|0),i.shape!=null){if(typeof i.shape!="object")throw TypeError(".onnx.TypeProto.Tensor.shape: object expected");a.shape=_.onnx.TensorShapeProto.fromObject(i.shape)}return a},t.toObject=function(i,a){a||(a={});var s={};return a.defaults&&(s.elemType=0,s.shape=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(s.elemType=i.elemType),i.shape!=null&&i.hasOwnProperty("shape")&&(s.shape=_.onnx.TensorShapeProto.toObject(i.shape,a)),s},t.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Tensor"},t}(),e.Sequence=function(){function t(o){if(o)for(var i=Object.keys(o),a=0;a>>3){case 1:{u.elemType=_.onnx.TypeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof N||(i=new N(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")){var a=_.onnx.TypeProto.verify(i.elemType);if(a)return"elemType."+a}return null},t.fromObject=function(i){if(i instanceof _.onnx.TypeProto.Sequence)return i;var a=new _.onnx.TypeProto.Sequence;if(i.elemType!=null){if(typeof i.elemType!="object")throw TypeError(".onnx.TypeProto.Sequence.elemType: object expected");a.elemType=_.onnx.TypeProto.fromObject(i.elemType)}return a},t.toObject=function(i,a){a||(a={});var s={};return a.defaults&&(s.elemType=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(s.elemType=_.onnx.TypeProto.toObject(i.elemType,a)),s},t.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Sequence"},t}(),e.Map=function(){function t(o){if(o)for(var i=Object.keys(o),a=0;a>>3){case 1:{u.keyType=i.int32();break}case 2:{u.valueType=_.onnx.TypeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof N||(i=new N(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.keyType!=null&&i.hasOwnProperty("keyType")&&!T.isInteger(i.keyType))return"keyType: integer expected";if(i.valueType!=null&&i.hasOwnProperty("valueType")){var a=_.onnx.TypeProto.verify(i.valueType);if(a)return"valueType."+a}return null},t.fromObject=function(i){if(i instanceof _.onnx.TypeProto.Map)return i;var a=new _.onnx.TypeProto.Map;if(i.keyType!=null&&(a.keyType=i.keyType|0),i.valueType!=null){if(typeof i.valueType!="object")throw TypeError(".onnx.TypeProto.Map.valueType: object expected");a.valueType=_.onnx.TypeProto.fromObject(i.valueType)}return a},t.toObject=function(i,a){a||(a={});var s={};return a.defaults&&(s.keyType=0,s.valueType=null),i.keyType!=null&&i.hasOwnProperty("keyType")&&(s.keyType=i.keyType),i.valueType!=null&&i.hasOwnProperty("valueType")&&(s.valueType=_.onnx.TypeProto.toObject(i.valueType,a)),s},t.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Map"},t}(),e.Optional=function(){function t(o){if(o)for(var i=Object.keys(o),a=0;a>>3){case 1:{u.elemType=_.onnx.TypeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof N||(i=new N(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")){var a=_.onnx.TypeProto.verify(i.elemType);if(a)return"elemType."+a}return null},t.fromObject=function(i){if(i instanceof _.onnx.TypeProto.Optional)return i;var a=new _.onnx.TypeProto.Optional;if(i.elemType!=null){if(typeof i.elemType!="object")throw TypeError(".onnx.TypeProto.Optional.elemType: object expected");a.elemType=_.onnx.TypeProto.fromObject(i.elemType)}return a},t.toObject=function(i,a){a||(a={});var s={};return a.defaults&&(s.elemType=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(s.elemType=_.onnx.TypeProto.toObject(i.elemType,a)),s},t.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Optional"},t}(),e.SparseTensor=function(){function t(o){if(o)for(var i=Object.keys(o),a=0;a>>3){case 1:{u.elemType=i.int32();break}case 2:{u.shape=_.onnx.TensorShapeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof N||(i=new N(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")&&!T.isInteger(i.elemType))return"elemType: integer expected";if(i.shape!=null&&i.hasOwnProperty("shape")){var a=_.onnx.TensorShapeProto.verify(i.shape);if(a)return"shape."+a}return null},t.fromObject=function(i){if(i instanceof _.onnx.TypeProto.SparseTensor)return i;var a=new _.onnx.TypeProto.SparseTensor;if(i.elemType!=null&&(a.elemType=i.elemType|0),i.shape!=null){if(typeof i.shape!="object")throw TypeError(".onnx.TypeProto.SparseTensor.shape: object expected");a.shape=_.onnx.TensorShapeProto.fromObject(i.shape)}return a},t.toObject=function(i,a){a||(a={});var s={};return a.defaults&&(s.elemType=0,s.shape=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(s.elemType=i.elemType),i.shape!=null&&i.hasOwnProperty("shape")&&(s.shape=_.onnx.TensorShapeProto.toObject(i.shape,a)),s},t.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.SparseTensor"},t}(),e}(),r.OperatorSetIdProto=function(){function e(n){if(n)for(var t=Object.keys(n),o=0;o>>3){case 1:{a.domain=t.string();break}case 2:{a.version=t.int64();break}default:t.skipType(s&7);break}}return a},e.decodeDelimited=function(t){return t instanceof N||(t=new N(t)),this.decode(t,t.uint32())},e.verify=function(t){return typeof t!="object"||t===null?"object expected":t.domain!=null&&t.hasOwnProperty("domain")&&!T.isString(t.domain)?"domain: string expected":t.version!=null&&t.hasOwnProperty("version")&&!T.isInteger(t.version)&&!(t.version&&T.isInteger(t.version.low)&&T.isInteger(t.version.high))?"version: integer|Long expected":null},e.fromObject=function(t){if(t instanceof _.onnx.OperatorSetIdProto)return t;var o=new _.onnx.OperatorSetIdProto;return t.domain!=null&&(o.domain=String(t.domain)),t.version!=null&&(T.Long?(o.version=T.Long.fromValue(t.version)).unsigned=!1:typeof t.version=="string"?o.version=parseInt(t.version,10):typeof t.version=="number"?o.version=t.version:typeof t.version=="object"&&(o.version=new T.LongBits(t.version.low>>>0,t.version.high>>>0).toNumber())),o},e.toObject=function(t,o){o||(o={});var i={};if(o.defaults)if(i.domain="",T.Long){var a=new T.Long(0,0,!1);i.version=o.longs===String?a.toString():o.longs===Number?a.toNumber():a}else i.version=o.longs===String?"0":0;return t.domain!=null&&t.hasOwnProperty("domain")&&(i.domain=t.domain),t.version!=null&&t.hasOwnProperty("version")&&(typeof t.version=="number"?i.version=o.longs===String?String(t.version):t.version:i.version=o.longs===String?T.Long.prototype.toString.call(t.version):o.longs===Number?new T.LongBits(t.version.low>>>0,t.version.high>>>0).toNumber():t.version),i},e.prototype.toJSON=function(){return this.constructor.toObject(this,$e.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.OperatorSetIdProto"},e}(),r.OperatorStatus=function(){var e={},n=Object.create(e);return n[e[0]="EXPERIMENTAL"]=0,n[e[1]="STABLE"]=1,n}(),r.FunctionProto=function(){function e(n){if(this.input=[],this.output=[],this.attribute=[],this.attributeProto=[],this.node=[],this.opsetImport=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{a.name=t.string();break}case 4:{a.input&&a.input.length||(a.input=[]),a.input.push(t.string());break}case 5:{a.output&&a.output.length||(a.output=[]),a.output.push(t.string());break}case 6:{a.attribute&&a.attribute.length||(a.attribute=[]),a.attribute.push(t.string());break}case 11:{a.attributeProto&&a.attributeProto.length||(a.attributeProto=[]),a.attributeProto.push(_.onnx.AttributeProto.decode(t,t.uint32()));break}case 7:{a.node&&a.node.length||(a.node=[]),a.node.push(_.onnx.NodeProto.decode(t,t.uint32()));break}case 8:{a.docString=t.string();break}case 9:{a.opsetImport&&a.opsetImport.length||(a.opsetImport=[]),a.opsetImport.push(_.onnx.OperatorSetIdProto.decode(t,t.uint32()));break}case 10:{a.domain=t.string();break}default:t.skipType(s&7);break}}return a},e.decodeDelimited=function(t){return t instanceof N||(t=new N(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.name!=null&&t.hasOwnProperty("name")&&!T.isString(t.name))return"name: string expected";if(t.input!=null&&t.hasOwnProperty("input")){if(!Array.isArray(t.input))return"input: array expected";for(var o=0;o{"use strict";xa();Ae=se(gr());tr();Jn=class{static arraysEqual(e,n){if(e.length!==n.length)return!1;for(let t=0;t1&&c>1)return;s[a-u]=Math.max(l,c)}return s}static index(e,n){let t=new Array(n.length);return r.fillIndex(e,n,t),t}static fillIndex(e,n,t){let o=e.length-n.length;for(let i=0;i=0;b--)l[b]=y%a[b],y=Math.floor(y/a[b]);h||(r.fillIndex(l,e.dims,c),p=e.get(c)),m||(r.fillIndex(l,n.dims,d),f=n.get(d)),u.set(l,t(p,f))}}return u}}static isValidBroadcast(e,n){let t=e.length,o=n.length;if(t>o)return!1;for(let i=1;i<=t;i++)if(e[t-i]!==1&&e[t-i]!==n[o-i])return!1;return!0}static getBroadcastDims(e,n){let t=e.length,o=[];for(let i=0;i1&&s===1&&o.unshift(a)}return o}},Mo=class{static getShapeOfGemmResult(e,n,t,o,i){if(e.length!==2||t.length!==2)throw new Error("shape need to be of size 2");let a,s,u;n?(a=e[1],s=e[0]):(a=e[0],s=e[1]);let l=-1;if(o?(u=t[0],l=1):(u=t[1],l=0),t[l]!==s)throw new Error("dimension mismatch");if(a<=0||u<=0||s<=0)throw new Error("invalid shape specified");if(i&&!Ze.isValidBroadcast(i,[a,u]))throw new Error("gemm: invalid bias shape for broadcast");return[a,u,s]}},je=class r{static tensorDataTypeFromProto(e){switch(e){case Ae.onnx.TensorProto.DataType.INT8:return"int8";case Ae.onnx.TensorProto.DataType.UINT8:return"uint8";case Ae.onnx.TensorProto.DataType.BOOL:return"bool";case Ae.onnx.TensorProto.DataType.INT16:return"int16";case Ae.onnx.TensorProto.DataType.UINT16:return"uint16";case Ae.onnx.TensorProto.DataType.INT32:return"int32";case Ae.onnx.TensorProto.DataType.UINT32:return"uint32";case Ae.onnx.TensorProto.DataType.FLOAT:return"float32";case Ae.onnx.TensorProto.DataType.DOUBLE:return"float64";case Ae.onnx.TensorProto.DataType.STRING:return"string";case Ae.onnx.TensorProto.DataType.INT64:return"int32";case Ae.onnx.TensorProto.DataType.UINT64:return"uint32";default:throw new Error(`unsupported data type: ${Ae.onnx.TensorProto.DataType[e]}`)}}static tensorDataTypeStringToEnum(e){switch(e){case"int8":return Ae.onnx.TensorProto.DataType.INT8;case"uint8":return Ae.onnx.TensorProto.DataType.UINT8;case"bool":return Ae.onnx.TensorProto.DataType.BOOL;case"int16":return Ae.onnx.TensorProto.DataType.INT16;case"uint16":return Ae.onnx.TensorProto.DataType.UINT16;case"int32":return Ae.onnx.TensorProto.DataType.INT32;case"uint32":return Ae.onnx.TensorProto.DataType.UINT32;case"float32":return Ae.onnx.TensorProto.DataType.FLOAT;case"float64":return Ae.onnx.TensorProto.DataType.DOUBLE;case"string":return Ae.onnx.TensorProto.DataType.STRING;case"int64":return Ae.onnx.TensorProto.DataType.INT64;case"uint64":return Ae.onnx.TensorProto.DataType.UINT64;default:throw new Error(`unsupported data type: ${e}`)}}static tensorDimsFromProto(e){return e.map(n=>Cn.isLong(n)?n.toNumber():n)}static tensorValueTypeFromProto(e){return{tensorType:r.tensorDataTypeFromProto(e.elemType),shape:{dims:r.tensorDimsFromProto(e.shape.dim.map(n=>n.dimValue))}}}static tensorDimsFromORTFormat(e){let n=[];for(let t=0;te.length)throw new Error(`invalid dimension of ${n} for sizeFromDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,n,e.length)}static sizeToDimension(e,n){if(n<0||n>e.length)throw new Error(`invalid dimension of ${n} for sizeToDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,0,n)}static getSizeFromDimensionRange(e,n,t){let o=1;for(let i=n;i=0;--o)t[o]=t[o+1]*e[o+1];return t}static transpose(e){return e.slice().reverse()}static indicesToOffset(e,n,t){t===void 0&&(t=e.length);let o=0;for(let i=0;i=n)throw new Error("unsupported axis for this operation.");return e<0?e+n:e}static normalizeAxes(e,n){return e.map(t=>this.normalizeAxis(t,n))}static incrementIndex(e,n,t){if(n.length===0||e.length===0)throw new Error("Index incrementing unsupported for scalar Tensor");if(t===void 0)t=n.length;else if(t<=0||t>n.length)throw new Error("Incorrect axis to increment on");for(let o=t-1;o>=0&&(e[o]++,!(e[o]=e.length)throw new Error("the dimension with value zero exceeds the dimension size of the input tensor");o[u]=e[u]}else o[u]=n[u];a*=o[u]}}let s=r.size(e);if(i!==-1){if(s%a!==0)throw new Error(`the input tensor cannot be reshaped to the requested shape. Input shape: [${e}] Output shape: [${n}]`);o[i]=s/a}else if(a!==s)throw new Error("reshapedDims and originalDims don't have matching sizes");return o}static sortBasedOnPerm(e,n){return n?n.map(t=>e[t]):e.slice().reverse()}static padShape(e,n){let t=e.length;return e.map((o,i)=>o+n[i]+n[i+t])}static areEqual(e,n){return e.length!==n.length?!1:e.every((t,o)=>t===n[o])}static validateDimsAndCalcSize(e){if(e.length>6)throw new TypeError("Only rank 0 to 6 is supported for tensor shape.");let n=1;for(let t of e){if(!Number.isInteger(t))throw new TypeError(`Invalid shape: ${t} is not an integer`);if(t<0||t>2147483647)throw new TypeError(`Invalid shape: length ${t} is not allowed`);n*=t}return n}static flattenShape(e,n){n<0&&(n+=e.length);let t=e.reduce((a,s)=>a*s,1),o=e.slice(n).reduce((a,s)=>a*s,1);return[t/o,o]}static squeezeShape(e,n){let t=new Array;n=r.normalizeAxes(n,e.length);for(let o=0;o=0;if(i&&e[o]!==1)throw new Error("squeeze an axis of size different than 1");(n.length===0&&e[o]>1||n.length>0&&!i)&&t.push(e[o])}return t}static unsqueezeShape(e,n){let t=new Array(e.length+n.length);t.fill(0);for(let i=0;i=t.length)throw new Error("'axes' has an out of range axis");if(t[a]!==0)throw new Error("'axes' has a duplicate axis");t[a]=1}let o=0;for(let i=0;i=t.length?t.push(n[s+2]):t[s]=n[s+2];for(let s=0;s=t[s]||a[s+t.length]>=t[s])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(e,n,t,o,i,a){if(a){if(i.length!==2*(e.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(n.length!==e.length-2)throw new Error("length of strides should be the length of data dimensions");if(o.length!==e.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let s=0;s{"use strict";Wd=se(sc());xa();Mr();ce=se(gr());xe();Ne=class r{constructor(e,n,t,o,i,a=Wd.Guid.create()){this.dims=e;this.type=n;this.dataProvider=t;this.asyncDataProvider=o;this.cache=i;this.dataId=a;this.size=V.validateDimsAndCalcSize(e);let s=this.size,u=t===void 0&&o===void 0&&i===void 0;if(i!==void 0&&i.length!==s)throw new RangeError("Input dims doesn't match data length.");if(n==="string"){if(i!==void 0&&(!Array.isArray(i)||!i.every(l=>typeof l=="string")))throw new TypeError("cache should be a string array");u&&(this.cache=new Array(s))}else{if(i!==void 0){let l=Hd(n);if(!(i instanceof l))throw new TypeError(`cache should be type ${l.name}`)}if(u){let l=new ArrayBuffer(s*g0(n));this.cache=b0(l,n)}}}get data(){if(this.cache===void 0){let e=this.dataProvider(this.dataId);if(e.length!==this.size)throw new Error("Length of data provided by the Data Provider is inconsistent with the dims of this Tensor.");this.cache=e}return this.cache}get stringData(){if(this.type!=="string")throw new TypeError("data type is not string");return this.data}get integerData(){switch(this.type){case"uint8":case"int8":case"uint16":case"int16":case"int32":case"uint32":case"bool":return this.data;default:throw new TypeError("data type is not integer (uint8, int8, uint16, int16, int32, uint32, bool)")}}get floatData(){switch(this.type){case"float32":case"float64":return this.data;default:throw new TypeError("data type is not float (float32, float64)")}}get numberData(){if(this.type!=="string")return this.data;throw new TypeError("type cannot be non-number (string)")}get(e){return this.data[V.indicesToOffset(e,this.strides)]}set(e,n){this.data[V.indicesToOffset(e,this.strides)]=n}async getData(){return this.cache===void 0&&(this.cache=await this.asyncDataProvider(this.dataId)),this.cache}get strides(){return this._strides||(this._strides=V.computeStrides(this.dims)),this._strides}static fromProto(e){if(!e)throw new Error("cannot construct Value from an empty tensor");let n=je.tensorDataTypeFromProto(e.dataType),t=je.tensorDimsFromProto(e.dims),o=new r(t,n);if(n==="string")e.stringData.forEach((i,a)=>{o.data[a]=Ur(i)});else if(e.rawData&&typeof e.rawData.byteLength=="number"&&e.rawData.byteLength>0){let i=o.data,a=new DataView(e.rawData.buffer,e.rawData.byteOffset,e.rawData.byteLength),s=Gd(e.dataType),u=e.rawData.byteLength/s;if(e.rawData.byteLength%s!==0)throw new Error("invalid buffer length");if(i.length!==u)throw new Error("buffer length mismatch");for(let l=0;l0){let i=o.data,a=new DataView(e.rawDataArray().buffer,e.rawDataArray().byteOffset,e.rawDataLength()),s=Gd(e.dataType()),u=e.rawDataLength()/s;if(e.rawDataLength()%s!==0)throw new Error("invalid buffer length");if(i.length!==u)throw new Error("buffer length mismatch");for(let l=0;l{"use strict";y0={version:"",attribute:"attribute",varyingVertex:"varying",varyingFrag:"varying",texture2D:"texture2D",output:"gl_FragColor",outputDeclaration:""},_0={version:"#version 300 es",attribute:"in",varyingVertex:"out",varyingFrag:"in",texture2D:"texture",output:"outputColor",outputDeclaration:"out vec4 outputColor;"}});var pe=$(()=>{"use strict"});async function eu(r,e=t=>0,n){return new Promise((t,o)=>{let i=0,a=()=>{if(r()){t();return}i++;let s=e(i);if(n!=null&&i>=n){o();return}setTimeout(a,s)};a()})}function Bo(r){return br(typeof r<"u"&&r.length!==0,()=>"empty string found for sampler name"),"get"+r.charAt(0).toUpperCase()+r.slice(1)}function Xd(r){return br(typeof r<"u"&&r.length!==0,()=>"empty string found for sampler name"),"get"+r.charAt(0).toUpperCase()+r.slice(1)+"AtOutCoords"}function yr(r,e){let n=JSON.parse(JSON.stringify(r));return n=e,n}function _r(r,e){return e.map(n=>r[n]).join(", ")}function Je(r){if(r<=1)return"int";if(r===2)return"ivec2";if(r===3)return"ivec3";if(r===4)return"ivec4";if(r===5)return"ivec5";if(r===6)return"ivec6";throw Error(`GPU for rank ${r} is not yet supported`)}function St(r=6){return["x","y","z","w","u","v"].slice(0,r)}var cn=$(()=>{"use strict";xe()});function x0(r,e){return St(e).map(n=>`${r}.${n}`)}function xr(r,e){return e===1?[r]:x0(r,e)}function dn(){return` + float getChannel(vec4 frag, int dim) { + int modCoord = imod(dim, 2); + return modCoord == 0 ? frag.r : frag.g; + } + + float getChannel(vec4 frag, vec2 innerDims) { + vec2 modCoord = mod(innerDims, 2.); + return modCoord.x == 0. ? + (modCoord.y == 0. ? frag.r : frag.g) : + (modCoord.y == 0. ? frag.b : frag.a); + } + `}var nr=$(()=>{"use strict";cn()});function T0(r,e,n){if(r===0)return"false";if(r===1)return`rc > ${e[0]}`;let t="";for(let o=r-2;o= ${e[o-r+2]}`,o= ${r[0]} ? 0. : getA(rc + 1), + 0, 0`;let t="r, c",o="r, cp1",i="rp1, c",a="rp1, cp1",s="";if(n>2)for(let u=0;u= ${t}; + bool cEdge = cp1 >= ${n}; + `}var Zd,w0,Jd,Qd=$(()=>{"use strict";Oe();pe();cn();nr();Zd={name:"pack",inputNames:["A"],inputTypes:[1]},w0=(r,e)=>{let n=j(r.session.backend.glContext.version),t=e.dims,o=t.length,i=e.dims.length,a=Je(i),s=xr("rc",i),u=I0(i,s,t[t.length-2],t[t.length-1]),l;o===0?l=[1,1]:o===1?l=[t[0],1]:l=[t[i-1],t[i-2]];let c=T0(i,l,s),d=v0(t,s),p=` + void main() { + ${a} rc = getOutputCoords(); + + if(${c}) { + ${n.output} = vec4(0); + } else { + ${u} + + ${n.output} = vec4(${d}); + } + } + `;return{...Zd,hasMain:!0,output:{dims:e.dims,type:e.type,textureType:2},shaderSource:p}},Jd=(r,e)=>({...Zd,get:()=>w0(r,e)})});function tu(r){if(r.length===0)return[1,1,1];let e=1;for(let n=0;n1?r[r.length-2]:1,r[r.length-1]]}function ep(r,e){let n=!1;return r.length===0||e.length===0?n=!0:r.length<2||e.length<2?n=r[r.length-1]===e[e.length-1]:n=r[r.length-1]===e[e.length-1]&&r[r.length-2]===e[e.length-2],n}function A0(r){let e=V.computeStrides(r),n=["b","r","c"],t="index";return` + ivec3 inputCoordsFromReshapedOutCoords(int index) { + ${e.map((i,a)=>{let s=`int ${n[a]} = ${t} / ${i}`,u=a===e.length-1?`int ${n[a+1]} = ${t} - ${n[a]} * ${i}`:`index -= ${n[a]} * ${i}`;return`${s}; ${u};`}).join("")} + return ivec3(b, r, c); + } + `}function P0(r){let e=V.computeStrides(r);return` + int getFlattenedIndex(ivec3 coords) { + // reverse y, z order + return coords.x * ${e[0]} + coords.z * ${e[1]} + coords.y; + } +`}var S0,$0,Yd,tp=$(()=>{"use strict";xe();Oe();pe();nr();S0=r=>({name:"Reshape (packed)",inputTypes:[2],inputNames:["A"],cacheHint:`${r}`}),$0=(r,e,n,t)=>{let o=e.dims,i=t,a="";for(let l=0;l<4;l++){let c="";switch(l){case 0:c="outputCoords = rc;";break;case 1:c="outputCoords = ivec3(rc.x, rc.y+1, rc.z);";break;case 2:c="outputCoords = ivec3(rc.x, rc.y, rc.z+1);";break;case 3:c="outputCoords = ivec3(rc.x, rc.y+1, rc.z+1);";break;default:throw new Error}a+=` + ${c} + ${l>0?"if(outputCoords.y < rows && outputCoords.z < cols){":""} + int flattenedIndex = getFlattenedIndex(outputCoords); + + ivec3 inputRC = inputCoordsFromReshapedOutCoords(flattenedIndex); + vec2 innerDims = vec2(float(inputRC.y),float(inputRC.z)); + + result[${l}] = getChannel(getA(inputRC.x, inputRC.y, inputRC.z), innerDims); + + ${l>0?"}":""} + `}let s=j(r.session.backend.glContext.version),u=` + ${A0(o)} + ${P0(i)} + ${dn()} + + void main() { + ivec3 rc = getOutputCoords(); + + vec4 result = vec4(0.0); + + ivec3 outputCoords; + int rows = ${i[2]}; + int cols = ${i[1]}; + + ${a} + ${s.output} = result; + } + `;return{...n,output:{dims:i,type:e.type,textureType:2},shaderSource:u,hasMain:!0}},Yd=(r,e,n)=>{let t=S0(n);return{...t,get:()=>$0(r,e,t,n)}}});var nu,np=$(()=>{"use strict";Oe();pe();nu=(r,e)=>{let n=e.shape,t=j(r.session.backend.glContext.version),o=` + const float FLOAT_MAX = 1.70141184e38; + const float FLOAT_MIN = 1.17549435e-38; + + bool isNaN(float val) { + return (val < 1.0 || 0.0 < val || val == 0.0) ? false : true; + } + + highp vec4 encodeAsUint8(highp float v) { + if (isNaN(v)) { + return vec4(255, 255, 255, 255); + } + + highp float av = abs(v); + + if(av < FLOAT_MIN) { + return vec4(0.0, 0.0, 0.0, 0.0); + } else if(v > FLOAT_MAX) { + return vec4(0.0, 0.0, 128.0, 127.0) / 255.0; + } else if(v < -FLOAT_MAX) { + return vec4(0.0, 0.0, 128.0, 255.0) / 255.0; + } + + highp vec4 c = vec4(0,0,0,0); + + highp float e = floor(log2(av)); + highp float m = exp2(fract(log2(av))) - 1.0; + + c[2] = floor(128.0 * m); + m -= c[2] / 128.0; + c[1] = floor(32768.0 * m); + m -= c[1] / 32768.0; + c[0] = floor(8388608.0 * m); + + highp float ebias = e + 127.0; + c[3] = floor(ebias / 2.0); + ebias -= c[3] * 2.0; + c[2] += floor(ebias) * 128.0; + + c[3] += 128.0 * step(0.0, -v); + + return c / 255.0; + } + + void main() { + float value = ${t.texture2D}(X,TexCoords).r; + ${t.output} = encodeAsUint8(value); + }`,i={name:"Uint8Encode",inputTypes:[0],inputNames:["X"],output:{dims:n,type:e.tensor.type,textureType:3},shaderSource:o,hasMain:!0};return r.executeProgram(i,[e.tensor])}});function E0(r,e){if(r===1)return"rc";let n="";for(let t=0;t{"use strict";Oe();pe();cn();nr();rp={name:"unpack",inputNames:["A"],inputTypes:[2]},O0=(r,e)=>{let n=e.dims.length,t=xr("rc",n),o=t.slice(-2),i=Je(n),a=dn(),u=e.dims.length===0?"":E0(n,t),l=n<=1?"rc":`vec2(${o.join(",")})`,c=j(r.session.backend.glContext.version),d=` + ${a} + void main() { + ${i} rc = getOutputCoords(); + + // Sample the texture with the coords to get the rgba channel value. + vec4 packedInput = getA(${u}); + + ${c.output} = vec4(getChannel(packedInput, ${l}), 0, 0, 0); + } + `;return{...rp,hasMain:!0,output:{dims:e.dims,type:e.type,textureType:0},shaderSource:d}},op=(r,e)=>({...rp,get:()=>O0(r,e)})});var Vo,Wr,Fo,Hr=$(()=>{"use strict";ct();Vo=class{constructor(e,n=1){if(n===1)this.internalFormat=e.R32F,this.format=e.RED,this.textureType=e.FLOAT,this.channelSize=n;else if(n===4)this.internalFormat=e.RGBA32F,this.format=e.RGBA,this.textureType=e.FLOAT,this.channelSize=n;else throw new Error(`Invalid number of channels: ${n}`)}encode(e,n){let t,o;return e.constructor!==Float32Array&&(Te.warning("Encoder","data was not of type Float32; creating new Float32Array"),o=new Float32Array(e)),n*this.channelSize>e.length?(Te.warning("Encoder","Source data too small. Allocating larger array"),o=e,t=this.allocate(n*this.channelSize),o.forEach((i,a)=>t[a]=i)):(o=e,t=o),t}allocate(e){return new Float32Array(e*4)}decode(e,n){return this.channelSize===1?e.filter((o,i)=>i%4===0).subarray(0,n):e.subarray(0,n)}},Wr=class{constructor(e,n=1,t){if(n!==1&&n!==4)throw new Error(`Invalid number of channels: ${n}`);this.internalFormat=e.RGBA,this.format=e.RGBA,this.channelSize=n,this.textureType=t||e.FLOAT}encode(e,n){let t=e;return this.channelSize===1&&(Te.verbose("Encoder","Exploding into a larger array"),t=this.allocate(n),e.forEach((o,i)=>t[i*4]=o)),t}allocate(e){return new Float32Array(e*4)}decode(e,n){return this.channelSize===1?e.filter((o,i)=>i%4===0).subarray(0,n):e.subarray(0,n)}},Fo=class{constructor(e,n=1){this.channelSize=4;if(n===1)this.internalFormat=e.ALPHA,this.format=e.ALPHA,this.textureType=e.UNSIGNED_BYTE,this.channelSize=n;else if(n===4)this.internalFormat=e.RGBA,this.format=e.RGBA,this.textureType=e.UNSIGNED_BYTE,this.channelSize=n;else throw new Error(`Invalid number of channels: ${n}`)}encode(e,n){return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}allocate(e){return new Uint8Array(e*this.channelSize)}decode(e,n){if(e instanceof Uint8Array)return e.subarray(0,n);throw new Error(`Invalid array type: ${e.constructor}`)}}});var qr,ap,ru,sp=$(()=>{"use strict";xe();pe();qr=(r,e,n)=>{let t=n===0||n===1?1:4,o=n===2,i=n===1||n===2,a=n===4?e.length-1:void 0,s=n===4?e.map((u,l)=>l===e.length-1?u*4:u):void 0;return ru(r,e,t,s,{isPacked:o,reverseWH:i,breakAxis:a})},ap=(r,e,n)=>{let t=qr(r,e,n);return[t.width,t.height]},ru=(r,e,n=1,t,o)=>{let i=!!(o&&o.isPacked),[a,s]=r.computeTextureWH(i&&t||e,o),u=e.length,l=e.slice(0);if(u===0&&(l=[1]),n===1)t=e;else if(i){if(n!==4)throw new Error("a packed texture must be 4-channel");t=e,u>0&&(l[u-1]=Math.ceil(l[u-1]/2)),u>1&&(l[u-2]=Math.ceil(l[u-2]/2))}else if(!t)throw new Error("Unpacked shape is needed when using channels > 1");return{width:a,height:s,channels:n,isPacked:i,shape:l,strides:V.computeStrides(l),unpackedShape:t,reversedWH:o&&o.reverseWH}}});var D0,Go,lp=$(()=>{"use strict";ct();tr();xe();Qd();tp();np();ip();Hr();sp();pe();D0=(r,e)=>{let n=e.map(o=>`${o.unpackedShape.join(",")};${o.width}x${o.height}`).join("_"),t=r.name;return r.cacheHint&&(t+="["+r.cacheHint+"]"),t+=":"+n,t},Go=class{constructor(e){this.session=e;this.packedTextureDataCache=new Map,this.unpackedTextureDataCache=new Map}calculateTextureWidthAndHeight(e,n){return ap(this.session.layoutStrategy,e,n)}executeProgram(e,n){if(n.lengththis.readTexture(a),async s=>this.readTextureAsync(a),void 0,i),texture:t};return this.setTextureData(a.tensor.dataId,a,e.isPacked),a}getTextureData(e,n=!1){return this.session.isInitializer(e)?this.session.getTextureData(e,n):n?this.packedTextureDataCache.get(e):this.unpackedTextureDataCache.get(e)}setTextureData(e,n,t=!1){this.session.isInitializer(e)?this.session.setTextureData(e,n,t):(t?this.packedTextureDataCache:this.unpackedTextureDataCache).set(e,n)}isTextureLayoutCached(e,n=!1){return!!this.getTextureData(e.dataId,n)}dispose(){this.session.textureManager.clearActiveTextures(),this.packedTextureDataCache.forEach(e=>this.session.textureManager.releaseTexture(e)),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache.forEach(e=>this.session.textureManager.releaseTexture(e)),this.unpackedTextureDataCache=new Map}readTexture(e){return e.isPacked?this.readTexture(this.unpack(e)):this.session.backend.glContext.isFloat32DownloadSupported?this.session.textureManager.readTexture(e,e.tensor.type,e.channels):this.session.textureManager.readUint8TextureAsFloat(nu(this,e))}async readTextureAsync(e){return e.isPacked?this.readTextureAsync(this.unpack(e)):this.session.backend.glContext.isFloat32DownloadSupported?this.session.textureManager.readTextureAsync(e,e.tensor.type,e.channels):this.session.textureManager.readUint8TextureAsFloat(nu(this,e))}pack(e){return this.executeProgram(Jd(this,e.tensor),[e.tensor])}unpack(e){return this.executeProgram(op(this,e.tensor),[e.tensor])}}});var ou,le,We=$(()=>{"use strict";ou=class{constructor(e){Object.assign(this,e)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(e=>`${this[e]}`).join(";")),this.key}},le=r=>new ou(r)});var cp,dp,pp,k0,L0,fp=$(()=>{"use strict";We();Oe();pe();cp={name:"BatchNormalization",inputNames:["A","Scale","B","Mean","Variance"],inputTypes:[0,0,0,0,0]},dp=(r,e,n)=>(L0(e),[r.run({...cp,cacheHint:n.cacheKey,get:()=>k0(r,e,n)},e)]),pp=r=>{let e=r.attributes.getFloat("epsilon",1e-5),n=r.attributes.getFloat("momentum",.9),t=r.attributes.getInt("spatial",1);return le({epsilon:e,momentum:n,spatial:t})},k0=(r,e,n)=>{let t=j(r.session.backend.glContext.version),o=e[0].dims.length,[i,a]=r.calculateTextureWidthAndHeight(e[1].dims,0),s=` + float process(int[${o}] indices) { + vec2 position = offsetToCoords(indices[1], ${i}, ${a}); + float scale = getColorAsFloat(${t.texture2D}(Scale, position)); + float mean = getColorAsFloat(${t.texture2D}(Mean, position)); + float variance = getColorAsFloat(${t.texture2D}(Variance, position)); + float b = getColorAsFloat(${t.texture2D}(B, position)); + + return scale * ( (_A(indices) - mean) / sqrt(variance + float(${n.epsilon})) ) + b; + }`;return{...cp,output:{dims:e[0].dims,type:e[0].type,textureType:0},shaderSource:s}},L0=r=>{if(!r||r.length!==5)throw new Error("BatchNormalization requires 5 inputs.");let e=r[0],n=r[1],t=r[2],o=r[3],i=r[4];if(e.dims.length<3||n.dims.length!==1||t.dims.length!==1||o.dims.length!==1||i.dims.length!==1)throw new Error("invalid input shape.");if(n.dims[0]!==e.dims[1]||t.dims[0]!==e.dims[1]||o.dims[0]!==e.dims[1]||i.dims[0]!==e.dims[1])throw new Error("invalid input shape.");if(e.type!=="float32"&&e.type!=="float64"||n.type!=="float32"&&n.type!=="float64"||t.type!=="float32"&&t.type!=="float64"||o.type!=="float32"&&o.type!=="float64"||i.type!=="float32"&&i.type!=="float64")throw new Error("invalid input tensor types.")}});var Uo,gt,z,jr,Wo,$n=$(()=>{"use strict";Uo=class{constructor(e,n,t,o){this.glContext=e;this.programInfo=n;this.inputTextureLayouts=t;this.outputTextureLayout=o}},gt=class{constructor(e){this.context=e}},z=class{constructor(e,n){this.routineBody=e;this.dependencies=n}},jr=class{constructor(e,n,t){this.name=e;t?this.dependencies=t:this.dependencies=[],n&&(this.routineBody=n)}addDependency(e){e&&this.dependencies.push(e)}},Wo=class{static returnOrderedNodes(e){if(!e||e.length===0)return[];if(e.length===1)return e;let n=new Set,t=new Set,o=new Array;return this.createOrderedNodes(e,n,t,o),o}static createOrderedNodes(e,n,t,o){for(let i=0;i0)for(let a=0;a b); + } + vec4 ${r}(vec4 v1, vec4 v2) { + return vec4( v1.r > v2.r , + v1.g > v2.g, + v1.b > v2.b, + v1.a > v2.a ); + } + `,name:r,type:0}}function G0(){let r="less_";return{body:` + float ${r}(float a, float b) { + return float(a < b); + } + vec4 ${r}(vec4 v1, vec4 v2) { + return vec4( v1.r < v2.r , + v1.g < v2.g, + v1.b < v2.b, + v1.a < v2.a ); + } + `,name:r,type:0}}function U0(){let r="and_";return{body:` + float ${r}(float a, float b) { + return float( bool(a) && bool(b) ); + } + vec4 ${r}(vec4 v1, vec4 v2) { + bvec4 b1 = bvec4(v1); + bvec4 b2 = bvec4(v2); + return vec4( b1.r && b2.r , + b1.g && b2.g, + b1.b && b2.b, + b1.a && b2.a ); + } + `,name:r,type:0}}function W0(){let r="or_";return{body:` + float ${r}(float a, float b) { + return float( bool(a) || bool(b) ); + } + vec4 ${r}(vec4 v1, vec4 v2) { + bvec4 b1 = bvec4(v1); + bvec4 b2 = bvec4(v2); + return vec4( b1.r || b2.r , + b1.g || b2.g, + b1.b || b2.b, + b1.a || b2.a ); + } + `,name:r,type:0}}function H0(){let r="xor_";return{body:` + float ${r}(float a, float b) { + return float( bool(a) ^^ bool(b) ); + } + vec4 ${r}(vec4 v1, vec4 v2) { + bvec4 b1 = bvec4(v1); + bvec4 b2 = bvec4(v2); + return vec4( b1.r ^^ b2.r , + b1.g ^^ b2.g, + b1.b ^^ b2.b, + b1.a ^^ b2.a ); + } + `,name:r,type:0}}function q0(){return K0("pow")}function j0(){let r="prelu_";return{body:` + float ${r}(float a, float b) { + return a < 0.0 ? a * b: a; + } + vec4 ${r}(vec4 v1, vec4 v2) { + return vec4( + v1.r < 0.0 ? v1.r * v2.r: v1.r, + v1.g < 0.0 ? v1.g * v2.g: v1.g, + v1.b < 0.0 ? v1.b * v2.b: v1.b, + v1.a < 0.0 ? v1.a * v2.a: v1.a + ); + } + `,name:r,type:0}}function K0(r){let e=`${r}_`;return{body:` + float ${e}(float a, float b) { + return ${r}(a, b); + } + vec4 ${e}(vec4 v1, vec4 v2) { + return ${r}(v1, v2); + } + `,name:e,type:0}}var bt,X0,hp,mp,gp,bp,yp,_p,xp,wp,Tp,vp,Ip,Sp,$p=$(()=>{"use strict";xe();$n();Oe();pe();bt=(r,e,n,t=e[0].type,o)=>{let i=r.session.pack?2:0;return{name:n.name,inputNames:["A","B"],inputTypes:[i,i],cacheHint:o,get:()=>X0(r,e,n,t)}},X0=(r,e,n,t=e[0].type)=>{let o=r.session.pack?2:0,i=!V.areEqual(e[0].dims,e[1].dims),a=e[0].dims,s=r.session.pack;if(i){let c=Ze.calcShape(e[0].dims,e[1].dims,!1);if(!c)throw new Error("Can't perform binary op on the given tensors");a=c;let d=a.length,p=e[0].dims.length!==0?e[0].dims.length:1,f=e[1].dims.length!==0?e[1].dims.length:1,h=e[0].dims.length!==0?"bcastIndices_A(indices, aindices);":"aindices[0] = 0;",m=e[1].dims.length!==0?"bcastIndices_B(indices, bindices);":"bindices[0] = 0;",y=j(r.session.backend.glContext.version),g=s?` + ${n.body} + void main() { + vec4 a = getAAtOutCoords(); + vec4 b = getBAtOutCoords(); + vec4 result = ${n.name}(a, b); + ${y.output} = result; + }`:` + ${n.body} + float process(int indices[${d}]) { + int aindices[${p}]; + int bindices[${f}]; + ${h} + ${m} + return ${n.name}(_A(aindices), _B(bindices)); + }`;return{name:n.name,inputNames:["A","B"],inputTypes:[o,o],output:{dims:a,type:t,textureType:o},shaderSource:g,hasMain:s}}let u=j(r.session.backend.glContext.version),l=` + ${n.body} + void main() { + vec4 v1 = ${u.texture2D}(A, TexCoords); + vec4 v2 = ${u.texture2D}(B, TexCoords); + vec4 result = ${n.name}(v1, v2); + ${u.output} = result; + } + `;return{name:n.name,inputNames:["A","B"],inputTypes:[o,o],output:{dims:e[0].dims,type:t,textureType:o},shaderSource:l,hasMain:!0}},hp=(r,e)=>[r.run(bt(r,e,N0()),e)],mp=(r,e)=>[r.run(bt(r,e,U0(),"bool"),e)],gp=(r,e)=>[r.run(bt(r,e,z0()),e)],bp=(r,e)=>[r.run(bt(r,e,V0(),"bool"),e)],yp=(r,e)=>[r.run(bt(r,e,F0(),"bool"),e)],_p=(r,e)=>[r.run(bt(r,e,G0(),"bool"),e)],xp=(r,e)=>[r.run(bt(r,e,M0()),e)],wp=(r,e)=>[r.run(bt(r,e,W0(),"bool"),e)],Tp=(r,e)=>[r.run(bt(r,e,q0()),e)],vp=(r,e)=>[r.run(bt(r,e,j0()),e)],Ip=(r,e)=>[r.run(bt(r,e,B0()),e)],Sp=(r,e)=>[r.run(bt(r,e,H0(),"bool"),e)]});var Ap,Pp,J0,Op=$(()=>{"use strict";xe();Ap=(r,e,n)=>(J0(e),[r.cast(e[0],n)]),Pp=r=>je.tensorDataTypeFromProto(r.attributes.getInt("to")),J0=r=>{if(!r||r.length!==1)throw new Error("Cast requires 1 input.");if(r[0].type==="string")throw new Error("Invalid input type.")}});var Q0,Y0,Ep,Ho,Cp=$(()=>{"use strict";Oe();pe();cn();nr();Q0=(r,e)=>({name:"Concat (packed)",inputNames:Array.from({length:r},(n,t)=>`X${t}`),inputTypes:Array(r).fill(2),cacheHint:e}),Y0=(r,e,n,t)=>{let o=n[0].dims.slice();if(t>=o.length||t<-1*o.length)throw new Error("axis specified for concat doesn't match input dimensionality");t<0&&(t=o.length+t);let i=o.slice(0);for(let v=1;vv.dims),d=St(a),p=new Array(c.length-1);p[0]=c[0][t];for(let v=1;v= ${p[v-1]}) { + return getChannel( + getX${v}(${Ho(d,f,I)}), + vec2(${Ho(h,f,I)})); + }`}let g=p.length,b=p[p.length-1];y+=` + return getChannel( + getX${g}(${Ho(d,f,b)}), + vec2(${Ho(h,f,b)}));`;let x=j(r.session.backend.glContext.version),w=` + ${l} + float getValue(${d.map(v=>"int "+v)}) { + ${y} + } + + void main() { + ${u} coords = getOutputCoords(); + int lastDim = coords.${d[a-1]}; + coords.${d[a-1]} = coords.${d[a-2]}; + coords.${d[a-2]} = lastDim; + + vec4 result = vec4(getValue(${s}), 0., 0., 0.); + + ${s[a-1]} = ${s[a-1]} + 1; + if (${s[a-1]} < ${i[a-1]}) { + result.g = getValue(${s}); + } + + ${s[a-2]} = ${s[a-2]} + 1; + if (${s[a-2]} < ${i[a-2]}) { + result.a = getValue(${s}); + } + + ${s[a-1]} = ${s[a-1]} - 1; + if (${s[a-2]} < ${i[a-2]} && + ${s[a-1]} < ${i[a-1]}) { + result.b = getValue(${s}); + } + ${x.output} = result; + } + `;return{...e,output:{dims:i,type:n[0].type,textureType:2},shaderSource:w,hasMain:!0}},Ep=(r,e,n)=>{let t=Q0(e.length,n.cacheKey);return{...t,get:()=>Y0(r,t,e,n.axis)}},Ho=(r,e,n)=>{let t=r.indexOf(e);return r.map((i,a)=>a===t?`${i} - ${n}`:i).join()}});var Dp,eI,tI,nI,kp,rI,oI,iI,Lp,aI,Rp=$(()=>{"use strict";We();pe();Cp();Dp=(r,e,n)=>(aI(e),r.session.pack&&e[0].dims.length>1?[r.run(Ep(r,e,n),e)]:[r.run(nI(r,e,n),e)]),eI=(r,e)=>({name:"Concat",inputNames:Array.from({length:r},(n,t)=>`X${t}`),inputTypes:Array(r).fill(0),cacheHint:e}),tI=(r,e,n,t)=>{let o=n[0].dims.slice();if(t>=o.length||t<-1*o.length)throw new Error("axis specified for concat doesn't match input dimensionality");t<0&&(t=o.length+t);let i=o.slice(0);for(let f=1;f{let t=eI(e.length,n.cacheKey);return{...t,get:()=>tI(r,t,e,n.axis)}},kp=r=>`int getTextureWhereDataResides(int index) { + ${r.map((n,t)=>`if(index<${n}) {return ${t};} +`).join("")} + }`,rI=r=>kp(r),oI=(r,e)=>{let n=[`float fetchDataFromCorrectTexture(int textureIndex, int indices[${e}]) {`];for(let t=0;t{let e=["int getSizeInConcatAxisValueFromIndex(int index) {"];for(let n=0;nle({axis:r.attributes.getInt("axis")}),aI=r=>{if(!r||r.length<1)throw new Error("too few inputs");let e=r[0].type,n=r[0].dims.length;if(e==="string")throw new Error("string tensor is not supported yet");for(let t of r){if(t.type!==e)throw new Error("input tensors should be one type");if(t.dims.length!==n)throw new Error("input tensors should have the same shape")}}});function sI(){return yt("abs")}function uI(){return yt("acos")}function lI(){return yt("asin")}function cI(){return yt("atan")}function dI(){return yt("ceil")}function pI(){return yt("cos")}function fI(r){let e="elu";return{body:` + const float alpha = float(${r}); + + float ${e}_(float a) { + return a >= 0.0 ? a: (exp(a) - 1.0) * alpha; + } + vec4 ${e}_(vec4 v) { + return vec4(${e}_(v.x), ${e}_(v.y), ${e}_(v.z), ${e}_(v.w)); + } + `,name:e,type:0}}function hI(){return yt("exp")}function mI(){return yt("floor")}function iu(r,e){let n="clip";return{body:` + const float min = float(${r}); + const float max = float(${e}); + + float ${n}_(float a) { + return clamp(a, min, max); + } + vec4 ${n}_(vec4 v) { + return clamp(v, min, max); + } + `,name:n,type:0}}function gI(){let r="indentity";return{body:` + float ${r}_(float a) { + return a; + } + vec4 ${r}_(vec4 v) { + return v; + } + `,name:r,type:0}}function bI(r){let e="leakyRelu";return{body:` + const float alpha = float(${r}); + + float ${e}_(float a) { + return a < 0.0 ? a * alpha : a; + } + vec4 ${e}_(vec4 v) { + return vec4(${e}_(v.x), ${e}_(v.y), ${e}_(v.z), ${e}_(v.w)); + } + `,name:e,type:0}}function yI(){return yt("log")}function _I(){let r="neg";return{body:` + float ${r}_(float a) { + return -a; + } + vec4 ${r}_(vec4 v) { + return -v; + } + `,name:r,type:0}}function xI(){let r="not";return{body:` + float ${r}_(float a) { + return float( ! bool(a) ); + } + bool ${r}_(bool a) { + return !a; + } + vec4 ${r}_(vec4 v) { + return vec4(!bool(v.x), !bool(v.y), !bool(v.z), !bool(v.w)); + } + bvec4 ${r}_(bvec4 v) { + return bvec4(!v.x, !v.y, !v.z, !v.w); + } + `,name:r,type:0}}function wI(){return yt("sin")}function au(){let r="relu";return{body:` + float ${r}_(float a) { + return max( a, 0.0 ); + } + vec4 ${r}_(vec4 v) { + return max( v, 0.0 ); + } + `,name:r,type:0}}function su(){let r="sigmoid";return{body:` + float ${r}_(float a) { + return 1.0 / (1.0 + exp(-a)); + } + vec4 ${r}_(vec4 v) { + return 1.0 / (1.0 + exp(-v)); + } + `,name:r,type:0}}function TI(){return yt("sqrt")}function vI(){return yt("tan")}function II(){let r="tanh";return{body:` + float ${r}_(float a) { + a = clamp(a, -10., 10.); + a = exp(2.*a); + return (a - 1.) / (a + 1.); + } + vec4 ${r}_(vec4 v) { + v = clamp(v, -10., 10.); + v = exp(2.*v); + return (v - 1.) / (v + 1.); + } + `,name:r,type:0}}function yt(r){return{body:` + float ${r}_(float a) { + return ${r}(a); + } + vec4 ${r}_(vec4 v) { + return ${r}(v); + } + `,name:r,type:0}}var SI,Re,Np,zp,Mp,Bp,uu,Vp,Fp,$I,Gp,Up,Wp,Hp,qp,jp,lu,Kp,Xp,Zp,Jp,Qp,Yp,ef,tf,nf,rf,of,cu=$(()=>{"use strict";We();xe();$n();Oe();pe();SI=(r,e,n,t)=>{let o=r.session.pack?2:0,i=j(r.session.backend.glContext.version);return{...e,output:{dims:n.dims,type:n.type,textureType:o},shaderSource:` + ${t.body} + void main() { + vec4 v = ${i.texture2D}(A, TexCoords); + v = ${t.name}_(v); + ${i.output} = v; + } + `,hasMain:!0}},Re=(r,e,n,t)=>{let o=r.session.pack?2:0,i={name:n.name,inputTypes:[o],inputNames:["A"],cacheHint:t};return{...i,get:()=>SI(r,i,e,n)}},Np=(r,e)=>[r.run(Re(r,e[0],sI()),e)],zp=(r,e)=>[r.run(Re(r,e[0],uI()),e)],Mp=(r,e)=>[r.run(Re(r,e[0],lI()),e)],Bp=(r,e)=>[r.run(Re(r,e[0],cI()),e)],uu=(r,e,n)=>[r.run(Re(r,e[0],iu(n.min,n.max),n.cacheKey),e)],Vp=r=>le({min:r.attributes.getFloat("min",Yn),max:r.attributes.getFloat("max",er)}),Fp=(r,e)=>{let n=$I(r,e);return uu(r,[e[0]],n)},$I=(r,e)=>{if(e.length>=3&&(!r.session.isInitializer(e[1].dataId)||!r.session.isInitializer(e[2].dataId)))throw new Error("dynamic clip attributes are not allowed");let n=e.length>=3?e[1].numberData[0]:Yn,t=e.length>=3?e[2].numberData[0]:er;return le({min:n,max:t})},Gp=(r,e)=>[r.run(Re(r,e[0],dI()),e)],Up=(r,e)=>[r.run(Re(r,e[0],pI()),e)],Wp=(r,e,n)=>[r.run(Re(r,e[0],fI(n.alpha),n.cacheKey),e)],Hp=r=>le({alpha:r.attributes.getFloat("alpha",1)}),qp=(r,e)=>[r.run(Re(r,e[0],hI()),e)],jp=(r,e)=>[r.run(Re(r,e[0],mI()),e)],lu=(r,e)=>[r.run(Re(r,e[0],gI()),e)],Kp=(r,e,n)=>[r.run(Re(r,e[0],bI(n.alpha),n.cacheKey),e)],Xp=r=>le({alpha:r.attributes.getFloat("alpha",.01)}),Zp=(r,e)=>[r.run(Re(r,e[0],yI()),e)],Jp=(r,e)=>[r.run(Re(r,e[0],_I()),e)],Qp=(r,e)=>[r.run(Re(r,e[0],xI()),e)],Yp=(r,e)=>[r.run(Re(r,e[0],au()),e)],ef=(r,e)=>[r.run(Re(r,e[0],su()),e)],tf=(r,e)=>[r.run(Re(r,e[0],wI()),e)],nf=(r,e)=>[r.run(Re(r,e[0],TI()),e)],rf=(r,e)=>[r.run(Re(r,e[0],vI()),e)],of=(r,e)=>[r.run(Re(r,e[0],II()),e)]});function pn(r){let e;switch(r.activation){case"Relu":e=au();break;case"Sigmoid":e=su();break;case"Clip":e=iu(r.clipMin,r.clipMax);break;default:return{activationFunction:"",applyActivation:""}}let n=e.name,t=e.body,o=`value = ${n}_(value);`;return{activationFunction:t,applyActivation:o}}var wr,rr=$(()=>{"use strict";xe();cu();wr=r=>{let e=r.getString("activation","");if(e==="Clip"){let[n,t]=r.getFloats("activation_params",[Yn,er]);return{activation:e,clipMax:t,clipMin:n,activationCacheKey:`${e}:${n},${t}`}}return{activation:e,activationCacheKey:e}}});var PI,OI,af,sf=$(()=>{"use strict";ct();Oe();pe();qo();rr();PI=(r,e)=>({name:"GroupedConv",inputNames:r?["X","W","Bias"]:["X","W"],inputTypes:r?[0,0,0]:[0,0],cacheHint:e}),OI=(r,e,n,t)=>{let i=e.length>2?"value += getBias(output_channel);":"",a=e[0].dims.slice(),s=e[1].dims.slice(),u=s[0]/t.group;Te.verbose("GroupedConv",`autpPad:${t.autoPad}, dilations:${t.dilations}, group:${t.group}, kernelShape:${t.kernelShape}, pads:${t.pads}, strides:${t.strides}`);let l=Tr(a,s,t.dilations,t.pads,t.strides),c=j(r.session.backend.glContext.version),{activationFunction:d,applyActivation:p}=pn(t),f=` + const ivec2 strides = ivec2(${t.strides[0]}, ${t.strides[1]}); + const ivec2 pads = ivec2(${t.pads[0]}, ${t.pads[1]}); + ${d} + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + int output_channel = coords.y; + ivec2 xRCCorner = coords.zw * strides - pads; + int group_id = output_channel / ${u}; + + float value = 0.0; + for (int wInChannel = 0; wInChannel < ${s[1]}; wInChannel++) { + int input_channel = group_id * ${s[1]} + wInChannel; + for (int wHeight = 0; wHeight < ${s[2]}; wHeight++) { + int xHeight = xRCCorner.x + wHeight * ${t.dilations[0]}; + + if (xHeight < 0 || xHeight >= ${a[2]}) { + continue; + } + + for (int wWidth = 0; wWidth < ${s[3]}; wWidth++) { + int xWidth = xRCCorner.y + wWidth * ${t.dilations[1]}; + if (xWidth < 0 || xWidth >= ${a[3]}) { + continue; + } + + float xVal = getX(batch, input_channel, xWidth, xHeight); + float wVal = getW(output_channel, wInChannel, wWidth, wHeight); + value += xVal*wVal; + } + } + } + ${i} + ${p} + ${c.output} = vec4(value, .0, .0, .0); + } +`;return{...n,output:{dims:l,type:e[0].type,textureType:0},shaderSource:f,hasMain:!0}},af=(r,e,n)=>{let t=PI(e.length>2,n.cacheKey);return{...t,get:()=>OI(r,e,t,n)}}});var EI,CI,uf,lf=$(()=>{"use strict";Oe();pe();nr();EI=r=>({name:"Im2Col (packed)",inputNames:["A"],inputTypes:[2],cacheHint:r}),CI=(r,e,n,t,o,i)=>{let a=n.dims,s=t.dims,u=2,l=3,c=o.length,d=[s[1]*s[2]*s[3],o[2]*o[3]],p=s[2]*s[3],f=dn(),h=j(r.session.backend.glContext.version),m="";for(let g=0;g<=1;g++)for(let b=0;b<=1;b++)m+=` + blockIndex = rc.x + ${b}; + pos = rc.y + ${g}; + + if(blockIndex < ${d[1]} && pos < ${d[0]}) { + offsetY = int(blockIndex / (${o[c-1]})) * ${i.strides[0]} - + ${i.pads[0]}; + d0 = offsetY + ${i.dilations[0]} * (imod(pos, ${p}) / ${s[2]}); + + if(d0 < ${a[u]} && d0 >= 0) { + offsetX = imod(blockIndex, ${o[c-1]}) * ${i.strides[1]} - + ${i.pads[1]}; + d1 = offsetX + ${i.dilations[1]} * imod(imod(pos, ${p}), ${s[2]}); + + if(d1 < ${a[l]} && d1 >= 0) { + + ch = int(float(pos)/ ${p}.); + innerDims = vec2(d0, d1); + result[${g*2+b}] = getChannel( + getA(0, ch, int(innerDims.x), + int(innerDims.y)), innerDims); + } + } + } + + `;let y=` + ${f} + + void main() { + ivec2 rc = getOutputCoords(); + vec4 result = vec4(0.0); + int blockIndex, pos, offsetY, d0, offsetX, d1, ch; + vec2 innerDims; + ${m} + ${h.output} = result; + } + `;return{...e,output:{dims:d,type:n.type,textureType:2},shaderSource:y,hasMain:!0}},uf=(r,e,n,t,o)=>{let i=EI(o.cacheKey);return{...i,get:()=>CI(r,i,e,n,t,o)}}});function kI(r,e,n){let t=e[0].dims,o=e[1].dims,i=Ze.calcShape(t,o,!0);if(!i)throw new Error("Can't use matmul on the given tensors");let a=Je(i.length),s=St(),{activationFunction:u,applyActivation:l}=pn(n),c=e.length>2,d=c?"value += getBiasForMatmul();":"",p=c?`${pu(a,s,e[2].dims,i,!1)}`:"",f=i.length,h=t.length,m=o.length,y=t[t.length-1],g=` + ${u} + ${p} + float process(int indices[${f}]) { + int a[${h}]; + int b[${m}]; + bcastMatmulIndices_A(indices, a); + bcastMatmulIndices_B(indices, b); + + float value; + for (int k=0; k<${y}; ++k) { + a[${h-1}] = k; + b[${m-2}] = k; + value += _A(a) * _B(b); + } + ${d} + ${l} + return value; + }`;return{...r,output:{dims:i,type:e[0].type,textureType:0},shaderSource:g}}function du(r,e){let n=DI(r.length>2,e.activationCacheKey);return{...n,get:()=>kI(n,r,e)}}function pu(r,e,n,t,o){let i="",a=n.length,s=t.length,u=s-a;s<2&&a>0?i="coords":i=n.map((m,y)=>`coords.${e[y+u]}`).join(", ");let c=Ze.getBroadcastDims(n,t).map(m=>`coords.${e[m+u]} = 0;`).join(` +`),p=V.size(n)===1,f="vec4(outputValue.xx, outputValue.yy)";return p&&(f="vec4(outputValue.x)"),o?` +vec4 getBiasForMatmul() { + ${r} coords = getOutputCoords(); + ${c} + vec4 outputValue = getBias(${i}); + return ${f}; +}`:` +float getBiasForMatmul() { + ${r} coords = getOutputCoords(); + ${c} + return getBias(coords.x); +}`}var cf,df,DI,LI,jo=$(()=>{"use strict";xe();pe();cn();rr();fu();cf=(r,e,n)=>(LI(e),r.session.pack?[r.run(Ko(r,e,n),e)]:[r.run(du(e,n),e)]),df=r=>wr(r.attributes),DI=(r,e)=>({name:"MatMul",inputNames:r?["A","B","Bias"]:["A","B"],inputTypes:r?[0,0,0]:[0,0],cacheHint:e});LI=r=>{if(!r||r.length!==2)throw new Error("MatMul requires 2 inputs.");if(r[0].dims[r[0].dims.length-1]!==r[1].dims[r[1].dims.length-2])throw new Error("shared dimension does not match.");if(r[0].type!=="float32"&&r[0].type!=="float64"||r[1].type!=="float32"&&r[1].type!=="float64")throw new Error("inputs should be float type");if(r[0].type!==r[1].type)throw new Error("inputs types should match")}});function zI(r,e,n,t){let o=[],i=[],a=n[0].dims,s=n[1].dims,u=a.length,l=s.length,c=t.length,d=c-u,p=c-l;o=a.map((x,w)=>`coords.${e[w+d]}`),o[u-1]="i*2",o.join(", "),i=s.map((x,w)=>`coords.${e[w+p]}`),i[l-2]="i*2",i.join(", ");let f=Ze.getBroadcastDims(a,t),h=Ze.getBroadcastDims(s,t),m=f.map(x=>`coords.${e[x+d]} = 0;`).join(` +`),y=h.map(x=>`coords.${e[x+p]} = 0;`).join(` +`),g=`int lastDim = coords.${e[c-1]}; + coords.${e[c-1]} = coords.${e[c-2]}; + coords.${e[c-2]} = lastDim;`;return` +vec4 getAAtOutCoordsMatmul(int i) { + ${r} coords = getOutputCoords(); + ${g} + ${m} + vec4 outputValue = getA(${o}); + return outputValue; +} + +vec4 getBAtOutCoordsMatmul(int i) { + ${r} coords = getOutputCoords(); + ${g} + ${y} + vec4 outputValue = getB(${i}); + return outputValue; +}`}function MI(r,e){let n="";for(let t=0;t{"use strict";xe();Oe();pe();cn();rr();jo();RI=(r,e)=>({name:"MatMul (packed)",inputNames:r?["A","B","Bias"]:["A","B"],inputTypes:r?[2,2,2]:[2,2],cacheHint:e}),NI=(r,e,n,t)=>{let o=n.length>2,i=o?"value += getBiasForMatmul();":"",a=n[0].dims,s=n[1].dims,u=Ze.calcShape(a,s,!0),l=!V.areEqual(n[0].dims,n[1].dims);if(!u)throw new Error("Can't use matmul on the given tensors");let c=a[a.length-1],d=Math.ceil(c/2),p=a.length,f=s.length,h=j(r.session.backend.glContext.version),m=Je(u.length),y=u.length,g=St(),{activationFunction:b,applyActivation:x}=pn(t),w=o?`${pu(m,g,n[2].dims,u,!0)}`:"",v=l?`${zI(m,g,n,u)}`:"",I=l?"getAAtOutCoordsMatmul(i)":`getA(${MI(g,p)})`,P=l?"getBAtOutCoordsMatmul(i)":`getB(${BI(g,f)})`,O=l?"":`${m} rc = + getOutputCoords(); int lastDim = rc.${g[y-1]}; rc.${g[y-1]} = + rc.${g[y-2]}; rc.${g[y-2]} = lastDim; + `,E=` + ${v} + ${w} + ${b} + void main() { + ${O} + + vec4 value = vec4(0); + for (int i = 0; i < ${d}; i++) { + vec4 a = ${I}; + vec4 b = ${P}; + + value += (a.rrbb * b.rgrg); + value += (a.ggaa * b.baba); + } + ${i} + ${x} + ${h.output} = value; + }`;return{...e,output:{dims:u,type:n[0].type,textureType:2},shaderSource:E,hasMain:!0}},Ko=(r,e,n)=>{let t=RI(e.length>2,n.activationCacheKey);return{...t,get:()=>NI(r,t,e,n)}}});var pf,ff=$(()=>{"use strict";qo();lf();fu();pf=(r,e,n)=>{let t=e[0].dims,o=e[1].dims,i=Tr(t,o,n.dilations,n.pads,n.strides),a=r.run(uf(r,e[0],e[1],i,n),[e[0]]),s=r.reshapePacked(e[1],[o[0],o[1]*o[2]*o[3]]),u=e.length===3?[s,a,e[2]]:[s,a],l=r.run(Ko(r,u,n),u);return r.reshapePacked(l,i)}});var VI,FI,hf,hu,mu=$(()=>{"use strict";pe();VI=r=>({name:"Im2Col",inputNames:["X"],inputTypes:[0],cacheHint:r}),FI=(r,e,n,t,o,i)=>{let a=n.dims,s=t.dims,u=o.length,l=hu(a,s,o,4),c=` + const int XC = ${a[1]}; + const int XH = ${a[2]}; + const int XW = ${a[3]}; + const int KH = ${i.kernelShape[0]}; + const int KW = ${i.kernelShape[1]}; + const int dilationH = ${i.dilations[0]}; + const int dilationW = ${i.dilations[1]}; + const int strideH = ${i.strides[0]}; + const int strideW = ${i.strides[1]}; + const int padH = ${i.pads[0]}; + const int padW = ${i.pads[1]}; + const int KHKW = KH*KW; + const int XCKHKW = XC * KHKW; + const int outputChannels = 4; + vec4 process(int indices[${u}]) { + int b = indices[0]; // batch size + int oh = indices[1] * strideH - padH; //output height + int ow = indices[2] * strideW - padW; //output width + int p = indices[3] * outputChannels; //patch + vec4 value = vec4(0.0); + for(int i=0; i < outputChannels; ++i) { + if(p < XCKHKW) { + int patchC = p / KHKW; + int patchH = (p - patchC*KHKW) / KW; + int patchW = (p - patchC*KHKW) - patchH * KW; + int xh2 = oh + patchH * dilationH; + int xw2 = ow + patchW * dilationW; + int x[${a.length}]; + x[0] = b; + x[1] = patchC; + x[2] = xh2; + x[3] = xw2; + if(xh2 >= 0 && + xh2 < XH && + xw2 >= 0 && + xw2 < XW) { + value[i] = _X(x); + } + } + ++p; + } + return value; + } + `;return{...e,output:{dims:l,type:n.type,textureType:4},shaderSource:c}},hf=(r,e,n,t,o)=>{let i=VI(o.cacheKey);return{...i,get:()=>FI(r,i,e,n,t,o)}},hu=(r,e,n,t=4)=>[n[0],n[2],n[3],Math.ceil(r[1]*e[2]*e[3]/t)]});var GI,UI,mf,gf=$(()=>{"use strict";xe();Oe();pe();rr();mu();GI=(r,e)=>({name:"ConvDotProduct",inputNames:r?["Im2Col","K","B"]:["Im2Col","K"],inputTypes:r?[0,4,0]:[0,4],cacheKey:e.activationCacheKey}),UI=(r,e,n,t,o)=>{let i=n[0].dims,a=n[1].dims,s=[a[0],Math.ceil(i[1]*a[2]*a[3]/4)],u=hu(i,a,t),[l,c]=r.calculateTextureWidthAndHeight(s,4),d=V.computeStrides(u),[p,f]=r.calculateTextureWidthAndHeight(u,4),h=t.length,m=n.length<3?"0.0":"_B(b)",y=Math.ceil(i[1]*a[2]*a[3]/4),{activationFunction:g,applyActivation:b}=pn(o),x=j(r.session.backend.glContext.version),w=` +${g} +float process(int indices[${h}]) { + int b[1]; + b[0] = indices[1]; + int im2col[4]; + im2col[0] = indices[0]; + im2col[1] = indices[2]; + im2col[2] = indices[3]; + int im2colOffset = im2col[0] * ${d[0]} + im2col[1] * ${d[1]} + im2col[2] * ${d[2]}; + int kernelOffset = indices[1] * ${s[1]}; + float value = ${m}; + for (int i = 0; i < ${y}; ++i) { + vec2 im2colCoords = offsetToCoords(im2colOffset, ${p}, ${f}); + vec2 kernelCoords = offsetToCoords(kernelOffset, ${l}, ${c}); + value += dot(${x.texture2D}(Im2Col, im2colCoords), ${x.texture2D}(K, kernelCoords)); + ++im2colOffset; + ++kernelOffset; + } + ${b} + return value; +}`;return{...e,output:{dims:t,type:n[0].type,textureType:0},shaderSource:w}},mf=(r,e,n,t)=>{let o=GI(e.length>2,t);return{...o,get:()=>UI(r,o,e,n,t)}}});var Tr,gu,WI,HI,qI,jI,bu,KI,qo=$(()=>{"use strict";We();xe();sf();ff();gf();rr();mu();jo();Tr=(r,e,n,t,o)=>{let i=r[0],a=r.slice(2),s=a.length,u=e[0],c=e.slice(2).map((h,m)=>h+(h-1)*(n[m]-1)),p=a.map((h,m)=>h+t[m]+t[m+s]).map((h,m)=>Math.floor((h-c[m]+o[m])/o[m]));return[i,u].concat(...p)},gu=(r,e,n)=>(KI(e,n),WI(r,e,n)),WI=(r,e,n)=>{let t=jI(n,e),o=r.session.pack,i=t.kernelShape[0]===1&&t.kernelShape[1]===1;return t.group>1?[r.run(af(r,e,t),e)]:i&&o?[HI(r,e,t)]:o&&e[0].dims.length===4&&e[0].dims[0]===1&&!i?[pf(r,e,t)]:[qI(r,e,t)]},HI=(r,e,n)=>{let t=e[0].dims,o=e[1].dims,i=Tr(t,o,n.dilations,n.pads,n.strides),a=r.reshapeUnpacked(e[0],[t[1],t[2]*t[3]]),s=r.reshapeUnpacked(e[1],[o[0],o[1]]),u=e.length>2?[s,a,e[2]]:[s,a],l=r.run(du(u,n),u);return r.reshapeUnpacked(l,i)},qI=(r,e,n)=>{let t=e[0].dims,o=e[1].dims,i=Tr(t,o,n.dilations,n.pads,n.strides),a=r.run(hf(r,e[0],e[1],i,n),[e[0]]),s=e.length===3?[a,e[1],e[2]]:[a,e[1]];return r.run(mf(r,e,i,n),s)},jI=(r,e)=>{let n=r.kernelShape.slice();if(r.kernelShape.length===0)for(let i=2;i{let e=r.attributes,n=wr(e),t=e.getString("auto_pad","NOTSET"),o=e.getInts("dilations",[1,1]),i=e.getInt("group",1),a=e.getInts("kernel_shape",[]),s=e.getInts("pads",[0,0,0,0]),u=e.getInts("strides",[1,1]);return le({autoPad:t,dilations:o,group:i,kernelShape:a,pads:s,strides:u,...n})},KI=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length!==4||r[1].dims.length!==4)throw new Error("currently only support 2-dimensional conv");let n=r[0].dims[1],t=r[1].dims[1]*e.group;if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(r.length===3&&(r[2].dims.length!==1||r[1].dims[0]!==r[2].dims[0]))throw new Error("invalid bias");let o=r[0].dims.length-2;if(e.dilations.length!==o)throw new Error(`dilations should be ${o}D`);if(e.strides.length!==o)throw new Error(`strides should be ${o}D`);if(e.pads.length!==o*2)throw new Error(`pads should be ${o*2}D`);if(e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape");if(r[0].type!=="float32"||r[1].type!=="float32")throw new Error("Conv input(X,W) should be float tensor");if(r.length===3&&r[2].type!=="float32")throw new Error("Conv input(bias) should be float tensor")}});var XI,ZI,JI,bf,QI,YI,e2,t2,n2,r2,yf,o2,_f=$(()=>{"use strict";We();Oe();pe();rr();XI=(r,e,n,t,o,i)=>(r-1)*e+n+(t-1)*o+1-i,ZI=(r,e,n,t,o)=>{let i=Math.floor(r/2);e==="SAME_UPPER"?(n[t]=i,n[o]=r-i):e==="SAME_LOWER"&&(n[t]=r-i,n[o]=i)},JI=(r,e,n,t,o,i,a,s)=>{let u=r.length-2,l=s.length===0;for(let c=0;c(o2(e,n),QI(r,e,n)),QI=(r,e,n)=>{let t=r2(n,e);return[n2(r,e,t)]},YI=(r,e)=>({name:"ConvTranspose",inputNames:r?["X","W","B"]:["X","W"],inputTypes:r?[0,0,0]:[0,0],cacheHint:e}),e2=(r,e,n,t)=>{let i=e.length>2?"getB(output_channel)":"0.0",a=e[0].dims,s=e[1].dims,u=s[1],l=s[0]/t.group,c=[e[0].dims[0],e[1].dims[1]*t.group,...t.outputShape],d=j(r.session.backend.glContext.version),{activationFunction:p,applyActivation:f}=pn(t),h=` + const ivec2 strides = ivec2(${t.strides[0]}, ${t.strides[1]}); + const ivec2 pads = ivec2(${t.pads[0]}, ${t.pads[1]}); + ${p} + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + int output_channel = coords.y; + + ivec2 loc = coords.zw + pads; + + int group_id = output_channel / ${u}; + int wOutChannel = output_channel - group_id * ${u}; + + float value = ${i}; + for (int inChannelOffset = 0; inChannelOffset < ${l}; inChannelOffset++) { + int input_channel = group_id * ${l} + inChannelOffset; + for (int wWOff = 0; wWOff < ${s[2]}; wWOff++) { + for (int wHOff = 0; wHOff < ${s[3]}; wHOff++) { + ivec2 wOff = ivec2(wWOff * ${t.dilations[0]}, wHOff * ${t.dilations[1]}); + ivec2 wLoc = loc - wOff; + ivec2 wLocIn = wLoc / strides; + if ( + wLocIn * strides == wLoc && + wLocIn.x >= 0 && wLocIn.x < ${a[2]} && + wLocIn.y >= 0 && wLocIn.y < ${a[3]} + ) { + float xVal = getX(batch, input_channel, wLocIn.y, wLocIn.x); + float wVal = getW(input_channel, wOutChannel, wHOff, wWOff); + value += xVal * wVal; + } + } + } + } + ${f} + ${d.output} = vec4(value, .0, .0, .0); + } +`;return{...n,output:{dims:c,type:e[0].type,textureType:0},shaderSource:h,hasMain:!0}},t2=(r,e,n)=>{let t=YI(e.length>2,n.cacheKey);return{...t,get:()=>e2(r,e,t,n)}},n2=(r,e,n)=>r.run(t2(r,e,n),e),r2=(r,e)=>{let n=r.kernelShape.slice();if(r.kernelShape.length===0)for(let s=2;s{let e=r.attributes,n=wr(e),t=e.getString("auto_pad","NOTSET"),o=e.getInts("dilations",[1,1]),i=e.getInt("group",1),a=e.getInts("kernel_shape",[]),s=e.getInts("output_padding",[0,0]),u=e.getInts("output_shape",[]),l=e.getInts("pads",[0,0,0,0]),c=e.getInts("strides",[1,1]);return le({autoPad:t,dilations:o,group:i,kernelShape:a,outputPadding:s,outputShape:u,pads:l,strides:c,...n})},o2=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length!==4||r[1].dims.length!==4)throw new Error("currently only support 2-dimensional conv");let n=r[0].dims[1],t=r[1].dims[0];if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let o=r[1].dims[1]*e.group;if(r.length===3&&(r[2].dims.length!==1||r[2].dims[0]!==o))throw new Error("invalid bias");let i=r[0].dims.length-2;if(e.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(e.strides.length!==i)throw new Error(`strides should be ${i}D`);if(e.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(e.outputPadding.length!==i)throw new Error(`output_padding should be ${i}D`);if(e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape");if(e.outputShape.length!==0&&e.outputShape.length!==r[0].dims.length-2)throw new Error("invalid output shape");if(r[0].type!=="float32"||r[1].type!=="float32")throw new Error("ConvTranspose input(X,W) should be float tensor");if(r.length===3&&r[2].type!=="float32")throw new Error("ConvTranspose input(bias) should be float tensor")}});var xf,or,wf,i2,Tf,a2,s2,u2,Xo=$(()=>{"use strict";We();xe();pe();xf={name:"Transpose",inputNames:["A"],inputTypes:[0]},or=(r,e,n)=>(u2(e),[r.run({...xf,cacheHint:n.cacheKey,get:()=>i2(r,e[0],n.perm)},e)]),wf=r=>le({perm:r.attributes.getInts("perm",[])}),i2=(r,e,n)=>{let t=e.dims;n=Tf(t,n);let o=a2(t,n),i=t.length,a=` + ${s2("perm",n,i)} + float process(int indices[${i}]) { + int a[${i}]; + perm(a, indices); + return _A(a); + }`;return{...xf,output:{dims:o,type:e.type,textureType:0},shaderSource:a}},Tf=(r,e)=>(e&&e.length!==r.length&&(e=[...r.keys()].reverse()),e),a2=(r,e)=>(e=Tf(r,e),V.sortBasedOnPerm(r,e)),s2=(r,e,n)=>{let t=[];t.push(`void ${r}(out int a[${n}], int src[${n}]) {`);for(let o=0;o{if(!r||r.length!==1)throw new Error("Transpose requires 1 input.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("input should be float tensor")}});var vf,If,l2,Sf=$(()=>{"use strict";Xo();vf=(r,e,n)=>{l2(e);let t=n.blocksize,o=t*t,i=n.mode==="DCR"?[0,3,4,1,5,2]:[0,1,4,2,5,3],a=n.mode==="DCR"?[e[0].dims[0],t,t,e[0].dims[1]/o,e[0].dims[2],e[0].dims[3]]:[e[0].dims[0],e[0].dims[1]/o,t,t,e[0].dims[2],e[0].dims[3]],s=r.reshapeUnpacked(e[0],a),u={perm:i,cacheKey:`${i}`},[l]=or(r,[s],u),c=[e[0].dims[0],e[0].dims[1]/o,e[0].dims[2]*t,e[0].dims[3]*t];return[r.reshapeUnpacked(l,c)]},If=r=>{let e=r.attributes.getInt("blocksize");if(e<1)throw new Error(`blocksize must be >= 1, but got : ${e} for DepthToSpace`);let n=r.attributes.getString("mode","DCR");if(n!=="DCR"&&n!=="CRD")throw new Error(`unrecognized mode: ${n} for DepthToSpace`);return{mode:n,blocksize:e}},l2=r=>{if(r.length!==1)throw new Error(`DepthToSpace expect 1 inputs, but got ${r.length}`);if(r[0].type==="string"||r[0].dims.length!==4)throw new TypeError("DepthToSpace input should be a 4-D numeric tensor")}});var $f,Af,c2,Pf=$(()=>{"use strict";xe();$f=(r,e,n)=>{c2(e,n);let t=V.flattenShape(e[0].dims,n);return[r.reshapeUnpacked(e[0],t)]},Af=r=>r.attributes.getInt("axis",1),c2=(r,e)=>{if(!r||r.length!==1)throw new Error("Flatten requires 1 input.");let n=r[0].dims.length;if(n===0)throw new Error("scalar tensor is not supported.");if(e<-n||e>n)throw new Error("Invalid axis");if(r[0].type==="string")throw new Error("string tensor is not supported.")}});var Nn,Kr=$(()=>{"use strict";Nn=["float32","float64","int32","int16","int8","uint16","uint32","uint8"]});var Of,Ef,d2,p2,f2,h2,Cf=$(()=>{"use strict";We();Kr();xe();pe();Of=(r,e,n)=>(h2(e,n.axis),[r.run(f2(r,e,n),e)]),Ef=r=>le({axis:r.attributes.getInt("axis",0)}),d2={name:"Gather",inputNames:["A","B"],inputTypes:[0,0]},p2=(r,e,n,t)=>{let o=n[0].dims.slice(),i=n[1].dims.slice(),a=new Array(o.length+i.length-1);t=V.normalizeAxis(t,o.length);let s=[];for(let p=0;p{let t={...d2,cacheHint:n.cacheKey};return{...t,get:()=>p2(r,t,e,n.axis)}},h2=(r,e)=>{if(!r||r.length!==2)throw new Error("Gather requires 2 inputs.");let n=r[0].dims.length;if(n<1)throw new Error("Invalid input shape.");if(e<-n||e>n-1)throw new Error("Invalid axis.");if(Nn.indexOf(r[0].type)===-1)throw new Error("Invaid input type.");if(r[1].type!=="int32"&&r[1].type!=="int16")throw new Error("Invaid input type.")}});var yu,Df,kf,Lf,m2,g2,b2,Rf=$(()=>{"use strict";We();xe();pe();yu=(r,e,n)=>(b2(e,n),[r.run(m2(e,n),e)]),Df=(r,e)=>{let n=r.attributes.getInt("transA",0)!==0,t=r.attributes.getInt("transB",0)!==0,o=r.attributes.getFloat("alpha",1),i=r.attributes.getFloat("beta",1);return le({transA:n,transB:t,alpha:o,beta:i,isOptionalC:e})},kf=r=>Df(r,!1),Lf=r=>Df(r,!0),m2=(r,e)=>{let n={name:"Gemm",inputNames:r.length===3?["A","B","C"]:["A","B"],inputTypes:r.length===3?[0,0,0]:[0,0],key:e.cacheKey};return{...n,get:()=>g2(n,r,e)}},g2=(r,e,n)=>{let t=e[0].dims.slice(),o=e[1].dims.slice(),[i,a]=Mo.getShapeOfGemmResult(t,n.transA,o,n.transB,e.length===3?e[2].dims:void 0),s=[i,a];if(!s)throw new Error("Can't use gemm on the given tensors");let u=t[t.length-1],l="";n.transA&&(u=t[0]),n.transA&&n.transB?l="value += _A_T(a) * _B_T(b);":n.transA&&!n.transB?l="value += _A_T(a) * _B(b);":!n.transA&&n.transB?l="value += _A(a) * _B_T(b);":!n.transA&&!n.transB&&(l="value += _A(a) * _B(b);");let c=s.length,d=e.length===3?`int c[${e[2].dims.length}];`:"",p=e.length===3?"bcastIndices_C(indices, c);":"",f=e.length===3?"value += beta * _C(c);":"",h=` + float process(int indices[${c}]) { + int a[${c}]; + int b[${c}]; + ${d} + + copyVec(indices, a); + copyVec(indices, b); + ${p} + + float value = 0.0; + for (int k=0; k<${u}; ++k) { + a[${c-1}] = k; + b[${c-2}] = k; + ${l} + } + + value = value * alpha; + ${f} + return value; + }`;return{...r,output:{dims:s,type:e[0].type,textureType:0},variables:[{name:"alpha",type:"float",data:n.alpha},{name:"beta",type:"float",data:n.beta}],shaderSource:h}},b2=(r,e)=>{if(!r)throw new Error("Input is missing");if(e.isOptionalC&&(r.length<2||r.length>3))throw new Error("Invaid input shape.");if(!e.isOptionalC&&r.length!==3)throw new Error("Gemm requires 3 inputs");if(r.length===3&&r[2].dims.length!==1&&r[2].dims.length!==2)throw new Error("Invalid input shape of C");if(r[0].type!=="float32"&&r[0].type!=="float64"||r[1].type!=="float32"&&r[1].type!=="float64"||r.length===3&&r[2].type!=="float32"&&r[2].type!=="float64")throw new Error("Invalid input type.");if(r[0].type!==r[1].type||r.length===3&&r[0].type!==r[2].type)throw new Error("Input types are mismatched")}});var Nf,zf,y2,_2,x2,w2,T2,Mf=$(()=>{"use strict";We();pe();Nf=(r,e,n)=>(T2(e),[r.run(x2(r,e,n),e)]),zf=r=>{let e=r.attributes.getFloat("scale"),n=r.attributes.getFloats("bias");return le({scale:e,bias:n})},y2={name:"ImageScaler",inputNames:["X"],inputTypes:[0]},_2=(r,e,n,t)=>{let o=n[0].dims.slice(),i=o.length,s=` + ${w2(t.bias.length)} + float process(int indices[${i}]) { + return _X(indices) * scale + getBias(bias, indices[1]); + }`;return{...e,output:{dims:o,type:n[0].type,textureType:0},variables:[{name:"bias",type:"float",arrayLength:t.bias.length,data:t.bias},{name:"scale",type:"float",data:t.scale}],shaderSource:s}},x2=(r,e,n)=>{let t={...y2,cacheHint:n.cacheKey};return{...t,get:()=>_2(r,t,e,n)}},w2=r=>{let e=[`float getBias(float bias[${r}], int channel) {`];for(let n=0;n{if(!r||r.length!==1)throw new Error("ImageScaler requires 1 input.");if(r[0].dims.length!==4)throw new Error("Invalid input shape.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type.")}});var Vf,Ff,Bf,v2,I2,S2,$2,A2,P2,Gf=$(()=>{"use strict";Oe();pe();Vf=(r,e,n)=>{P2(e);let t=r.run(I2(e[0]),e);return[r.run(A2(r,e[0],n,t.dims),[e[0],t,e[1],e[2]])]},Ff=r=>r.attributes.getFloat("epsilon",1e-5),Bf={name:"InstanceNormalization_MeanAndVariance",inputNames:["X"],inputTypes:[0]},v2=(r,e)=>{let n=e.dims.slice(),t=n[1],o=n[2]*n[3],i=[n[0],t],a=` + vec4 process(int[2] indices) { + vec4 v = vec4(0.0); + int a[4]; + a[0] = indices[0]; + a[1] = indices[1]; + float temp = 0.0; + for(int a2=0; a2<${n[2]}; a2++) { + a[2] = a2; + for(int a3=0; a3<${n[3]}; a3++) { + a[3] = a3; + float x = _X(a); + temp += x; + } + } + float mean = temp / float(${o}); + temp = 0.0; + for(int a2=0; a2<${n[2]}; a2++) { + a[2] = a2; + for(int a3=0; a3<${n[3]}; a3++) { + a[3] = a3; + float x = _X(a); + temp += (x - mean) * (x - mean); + } + } + v.r = mean; + v.g = temp / float(${o}); + + return v; + }`;return{...r,output:{dims:i,type:e.type,textureType:4},shaderSource:a}},I2=r=>({...Bf,get:()=>v2(Bf,r)}),S2={name:"InstanceNormalization_ComputeOutput",inputNames:["X","MeanAndVariance","Scale","B"],inputTypes:[0,4,0,0]},$2=(r,e,n,t,o)=>{let i=j(r.session.backend.glContext.version),[a,s]=r.calculateTextureWidthAndHeight(o,4),[u,l]=[a/4,s],c=` + vec4 get_MeanAndVariance(int[2] mv) { + int offset = indicesToOffset_MeanAndVariance(mv); + vec2 coords = offsetToCoords(offset, ${u}, ${l}); + return ${i.texture2D}(MeanAndVariance, coords); + } + + float process(int[4] indices) { + int mv[2]; + mv[0] = indices[0]; + mv[1] = indices[1]; + vec4 mean_and_variance = get_MeanAndVariance(mv); + float mean = mean_and_variance.r; + float variance = mean_and_variance.g; + + int sb[1]; + sb[0] = indices[1]; + float scale = _Scale(sb); + float b = _B(sb); + + return scale * (_X(indices) - mean) / sqrt(variance + epsilon) + b; + }`;return{...e,output:{dims:n.dims,type:n.type,textureType:0},variables:[{name:"epsilon",type:"float",data:t}],shaderSource:c}},A2=(r,e,n,t)=>{let o={...S2,cacheHint:`${n}`};return{...o,get:()=>$2(r,o,e,n,t)}},P2=r=>{if(!r||r.length!==3)throw new Error("InstanceNormalization requires 3 inputs.");let e=r[0],n=r[1],t=r[2];if(e.dims.length<3||n.dims.length!==1||t.dims.length!==1)throw new Error("Invalid input shape.");if(n.dims[0]!==e.dims[1]||t.dims[0]!==e.dims[1])throw new Error("Input shapes are mismatched.");if(e.type!=="float32"&&e.type!=="float64"||n.type!=="float32"&&n.type!=="float64"||t.type!=="float32"&&t.type!=="float64")throw new Error("Invalid input type.");if(r[0].dims.length!==4)throw new Error("Only support 4-D input shape.")}});function O2(r,e){let n=r[0].dims[1],t=r[0].dims.length,o=-Math.floor((e.size-1)/2),i=Math.ceil((e.size-1)/2),a=`float(${e.alpha}) / float(${e.size})`,s=`float(${e.bias})`,u=`float(${e.beta})`,l=` + float process(int indices[${t}]) { + int c = indices[1]; + float x = _X(indices); + float square_sum = 0.0; + + for (int i = ${o}; i <= ${i}; i++) { + int idx = c + i; + if (c >= 0 && c < ${n}) { + indices[1] = idx; + float j = _X(indices); + square_sum += j * j; + } + } + return x / pow(${s} + ${a} * square_sum, ${u}); + }`;return{...Hf,cacheHint:e.cacheKey,output:{dims:r[0].dims,type:r[0].type,textureType:0},shaderSource:l}}function E2(r,e){return{...Hf,cacheHint:e.cacheKey,get:()=>O2(r,e)}}var Uf,Wf,Hf,C2,qf=$(()=>{"use strict";We();pe();Uf=(r,e,n)=>(C2(e),[r.run(E2(e,n),e)]),Wf=r=>{let e=r.attributes.getFloat("alpha",1e-4),n=r.attributes.getFloat("beta",.75),t=r.attributes.getFloat("bias",1),o=r.attributes.getInt("size");return le({alpha:e,beta:n,bias:t,size:o})},Hf={name:"LRN",inputNames:["X"],inputTypes:[0]};C2=r=>{if(!r||r.length!==1)throw new Error("LRN requires 1 input.");if(r[0].dims.length!==4)throw new Error('currently only support LRN for input with "NCHW" format');if(r[0].type!=="float32")throw new Error("input should be float type")}});var D2,_u,jf,Kf,Xf,k2,L2,R2,N2,z2,M2,B2,V2,Zf=$(()=>{"use strict";We();xe();Oe();pe();D2={name:"Pad",inputNames:["A"],inputTypes:[0]},_u=(r,e,n)=>(R2(e),[r.run({...D2,cacheHint:n.cacheKey,get:()=>L2(r,e[0],n)},e)]),jf=r=>{let e=r.attributes.getString("mode","constant"),n=r.attributes.getFloat("value",0),t=r.attributes.getInts("pads");return le({mode:e,value:n,pads:t})},Kf=(r,e,n)=>{N2(e);let t=k2(r,e,n);return _u(r,[e[0]],t)},Xf=r=>r.attributes.getString("mode","constant"),k2=(r,e,n)=>{if(!r.session.isInitializer(e[1].dataId)||e.length>=3&&!r.session.isInitializer(e[2].dataId))throw new Error("dynamic pad attributes are not allowed");let t=Array.from(e[1].integerData),o=e.length>=3?e[2].floatData[0]:0;return le({mode:n,pads:t,value:o})},L2=(r,e,n)=>{let t=V.padShape(e.dims.slice(),n.pads),o=t.length,a=` + ${z2(r,e,n)} + float process(int[${o}] indices) { + return padA(indices); + }`;return{name:"Pad",inputNames:["A"],inputTypes:[0],output:{dims:t,type:e.type,textureType:0},shaderSource:a}},R2=r=>{if(!r||r.length!==1)throw new Error("Pad requires 1 input");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type.")},N2=r=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Pad requires 2 or 3 inputs");if(r[1].type!=="int32")throw new Error("Invalid input type.");if(r.length>=3&&r[2].type==="string")throw new Error("Invalid input type.")},z2=(r,e,n)=>{let t=j(r.session.backend.glContext.version),[o,i]=r.calculateTextureWidthAndHeight(e.dims,0),a=V.computeStrides(e.dims);switch(n.mode){case"constant":return M2(t,e.dims,a,o,i,n.pads,n.value);case"reflect":return B2(t,e.dims,a,o,i,n.pads);case"edge":return V2(t,e.dims,a,o,i,n.pads);default:throw new Error("Invalid mode")}},M2=(r,e,n,t,o,i,a)=>{let s=e.length,u="";for(let l=s-1;l>=0;--l)u+=` + k = m[${l}] - ${i[l]}; + if (k < 0) return constant; + if (k >= ${e[l]}) return constant; + offset += k * ${n[l]}; + `;return` + float padA(int m[${s}]) { + const float constant = float(${a}); + int offset = 0; + int k = 0; + ${u} + vec2 coords = offsetToCoords(offset, ${t}, ${o}); + float value = getColorAsFloat(${r.texture2D}(A, coords)); + return value; + } + `},B2=(r,e,n,t,o,i)=>{let a=e.length,s="";for(let u=a-1;u>=0;--u)s+=` + k = m[${u}] - ${i[u]}; + if (k < 0) { k = -k; } + { + const int _2n_1 = ${2*(e[u]-1)}; + k = int( mod( float(k), float(_2n_1) ) ) ; + if(k >= ${e[u]}) { k = _2n_1 - k; } + } + offset += k * ${n[u]}; + `;return` + float padA(int m[${a}]) { + int offset = 0; + int k = 0; + ${s} + vec2 coords = offsetToCoords(offset, ${t}, ${o}); + float value = getColorAsFloat(${r.texture2D}(A, coords)); + return value; + } + `},V2=(r,e,n,t,o,i)=>{let a=e.length,s="";for(let u=a-1;u>=0;--u)s+=` + k = m[${u}] - ${i[u]}; + if (k < 0) k = 0; + if (k >= ${e[u]}) k = ${e[u]-1}; + offset += k * ${n[u]}; + `;return` + float padA(int m[${a}]) { + int offset = 0; + int k = 0; + ${s} + vec2 coords = offsetToCoords(offset, ${t}, ${o}); + float value = getColorAsFloat(${r.texture2D}(A, coords)); + return value; + } + `}});var Qf,Yf,eh,th,nh,rh,oh,ih,ah,F2,Jf,sh,Jo,uh,Zo,G2,lh=$(()=>{"use strict";We();xe();pe();Qf=(r,e,n)=>{Jo(e);let t={name:"AveragePool",inputNames:["X"],inputTypes:[0],cacheHint:n.cacheKey};return[r.run({...t,get:()=>eh(e,t,!1,n)},e)]},Yf=r=>{let e=r.attributes.getString("auto_pad","NOTSET"),n=r.attributes.getInt("ceil_mode",0),t=r.attributes.getInt("count_include_pad",0)!==0,o=r.attributes.getInts("kernel_shape"),i=r.attributes.getInts("strides",[]),a=r.attributes.getInts("pads",[]);if(n!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");return le({autoPad:e,ceilMode:n,countIncludePad:t,kernelShape:o,strides:i,pads:a})},eh=(r,e,n,t)=>{let[o,i]=ah(r,t,n),a=V.size(o.kernelShape),s="value += _X(x);",u="";o.countIncludePad?u+=`value /= float(${a});`:u+=`value /= float(${a} - pad);`;let c=` + ${uh(r[0].dims,o,s,u,"0.0")} + `;return{...e,output:{dims:i,type:r[0].type,textureType:0},shaderSource:c}},th=(r,e,n)=>{Jo(e);let t={name:"GlobalAveragePool",inputNames:["X"],inputTypes:[0],cacheHint:`${n.countIncludePad}`};return[r.run({...t,get:()=>eh(e,t,!0,n)},e)]},nh=r=>{let e=r.attributes.getInt("count_include_pad",0)!==0;return le({autoPad:"",ceilMode:0,countIncludePad:e,kernelShape:[],strides:[],pads:[]})},rh=(r,e,n)=>{Jo(e);let t={name:"MaxPool",inputNames:["X"],inputTypes:[0],cacheHint:n.cacheKey};return[r.run({...t,get:()=>ih(e,t,!1,n)},e)]},oh=r=>{let e=r.attributes.getString("auto_pad","NOTSET"),n=r.attributes.getInt("ceil_mode",0),t=r.attributes.getInts("kernel_shape"),o=r.attributes.getInts("strides",[]),i=r.attributes.getInts("pads",[]),a=r.attributes.getInt("storage_order",0),s=r.attributes.getInts("dilations",[]);if(a!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(n!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");return le({autoPad:e,ceilMode:n,countIncludePad:!1,kernelShape:t,strides:o,pads:i,storageOrder:a,dilations:s})},ih=(r,e,n,t)=>{let[o,i]=ah(r,t,n),l=` + ${uh(r[0].dims,o,` + value = max(_X(x), value); + `,"","-1e5")} + `;return{...e,output:{dims:i,type:r[0].type,textureType:0},shaderSource:l}},ah=(r,e,n)=>{let t=r[0].dims.slice(),o=Object.hasOwnProperty.call(e,"dilations"),i=e.kernelShape.slice(),a=e.strides.slice(),s=o?e.dilations.slice():[],u=e.pads.slice();Qn.adjustPoolAttributes(n,t,i,a,s,u);let l=Qn.computePoolOutputShape(n,t,a,s,i,u,e.autoPad),c=Object.assign({},e);return o?Object.assign(c,{kernelShape:i,strides:a,pads:u,dilations:s,cacheKey:e.cacheKey}):Object.assign(c,{kernelShape:i,strides:a,pads:u,cacheKey:e.cacheKey}),[c,l]},F2={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[],cacheKey:""},Jf={name:"GlobalMaxPool",inputNames:["X"],inputTypes:[0]},sh=(r,e)=>(Jo(e),[r.run({...Jf,get:()=>ih(e,Jf,!0,F2)},e)]),Jo=r=>{if(!r||r.length!==1)throw new Error("Pool ops requires 1 input.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type.")},uh=(r,e,n,t,o)=>{let i=r.length;if(e.kernelShape.length<=2){let a=e.kernelShape[e.kernelShape.length-1],s=e.strides[e.strides.length-1],u=e.pads[e.pads.length/2-1],l=e.pads[e.pads.length-1],c=r[i-1],d="",p="",f="";if(u+l!==0?d=` + for (int i = 0; i < ${a}; i++) { + x[${i} - 1] = indices[${i} - 1] * ${s} - ${u} + i; + if (x[${i} - 1] < 0 || x[${i} - 1] >= ${c}) { + pad++; + continue; + } + ${n} + }`:d=` + for (int i = 0; i < ${a}; i++) { + x[${i} - 1] = indices[${i} - 1] * ${s} - ${u} + i; + ${n} + }`,e.kernelShape.length===2){let m=e.kernelShape[e.kernelShape.length-2],y=e.strides[e.strides.length-2],g=e.pads[e.pads.length/2-2],b=e.pads[e.pads.length-2],x=r[i-2];g+b!==0?p=` + for (int j = 0; j < ${m}; j++) { + x[${i} - 2] = indices[${i} - 2] * ${y} - ${g} + j; + if (x[${i} - 2] < 0 || x[${i} - 2] >= ${x}) { + pad+= ${a}; + continue; + } + `:p=` + for (int j = 0; j < ${m}; j++) { + x[${i} - 2] = indices[${i} - 2] * ${y} - ${g} + j; + `,f=` + } + `}return` + float process(int indices[${i}]) { + int x[${i}]; + copyVec(indices, x); + + float value = ${o}; + int pad = 0; + ${p} + ${d} + ${f} + ${t} + return value; + } + `}else{let a=V.size(e.kernelShape),s=V.computeStrides(e.kernelShape),u=s.length,l=e.pads.length,c=G2(u),d=Zo(r,"inputDims"),p=Zo(e.pads,"pads"),f=Zo(s,"kernelStrides"),h=Zo(e.strides,"strides"),m=e.pads.reduce((b,x)=>b+x),y="";return m?y=` + if (x[j] >= inputDims[j] || x[j] < 0) { + pad++; + isPad = true; + break; + } + } + if (!isPad) { + ${n} + }`:y=` + } + ${n} + `,` + ${c} + float process(int indices[${i}]) { + int x[${i}]; + copyVec(indices, x); + int offset[${u}]; + int pads[${l}]; + int inputDims[${i}]; + int kernelStrides[${u}]; + int strides[${u}]; + ${p} + ${d} + ${h} + ${f} + + float value = ${o}; + int pad = 0; + bool isPad = false; + for (int i = 0; i < ${a}; i++) { + offsetToIndices(i, kernelStrides, offset); + isPad = false; + for (int j = ${i} - ${u}; j < ${i}; j++) { + x[j] = indices[j] * strides[j - ${i} + ${u}] + + offset[j - ${i} + ${u}] - pads[j - 2]; + ${y} + } + ${t} + + return value; + } + `}},Zo=(r,e)=>{let n="";for(let t=0;t` + void offsetToIndices(int offset, int[${r}] strides, out int[${r}] indices) { + if (${r} == 0) { + return; + } + for (int i = 0; i < ${r} - 1; ++i) { + indices[i] = offset / strides[i]; + offset -= indices[i] * strides[i]; + } + indices[${r} - 1] = offset; + }`});var ir,zn,U2,W2,ch,dh,ph,fh,hh,mh,gh,bh=$(()=>{"use strict";We();Kr();xe();pe();ir=(r,e,n,t,o)=>{W2(e);let i={name:t,inputNames:["A"],inputTypes:[0]};return[r.run({...i,cacheHint:n.cacheKey,get:()=>U2(r,e,n,t,o,i)},e)]},zn=r=>{let e=r.attributes.getInts("axes",[]),n=r.attributes.getInt("keepdims",1)===1;return le({axes:e,keepDims:n})},U2=(r,e,n,t,o,i)=>{let a=[],s=e[0].dims.length||1,u=[],l=V.normalizeAxes(n.axes,e[0].dims.length),c=o(e,l),d=c[1];for(let h=0;h=0||l.length===0?(n.keepDims&&a.push(1),d=` + for(int j${h} = 0; j${h} < ${e[0].dims[h]}; j${h}++) { + inputIdx[${h}] = j${h}; + ${d} + }`):(u.push(`inputIdx[${h}] = outputIdx[${a.length}];`),a.push(e[0].dims[h]));let f=` + float process(int outputIdx[${a.length||1}]) { + float value; // final result + int inputIdx[${s}]; // addressing input data + ${u.join(` +`)} + ${c[0]} // init ops for reduce max/min + ${d} + ${c[2]} // final computation for reduce mean + return value; + }`;return{...i,output:{dims:a,type:e[0].type,textureType:0},shaderSource:f}},W2=r=>{if(!r||r.length!==1)throw new Error("Reduce op requires 1 input.");if(Nn.indexOf(r[0].type)===-1)throw new Error("Invalid input type.")},ch=(r,e,n)=>ir(r,e,n,"ReduceSum",()=>["value = 0.0;","value += _A(inputIdx);",""]),dh=(r,e,n)=>ir(r,e,n,"ReduceMean",(o,i)=>{let a=1;for(let s=0;s=0||i.length===0)&&(a*=o[0].dims[s]);return["value = 0.0;","value += _A(inputIdx);",`value /= ${a}.;`]}),ph=(r,e,n)=>ir(r,e,n,"ReduceMax",(o,i)=>{let a=[];for(let s=0;s=0||i.length===0)&&a.push(`inputIdx[${s}] = 0;`);return[`${a.join(` +`)} +value = _A(inputIdx);`,"value = max(value, _A(inputIdx));",""]}),fh=(r,e,n)=>ir(r,e,n,"ReduceMin",(o,i)=>{let a=[];for(let s=0;s=0||i.length===0)&&a.push(`inputIdx[${s}] = 0;`);return[`${a.join(` +`)} +value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),hh=(r,e,n)=>ir(r,e,n,"ReduceProd",()=>["value = 1.0;","value *= _A(inputIdx);",""]),mh=(r,e,n)=>ir(r,e,n,"ReduceLogSum",()=>["value = 0.0;","value += _A(inputIdx);","value = log(value);"]),gh=(r,e,n)=>ir(r,e,n,"ReduceLogSumSquare",()=>["float t; value = 0.0;","t = _A(inputIdx); value += t * t;",""])});var yh,_h=$(()=>{"use strict";xe();yh=(r,e)=>{let n=V.calculateReshapedDims(e[0].dims,e[1].integerData);return r.session.pack?[r.reshapePacked(e[0],n)]:[r.reshapeUnpacked(e[0],n)]}});var xh,xu,wh,Th,Xr,H2,wu,Qo,Tu=$(()=>{"use strict";We();Oe();pe();xh={name:"Upsample",inputNames:["X"],inputTypes:[0]},xu=(r,e,n)=>(wu(e,n),[r.run({...xh,cacheHint:n.cacheKey,get:()=>H2(r,e,n)},e)]),wh=r=>Xr(r,7),Th=r=>Xr(r,9),Xr=(r,e)=>{let n=e>=10,t=r.attributes.getString("mode","nearest");if(t!=="nearest"&&t!=="linear"&&(e<11||t!=="cubic"))throw new Error(`unrecognized mode: ${t}`);let o=[];e<9&&(o=r.attributes.getFloats("scales"),Qo(o,t,n));let i=r.attributes.getFloat("extrapolation_value",0),a=e>10?r.attributes.getString("coordinate_transformation_mode","half_pixel"):"asymmetric";if(["asymmetric","pytorch_half_pixel","tf_half_pixel_for_nn","align_corners","tf_crop_and_resize","half_pixel"].indexOf(a)===-1)throw new Error(`coordinate_transform_mode '${a}' is not supported`);let s=a==="tf_crop_and_resize",u=s,l=t==="nearest"&&e>=11?r.attributes.getString("nearest_mode","round_prefer_floor"):"";if(["round_prefer_floor","round_prefer_ceil","floor","ceil",""].indexOf(l)===-1)throw new Error(`nearest_mode '${l}' is not supported`);let c=r.attributes.getFloat("cubic_coeff_a",-.75),d=r.attributes.getInt("exclude_outside",0)!==0;if(d&&t!=="cubic")throw new Error("exclude_outside can be set to 1 only when mode is CUBIC.");let p=e<11?!0:t==="nearest"&&a==="asymmetric"&&l==="floor",f=0,h=0,m=0;return e>10?r.inputs.length>2?(f=1,h=2,m=3):(h=1,m=2):e===9&&(h=1),le({opset:e,isResize:n,mode:t,scales:o,extrapolationValue:i,coordinateTransformMode:a,useExtrapolation:u,needRoiInput:s,nearestMode:l,cubicCoefficientA:c,excludeOutside:d,useNearest2xOptimization:p,roiInputIdx:f,scalesInputIdx:h,sizesInputIdx:m})},H2=(r,e,n)=>{let t=j(r.session.backend.glContext.version),[o,i]=r.calculateTextureWidthAndHeight(e[0].dims,0),a=e[0].dims.map((m,y)=>Math.floor(m*n.scales[y])),[s,u]=r.calculateTextureWidthAndHeight(a,0),l=a.length,c=new Array(l),d=new Array(l),p=` + int output_pitches[${l}]; + int input_pitches[${l}]; + `;for(let m=l-1;m>=0;m--)c[m]=m===l-1?1:c[m+1]*a[m+1],d[m]=m===l-1?1:d[m+1]*e[0].dims[m+1],p+=` + output_pitches[${m}] = ${c[m]}; + input_pitches[${m}] = ${d[m]}; + `;let f=` + float getInputFloat(int index) { + vec2 coords = offsetToCoords(index, ${o}, ${i}); + float value = getColorAsFloat(${t.texture2D}(X, coords)); + return value; + } + `,h=n.mode==="nearest"?` + ${f} + float process(int indices[${l}]) { + int input_index = 0; + int output_index = coordsToOffset(TexCoords, ${s}, ${u}); + + ${p} + + int d, m; + for (int dim = 0; dim < ${l}; ++dim) { + d = output_index / output_pitches[dim]; + m = output_index - d * output_pitches[dim]; + output_index = m; + + if (scales[dim] != 1 && d > 0) { + int d2 = d / scales[dim]; + m = d - d2 * scales[dim]; + d = d2; + } + input_index += input_pitches[dim] * d; + } + + return getInputFloat(input_index); + }`:l===4?` + ${f} + float process(int indices[4]) { + int input_index = 0; + int output_index = coordsToOffset(TexCoords, ${s}, ${u}); + + ${p} + + int m; + int index_of_dim0, index_of_dim1, index_of_dim2, index_of_dim3; + index_of_dim0 = output_index / output_pitches[0]; + m = output_index - index_of_dim0 * output_pitches[0]; + index_of_dim1 = m / output_pitches[1]; + m = m - index_of_dim1 * output_pitches[1]; + index_of_dim2 = m / output_pitches[2]; + m = m - index_of_dim2 * output_pitches[2]; + index_of_dim3 = m; + + int index_of_input_dim2, index_of_input_dim3, x_offset, y_offset; + index_of_input_dim2 = index_of_dim2 / scales[2]; + y_offset = index_of_dim2 - index_of_input_dim2 * scales[2]; + index_of_input_dim3 = index_of_dim3 / scales[3]; + x_offset = index_of_dim3 - index_of_input_dim3 * scales[3]; + + input_index = index_of_dim0 * input_pitches[0] + + index_of_dim1 * input_pitches[1] + + index_of_input_dim2 * input_pitches[2] + + index_of_input_dim3; + + float x00 = getInputFloat(input_index); + float x10, x01, x11; + + bool end_of_dim2 = false; + if (index_of_input_dim2 == (${e[0].dims[2]} - 1)) { + // It's the end in dimension 2 + x01 = x00; + end_of_dim2 = true; + } else { + x01 = getInputFloat(input_index + input_pitches[2]); + } + + if (index_of_input_dim3 == (input_pitches[2] - 1)) { + // It's the end in dimension 3 + x10 = x00; + x11 = x01; + } + else { + x10 = getInputFloat(input_index + 1); + x11 = end_of_dim2 ? x10 : getInputFloat(input_index + input_pitches[2] + 1); + } + + float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[2]); + float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[2]); + return y0 + float(x_offset) * (y1 - y0) / float(scales[3]); + }`:` + ${f} + float process(int indices[2]) { + int input_index = 0; + int output_index = coordsToOffset(TexCoords, ${s}, ${u}); + + ${p} + + int m; + int index_of_dim0, index_of_dim1; + index_of_dim0 = output_index / output_pitches[0]; + m = output_index - index_of_dim0 * output_pitches[0]; + index_of_dim1 = m; + + int index_of_input_dim0, index_of_input_dim1, x_offset, y_offset; + index_of_input_dim0 = index_of_dim0 / scales[0]; + y_offset = index_of_dim0 - index_of_input_dim0 * scales[0]; + index_of_input_dim1 = index_of_dim1 / scales[1]; + x_offset = index_of_dim1 - index_of_input_dim1 * scales[1]; + + input_index = index_of_input_dim0 * input_pitches[0] + index_of_input_dim1; + + float x00 = getInputFloat(input_index); + float x10, x01, x11; + + bool end_of_dim0 = false; + if (index_of_input_dim0 == (${e[0].dims[0]} - 1)) { + // It's the end in dimension 0 + x01 = x00; + end_of_dim0 = true; + } else { + x01 = getInputFloat(input_index + input_pitches[0]); + } + + if (index_of_input_dim1 == (input_pitches[0] - 1)) { + // It's the end in dimension 1 + x10 = x00; + x11 = x01; + } + else { + x10 = getInputFloat(input_index + 1); + x11 = end_of_dim0 ? x10 : getInputFloat(input_index + input_pitches[0] + 1); + } + + float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[0]); + float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[0]); + return y0 + float(x_offset) * (y1 - y0) / float(scales[1]); + }`;return{...xh,output:{dims:a,type:e[0].type,textureType:0},shaderSource:h,variables:[{name:"scales",type:"int",arrayLength:n.scales.length,data:n.scales.map(m=>Math.ceil(m))}]}},wu=(r,e)=>{if(!r||e.opset<9&&r.length!==1||e.opset>=9&&e.opset<11&&r.length!==2||e.opset>=11&&r.length<2)throw new Error("invalid inputs.");if(e.scales.length>0&&r[0].dims.length!==e.scales.length)throw new Error("Invalid input shape.");if(r[0].type==="string")throw new Error("Invalid input tensor types.")},Qo=(r,e,n)=>{if(n){for(let t of r)if(t<=0)throw new Error("Scale value should be greater than 0.")}else for(let t of r)if(t<1)throw new Error("Scale value should be greater than or equal to 1.");if((e==="linear"||e==="cubic")&&r.length!==2&&(r.length!==4||r[0]!==1||r[1]!==1))throw new Error(`'Linear' mode and 'Cubic' mode only support 2-D inputs ('Bilinear', 'Bicubic') or 4-D inputs with the corresponding outermost 2 scale values being 1 in the ${n?"Resize":"Upsample"} opeartor.`)}});var vu,Iu,vh,Ih,q2,j2,K2,X2,Sh=$(()=>{"use strict";Oe();pe();cn();nr();Tu();vu={name:"Resize",inputNames:["A"],inputTypes:[2]},Iu=(r,e,n)=>(wu(e,n),[r.run({...vu,cacheHint:n.cacheKey,get:()=>q2(r,e,n)},e)]),vh=r=>Xr(r,10),Ih=r=>Xr(r,11),q2=(r,e,n)=>{let t=j(r.session.backend.glContext.version),[o,i]=j2(e,n);if(o.every(x=>x===1)&&n.coordinateTransformMode!=="tf_crop_and_resize")return{...vu,output:{dims:i,type:e[0].type,textureType:2},hasMain:!0,shaderSource:`void main() { + vec4 v = ${t.texture2D}(X, TexCoords); + ${t.output} = v; + }`};let s=i.length;if(s<2)throw new Error(`output dimension should be at least 2, but got ${s}`);let u=i[s-2],l=i[s-1],c=e[0].dims;if(s!==c.length)throw new Error(`output dimension should match input ${c.length}, but got ${s}`);let d=c[s-2],p=c[s-1],f=o[s-2],h=o[s-1],m="";if(n.mode!=="linear")throw new Error(`resize (packed) does not support mode: '${n.mode}'`);switch(n.coordinateTransformMode){case"asymmetric":m=` + vec4 getSourceFracIndex(ivec4 coords) { + return vec4(coords) / scaleWHWH; + } + `;break;case"half_pixel":m=` + vec4 getSourceFracIndex(ivec4 coords) { + return (vec4(coords) + 0.5) / scaleWHWH - 0.5; + } + `;break;case"pytorch_half_pixel":m=` + vec4 getSourceFracIndex(ivec4 coords) { + vec4 fcoords = vec4(coords); + return vec4( + ${l}.0 > 1.0 ? (fcoords.x + 0.5) / scaleWHWH.x - 0.5 : 0.0, + ${u}.0 > 1.0 ? (fcoords.y + 0.5) / scaleWHWH.y - 0.5 : 0.0, + ${l}.0 > 1.0 ? (fcoords.z + 0.5) / scaleWHWH.z - 0.5 : 0.0, + ${u}.0 > 1.0 ? (fcoords.w + 0.5) / scaleWHWH.w - 0.5 : 0.0 + ); + } + `;break;case"align_corners":m=` + vec4 getSourceFracIndex(ivec4 coords) { + vec4 resized = vec4(${l}.0 - 1.0, ${u}.0 - 1.0, ${l}.0 - 1.0, + ${u}.0 - 1.0); + vec4 original = vec4(${p}.0 - 1.0, ${d}.0 - 1.0, ${p}.0 - 1.0, + ${d}.0 - 1.0); + vec4 new_scale = original / resized; + return vec4(coords) * new_scale; + } + `;break;default:throw new Error(`resize (packed) does not support coordinateTransformMode: '${n.coordinateTransformMode}'`)}let y=Je(s),g=dn(),b=` + const vec2 inputWH = vec2(${d}.0, ${p}.0); + const vec4 scaleWHWH = vec4(float(${f}), float(${h}), float(${f}), float(${h})); + ${g} + ${m} + float getAValue(int x10, int r, int c, int d) { + return getChannel(getA(x10, r, c, d), vec2(c, d)); + } + void main() { + ${y} rc = getOutputCoords(); + + int batch = rc[0]; + int depth = rc[1]; + + // retrieve the 4 coordinates that is used in the 4 packed output values. + ivec4 coords = ivec4(rc.wz, rc.w + 1, rc.z + 1); + + // calculate the source index in fraction + vec4 sourceFrac = getSourceFracIndex(coords); + + // get the lower and upper bound of the 4 values that will be packed into one texel. + ivec4 x00 = ivec4(max(sourceFrac.xy, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.xy))); + ivec4 x01 = ivec4(max(sourceFrac.xw, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.xw))); + ivec4 x10 = ivec4(max(sourceFrac.zy, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.zy))); + ivec4 x11 = ivec4(max(sourceFrac.zw, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.zw))); + + bool hasNextRow = rc.w < ${u-1}; + bool hasNextCol = rc.z < ${l-1}; + + // pack x00, x01, x10, x11's top-left corner into one vec4 structure + vec4 topLeft = vec4( + getAValue(batch, depth, x00.x, x00.y), + hasNextCol ? getAValue(batch, depth, x01.x, x01.y) : 0.0, + hasNextRow ? getAValue(batch, depth, x10.x, x10.y) : 0.0, + (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.x, x11.y) : 0.0); + + // pack x00, x01, x10, x11's top-right corner into one vec4 structure + vec4 topRight = vec4( + getAValue(batch, depth, x00.x, x00.w), + hasNextCol ? getAValue(batch, depth, x01.x, x01.w) : 0.0, + hasNextRow ? getAValue(batch, depth, x10.x, x10.w) : 0.0, + (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.x, x11.w) : 0.0); + + // pack x00, x01, x10, x11's bottom-left corner into one vec4 structure + vec4 bottomLeft = vec4( + getAValue(batch, depth, x00.z, x00.y), + hasNextCol ? getAValue(batch, depth, x01.z, x01.y) : 0.0, + hasNextRow ? getAValue(batch, depth, x10.z, x10.y) : 0.0, + (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.z, x11.y) : 0.0); + + // pack x00, x01, x10, x11's bottom-right corner into one vec4 structure + vec4 bottomRight = vec4( + getAValue(batch, depth, x00.z, x00.w), + hasNextCol ? getAValue(batch, depth, x01.z, x01.w) : 0.0, + hasNextRow ? getAValue(batch, depth, x10.z, x10.w) : 0.0, + (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.z, x11.w) : 0.0); + + // calculate the interpolation fraction on u and v direction + vec4 frac = vec4(sourceFrac) - floor(sourceFrac); + vec4 clampFrac = clamp(frac, vec4(0.0), vec4(1.0)); + + vec4 top = mix(topLeft, topRight, clampFrac.ywyw); + vec4 bottom = mix(bottomLeft, bottomRight, clampFrac.ywyw); + vec4 newValue = mix(top, bottom, clampFrac.xxzz); + + ${t.output} = vec4(newValue); + } + `;return{...vu,output:{dims:i,type:e[0].type,textureType:2},hasMain:!0,shaderSource:b}},j2=(r,e)=>{let t=r[0].dims,o=e.scales,i;if(o.length===0){let s=r[e.scalesInputIdx];if(s&&s.size!==0){if(r[e.sizesInputIdx])throw new Error("Only one of scales or sizes must be provided as input.");o=K2(s,e.mode,e.isResize)}else{let u=r[e.sizesInputIdx];if(!u||u.size===0)throw new Error("Either scales or sizes MUST be provided as input.");i=Array.from(u.integerData),o=X2(i,t,e.mode,e.isResize)}}else if(r[e.sizesInputIdx])throw new Error("Only one of scales or sizes must be provided as input.");let a=i||t.map((s,u)=>Math.floor(s*o[u]));return[o,a]},K2=(r,e,n)=>{let t=Array.from(r.floatData);return Qo(t,e,n),t},X2=(r,e,n,t)=>{let o=e.length,i=new Array(o);for(let a=0,s=o;a{"use strict";tr();$h=(r,e)=>(Z2(e),[new Ne([e[0].dims.length],"int32",void 0,void 0,new Int32Array(e[0].dims))]),Z2=r=>{if(!r||r.length!==1)throw new Error("Shape requires 1 input.")}});var Su,Ph,Oh,Eh,J2,Ch,Q2,Y2,Dh=$(()=>{"use strict";We();Kr();xe();pe();Su={name:"Slice",inputNames:["A"],inputTypes:[0]},Ph=(r,e,n)=>(J2(e),[r.run({...Su,cacheHint:n.cacheKey,get:()=>Eh(r,e[0],n)},e)]),Oh=r=>{let e=r.attributes.getInts("starts"),n=r.attributes.getInts("ends"),t=r.attributes.getInts("axes",[]);return le({starts:e,ends:n,axes:t})},Eh=(r,e,n)=>{let t=n.axes.length===0?e.dims.slice(0).map((d,p)=>p):n.axes,o=V.normalizeAxes(t,e.dims.length),i=n.starts.map((d,p)=>d>e.dims[o[p]]-1?e.dims[o[p]]:V.normalizeAxis(d,e.dims[o[p]])),a=n.ends.map((d,p)=>d>e.dims[o[p]]-1?e.dims[o[p]]:V.normalizeAxis(d,e.dims[o[p]])),s=e.dims.slice(),u=[];for(let d=0;d0&&u.push(`outputIdx[${o[d]}] += ${i[d]};`);let c=` + float process(int outputIdx[${s.length}]) { + ${u.join(` + `)} + return _A(outputIdx); + }`;return{...Su,output:{dims:s,type:e.type,textureType:0},shaderSource:c}},J2=r=>{if(!r||r.length!==1)throw new Error("Slice requires 1 input.");if(Nn.indexOf(r[0].type)===-1)throw new Error("Invalid input type.")},Ch=(r,e)=>{Y2(e);let n=Q2(r,e);return[r.run({...Su,cacheHint:n.cacheKey,get:()=>Eh(r,e[0],n)},[e[0]])]},Q2=(r,e)=>{if(!r.session.isInitializer(e[1].dataId)||!r.session.isInitializer(e[2].dataId)||e.length>=4&&!r.session.isInitializer(e[3].dataId)||e.length>=5&&!r.session.isInitializer(e[4].dataId))throw new Error("dynamic slice attributes are not allowed");if(e.length>=5&&e[4].integerData.some(a=>a!==1))throw new Error("currently non-1 steps is not supported for Slice");let n=Array.from(e[1].integerData),t=Array.from(e[2].integerData),o=e.length>=4?Array.from(e[3].integerData):[],i=`${o};${n};${t}`;return{starts:n,ends:t,axes:o,cacheKey:i}},Y2=r=>{if(!r||r.length<3||r.length>5)throw new Error("Invalid input number.");if(r[1].type!=="int32"||r[1].dims.length!==1)throw new Error("Invalid input type.");if(r[2].type!=="int32"||r[2].dims.length!==1)throw new Error("Invalid input type.");if(r.length>=4&&(r[3].type!=="int32"||r[3].dims.length!==1))throw new Error("Invalid input type.");if(r.length>=5&&(r[4].type!=="int32"||r[4].dims.length!==1))throw new Error("Invalid input type.")}});var kh,Lh,Rh,Nh,zh,Mh,Bh,Vh,eS,tS,nS,Fh,Gh=$(()=>{"use strict";We();xe();Oe();pe();Xo();kh={name:"SoftmaxComputeMax",inputNames:["A"],inputTypes:[0]},Lh={name:"SoftmaxComputeScale",inputNames:["A","Max"],inputTypes:[0,0]},Rh={name:"SoftMax",inputNames:["A","Max","Norm"],inputTypes:[0,0,0]},Nh=(r,e,n)=>{Fh(e);let t=e[0].dims.slice(),o=V.normalizeAxis(n.axis,t.length),i=V.sizeToDimension(t,o),a=V.sizeFromDimension(t,o);return Vh(r,e,n,i,a)},zh=r=>le({axis:r.attributes.getInt("axis",1)}),Mh=r=>le({axis:r.attributes.getInt("axis",-1)}),Bh=(r,e,n)=>{Fh(e);let t=e[0].dims.slice(),o=V.normalizeAxis(n.axis,t.length),i=t.length,a=o!==i-1,s=[],u=[],l=[],c;a&&(u=Array.from({length:i}).map((h,m)=>m),u[o]=i-1,u[i-1]=o,u.map(h=>s.push(t[h])),c=le({perm:u}),l=or(r,e,c));let d=a?V.sizeToDimension(s,i-1):V.sizeToDimension(t,i-1),p=a?V.sizeFromDimension(s,i-1):V.sizeFromDimension(t,i-1),f=Vh(r,a?l:e,n,d,p);return a?or(r,f,c):f},Vh=(r,e,n,t,o)=>{let i=eS(r,e[0],t,o,[t]),a=r.run({...kh,cacheHint:n.cacheKey,get:()=>i},e),s=tS(r,e[0],t,o,i.output.dims,[t]),u=r.run({...Lh,cacheHint:n.cacheKey,get:()=>s},[e[0],a]),l=nS(r,e[0],t,o,i.output.dims,s.output.dims);return[r.run({...Rh,cacheHint:n.cacheKey,get:()=>l},[e[0],a,u])]},eS=(r,e,n,t,o)=>{let[i,a]=r.calculateTextureWidthAndHeight(e.dims,0),s=o.length;if(n<1||t<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(o.length!==1)throw new Error("Dimensionality of the output should be 1");if(o[0]!==n)throw new Error("Shape of the output should be equal to logical row count");let u=j(r.session.backend.glContext.version),l=` + float process(int[${s}] indices) { + int logical_row_start_offset = indices[0] * ${t}; + + float max = getColorAsFloat(${u.texture2D}(A, offsetToCoords(logical_row_start_offset, ${i}, + ${a} ))); + for(int i=1; i<${t}; ++i) + { + float current = getColorAsFloat(${u.texture2D}(A, offsetToCoords(logical_row_start_offset + i, + ${i}, ${a}))); + if(current > max) + max = current; + } + + return max; + }`;return{...kh,output:{dims:o,type:e.type,textureType:0},shaderSource:l}},tS=(r,e,n,t,o,i)=>{let[a,s]=r.calculateTextureWidthAndHeight(e.dims,0),u=i.length;if(n<1||t<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(i.length!==1)throw new Error("Dimensionality of the output should be 1");if(i[0]!==n)throw new Error("Shape of the output should be equal to logical row count");if(o.length!==1)throw new Error("Dimensionality of the intermediate results should be 1");if(o[0]!==n)throw new Error("Shape of the intermediate results should be equal to logical row count");let l=j(r.session.backend.glContext.version),c=` + float process(int[${u}] indices) { + int logical_row_start_offset = indices[0] * ${t}; + + float norm_factor = 0.0; + float max = _Max(indices); + for(int i=0; i<${t}; ++i) + { + norm_factor += exp(getColorAsFloat(${l.texture2D}(A, offsetToCoords(logical_row_start_offset + i, + ${a}, ${s}))) - max); + } + + return norm_factor; + }`;return{...Lh,output:{dims:i,type:e.type,textureType:0},shaderSource:c}},nS=(r,e,n,t,o,i)=>{let[a,s]=r.calculateTextureWidthAndHeight(e.dims,0),u=e.dims.length;if(n<1||t<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(o.length!==1||i.length!==1)throw new Error("Dimensionality of the intermediate results should be 1");if(o[0]!==n||i[0]!==n)throw new Error("Shape of the intermediate results should be equal to logical row count");let l=` + float process(int[${u}] indices) { + + // get offset of current logical tensor index from the 2-D texture coordinates (TexCoords) + int offset = coordsToOffset(TexCoords, ${a}, ${s}); + + //determine the logical row for this index + int logical_row_index[1]; + logical_row_index[0] = offset / ${t}; + + float norm_factor = _Norm(logical_row_index); + + // avoid possible division by 0 + // if norm_facor is 0, all elements are zero + // if so, return 0 + if(norm_factor == 0.0) + return 0.0; + + return exp(_A(indices) - _Max(logical_row_index)) / norm_factor; + }`;return{...Rh,output:{dims:e.dims,type:e.type,textureType:0},shaderSource:l}},Fh=r=>{if(!r||r.length!==1)throw new Error("Softmax requires 1 input.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type")}});var Uh,Wh,Hh,rS,oS,iS,qh=$(()=>{"use strict";We();xe();pe();Uh={name:"Split",inputNames:["A"],inputTypes:[0]},Wh=(r,e,n)=>{iS(e);let t=V.normalizeAxis(n.axis,e[0].dims.length),o=rS(r,e,t,n),i=[];for(let a=0;aoS(r,e[0],n,t,a)},e));return i},Hh=r=>{let e=r.attributes.getInt("axis",0),n=r.attributes.getInts("split",[]),t=r.outputs.length;return le({axis:e,split:n,numOutputs:t})},rS=(r,e,n,t)=>{let[,o]=Gr.splitShape(e[0].dims,n,t.split,t.numOutputs);return o.length},oS=(r,e,n,t,o)=>{let[i,a]=Gr.splitShape(e.dims,t,n.split,n.numOutputs),s=a[o],u=i[o],c=` + float process(int indices[${u.length}]) { + indices[${t}] += ${s}; + return _A(indices); + } + `;return{...Uh,cacheHint:`${n.cacheKey}:${o}`,output:{dims:u,type:e.type,textureType:0},shaderSource:c}},iS=r=>{if(!r||r.length!==1)throw new Error("Split requires one input.");if(r[0].type!=="int8"&&r[0].type!=="uint8"&&r[0].type!=="int16"&&r[0].type!=="uint16"&&r[0].type!=="int32"&&r[0].type!=="uint32"&&r[0].type!=="float32"&&r[0].type!=="float64"&&r[0].type!=="bool")throw new Error("Invalid input type.")}});var $u,jh,Kh,aS,sS,Xh=$(()=>{"use strict";xe();$u=(r,e,n)=>{aS(e);let t=V.squeezeShape(e[0].dims,n);return[r.reshapeUnpacked(e[0],t)]},jh=(r,e)=>(sS(e),$u(r,[e[0]],Array.from(e[1].integerData))),Kh=r=>r.attributes.getInts("axes"),aS=r=>{if(!r||r.length!==1)throw new Error("Squeeze requires 1 input.");if(r[0].type==="string")throw new Error("invalid input tensor types.")},sS=r=>{if(!r||r.length!==2)throw new Error("Squeeze requires 2 inputs.");if(r[1].type!=="int32")throw new Error("Invalid input type.")}});var Zh,uS,lS,Jh=$(()=>{"use strict";Oe();pe();Zh=(r,e)=>{lS(e);let n={name:"Sum",inputNames:e.map((o,i)=>`X${i}`),inputTypes:new Array(e.length).fill(0)};return[r.run({...n,get:()=>uS(r,e,n)},e)]},uS=(r,e,n)=>{let t=j(r.session.backend.glContext.version),o=e[0].dims.slice(),a=` + void main() { + vec4 result = ${e.map((s,u)=>`${t.texture2D}(X${u},TexCoords)`).join(" + ")}; + ${t.output} = result; + } + `;return{...n,output:{dims:o,type:e[0].type,textureType:0},hasMain:!0,shaderSource:a}},lS=r=>{if(!r||r.length===0)throw new Error("Sum requires inputs.");let e=r[0].dims.length;for(let n=1;n{"use strict";Kr();pe();Qh=(r,e)=>{dS(e);let n={name:"Tile",inputNames:["A"],inputTypes:[0]};return[r.run({...n,get:()=>cS(r,e,n)},e)]},cS=(r,e,n)=>{let t=e[0].dims.slice(),o=new Array(t.length),i=[];for(let u=0;u{if(!r||r.length!==2)throw new Error("Tile requires 2 input.");if(r[1].dims.length!==1)throw new Error("The second input shape must 1 dimension.");if(r[1].dims[0]!==r[0].dims.length)throw new Error("Invalid input shape.");if(Nn.indexOf(r[0].type)===-1)throw new Error("Invalid input type.");if(r[1].type!=="int32"&&r[1].type!=="int16")throw new Error("Invalid repeat type.")}});var Au,em,tm,pS,fS,nm=$(()=>{"use strict";xe();Au=(r,e,n)=>{pS(e);let t=V.unsqueezeShape(e[0].dims,n);return[r.reshapeUnpacked(e[0],t)]},em=(r,e)=>(fS(e),Au(r,[e[0]],Array.from(e[1].integerData))),tm=r=>r.attributes.getInts("axes"),pS=r=>{if(!r||r.length!==1)throw new Error("Unsqueeze requires 1 input.");if(r[0].type==="string")throw new Error("invalid input tensor types.")},fS=r=>{if(!r||r.length!==2)throw new Error("Unsqueeze requires 2 inputs.");if(r[1].type!=="int32")throw new Error("Invalid input type.")}});var rm,om=$(()=>{"use strict";fp();$p();Op();Rp();qo();_f();Sf();Pf();Cf();Rf();Mf();Gf();qf();jo();Zf();lh();bh();_h();Sh();Ah();Dh();Gh();qh();Xh();Jh();Yh();Xo();cu();nm();Tu();rm=[["Abs","","6+",Np],["Acos","","7+",zp],["Add","","7+",hp],["And","","7+",mp],["Asin","","7+",Mp],["Atan","","7+",Bp],["AveragePool","","7+",Qf,Yf],["BatchNormalization","","7+",dp,pp],["Cast","","6+",Ap,Pp],["Ceil","","6+",Gp],["Clip","","6-10",uu,Vp],["Clip","","11+",Fp],["Concat","","4+",Dp,Lp],["Conv","","1+",gu,bu],["ConvTranspose","","1+",bf,yf],["Cos","","7+",Up],["Div","","7+",gp],["Dropout","","7+",lu],["DepthToSpace","","1+",vf,If],["Equal","","7+",bp],["Elu","","6+",Wp,Hp],["Exp","","6+",qp],["Flatten","","1+",$f,Af],["Floor","","6+",jp],["FusedConv","com.microsoft","1+",gu,bu],["Gather","","1+",Of,Ef],["Gemm","","7-10",yu,kf],["Gemm","","11+",yu,Lf],["GlobalAveragePool","","1+",th,nh],["GlobalMaxPool","","1+",sh],["Greater","","7+",yp],["Identity","","1+",lu],["ImageScaler","","1+",Nf,zf],["InstanceNormalization","","6+",Vf,Ff],["LeakyRelu","","6+",Kp,Xp],["Less","","7+",_p],["LRN","","1+",Uf,Wf],["Log","","6+",Zp],["MatMul","","1+",cf,df],["MaxPool","","1+",rh,oh],["Mul","","7+",xp],["Neg","","6+",Jp],["Not","","1+",Qp],["Or","","7+",wp],["Pad","","2-10",_u,jf],["Pad","","11+",Kf,Xf],["Pow","","7+",Tp],["PRelu","","7+",vp],["ReduceLogSum","","1+",mh,zn],["ReduceMax","","1+",ph,zn],["ReduceMean","","1+",dh,zn],["ReduceMin","","1+",fh,zn],["ReduceProd","","1+",hh,zn],["ReduceSum","","1-12",ch,zn],["ReduceSumSquare","","1+",gh,zn],["Relu","","6+",Yp],["Reshape","","5+",yh],["Resize","","10",Iu,vh],["Resize","","11+",Iu,Ih],["Shape","","1+",$h],["Sigmoid","","6+",ef],["Sin","","7+",tf],["Slice","","10+",Ch],["Slice","","1-9",Ph,Oh],["Softmax","","1-12",Nh,zh],["Softmax","","13+",Bh,Mh],["Split","","2-12",Wh,Hh],["Sqrt","","6+",nf],["Squeeze","","1-12",$u,Kh],["Squeeze","","13+",jh],["Sub","","7+",Ip],["Sum","","6+",Zh],["Tan","","7+",rf],["Tanh","","6+",of],["Tile","","6+",Qh],["Transpose","","1+",or,wf],["Upsample","","7-8",xu,wh],["Upsample","","9",xu,Th],["Unsqueeze","","1-12",Au,tm],["Unsqueeze","","13+",em],["Xor","","7+",Sp]]});function am(r){let e={},n;for(;(n=im.exec(r))!==null;){let t=n[3].split(",").map(o=>{let i=o.trim().split(" ");return i&&i.length===2?{type:i[0],name:i[1]}:null}).filter(o=>o!==null);e[n[2]]={params:t,body:n[4]}}for(let t in e){let o=hS.replace("__FUNC__",t),i=new RegExp(o,"gm");for(;(n=i.exec(r))!==null;){let a=n[1],s=n[2],u=n[3].split(","),l=a?`${a} ${s};`:"",c=e[t].body,d="";e[t].params.forEach((f,h)=>{f&&(d+=`${f.type} ${f.name} = ${u[h]}; +`)}),c=`${d} + ${c}`,c=c.replace("return",`${s} = `);let p=` + ${l} + { + ${c} + } + `;r=r.replace(n[0],p)}}return r=r.replace(im,""),r}var im,hS,sm=$(()=>{"use strict";im=/@inline[\s\n\r]+(\w+)[\s\n\r]+([0-9a-zA-Z_]+)\s*\(([^)]*)\)\s*{(([^}]|[\n\r])*)}/gm,hS="(\\w+)?\\s+([_0-9a-zA-Z]+)\\s+=\\s+__FUNC__\\((.*)\\)\\s*;"});function vr(r,e){let n=[],t=[],o=e!=null&&Array.isArray(e)&&e.length===0,i=e==null||o?null:mS(e,r).sort(),a=0;for(let s=0;ss)&&r[s]===1&&(n.push(r[s]),t.push(s)),i[a]<=s&&a++}r[s]!==1&&(n.push(r[s]),t.push(s))}return{newShape:n,keptDims:t}}function mS(r,e){let n=e.length;return r=r==null?e.map((t,o)=>o):[].concat(r),br(r.every(t=>t>=-n&&t`All values in axis param must be in range [-${n}, ${n}) but got axis ${r}`),br(r.every(gS),()=>`All values in axis param must be integers but got axis ${r}`),r.map(t=>t<0?n+t:t)}function gS(r){return r%1===0}function bS(r){if(r.length===0)return 1;let e=r[0];for(let n=1;n{"use strict";ct();xe();Yo=class{constructor(e){this.maxTextureSize=e}computeTextureWH(e,n){let t=this.computeTexture(e,n);return n&&n.isPacked&&(t[0]/=2,t[1]/=2),n&&n.reverseWH?[t[1],t[0]]:t}computeTexture(e,n){let t=n&&n.isPacked;if(e.length===0)return t?[2,2]:[1,1];let o=this.maxTextureSize;if(n&&n.breakAxis!==void 0){let s=n.breakAxis>=e.length?1:e.slice(n.breakAxis).reduce((l,c)=>l*c),u=n.breakAxis<=0?1:e.slice(0,n.breakAxis).reduce((l,c)=>l*c);if(s>o||u>o)Te.verbose("TextureLayout",`Given width/height preferences were unattainable: shape:${e}, breakAxis:${n.breakAxis}`);else return[s,u]}let i=e.slice(0);t&&(o=o*2,i=i.map((s,u)=>u>=i.length-2?i[u]%2===0?i[u]:i[u]+1:i[u]),i.length===1&&(i=[2,i[0]])),i.length!==2&&(i=vr(i).newShape);let a=bS(i);return i.length<=1&&a<=o?[1,a]:i.length===2&&i[0]<=o&&i[1]<=o?i:i.length===3&&i[0]*i[1]<=o&&i[2]<=o?[i[0]*i[1],i[2]]:i.length===3&&i[0]<=o&&i[1]*i[2]<=o?[i[0],i[1]*i[2]]:i.length===4&&i[0]*i[1]*i[2]<=o&&i[3]<=o?[i[0]*i[1]*i[2],i[3]]:i.length===4&&i[0]<=o&&i[1]*i[2]*i[3]<=o?[i[0],i[1]*i[2]*i[3]]:t?um(a/4).map(s=>s*2):um(a)}}});var ei,lm=$(()=>{"use strict";xe();$n();Oe();Pu();cn();ei=class extends gt{constructor(e){super(e)}getFunctions(){return{...this.offsetToCoords(),...this.coordsToOffset(),...this.toVec(),...this.valueFrom(),...this.getCommonUtilFuncs(),...this.getInputsSamplingSnippets(),...this.getOutputSamplingSnippet()}}getCustomTypes(){return{}}offsetToCoords(){let e="offsetToCoords";return{offsetToCoords:new z(` + vec2 ${e}(int offset, int width, int height) { + int t = offset / width; + int s = offset - t*width; + vec2 coords = (vec2(s,t) + vec2(0.5,0.5)) / vec2(width, height); + return coords; + } + `)}}coordsToOffset(){let e="coordsToOffset";return{coordsToOffset:new z(` + int ${e}(vec2 coords, int width, int height) { + float s = coords.s * float(width); + float t = coords.t * float(height); + int offset = int(t) * width + int(s); + return offset; + } + `)}}getOutputSamplingSnippet(){let e=this.context.outputTextureLayout;return e.isPacked?this.getPackedOutputSamplingSnippet(e):this.getUnpackedOutputSamplingSnippet(e)}getPackedOutputSamplingSnippet(e){let n=e.unpackedShape,t=[e.width,e.height],o={},i="getOutputCoords";switch(n.length){case 0:o[i]=this.getOutputScalarCoords();break;case 1:o[i]=this.getOutputPacked1DCoords(n,t);break;case 2:o[i]=this.getOutputPacked2DCoords(n,t);break;case 3:o[i]=this.getOutputPacked3DCoords(n,t);break;default:o[i]=this.getOutputPackedNDCoords(n,t)}let s=` + void setOutput(vec4 val) { + ${j(this.context.glContext.version).output} = val; + } + `,u="floatTextureSetRGBA";return o[u]=new z(s),o}getUnpackedOutputSamplingSnippet(e){let n=e.unpackedShape,t=[e.width,e.height],o={},i="getOutputCoords";switch(n.length){case 0:o[i]=this.getOutputScalarCoords();break;case 1:o[i]=this.getOutputUnpacked1DCoords(n,t);break;case 2:o[i]=this.getOutputUnpacked2DCoords(n,t);break;case 3:o[i]=this.getOutputUnpacked3DCoords(n,t);break;case 4:o[i]=this.getOutputUnpacked4DCoords(n,t);break;case 5:o[i]=this.getOutputUnpacked5DCoords(n,t);break;case 6:o[i]=this.getOutputUnpacked6DCoords(n,t);break;default:throw new Error(`Unsupported output dimensionality: ${n.length}`)}let s=` + void setOutput(float val) { + ${j(this.context.glContext.version).output} = vec4(val, 0, 0, 0); + } + `,u="floatTextureSetR";return o[u]=new z(s),o}getOutputScalarCoords(){return new z(` + int getOutputCoords() { + return 0; + } + `)}getOutputPacked1DCoords(e,n){let t=n,o="";return t[0]===1?(o=` + int getOutputCoords() { + return 2 * int(TexCoords.y * ${t[1]}.0); + } + `,new z(o)):t[1]===1?(o=` + int getOutputCoords() { + return 2 * int(TexCoords.x * ${t[0]}.0); + } + `,new z(o)):(o=` + int getOutputCoords() { + ivec2 resTexRC = ivec2(TexCoords.xy * + vec2(${t[0]}, ${t[1]})); + return 2 * (resTexRC.y * ${t[0]} + resTexRC.x); + } + `,new z(o))}getOutputPacked2DCoords(e,n){let t="";if(Jn.arraysEqual(e,n))return t=` + ivec2 getOutputCoords() { + return 2 * ivec2(TexCoords.xy * vec2(${n[0]}, ${n[1]})); + } + `,new z(t);let o=n,i=Math.ceil(e[1]/2);return t=` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(TexCoords.xy * + vec2(${o[0]}, ${o[1]})); + + int index = resTexRC.y * ${o[0]} + resTexRC.x; + + // reverse r and c order for packed texture + int r = imod(index, ${i}) * 2; + int c = 2 * (index / ${i}); + + return ivec2(r, c); + } + `,new z(t)}getOutputPacked3DCoords(e,n){let t=[n[0],n[1]],o=Math.ceil(e[2]/2),i=o*Math.ceil(e[1]/2),a=` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(TexCoords.xy * + vec2(${t[0]}, ${t[1]})); + int index = resTexRC.y * ${t[0]} + resTexRC.x; + + int b = index / ${i}; + index -= b * ${i}; + + // reverse r and c order for packed texture + int r = imod(index, ${o}) * 2; + int c = 2 * (index / ${o}); + + return ivec3(b, r, c); + } + `;return new z(a)}getOutputPackedNDCoords(e,n){let t=[n[0],n[1]],o=Math.ceil(e[e.length-1]/2),i=o*Math.ceil(e[e.length-2]/2),a=i,s="",u="b, r, c";for(let c=2;c=0;--u)i[u]=i[u+1]*e[u+1];let a=["r","c","d"],s=i.map((u,l)=>{let c=`int ${a[l]} = index / ${u}`,d=l===i.length-1?`int ${a[l+1]} = index - ${a[l]} * ${u}`:`index -= ${a[l]} * ${u}`;return`${c}; ${d};`}).join("");return t=` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(TexCoords.xy * + vec2(${n[0]}, ${n[1]})); + int index = resTexRC.y * ${n[0]} + resTexRC.x; + ${s} + return ivec3(r, c, d); + } + `,new z(t)}getOutputUnpacked4DCoords(e,n){let t="",o=e.length,i=null;o<2&&(i=[]),i=new Array(o-1),i[o-2]=e[o-1];for(let u=o-3;u>=0;--u)i[u]=i[u+1]*e[u+1];let a=["r","c","d","d2"],s=i.map((u,l)=>{let c=`int ${a[l]} = index / ${u}`,d=l===i.length-1?`int ${a[l+1]} = index - ${a[l]} * ${u}`:`index -= ${a[l]} * ${u}`;return`${c}; ${d};`}).join("");return t=` + ivec4 getOutputCoords() { + ivec2 resTexRC = ivec2(TexCoords.xy * + vec2(${n[0]}, ${n[1]})); + int index = resTexRC.y * ${n[0]} + resTexRC.x; + ${s} + return ivec4(r, c, d, d2); + } + `,new z(t)}getOutputUnpacked5DCoords(e,n){let t="",o=e.length,i=null;o<2&&(i=[]),i=new Array(o-1),i[o-2]=e[o-1];for(let u=o-3;u>=0;--u)i[u]=i[u+1]*e[u+1];let a=["r","c","d","d2","d3"],s=i.map((u,l)=>{let c=`int ${a[l]} = index / ${u}`,d=l===i.length-1?`int ${a[l+1]} = index - ${a[l]} * ${u}`:`index -= ${a[l]} * ${u}`;return`${c}; ${d};`}).join("");return t=` + ivec5 getOutputCoords() { + ivec2 resTexRC = ivec2(TexCoords.xy * + vec2(${n[0]}, ${n[1]})); + int index = resTexRC.y * ${n[0]} + resTexRC.x; + ${s} + return ivec5(r, c, d, d2, d3); + } + `,new z(t)}getOutputUnpacked6DCoords(e,n){let t="",o=e.length,i=null;o<2&&(i=[]),i=new Array(o-1),i[o-2]=e[o-1];for(let u=o-3;u>=0;--u)i[u]=i[u+1]*e[u+1];let a=["r","c","d","d2","d3","d4"],s=i.map((u,l)=>{let c=`int ${a[l]} = index / ${u}`,d=l===i.length-1?`int ${a[l+1]} = index - ${a[l]} * ${u}`:`index -= ${a[l]} * ${u}`;return`${c}; ${d};`}).join("");return t=` + ivec6 getOutputCoords() { + ivec2 resTexRC = ivec2(TexCoords.xy * + vec2(${n[0]}, ${n[1]})); + int index = resTexRC.y * ${n[0]} + resTexRC.x; + ${s} + return ivec6(r, c, d, d2, d3, d4); + } + `,new z(t)}getCommonUtilFuncs(){let e={},n="uvFromFlat";e[n]=new z(` + vec2 uvFromFlat(int texNumR, int texNumC, int index) { + int texC = index / texNumR; + int texR = index - texC * texNumR; + // TODO: swap texR, texC order in following function so row is corresponding to u and column is corresponding to + // v. + return (vec2(texR, texC) + halfCR) / vec2(texNumR, texNumC); + } + `),n="packedUVfrom1D",e[n]=new z(` + vec2 packedUVfrom1D(int texNumR, int texNumC, int index) { + int texelIndex = index / 2; + int texR = texelIndex / texNumC; + int texC = texelIndex - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); + } + `),n="packedUVfrom2D",e[n]=new z(` + vec2 packedUVfrom2D(int texNumR, int texNumC, int texelsInLogicalRow, int row, int col) { + int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2); + int texR = texelIndex / texNumC; + int texC = texelIndex - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); + } + `),n="packedUVfrom3D",e[n]=new z(` + vec2 packedUVfrom3D(int texNumR, int texNumC, + int texelsInBatch, int texelsInLogicalRow, int b, + int row, int col) { + int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2); + int texR = index / texNumC; + int texC = index - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); + } + `),n="sampleTexture";let t=j(this.context.glContext.version);return e[n]=new z(` + float sampleTexture(sampler2D textureSampler, vec2 uv) { + return ${t.texture2D}(textureSampler, uv).r; + }`),e}getInputsSamplingSnippets(){let e={},n=this.context.outputTextureLayout;return this.context.programInfo.inputNames.forEach((t,o)=>{let i=this.context.inputTextureLayouts[o],a=Bo(t);i.isPacked?e[a]=this.getPackedSamplerFromInput(a,t,i):e[a]=this.getUnpackedSamplerFromInput(a,t,i);let s=Xd(t);i.unpackedShape.length<=n.unpackedShape.length&&(i.isPacked?e[s]=this.getPackedSamplerAtOutputCoords(s,i,n,t):e[s]=this.getUnpackedSamplerAtOutputCoords(s,i,n,t))}),e}getPackedSamplerAtOutputCoords(e,n,t,o){let i=n.unpackedShape,a=t.unpackedShape,u=Bo(o),l=i.length,c=a.length,d=Ze.getBroadcastDims(i,a),p=Je(c),f=c-l,h,m=St();l===0?h="":c<2&&d.length>=1?h="coords = 0;":h=d.map(O=>`coords.${m[O+f]} = 0;`).join(` +`);let y="";c<2&&l>0?y="coords":y=i.map((O,E)=>`coords.${m[E+f]}`).join(", ");let g="return outputValue;",x=V.size(i)===1,v=V.size(a)===1;if(l===1&&!x&&!v)g=` + return vec4(outputValue.xy, outputValue.xy); + `;else if(x&&!v)c===1?g=` + return vec4(outputValue.x, outputValue.x, 0., 0.); + `:g=` + return vec4(outputValue.x); + `;else if(d.length){let O=l-2,E=l-1;d.indexOf(O)>-1&&d.indexOf(E)>-1?g="return vec4(outputValue.x);":d.indexOf(O)>-1?g="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":d.indexOf(E)>-1&&(g="return vec4(outputValue.xx, outputValue.zz);")}let I=` + int lastDim = coords.${m[c-1]}; + coords.${m[c-1]} = coords.${m[c-2]}; + coords.${m[c-2]} = lastDim; + `,P=` + vec4 ${e}() { + ${p} coords = getOutputCoords(); + ${I} + ${h} + vec4 outputValue = ${u}(${y}); + ${g} + } + `;return new z(P,["coordinates.getOutputCoords"])}getUnpackedSamplerAtOutputCoords(e,n,t,o){let i=[t.width,t.height],a=[n.width,n.height],s=n.unpackedShape.length,u=t.unpackedShape.length,l=n.unpackedShape,c=t.unpackedShape,d=Bo(o);if(s===u&&Jn.arraysEqual(a,i)){let x=` + float ${e}() { + return sampleTexture(${o}, TexCoords); + } + `;return new z(x,["coordinates.sampleTexture"])}let p=Je(u),f=Ze.getBroadcastDims(l,c),h=u-s,m,y=St();s===0?m="":u<2&&f.length>=1?m="coords = 0;":m=f.map(x=>`coords.${y[x+h]} = 0;`).join(` +`);let g="";u<2&&s>0?g="coords":g=n.unpackedShape.map((x,w)=>`coords.${y[w+h]}`).join(", ");let b=` + float ${e}() { + ${p} coords = getOutputCoords(); + ${m} + return ${d}(${g}); + } + `;return new z(b,["coordinates.getOutputCoords"])}getPackedSamplerFromInput(e,n,t){switch(t.unpackedShape.length){case 0:return this.getPackedSamplerScalar(e,n);case 1:return this.getPackedSampler1D(e,n,t);case 2:return this.getPackedSampler2D(e,n,t);case 3:return this.getPackedSampler3D(e,n,t);default:return this.getPackedSamplerND(e,n,t)}}getUnpackedSamplerFromInput(e,n,t){let o=t.unpackedShape;switch(o.length){case 0:return this.getUnpackedSamplerScalar(e,n,t);case 1:return this.getUnpackedSampler1D(e,n,t);case 2:return this.getUnpackedSampler2D(e,n,t);case 3:return this.getUnpackedSampler3D(e,n,t);case 4:return this.getUnpackedSampler4D(e,n,t);case 5:return this.getUnpackedSampler5D(e,n,t);case 6:return this.getUnpackedSampler6D(e,n,t);default:throw new Error(`Unsupported dimension ${o.length}-D`)}}getPackedSamplerScalar(e,n){let t=j(this.context.glContext.version),o=` + vec4 ${e}() { + return ${t.texture2D}(${n}, halfCR); + } + `;return new z(o)}getPackedSampler1D(e,n,t){let o=[t.width,t.height],i=[o[1],o[0]],a=j(this.context.glContext.version),u=`vec4 ${e}(int index) { + vec2 uv = packedUVfrom1D( + ${i[0]}, ${i[1]}, index); + return ${a.texture2D}(${n}, uv); + }`;return new z(u,["coordinates.packedUVfrom1D"])}getPackedSampler2D(e,n,t){let o=t.unpackedShape,i=[t.width,t.height],a=j(this.context.glContext.version),s=i[0],u=i[1];if(i!=null&&Jn.arraysEqual(o,i)){let f=`vec4 ${e}(int row, int col) { + vec2 uv = (vec2(col, row) + halfCR) / vec2(${u}.0, ${s}.0); + return ${a.texture2D}(${n}, uv); + }`;return new z(f)}let l=i,c=Math.ceil(o[1]/2),p=`vec4 ${e}(int row, int col) { + vec2 uv = packedUVfrom2D(${l[1]}, ${l[0]}, ${c}, row, col); + return ${a.texture2D}(${n}, uv); + }`;return new z(p,["coordinates.packedUVfrom2D"])}getPackedSampler3D(e,n,t){let o=t.unpackedShape,i=[t.width,t.height],a=[i[0],i[1]],s=j(this.context.glContext.version);if(o[0]===1){let h=o.slice(1),m=[1,2],y=yr(o,h),g=["b","row","col"],b=JSON.parse(JSON.stringify(t));b.unpackedShape=y;let x=this.getPackedSamplerFromInput(e,n,b),v=`${x.routineBody} + vec4 ${e}(int b, int row, int col) { + return ${e}(${_r(g,m)}); + } `;return new z(v,x.dependencies)}let u=a[0],l=a[1],c=Math.ceil(o[2]/2),d=c*Math.ceil(o[1]/2),f=`vec4 ${e}(int b, int row, int col) { + vec2 uv = packedUVfrom3D( + ${l}, ${u}, ${d}, ${c}, b, row, col); + return ${s.texture2D}(${n}, uv);}`;return new z(f,["coordinates.packedUVfrom3D"])}getPackedSamplerND(e,n,t){let o=t.unpackedShape,i=o.length,a=[t.width,t.height],s=j(this.context.glContext.version),u=[a[0],a[1]],l=u[1],c=u[0],d=Math.ceil(o[i-1]/2),p=d*Math.ceil(o[i-2]/2),f="int b, int row, int col",h=`b * ${p} + (row / 2) * ${d} + (col / 2)`;for(let g=2;g{let o=this.context.inputTextureLayouts[t],a=(o.unpackedShape.length>0?o.unpackedShape:o.shape).length,s=`_${n}`;e[s]=new z(this.getValueFromSingle(n,a,o.width,o.height,!1),[`shapeUtils.indicesToOffset${s}`,"coordinates.offsetToCoords","fragcolor.getColorAsFloat"]),s=s+"_T",e[s]=new z(this.getValueFromSingle(n,a,o.width,o.height,!0),[`shapeUtils.indicesToOffset${s}`,"coordinates.offsetToCoords","fragcolor.getColorAsFloat"])}),e}getValueFromSingle(e,n,t,o,i){let a=`_${e}`;i&&(a=a+"_T");let s=j(this.context.glContext.version);return` + float ${a}(int m[${n}]) { + int offset = indicesToOffset${a}(m); + vec2 coords = offsetToCoords(offset, ${t}, ${o}); + float value = getColorAsFloat(${s.texture2D}(${e}, coords)); + return value; + } + `}getPackedValueFrom(e,n,t,o,i){let a=`_${e}_Pack`;i&&(a=a+"_T");let s=j(this.context.glContext.version);return` + vec4 ${a}(int m[${n}]) { + int offset = indicesToOffset_${e}(m); + vec2 coords = offsetToCoords(offset, ${t}, ${o}); + return ${s.texture2D}(${e}, coords); + } + `}}});var ti,cm=$(()=>{"use strict";$n();ti=class r extends gt{constructor(e){super(e)}getFunctions(){return{...this.encodeFloat32(),...this.decodeFloat32()}}getCustomTypes(){return{}}encodeFloat32(){return{encode:new z(`highp vec4 encode(highp float f) { + return vec4(f, 0.0, 0.0, 0.0); + } + `)}}decodeFloat32(){return{decode:new z(`highp float decode(highp vec4 rgba) { + return rgba.r; + } + `)}}encodeUint8(){let e=r.isLittleEndian()?"rgba.rgba=rgba.abgr;":"";return{encode:new z(` + highp vec4 encode(highp float f) { + highp float F = abs(f); + highp float Sign = step(0.0,-f); + highp float Exponent = floor(log2(F)); + highp float Mantissa = (exp2(- Exponent) * F); + Exponent = floor(log2(F) + 127.0) + floor(log2(Mantissa)); + highp vec4 rgba; + rgba[0] = 128.0 * Sign + floor(Exponent*exp2(-1.0)); + rgba[1] = 128.0 * mod(Exponent,2.0) + mod(floor(Mantissa*128.0),128.0); + rgba[2] = floor(mod(floor(Mantissa*exp2(23.0 -8.0)),exp2(8.0))); + rgba[3] = floor(exp2(23.0)*mod(Mantissa,exp2(-15.0))); + ${e} + rgba = rgba / 255.0; // values need to be normalized to [0,1] + return rgba; + } + `)}}decodeUint8(){let e=r.isLittleEndian()?"rgba.rgba=rgba.abgr;":"";return{decode:new z(` + highp float decode(highp vec4 rgba) { + rgba = rgba * 255.0; // values need to be de-normalized from [0,1] to [0,255] + ${e} + highp float Sign = 1.0 - step(128.0,rgba[0])*2.0; + highp float Exponent = 2.0 * mod(rgba[0],128.0) + step(128.0,rgba[1]) - 127.0; + highp float Mantissa = mod(rgba[1],128.0)*65536.0 + rgba[2]*256.0 +rgba[3] + float(0x800000); + highp float Result = Sign * exp2(Exponent) * (Mantissa * exp2(-23.0 )); + return Result; + } + `)}}static isLittleEndian(){let e=new ArrayBuffer(4),n=new Uint32Array(e),t=new Uint8Array(e);if(n[0]=3735928559,t[0]===239)return!0;if(t[0]===222)return!1;throw new Error("unknown endianness")}}});var ni,dm=$(()=>{"use strict";$n();Oe();ni=class extends gt{constructor(e){super(e)}getFunctions(){return{...this.setFragColor(),...this.getColorAsFloat()}}getCustomTypes(){return{}}setFragColor(){let e=j(this.context.glContext.version);return{setFragColor:new z(` + void setFragColor(float value) { + ${e.output} = encode(value); + } + `,["encoding.encode"])}}getColorAsFloat(){return{getColorAsFloat:new z(` + float getColorAsFloat(vec4 color) { + return decode(color); + } + `,["encoding.decode"])}}}});var ri,pm=$(()=>{"use strict";$n();ri=class r extends gt{constructor(e){super(e)}getFunctions(){return{...this.bcastIndex(),...this.bcastMatmulIndex(),...this.offsetToIndices(),...this.indicesToOffset(),...this.incrementIndices()}}getCustomTypes(){return{}}bcastIndex(){let e=this.context.outputTextureLayout.shape.length,n={};return this.context.programInfo.inputNames.forEach((t,o)=>{let i=this.context.inputTextureLayouts[o].unpackedShape;if(i.length<=e){let a=i.length,s=e-a,u=`bcastIndices_${t}`,l="";for(let d=0;d{let i=this.context.inputTextureLayouts[o].shape;if(!(i.length<2||i.length>e)){let a=i.length,s=e-a,u=`bcastMatmulIndices_${t}`,l="";for(let d=0;d{let o=this.context.inputTextureLayouts[t].shape,i=this.context.inputTextureLayouts[t].strides,a=o.length,s=`indicesToOffset_${n}`;e[s]=new z(r.indexToOffsetSingle(s,a,i)),s=`indicesToOffset_${n}_T`,e[s]=new z(r.indexToOffsetSingle(s,a,i.slice().reverse()))}),e}static indexToOffsetSingle(e,n,t){let o="";for(let i=n-1;i>=0;--i)o+=` + offset += indices[${i}] * ${t[i]}; + `;return` + int ${e}(int indices[${n}]) { + int offset = 0; + ${o} + return offset; + } + `}offsetToIndices(){let e={};return this.context.programInfo.inputNames.forEach((n,t)=>{let o=this.context.inputTextureLayouts[t].shape,i=this.context.inputTextureLayouts[t].strides,a=o.length,s=`offsetToIndices_${n}`;e[s]=new z(r.offsetToIndicesSingle(s,a,i)),s=`offsetToIndices_${n}_T`,e[s]=new z(r.offsetToIndicesSingle(s,a,i.slice().reverse()))}),e}static offsetToIndicesSingle(e,n,t){let o=[];for(let i=0;i{let o=this.context.inputTextureLayouts[t].shape,i=o.length,a=`incrementIndices_${n}`,s="";for(let l=0;l= 0; --i) { + if(i > axis) continue; + indices[i] += 1; + if(indices[i] < shape[i]) { + break; + } + indices[i] = 0; + } + } + `;e[a]=new z(u)}),e}}});var oi,fm=$(()=>{"use strict";$n();oi=class extends gt{constructor(e){super(e)}getCustomTypes(){return{}}getFunctions(){return{...this.binaryVecFunctions(),...this.copyVec(),...this.setVecItem(),...this.getVecItem()}}binaryVecFunctions(){let n=this.context.outputTextureLayout.shape.length,t={add:"+=",sub:"-=",mul:"*=",div:"/="},o={};for(let i in t){let a=`${i}Vec`,s="";for(let l=0;l{"use strict";lm();cm();dm();pm();fm();Ou={encoding:ti,fragcolor:ni,vec:oi,shapeUtils:ri,coordinates:ei}});var ii,mm=$(()=>{"use strict";$n();sm();hm();Oe();ii=class{constructor(e,n,t,o){this.libs={};this.glslLibRoutineDependencyGraph={};this.context=new Uo(e,n,t,o),Object.keys(Ou).forEach(a=>{let s=new Ou[a](this.context);this.libs[a]=s});let i=this.glslLibRoutineDependencyGraph;for(let a in this.libs){let u=this.libs[a].getFunctions();for(let l in u){let c=a+"."+l,d;i[c]?(d=i[c],d.routineBody=u[l].routineBody):(d=new jr(c,u[l].routineBody),i[c]=d);let p=u[l].dependencies;if(p)for(let f=0;f{let o=t.split(".")[1];e.indexOf(o)!==-1&&n.push(this.glslLibRoutineDependencyGraph[t])}),Wo.returnOrderedNodes(n)}getUniforms(e,n){let t=[];if(e)for(let o of e)t.push(`uniform sampler2D ${o};`);if(n)for(let o of n)t.push(`uniform ${o.type} ${o.name}${o.arrayLength?`[${o.arrayLength}]`:""};`);return t.join(` +`)}}});var ai,gm=$(()=>{"use strict";qe();ct();mm();Oe();ai=class{constructor(e,n,t){this.profiler=e;this.glContext=n;this.textureLayoutStrategy=t;this.repo=new Map,this.attributesBound=!1}getArtifact(e){return this.repo.get(e)}setArtifact(e,n){this.repo.set(e,n)}run(e,n,t){this.profiler.event("op",`ProgramManager.run ${e.programInfo.name??"unknown kernel"}`,()=>{let o=this.glContext.gl,i=e.program;o.useProgram(i);try{this.bindOutput(t),this.attributesBound||this.bindAttributes(e.attribLocations),this.bindUniforms(e.uniformLocations,e.programInfo.variables??[],n)}catch(a){throw Te.error("ProgramManager",e.programInfo.shaderSource),a}this.profiler.event("backend","GlContext.draw()",()=>{this.glContext.draw()})},this.glContext)}dispose(){this.vertexShader&&this.glContext.deleteShader(this.vertexShader),this.repo.forEach(e=>this.glContext.deleteProgram(e.program))}build(e,n,t){return this.profiler.event("backend","ProgramManager.build",()=>{let o=new ii(this.glContext,e,n,t),i=o.preprocess(),a=this.compile(i);return{programInfo:e,program:a,uniformLocations:this.getUniformLocations(a,o.context.programInfo.inputNames,o.context.programInfo.variables),attribLocations:this.getAttribLocations(a)}})}compile(e){if(!this.vertexShader){Te.verbose("ProrgramManager","Compiling and caching Vertex shader for the first time");let o=qd(this.glContext.version);this.vertexShader=this.glContext.compileShader(o,this.glContext.gl.VERTEX_SHADER)}ee.debug&&Te.verbose("ProrgramManager",`FragShader: +${e} +`);let n=this.glContext.compileShader(e,this.glContext.gl.FRAGMENT_SHADER),t=this.glContext.createProgram(this.vertexShader,n);return this.glContext.deleteShader(n),t}bindOutput(e){let n=e.width,t=e.height;Te.verbose("ProrgramManager",`Binding output texture to Framebuffer: w/h=${n}/${t}, shape=${e.shape}, type=${e.tensor.type}`),this.glContext.attachFramebuffer(e.texture,n,t)}bindAttributes(e){let n=e.position,t=e.textureCoord;this.glContext.setVertexAttributes(n,t),this.attributesBound=!0}bindUniforms(e,n,t){let o=this.glContext.gl,i=0;for(let{name:a,type:s,location:u,arrayLength:l}of e){let c=n.find(d=>d.name===a)?.data;if(s!=="sampler2D"&&!c)throw new Error(`variable '${a}' does not have data defined in program info`);switch(s){case"sampler2D":this.bindTexture(t[i],u,i),i++;break;case"float":l?o.uniform1fv(u,c):o.uniform1f(u,c);break;case"int":l?o.uniform1iv(u,c):o.uniform1i(u,c);break;default:throw new Error(`Uniform not implemented: ${s}`)}}}bindTexture(e,n,t){this.glContext.bindTextureToUniform(e.texture,t,n)}getAttribLocations(e){return{position:this.getAttribLocation(e,"position"),textureCoord:this.getAttribLocation(e,"textureCoord")}}getUniformLocations(e,n,t){let o=[];if(n)for(let i of n)o.push({name:i,type:"sampler2D",location:this.getUniformLocation(e,i)});if(t)for(let i of t)o.push({...i,location:this.getUniformLocation(e,i.name)});return o}getUniformLocation(e,n){let o=this.glContext.gl.getUniformLocation(e,n);if(o===null)throw new Error(`Uniform ${n} not found.`);return o}getAttribLocation(e,n){return this.glContext.gl.getAttribLocation(e,n)}}});var si,bm=$(()=>{"use strict";ct();Hr();si=class{constructor(e,n,t,o){this.glContext=e;this.layoutStrategy=n;this.profiler=t;this.config=o;this.pendingRead=new Map;o.reuseTextures&&(this.inUseTextures=new Map,this.idleTextures=new Map,this.textureLookup=new Map)}createTextureFromLayout(e,n,t,o){let i=this.toEncoderType(e),a=this.glContext.getEncoder(i,n.channels||1,o);if(n.isPacked&&o===1)throw new Error("not implemented");let s=n.width,u=n.height,l,c;if(this.config.reuseTextures){l=`${s}x${u}_${a.format}_${a.internalFormat}_${a.textureType}`,c=this.inUseTextures.get(l),c||(c=[],this.inUseTextures.set(l,c));let p=this.idleTextures.get(l);if(p&&p.length>0){let f=p.pop();return c.push(f),o===1&&this.glContext.updateTexture(f,s,u,a,this.toTextureData(e,t)),f}}Te.verbose("TextureManager",`Creating new texture of size ${n.width}x${n.height}`);let d=this.glContext.allocateTexture(s,u,a,this.toTextureData(e,t));return this.config.reuseTextures&&(c.push(d),this.textureLookup.set(d,l)),d}readTexture(e,n,t){return t||(t=1),this.profiler.event("backend","TextureManager.readTexture",()=>{let o=e.shape.reduce((a,s)=>a*s)*t,i=this.glContext.readTexture(e.texture,e.width,e.height,o,this.toEncoderType(n),t);return this.toTensorData(n,i)})}async readTextureAsync(e,n,t){let o=e.tensor.dataId;if(t||(t=1),this.pendingRead.has(o)){let i=this.pendingRead.get(o);return new Promise(a=>i?.push(a))}return this.profiler.event("backend","TextureManager.readTextureAsync",async()=>{this.pendingRead.set(o,[]);let i=e.shape.reduce((l,c)=>l*c)*t;await this.glContext.createAndWaitForFence();let a=this.glContext.readTexture(e.texture,e.width,e.height,i,this.toEncoderType(n),t),s=this.toTensorData(n,a),u=this.pendingRead.get(o);return this.pendingRead.delete(o),u?.forEach(l=>l(s)),s})}readUint8TextureAsFloat(e){return this.profiler.event("backend","TextureManager.readUint8TextureAsFloat",()=>{let n=e.shape.reduce((o,i)=>o*i),t=this.glContext.readTexture(e.texture,e.width,e.height,n*4,"byte",4);return new Float32Array(t.buffer,t.byteOffset,n)})}releaseTexture(e,n){let t;if(this.config.reuseTextures&&(t=this.textureLookup.get(e.texture),t)){n&&this.textureLookup.delete(t);let o=this.inUseTextures.get(t);if(o){let i=o.indexOf(e.texture);if(i!==-1){o.splice(i,1);let a=this.idleTextures.get(t);a||(a=[],this.idleTextures.set(t,a)),a.push(e.texture)}}}(!t||n)&&(Te.verbose("TextureManager",`Deleting texture of size ${e.width}x${e.height}`),this.glContext.deleteTexture(e.texture))}toTensorData(e,n){switch(e){case"int16":return n instanceof Int16Array?n:Int16Array.from(n);case"int32":return n instanceof Int32Array?n:Int32Array.from(n);case"int8":return n instanceof Int8Array?n:Int8Array.from(n);case"uint16":return n instanceof Uint16Array?n:Uint16Array.from(n);case"uint32":return n instanceof Uint32Array?n:Uint32Array.from(n);case"uint8":case"bool":return n instanceof Uint8Array?n:Uint8Array.from(n);case"float32":return n instanceof Float32Array?n:Float32Array.from(n);case"float64":return n instanceof Float64Array?n:Float64Array.from(n);default:throw new Error(`TensorData type ${e} is not supported`)}}toTextureData(e,n){if(n)return n instanceof Float32Array?n:new Float32Array(n)}toEncoderType(e){return"float"}clearActiveTextures(){this.glContext.clearActiveTextures()}}});var ui,ym=$(()=>{"use strict";ct();ac();lp();om();gm();Pu();bm();ui=class{constructor(e,n){this.backend=e;this.context=n;this.layoutStrategy=new Yo(e.glContext.maxTextureSize),this.programManager=new ai(this.context.profiler,e.glContext,this.layoutStrategy),this.textureManager=new si(e.glContext,this.layoutStrategy,this.context.profiler,{reuseTextures:e.textureCacheMode==="full"}),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache=new Map,this.pack=e.pack,this.pack2unpackMap=new Map,this.unpack2packMap=new Map}createInferenceHandler(){return new Go(this)}onGraphInitialized(e){let n=e.getValues().filter(t=>t.from===-1&&t.tensor).map(t=>t.tensor.dataId);this.initializers=new Set(n)}isInitializer(e){return this.initializers?this.initializers.has(e):!1}addInitializer(e){this.initializers.add(e)}getTextureData(e,n){return n?this.packedTextureDataCache.get(e):this.unpackedTextureDataCache.get(e)}setTextureData(e,n,t=!1){Te.verbose("WebGLSessionHandler","Storing Texture data in cache"),t?this.packedTextureDataCache.set(e,n):this.unpackedTextureDataCache.set(e,n)}dispose(){this.programManager.dispose(),this.textureManager.clearActiveTextures(),this.packedTextureDataCache.forEach(e=>this.textureManager.releaseTexture(e,!0)),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache.forEach(e=>this.textureManager.releaseTexture(e,!0)),this.unpackedTextureDataCache=new Map}resolve(e,n,t){let o=ic(e,n,rm);return{impl:o.opImpl,context:o.opInit?o.opInit(e,t):e}}}});function yS(r){let e=0;for(;e{"use strict";qe();Hr();Hr();cn();Zr=class{constructor(e,n){this.frameBufferBound=!1;this.itemsToPoll=[];this.gl=e,this.version=n,this.getExtensions(),this.vertexbuffer=this.createVertexbuffer(),this.framebuffer=this.createFramebuffer(),this.queryVitalParameters()}allocateTexture(e,n,t,o){let i=this.gl,a=i.createTexture();i.bindTexture(i.TEXTURE_2D,a),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);let s=o?t.encode(o,e*n):null;return i.texImage2D(i.TEXTURE_2D,0,t.internalFormat,e,n,0,t.format,t.textureType,s),this.checkError(),a}updateTexture(e,n,t,o,i){let a=this.gl;a.bindTexture(a.TEXTURE_2D,e);let s=o.encode(i,n*t);a.texSubImage2D(a.TEXTURE_2D,0,0,0,n,t,o.format,o.textureType,s),this.checkError()}attachFramebuffer(e,n,t){let o=this.gl;o.bindTexture(o.TEXTURE_2D,e),o.bindFramebuffer(o.FRAMEBUFFER,this.framebuffer),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,e,0),this.checkError(),o.viewport(0,0,n,t),o.scissor(0,0,n,t)}readTexture(e,n,t,o,i,a){let s=this.gl;a||(a=1),this.frameBufferBound||this.attachFramebuffer(e,n,t);let u=this.getEncoder(i,a),l=u.allocate(n*t);return s.bindTexture(s.TEXTURE_2D,e),s.framebufferTexture2D(s.FRAMEBUFFER,s.COLOR_ATTACHMENT0,s.TEXTURE_2D,e,0),s.readPixels(0,0,n,t,s.RGBA,u.textureType,l),this.checkError(),u.decode(l,o)}isFramebufferReady(){return!0}getActiveTexture(){let e=this.gl;return`TEXTURE${e.getParameter(this.gl.ACTIVE_TEXTURE)-e.TEXTURE0}`}getTextureBinding(){return this.gl.getParameter(this.gl.TEXTURE_BINDING_2D)}getFramebufferBinding(){return this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING)}setVertexAttributes(e,n){let t=this.gl;t.vertexAttribPointer(e,3,t.FLOAT,!1,20,0),t.enableVertexAttribArray(e),n!==-1&&(t.vertexAttribPointer(n,2,t.FLOAT,!1,20,12),t.enableVertexAttribArray(n)),this.checkError()}createProgram(e,n){let t=this.gl,o=t.createProgram();return t.attachShader(o,e),t.attachShader(o,n),t.linkProgram(o),o}compileShader(e,n){let t=this.gl,o=t.createShader(n);if(!o)throw new Error(`createShader() returned null with type ${n}`);if(t.shaderSource(o,e),t.compileShader(o),t.getShaderParameter(o,t.COMPILE_STATUS)===!1)throw new Error(`Failed to compile shader: ${t.getShaderInfoLog(o)} +Shader source: +${e}`);return o}deleteShader(e){this.gl.deleteShader(e)}bindTextureToUniform(e,n,t){let o=this.gl;o.activeTexture(o.TEXTURE0+n),this.checkError(),o.bindTexture(o.TEXTURE_2D,e),this.checkError(),o.uniform1i(t,n),this.checkError()}draw(){this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4),this.checkError()}checkError(){if(ee.debug){let e=this.gl,n=e.getError(),t="";switch(n){case e.NO_ERROR:return;case e.INVALID_ENUM:t="INVALID_ENUM";break;case e.INVALID_VALUE:t="INVALID_VALUE";break;case e.INVALID_OPERATION:t="INVALID_OPERATION";break;case e.INVALID_FRAMEBUFFER_OPERATION:t="INVALID_FRAMEBUFFER_OPERATION";break;case e.OUT_OF_MEMORY:t="OUT_OF_MEMORY";break;case e.CONTEXT_LOST_WEBGL:t="CONTEXT_LOST_WEBGL";break;default:t=`Unknown WebGL Error: ${n.toString(16)}`}throw new Error(t)}}deleteTexture(e){this.gl.deleteTexture(e)}deleteProgram(e){this.gl.deleteProgram(e)}getEncoder(e,n,t=0){if(this.version===2)return new Vo(this.gl,n);switch(e){case"float":return t===1||this.isRenderFloat32Supported?new Wr(this.gl,n):new Wr(this.gl,n,this.textureHalfFloatExtension.HALF_FLOAT_OES);case"int":throw new Error("not implemented");case"byte":return new Fo(this.gl,n);default:throw new Error(`Invalid dataType: ${e}`)}}clearActiveTextures(){let e=this.gl;for(let n=0;nthis.isTimerResultAvailable(e)),this.getTimerResult(e)}async createAndWaitForFence(){let e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let n,t=e,o=t.fenceSync(t.SYNC_GPU_COMMANDS_COMPLETE,0);return e.flush(),o===null?n=()=>!0:n=()=>{let i=t.clientWaitSync(o,0,0);return i===t.ALREADY_SIGNALED||i===t.CONDITION_SATISFIED},{query:o,isFencePassed:n}}async pollFence(e){return new Promise(n=>{this.addItemToPoll(()=>e.isFencePassed(),()=>n())})}pollItems(){let e=yS(this.itemsToPoll.map(n=>n.isDoneFn));for(let n=0;n<=e;++n){let{resolveFn:t}=this.itemsToPoll[n];t()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}async addItemToPoll(e,n){this.itemsToPoll.push({isDoneFn:e,resolveFn:n}),!(this.itemsToPoll.length>1)&&await eu(()=>(this.pollItems(),this.itemsToPoll.length===0))}}});function Eu(r){let e;if((!r||r==="webgl2")&&"webgl2"in Ir?e=Ir.webgl2:(!r||r==="webgl")&&"webgl"in Ir&&(e=Ir.webgl),!e)try{let t=xS();e=xm(t,r)}catch{let t=_S();e=xm(t,r)}r=r||e.version===1?"webgl":"webgl2";let n=e.gl;return Ir[r]=e,n.isContextLost()?(delete Ir[r],Eu(r)):(n.disable(n.DEPTH_TEST),n.disable(n.STENCIL_TEST),n.disable(n.BLEND),n.disable(n.DITHER),n.disable(n.POLYGON_OFFSET_FILL),n.disable(n.SAMPLE_COVERAGE),n.enable(n.SCISSOR_TEST),n.enable(n.CULL_FACE),n.cullFace(n.BACK),e)}function xm(r,e){let n={alpha:!1,depth:!1,antialias:!1,stencil:!1,preserveDrawingBuffer:!1,premultipliedAlpha:!1,failIfMajorPerformanceCaveat:!1},t,o=n;if((!e||e==="webgl2")&&(t=r.getContext("webgl2",o),t))try{return new Zr(t,2)}catch(i){Te.warning("GlContextFactory",`failed to create WebGLContext using contextId 'webgl2'. Error: ${i}`)}if((!e||e==="webgl")&&(t=r.getContext("webgl",o)||r.getContext("experimental-webgl",o),t))try{return new Zr(t,1)}catch(i){Te.warning("GlContextFactory",`failed to create WebGLContext using contextId 'webgl' or 'experimental-webgl'. Error: ${i}`)}throw new Error("WebGL is not supported")}function _S(){if(typeof document>"u")throw new TypeError("failed to create canvas: document is not supported");let r=document.createElement("canvas");return r.width=1,r.height=1,r}function xS(){if(typeof OffscreenCanvas>"u")throw new TypeError("failed to create offscreen canvas: OffscreenCanvas is not supported");return new OffscreenCanvas(1,1)}var Ir,wm=$(()=>{"use strict";ct();_m();Ir={}});var li,Tm=$(()=>{"use strict";qe();ct();ym();wm();li=class{get contextId(){return ee.webgl.contextId}set contextId(e){ee.webgl.contextId=e}get matmulMaxBatchSize(){return ee.webgl.matmulMaxBatchSize}set matmulMaxBatchSize(e){ee.webgl.matmulMaxBatchSize=e}get textureCacheMode(){return ee.webgl.textureCacheMode}set textureCacheMode(e){ee.webgl.textureCacheMode=e}get pack(){return ee.webgl.pack}set pack(e){ee.webgl.pack=e}get async(){return ee.webgl.async}set async(e){ee.webgl.async=e}initialize(){try{return this.glContext=Eu(this.contextId),typeof this.matmulMaxBatchSize!="number"&&(this.matmulMaxBatchSize=16),typeof this.textureCacheMode!="string"&&(this.textureCacheMode="full"),typeof this.pack!="boolean"&&(this.pack=!1),typeof this.async!="boolean"&&(this.async=!1),Te.setWithEnv(ee),ee.webgl.context||Object.defineProperty(ee.webgl,"context",{value:this.glContext.gl}),Te.verbose("WebGLBackend",`Created WebGLContext: ${typeof this.glContext} with matmulMaxBatchSize: ${this.matmulMaxBatchSize}; textureCacheMode: ${this.textureCacheMode}; pack: ${this.pack}; async: ${this.async}.`),!0}catch(e){return Te.warning("WebGLBackend",`Unable to initialize WebGLBackend. ${e}`),!1}}createSessionHandler(e){return new ui(this,e)}dispose(){this.glContext.dispose()}}});async function Cu(r){if(r){let e=typeof r=="string"?[r]:r;for(let n of e){let t=vm.get(n);if(t)return t;let o=await TS(n);if(o)return o}}else return Cu(["webgl"]);throw new Error("no available backend to use")}async function TS(r){let e=wS;if(typeof e[r]<"u"&&vS(e[r])){let n=e[r],t=n.initialize();if(typeof t=="object"&&"then"in t&&(t=await t),t)return vm.set(r,n),n}}function vS(r){let e=r;return"initialize"in e&&typeof e.initialize=="function"&&"createSessionHandler"in e&&typeof e.createSessionHandler=="function"&&"dispose"in e&&typeof e.dispose=="function"}var vm,wS,Im=$(()=>{"use strict";Tm();vm=new Map,wS={webgl:new li}});var Du,ci,Sm=$(()=>{"use strict";ct();Du=class{constructor(e,n){this.op=e;this.node=n}},ci=class{constructor(e,n,t){this.graph=e;this.profiler=t;this.initialize(n)}initialize(e){this.profiler.event("session","ExecutionPlan.initialize",()=>{let n=this.graph.getNodes();if(n.length!==e.length)throw new Error("The size of nodes and OPs do not match.");this._ops=e.map((t,o)=>new Du(t,n[o])),this.reset(),this._starter=[],this._ops.forEach((t,o)=>{let i=!0;for(let a of t.node.inputs)if(!this._values[a]&&this.graph.getInputIndices().indexOf(a)===-1){i=!1;break}i&&this._starter.push(o)})})}reset(){this._values=this.graph.getValues().map(e=>e.tensor)}async execute(e,n){return this.profiler.event("session","ExecutionPlan.execute",async()=>{this.reset();let t=e.createInferenceHandler(),o=this.graph.getInputIndices();if(n.length!==o.length)throw new Error(`number of input tensors don't match the number of inputs to the model: actual: ${n.length} expected: ${o.length}`);n.forEach((c,d)=>{let p=o[d];this._values[p]=c});let i=this._starter.slice(0),a=this.graph.getValues(),s=this.graph.getNodes(),u=0;for(;uthis._values[y]);if(p.indexOf(void 0)!==-1)throw new Error(`unresolved input detected: op: ${d.node}`);let f=p;Te.verbose("ExecPlan",`Running op:${d.node.name} (${f.map((y,g)=>`'${d.node.inputs[g]}': ${y.type}[${y.dims.join(",")}]`).join(", ")})`);let h=await this.profiler.event("node",d.node.name,async()=>d.op.impl(t,f,d.op.context));if(h.length!==d.node.outputs.length)throw new Error("the size of output does not match model definition.");h.forEach((y,g)=>{let b=d.node.outputs[g];if(this._values[b])throw new Error(`output [${b}] already has value: op:${d.node.name}`);this._values[b]=y});let m=new Set;h.forEach((y,g)=>{let b=d.node.outputs[g];for(let x of a[b].to){let w=s[x],v=!0;for(let I of w.inputs)if(!this._values[I]){v=!1;break}v&&m.add(x)}}),i.push(...m)}let l=[];for(let c=0;c{"use strict";Mr();de=se(gr());tr();xe();Jr=class r{constructor(e){if(this._attributes=new Map,e!=null){for(let n of e)n instanceof de.onnx.AttributeProto?this._attributes.set(n.name,[r.getValue(n),r.getType(n)]):n instanceof Do.Attribute&&this._attributes.set(n.name(),[r.getValue(n),r.getType(n)]);if(this._attributes.sizeNe.fromProto(i));if(e instanceof Do.Attribute)return t.map(i=>Ne.fromOrtTensor(i))}return n===de.onnx.AttributeProto.AttributeType.STRING&&e instanceof de.onnx.AttributeProto?Ur(t):n===de.onnx.AttributeProto.AttributeType.STRINGS&&e instanceof de.onnx.AttributeProto?t.map(Ur):t}static getValueNoCheck(e){return e instanceof de.onnx.AttributeProto?this.getValueNoCheckFromOnnxFormat(e):this.getValueNoCheckFromOrtFormat(e)}static getValueNoCheckFromOnnxFormat(e){switch(e.type){case de.onnx.AttributeProto.AttributeType.FLOAT:return e.f;case de.onnx.AttributeProto.AttributeType.INT:return e.i;case de.onnx.AttributeProto.AttributeType.STRING:return e.s;case de.onnx.AttributeProto.AttributeType.TENSOR:return e.t;case de.onnx.AttributeProto.AttributeType.GRAPH:return e.g;case de.onnx.AttributeProto.AttributeType.FLOATS:return e.floats;case de.onnx.AttributeProto.AttributeType.INTS:return e.ints;case de.onnx.AttributeProto.AttributeType.STRINGS:return e.strings;case de.onnx.AttributeProto.AttributeType.TENSORS:return e.tensors;case de.onnx.AttributeProto.AttributeType.GRAPHS:return e.graphs;default:throw new Error(`unsupported attribute type: ${de.onnx.AttributeProto.AttributeType[e.type]}`)}}static getValueNoCheckFromOrtFormat(e){switch(e.type()){case ht.AttributeType.FLOAT:return e.f();case ht.AttributeType.INT:return e.i();case ht.AttributeType.STRING:return e.s();case ht.AttributeType.TENSOR:return e.t();case ht.AttributeType.GRAPH:return e.g();case ht.AttributeType.FLOATS:return e.floatsArray();case ht.AttributeType.INTS:{let n=[];for(let t=0;t{"use strict";$m();Mr();Lu=se(gr());tr();xe();Ru={from:(r,e)=>new ku(r,e)},fn=class{constructor(e){this._from=void 0,this._to=[],this.tensor=void 0,this.type=void 0,e&&(this.type=je.tensorValueTypeFromProto(e.type.tensorType))}get from(){return this._from}get to(){return this._to}},di=class{constructor(e,n){e instanceof Lu.onnx.NodeProto?(this.name=e.name,this.opType=e.opType,this.attributes=new Jr(e.attribute)):e instanceof Ns.Node&&(this.name=n??e.name(),this.opType=e.opType(),this.attributes=new Jr(je.tensorAttributesFromORTFormat(e))),this.inputs=[],this.outputs=[],this.executeNode=!0}},ku=class{constructor(e,n){if(!e)throw new TypeError("graph is empty");this.buildGraph(e),this.transformGraph(n),this.checkIsAcyclic()}getInputIndices(){return this._allInputIndices}getInputNames(){return this._allInputNames}getOutputIndices(){return this._allOutputIndices}getOutputNames(){return this._allOutputNames}getValues(){return this._allData}getNodes(){return this._nodes}buildGraph(e){if(e instanceof Lu.onnx.GraphProto)this.buildGraphFromOnnxFormat(e);else if(e instanceof Ls.Graph)this.buildGraphFromOrtFormat(e);else throw new TypeError("Graph type is not supported.")}buildGraphFromOnnxFormat(e){let n=new Map;this._allData=[],this._allInputIndices=[],this._allInputNames=[],this._allOutputIndices=[],this._allOutputNames=[],this._nodes=[];let t=new Map;if(!e.input)throw new Error("missing information in graph: input");let o=[];for(let i of e.input){if(n.has(i.name))throw new Error(`duplicated input name: ${i.name}`);let a=this._allData.push(new fn(i))-1;n.set(i.name,a),o.push(i.name)}if(!e.initializer)throw new Error("missing information in graph: initializer");for(let i of e.initializer){let a=n.get(i.name);if(a===void 0){let s=new fn;s.type={shape:{dims:je.tensorDimsFromProto(i.dims)},tensorType:je.tensorDataTypeFromProto(i.dataType)},a=this._allData.push(s)-1,n.set(i.name,a)}this._allData[a]._from=-1,this._allData[a].tensor=Ne.fromProto(i)}for(let i=0;i"u"&&(l=this._allData.push(new fn)-1,n.set(u,l)),a.outputs.push(l),this._allData[l]._from!==void 0)throw new Error(`multiple nodes output to one data value: ${l}`);if(this._allData[l]._from=i,s.opType==="Constant"){if(!s.attribute||s.attribute.length!==1||!s.attribute[0].t)throw new Error("missing attributes or missing tensor value in attributes for this Constant operator");if(!s.output||s.output.length!==1)throw new Error("missing output or incorrect number of outputs for this Constant operator");a.outputs.pop(),a.executeNode=!1,this._allData[l]._from=-1,this._allData[l].tensor=Ne.fromProto(s.attribute[0].t)}}}for(let i=0;i"u"){if(u===""&&(s.input.length===3||s.input.length===4)&&s.opType==="Resize")continue;throw new Error(`unrecognized input '${u}' for node: ${s.name}`)}a.inputs.push(l),this._allData[l]._to.push(i)}}return!0}buildGraphFromOrtFormat(e){let n=new Map;this._allData=[],this._allInputIndices=[],this._allInputNames=[],this._allOutputIndices=[],this._allOutputNames=[],this._nodes=[];let t=new Map,o=[];for(let i=0;i"u"&&(c=this._allData.push(new fn)-1,n.set(l,c)),a.outputs.push(c),this._allData[c]._from!==void 0)throw new Error(`multiple nodes output to one data value: ${c}`);if(this._allData[c]._from=i,s.opType()==="Constant"){if(s.attributesLength()!==1||!s.attributes(0).t())throw new Error("missing attributes or missing tensor value in attributes for this Constant operator");if(s.outputsLength()!==1)throw new Error("missing output or incorrect number of outputs for this Constant operator");a.outputs.pop(),a.executeNode=!1,this._allData[c]._from=-1,this._allData[c].tensor=Ne.fromOrtTensor(s.attributes(0).t())}}}for(let i=0;i"u")throw new Error(`unrecognized input '${l}' for node: ${s.name()}`);a.inputs.push(c),this._allData[c]._to.push(i)}}}checkIsAcyclic(){let e=new Set;this._allInputIndices.forEach(o=>{this._allData[o]._to.forEach(a=>{e.add(a)})});let n=Array.from(e),t=new Array(this._nodes.length).fill("white");for(;n.length>0;){let o=n.pop();t[o]==="gray"?t[o]="black":(n.push(o),t[o]="gray",this._nodes[o].outputs.forEach(i=>{let a=this._allData[i];if(typeof a.tensor<"u")throw new Error("node outputs should not be initialized");if(a._from!==o)throw new Error("from property of the Value object doesn't match index of Node being processed");a._to.forEach(s=>{if(t[s]==="gray")throw new Error("model graph is cyclic");t[s]==="white"&&n.push(s)})}))}}transformGraph(e){this.removeAllIdentityNodes(),this.removeAllDropoutNodes(),this.fuseConvActivationNodes(),e&&e.transformGraph(this),this.finalizeGraph()}finalizeGraph(){let e=0,n=new Array(this._nodes.length,0),t=0;for(let o=0;o{this._allData[i]._from=-2});this._nodes.splice(t,this._nodes.length-t);for(let o=0;o=0)i._to[a]=n[i._to[a]];else throw new Error("Trying to update a removed node")}e=0;for(let o=0;o0){let i=-1;this._allData[o].from!==void 0&&this._allData[o].from!==-1?(i=this._nodes[this._allData[o].from].outputs.indexOf(o+e),i!==-1&&(this._nodes[this._allData[o].from].outputs[i]=o)):(i=this._allInputIndices.indexOf(o+e),i!==-1&&(this._allInputIndices[i]=o)),this._allData[o].to.forEach(a=>{i=this._nodes[a].inputs.indexOf(o+e),i!==-1&&(this._nodes[a].inputs[i]=o)}),this._allData[o].to.length===0&&(i=this._allOutputIndices.indexOf(o+e),i!==-1&&(this._allOutputIndices[i]=o))}}}deleteNode(e){let n=this._nodes[e];if(n.outputs.length>1){for(let s=1;s0)throw new Error("Node deletion with more than one output connected to other nodes is not supported. ")}n.executeNode=!1;let t=n.inputs[0],o=n.outputs[0],i=this._allData[o].to;for(let s=0;s0)for(let s of i){let u=this._nodes[s].inputs.indexOf(o);if(u===-1)throw new Error("The Node object doesn't have the output Value in it's 'inputs' property ");this._nodes[s].inputs[u]=t,this._allData[t].to.push(s)}}removeAllDropoutNodes(){let e=0;for(let n of this._nodes){if(n.opType==="Dropout"){if(n.inputs.length!==1)throw new Error("Dropout nodes should only contain one input. ");if(n.outputs.length!==1&&n.outputs.length!==2)throw new Error("Dropout nodes should contain either 1 or 2 output(s)");if(n.outputs.length===2&&this._allData[n.outputs[1]]._to.length!==0)throw new Error("Dropout nodes's second output should not be referenced by other nodes");this.deleteNode(e)}e++}}removeAllIdentityNodes(){let e=0;for(let n of this._nodes)n.opType==="Identity"&&this.deleteNode(e),e++}isActivation(e){switch(e.opType){case"Relu":case"Sigmoid":case"Clip":return!0;default:return!1}}fuseConvActivationNodes(){for(let e of this._nodes)if(e.opType==="Conv"){let n=this._allData[e.outputs[0]]._to;if(n.length===1&&this.isActivation(this._nodes[n[0]])){let t=this._nodes[n[0]];if(t.opType==="Clip")if(t.inputs.length===1)try{e.attributes.set("activation_params","floats",[t.attributes.getFloat("min"),t.attributes.getFloat("max")])}catch{e.attributes.set("activation_params","floats",[Yn,er])}else if(t.inputs.length>=3&&this._allData[t.inputs[1]].tensor!==void 0&&this._allData[t.inputs[2]].tensor!==void 0)e.attributes.set("activation_params","floats",[this._allData[t.inputs[1]].tensor.floatData[0],this._allData[t.inputs[2]].tensor.floatData[0]]);else continue;e.attributes.set("activation","string",t.opType),this.deleteNode(n[0])}}}}});var Pm,Om,pi,Em=$(()=>{"use strict";Pm=se(_e());Am();Mr();Om=se(gr());xe();pi=class{constructor(){}load(e,n,t){let o;if(!t)try{this.loadFromOnnxFormat(e,n);return}catch(i){if(t!==void 0)throw i;o=i}try{this.loadFromOrtFormat(e,n)}catch(i){throw t!==void 0?i:new Error(`Failed to load model as ONNX format: ${o} +as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=Om.onnx.ModelProto.decode(e);if(ot.longToNumber(t.irVersion)<3)throw new Error("only support ONNX model with IR_VERSION>=3");this._opsets=t.opsetImport.map(i=>({domain:i.domain,version:ot.longToNumber(i.version)})),this._graph=Ru.from(t.graph,n)}loadFromOrtFormat(e,n){let t=new Pm.ByteBuffer(e),o=Rs.InferenceSession.getRootAsInferenceSession(t).model();if(ot.longToNumber(o.irVersion())<3)throw new Error("only support ONNX model with IR_VERSION>=3");this._opsets=[];for(let a=0;a{"use strict";Im();Sm();ct();Em();fi=class{constructor(e={}){this._initialized=!1,this.backendHint=e.backendHint,this.profiler=yo.create(e.profiler),this.context={profiler:this.profiler,graphInputTypes:[],graphInputDims:[]}}get inputNames(){return this._model.graph.getInputNames()}get outputNames(){return this._model.graph.getOutputNames()}startProfiling(){this.profiler.start()}endProfiling(){this.profiler.stop()}async loadModel(e,n,t){await this.profiler.event("session","Session.loadModel",async()=>{let o=await Cu(this.backendHint);if(this.sessionHandler=o.createSessionHandler(this.context),this._model=new pi,typeof e=="string"){let i=e.endsWith(".ort");{let s=await(await fetch(e)).arrayBuffer();this.initialize(new Uint8Array(s),i)}}else if(ArrayBuffer.isView(e))this.initialize(e);else{let i=new Uint8Array(e,n||0,t||e.byteLength);this.initialize(i)}})}initialize(e,n){if(this._initialized)throw new Error("already initialized");this.profiler.event("session","Session.initialize",()=>{let t=this.sessionHandler.transformGraph?this.sessionHandler:void 0;this._model.load(e,t,n),this.sessionHandler.onGraphInitialized&&this.sessionHandler.onGraphInitialized(this._model.graph),this.initializeOps(this._model.graph),this._executionPlan=new ci(this._model.graph,this._ops,this.profiler)}),this._initialized=!0}async run(e){if(!this._initialized)throw new Error("session not initialized yet");return this.profiler.event("session","Session.run",async()=>{let n=this.normalizeAndValidateInputs(e),t=await this._executionPlan.execute(this.sessionHandler,n);return this.createOutput(t)})}normalizeAndValidateInputs(e){let n=this._model.graph.getInputNames();if(Array.isArray(e)){if(e.length!==n.length)throw new Error(`incorrect input array length: expected ${n.length} but got ${e.length}`)}else{if(e.size!==n.length)throw new Error(`incorrect input map size: expected ${n.length} but got ${e.size}`);let t=new Array(e.size),o=0;for(let i=0;i{"use strict";qe();tr();hi=class{constructor(e){this.session=e;this.inputNames=this.session.inputNames,this.outputNames=this.session.outputNames}get inputMetadata(){throw new Error("Getting model metadata is not supported in webgl backend.")}get outputMetadata(){throw new Error("Getting model metadata is not supported in webgl backend.")}async dispose(){}async run(e,n,t){let o=new Map;for(let s in e)if(Object.hasOwnProperty.call(e,s)){let u=e[s];o.set(s,new Ne(u.dims,u.type,void 0,void 0,u.data))}let i=await this.session.run(o),a={};return i.forEach((s,u)=>{a[u]=new Ye(s.type,s.data,s.dims)}),a}startProfiling(){this.session.startProfiling()}endProfiling(){this.session.endProfiling()}}});var km={};Wn(km,{onnxjsBackend:()=>IS});var Nu,IS,Lm=$(()=>{"use strict";Cm();Dm();Nu=class{async init(){}async createInferenceSessionHandler(e,n){let t=new fi(n);return typeof e=="string"?await t.loadModel(e):await t.loadModel(e),new hi(t)}},IS=new Nu});var mi=$(()=>{"use strict"});var zm={};Wn(zm,{default:()=>SS});var Rm,Nm,SS,Mm=$(()=>{"use strict";zu();Mn();gi();Rm="ort-wasm-proxy-worker",Nm=globalThis.self?.name===Rm;Nm&&(self.onmessage=r=>{let{type:e,in:n}=r.data;try{switch(e){case"init-wasm":bi(n.wasm).then(()=>{yi(n).then(()=>{postMessage({type:e})},t=>{postMessage({type:e,err:t})})},t=>{postMessage({type:e,err:t})});break;case"init-ep":{let{epName:t,env:o}=n;_i(o,t).then(()=>{postMessage({type:e})},i=>{postMessage({type:e,err:i})});break}case"copy-from":{let{buffer:t}=n,o=Qr(t);postMessage({type:e,out:o});break}case"create":{let{model:t,options:o}=n;xi(t,o).then(i=>{postMessage({type:e,out:i})},i=>{postMessage({type:e,err:i})});break}case"release":wi(n),postMessage({type:e});break;case"run":{let{sessionId:t,inputIndices:o,inputs:i,outputIndices:a,options:s}=n;Ti(t,o,i,a,new Array(a.length).fill(null),s).then(u=>{u.some(l=>l[3]!=="cpu")?postMessage({type:e,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:e,out:u},Ii([...i,...u]))},u=>{postMessage({type:e,err:u})});break}case"end-profiling":vi(n),postMessage({type:e});break;default:}}catch(t){postMessage({type:e,err:t})}});SS=Nm?null:r=>new Worker(r??st,{type:"classic",name:Rm})});var $S,AS,st,Si,Mu,PS,OS,Fm,ES,Bm,Gm,Vm,Um,gi=$(()=>{"use strict";mi();$S=typeof location>"u"?void 0:location.origin,AS=()=>{if(!!1)return typeof document<"u"?document.currentScript?.src:typeof self<"u"?self.location?.href:void 0},st=AS(),Si=()=>{if(st&&!st.startsWith("blob:"))return st.substring(0,st.lastIndexOf("/")+1)},Mu=(r,e)=>{try{let n=e??st;return(n?new URL(r,n):new URL(r)).origin===$S}catch{return!1}},PS=(r,e)=>{let n=e??st;try{return(n?new URL(r,n):new URL(r)).href}catch{return}},OS=(r,e)=>`${e??"./"}${r}`,Fm=async r=>{let n=await(await fetch(r,{credentials:"same-origin"})).blob();return URL.createObjectURL(n)},ES=async r=>(await import(/*webpackIgnore:true*/ /*@vite-ignore*/r)).default,Bm=(Mm(),pr(zm)).default,Gm=async()=>{if(!st)throw new Error("Failed to load proxy worker: cannot determine the script source URL.");if(Mu(st))return[void 0,Bm()];let r=await Fm(st);return[r,Bm(r)]},Vm=void 0,Um=async(r,e,n,t)=>{let o=Vm&&!(r||e);if(o)if(st)o=Mu(st)||t&&!n;else if(t&&!n)o=!0;else throw new Error("cannot determine the script source URL.");if(o)return[void 0,Vm];{let i="ort-wasm-simd-threaded.jsep.mjs",a=r??PS(i,e),s=!!1&&n&&a&&!Mu(a,e),u=s?await Fm(a):a??OS(i,e);return[s?u:void 0,await ES(u)]}}});var Bu,Vu,$i,Wm,CS,DS,kS,bi,we,Mn=$(()=>{"use strict";gi();Vu=!1,$i=!1,Wm=!1,CS=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},DS=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},kS=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},bi=async r=>{if(Vu)return Promise.resolve();if($i)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(Wm)throw new Error("previous call to 'initializeWebAssembly()' failed.");$i=!0;let e=r.initTimeout,n=r.numThreads;if(r.simd!==!1){if(r.simd==="relaxed"){if(!kS())throw new Error("Relaxed WebAssembly SIMD is not supported in the current environment.")}else if(!DS())throw new Error("WebAssembly SIMD is not supported in the current environment.")}let t=CS();n>1&&!t&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+n+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),r.numThreads=n=1);let o=r.wasmPaths,i=typeof o=="string"?o:void 0,a=o?.mjs,s=a?.href??a,u=o?.wasm,l=u?.href??u,c=r.wasmBinary,[d,p]=await Um(s,i,n>1,!!c||!!l),f=!1,h=[];if(e>0&&h.push(new Promise(m=>{setTimeout(()=>{f=!0,m()},e)})),h.push(new Promise((m,y)=>{let g={numThreads:n};if(c)g.wasmBinary=c,g.locateFile=b=>b;else if(l||i)g.locateFile=b=>l??i+b;else if(s&&s.indexOf("blob:")!==0)g.locateFile=b=>new URL(b,s).href;else if(d){let b=Si();b&&(g.locateFile=x=>b+x)}p(g).then(b=>{$i=!1,Vu=!0,Bu=b,m(),d&&URL.revokeObjectURL(d)},b=>{$i=!1,Wm=!0,y(b)})})),await Promise.race(h),f)throw new Error(`WebAssembly backend initializing failed due to timeout: ${e}ms`)},we=()=>{if(Vu&&Bu)return Bu;throw new Error("WebAssembly is not initialized yet.")}});var ut,Yr,fe,Ai=$(()=>{"use strict";Mn();ut=(r,e)=>{let n=we(),t=n.lengthBytesUTF8(r)+1,o=n._malloc(t);return n.stringToUTF8(r,o,t),e.push(o),o},Yr=(r,e,n,t)=>{if(typeof r=="object"&&r!==null){if(n.has(r))throw new Error("Circular reference in options");n.add(r)}Object.entries(r).forEach(([o,i])=>{let a=e?e+o:o;if(typeof i=="object")Yr(i,a+".",n,t);else if(typeof i=="string"||typeof i=="number")t(a,i.toString());else if(typeof i=="boolean")t(a,i?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof i}`)})},fe=r=>{let e=we(),n=e.stackSave();try{let t=e.PTR_SIZE,o=e.stackAlloc(2*t);e._OrtGetLastError(o,o+t);let i=Number(e.getValue(o,t===4?"i32":"i64")),a=e.getValue(o+t,"*"),s=a?e.UTF8ToString(a):"";throw new Error(`${r} ERROR_CODE: ${i}, ERROR_MESSAGE: ${s}`)}finally{e.stackRestore(n)}}});var Hm,qm=$(()=>{"use strict";Mn();Ai();Hm=r=>{let e=we(),n=0,t=[],o=r||{};try{if(r?.logSeverityLevel===void 0)o.logSeverityLevel=2;else if(typeof r.logSeverityLevel!="number"||!Number.isInteger(r.logSeverityLevel)||r.logSeverityLevel<0||r.logSeverityLevel>4)throw new Error(`log severity level is not valid: ${r.logSeverityLevel}`);if(r?.logVerbosityLevel===void 0)o.logVerbosityLevel=0;else if(typeof r.logVerbosityLevel!="number"||!Number.isInteger(r.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${r.logVerbosityLevel}`);r?.terminate===void 0&&(o.terminate=!1);let i=0;return r?.tag!==void 0&&(i=ut(r.tag,t)),n=e._OrtCreateRunOptions(o.logSeverityLevel,o.logVerbosityLevel,!!o.terminate,i),n===0&&fe("Can't create run options."),r?.extra!==void 0&&Yr(r.extra,"",new WeakSet,(a,s)=>{let u=ut(a,t),l=ut(s,t);e._OrtAddRunConfigEntry(n,u,l)!==0&&fe(`Can't set a run config entry: ${a} - ${s}.`)}),[n,t]}catch(i){throw n!==0&&e._OrtReleaseRunOptions(n),t.forEach(a=>e._free(a)),i}}});var LS,RS,NS,Pi,zS,jm,Km=$(()=>{"use strict";Mn();Ai();LS=r=>{switch(r){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"layout":return 3;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${r}`)}},RS=r=>{switch(r){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${r}`)}},NS=r=>{r.extra||(r.extra={}),r.extra.session||(r.extra.session={});let e=r.extra.session;e.use_ort_model_bytes_directly||(e.use_ort_model_bytes_directly="1"),r.executionProviders&&r.executionProviders.some(n=>(typeof n=="string"?n:n.name)==="webgpu")&&(r.enableMemPattern=!1)},Pi=(r,e,n,t)=>{let o=ut(e,t),i=ut(n,t);we()._OrtAddSessionConfigEntry(r,o,i)!==0&&fe(`Can't set a session config entry: ${e} - ${n}.`)},zS=async(r,e,n)=>{let t=e.executionProviders;for(let o of t){let i=typeof o=="string"?o:o.name,a=[];switch(i){case"webnn":if(i="WEBNN",typeof o!="string"){let p=o?.deviceType;p&&Pi(r,"deviceType",p,n)}break;case"webgpu":if(i="JS",typeof o!="string"){let d=o;if(d?.preferredLayout){if(d.preferredLayout!=="NCHW"&&d.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${d.preferredLayout}`);Pi(r,"preferredLayout",d.preferredLayout,n)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${i}`)}let s=ut(i,n),u=a.length,l=0,c=0;if(u>0){l=we()._malloc(u*we().PTR_SIZE),n.push(l),c=we()._malloc(u*we().PTR_SIZE),n.push(c);for(let d=0;d{let e=we(),n=0,t=[],o=r||{};NS(o);try{let i=LS(o.graphOptimizationLevel??"all"),a=RS(o.executionMode??"sequential"),s=typeof o.logId=="string"?ut(o.logId,t):0,u=o.logSeverityLevel??2;if(!Number.isInteger(u)||u<0||u>4)throw new Error(`log severity level is not valid: ${u}`);let l=o.logVerbosityLevel??0;if(!Number.isInteger(l)||l<0||l>4)throw new Error(`log verbosity level is not valid: ${l}`);let c=typeof o.optimizedModelFilePath=="string"?ut(o.optimizedModelFilePath,t):0;if(n=e._OrtCreateSessionOptions(i,!!o.enableCpuMemArena,!!o.enableMemPattern,a,!!o.enableProfiling,0,s,u,l,c),n===0&&fe("Can't create session options."),o.executionProviders&&await zS(n,o,t),o.enableGraphCapture!==void 0){if(typeof o.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${o.enableGraphCapture}`);Pi(n,"enableGraphCapture",o.enableGraphCapture.toString(),t)}if(o.freeDimensionOverrides)for(let[d,p]of Object.entries(o.freeDimensionOverrides)){if(typeof d!="string")throw new Error(`free dimension override name must be a string: ${d}`);if(typeof p!="number"||!Number.isInteger(p)||p<0)throw new Error(`free dimension override value must be a non-negative integer: ${p}`);let f=ut(d,t);e._OrtAddFreeDimensionOverride(n,f,p)!==0&&fe(`Can't set a free dimension override: ${d} - ${p}.`)}return o.extra!==void 0&&Yr(o.extra,"",new WeakSet,(d,p)=>{Pi(n,d,p,t)}),[n,t]}catch(i){throw n!==0&&e._OrtReleaseSessionOptions(n)!==0&&fe("Can't release session options."),t.forEach(a=>e._free(a)),i}}});var Bn,hn,Vn,Sr,eo,Oi,Ei,Fu,Z=$(()=>{"use strict";Bn=r=>{switch(r){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;case"int4":return 22;case"uint4":return 21;default:throw new Error(`unsupported data type: ${r}`)}},hn=r=>{switch(r){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";case 22:return"int4";case 21:return"uint4";default:throw new Error(`unsupported data type: ${r}`)}},Vn=(r,e)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][r],t=typeof e=="number"?e:e.reduce((o,i)=>o*i,1);return n>0?Math.ceil(t*n):void 0},Sr=r=>{switch(r){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${r}`)}},eo=r=>{switch(r){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${r}`)}},Oi=r=>r==="float32"||r==="float16"||r==="int32"||r==="int64"||r==="uint32"||r==="uint8"||r==="bool"||r==="uint4"||r==="int4",Ei=r=>r==="float32"||r==="float16"||r==="int32"||r==="int64"||r==="uint32"||r==="uint64"||r==="int8"||r==="uint8"||r==="bool"||r==="uint4"||r==="int4",Fu=r=>{switch(r){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;case"ml-tensor":return 5;default:throw new Error(`unsupported data location: ${r}`)}}});var to,Gu=$(()=>{"use strict";mi();to=async r=>{if(typeof r=="string")if(!1)try{let{readFile:e}=ua("node:fs/promises");return new Uint8Array(await e(r))}catch(e){if(e.code==="ERR_FS_FILE_TOO_LARGE"){let{createReadStream:n}=ua("node:fs"),t=n(r),o=[];for await(let i of t)o.push(i);return new Uint8Array(Buffer.concat(o))}throw e}else{let e=await fetch(r);if(!e.ok)throw new Error(`failed to load external data file: ${r}`);let n=e.headers.get("Content-Length"),t=n?parseInt(n,10):0;if(t<1073741824)return new Uint8Array(await e.arrayBuffer());{if(!e.body)throw new Error(`failed to load external data file: ${r}, no response body.`);let o=e.body.getReader(),i;try{i=new ArrayBuffer(t)}catch(s){if(s instanceof RangeError){let u=Math.ceil(t/65536);i=new WebAssembly.Memory({initial:u,maximum:u}).buffer}else throw s}let a=0;for(;;){let{done:s,value:u}=await o.read();if(s)break;let l=u.byteLength;new Uint8Array(i,a,l).set(u),a+=l}return new Uint8Array(i,0,t)}}else return r instanceof Blob?new Uint8Array(await r.arrayBuffer()):r instanceof Uint8Array?r:new Uint8Array(r)}});var MS,BS,Xm,Zm,Ci,VS,ie,mn=$(()=>{"use strict";Z();MS=["V","I","W","E","F"],BS=(r,e)=>{console.log(`[${MS[r]},${new Date().toISOString()}]${e}`)},Ci=(r,e)=>{Xm=r,Zm=e},VS=(r,e)=>{let n=eo(r),t=eo(Xm);n>=t&&BS(n,typeof e=="function"?e():e)},ie=(...r)=>{Zm&&VS(...r)}});var Uu,gn,S,sr,Di,Jm,Qm,ne=$(()=>{"use strict";Uu=class{static calcMatMulShape(e,n){return e[1]!==n[0]?void 0:[e[0],n[1]]}},gn=class{static calcShape(e,n,t=!1){let o=e.length,i=n.length;if(o===0)return n;if(i===0)return e;let a=Math.max(e.length,n.length),s=new Array(a);if(t){if(o<2||i<2)return;let u=Uu.calcMatMulShape([e[o-2],e[o-1]],[n[i-2],n[i-1]]);if(u===void 0)return;[s[a-2],s[a-1]]=u}for(let u=t?3:1;u<=a;u++){let l=o-u<0?1:e[o-u],c=i-u<0?1:n[i-u];if(l!==c&&l>1&&c>1)return;let d=Math.max(l,c);if(l&&c)s[a-u]=Math.max(l,c);else{if(d>1)return;s[a-u]=0}}return s}static isValidBroadcast(e,n){let t=e.length,o=n.length;if(t>o)return!1;for(let i=1;i<=t;i++)if(e[t-i]!==1&&e[t-i]!==n[o-i])return!1;return!0}},S=class r{static size(e){return r.getSizeFromDimensionRange(e,0,e.length)}static convertShape(e,n=4){let t=e.length;if(t===0)return[];let o=new Array(t),i=t-1;for(;i>=0;){if(e[i]%n===0){o[i]=e[i]/n;break}if(n%e[i]!==0)throw new Error("cannot convert shape");o[i]=1,n/=e[i],i--}for(i--;i>=0;i--)o[i]=e[i];return o}static sizeFromDimension(e,n){if(n<0||n>e.length)throw new Error(`invalid dimension of ${n} for sizeFromDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,n,e.length)}static sizeToDimension(e,n){if(n<0||n>e.length)throw new Error(`invalid dimension of ${n} for sizeToDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,0,n)}static getSizeFromDimensionRange(e,n,t){let o=1;for(let i=n;i=0;--o)t[o]=t[o+1]*e[o+1];return t}static normalizeAxis(e,n){if(e<-n&&e>=n)throw new Error("unsupported axis for this operation.");return e<0?e+n:e}static normalizeAxes(e,n){return e.map(t=>this.normalizeAxis(t,n??e.length))}static sortBasedOnPerm(e,n){return n?n.map(t=>e[t]):e.slice().reverse()}static padShape(e,n){let t=e.length;return e.map((o,i)=>o+n[i]+n[i+t])}static areEqual(e,n){return e.length!==n.length?!1:e.every((t,o)=>t===n[o])}},sr=class r{static adjustPoolAttributes(e,n,t,o,i,a){if(!e&&t.length!==n.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(e)for(let s=0;s=t.length?t.push(n[s+2]):t[s]=n[s+2];for(let s=0;s=t[s]||a[s+t.length]>=t[s])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(e,n,t,o,i,a,s){if(s){if(i.length!==2*(e.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(n.length!==e.length-2)throw new Error("length of strides should be the length of data dimensions");if(o.length!==e.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let u=0;u{"use strict";Z();ki=(r,e)=>new(Sr(e))(r)});var eg,qu,tg,FS,Ym,GS,ng,Li,Ri,Hu,rg,og=$(()=>{"use strict";Z();mn();eg=new Map([["float32",32],["float16",16],["int32",32],["uint32",32],["int64",64],["uint64",64],["int8",8],["uint8",8],["int4",4],["uint4",4]]),qu=(r,e)=>{if(e==="int32")return r;let n=eg.get(e);if(!n)throw new Error(`WebNN backend does not support data type: ${e}`);let t=n/8;if(r.byteLength%t!==0)throw new Error(`Invalid Uint8Array length - must be a multiple of ${t}.`);let o=r.byteLength/t,i=new(Sr(e))(r.buffer,r.byteOffset,o);switch(e){case"int64":case"uint64":{let a=new Int32Array(o);for(let s=0;s2147483647n||u<-2147483648n)throw new Error("Can not convert int64 data to int32 - value out of range.");a[s]=Number(u)}return new Uint8Array(a.buffer)}case"int8":case"uint8":case"uint32":{if(e==="uint32"&&i.some(s=>s>2147483647))throw new Error("Can not convert uint32 data to int32 - value out of range.");let a=Int32Array.from(i,Number);return new Uint8Array(a.buffer)}default:throw new Error(`Unsupported data conversion from ${e} to 'int32'`)}},tg=(r,e)=>{if(e==="int32")return r;if(r.byteLength%4!==0)throw new Error("Invalid Uint8Array length - must be a multiple of 4 (int32).");let n=r.byteLength/4,t=new Int32Array(r.buffer,r.byteOffset,n);switch(e){case"int64":{let o=BigInt64Array.from(t,BigInt);return new Uint8Array(o.buffer)}case"uint64":{if(t.some(i=>i<0))throw new Error("Can not convert int32 data to uin64 - negative value found.");let o=BigUint64Array.from(t,BigInt);return new Uint8Array(o.buffer)}case"int8":{if(t.some(i=>i<-128||i>127))throw new Error("Can not convert int32 data to int8 - value out of range.");let o=Int8Array.from(t,Number);return new Uint8Array(o.buffer)}case"uint8":{if(t.some(o=>o<0||o>255))throw new Error("Can not convert int32 data to uint8 - value out of range.");return Uint8Array.from(t,Number)}case"uint32":{if(t.some(i=>i<0))throw new Error("Can not convert int32 data to uint32 - negative value found.");let o=Uint32Array.from(t,Number);return new Uint8Array(o.buffer)}default:throw new Error(`Unsupported data conversion from 'int32' to ${e}`)}},FS=1,Ym=()=>FS++,GS=new Map([["int8","int32"],["uint8","int32"],["uint32","int32"],["int64","int32"]]),ng=(r,e)=>{let n=eg.get(r);if(!n)throw new Error(`WebNN backend does not support data type: ${r}`);return e.length>0?Math.ceil(e.reduce((t,o)=>t*o)*n/8):0},Li=class{constructor(e){this.isDataConverted=!1;let{sessionId:n,context:t,tensor:o,dataType:i,shape:a,fallbackDataType:s}=e;this.sessionId=n,this.mlContext=t,this.mlTensor=o,this.dataType=i,this.tensorShape=a,this.fallbackDataType=s}get tensor(){return this.mlTensor}get type(){return this.dataType}get fallbackType(){return this.fallbackDataType}get shape(){return this.tensorShape}get byteLength(){return ng(this.dataType,this.tensorShape)}destroy(){ie("verbose",()=>"[WebNN] TensorWrapper.destroy"),this.mlTensor.destroy()}write(e){this.mlContext.writeTensor(this.mlTensor,e)}async read(e){if(this.fallbackDataType){let n=await this.mlContext.readTensor(this.mlTensor),t=tg(new Uint8Array(n),this.dataType);if(e){(e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)).set(t);return}else return t.buffer}else return e?this.mlContext.readTensor(this.mlTensor,e):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(e,n,t){return this.mlContext===e&&this.dataType===n&&this.tensorShape.length===t.length&&this.tensorShape.every((o,i)=>o===t[i])}setIsDataConverted(e){this.isDataConverted=e}},Ri=class{constructor(e,n){this.tensorManager=e;this.wrapper=n}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(e,n,t,o){let i=this.tensorManager.getMLContext(e),a=this.tensorManager.getMLOpSupportLimits(e),s;if(!a?.input.dataTypes.includes(n)){if(s=GS.get(n),!s||a?.input.dataTypes.includes(s))throw new Error(`WebNN backend does not support data type: ${n}`);ie("verbose",()=>`[WebNN] TensorIdTracker.ensureTensor: fallback dataType from ${n} to ${s}`)}if(this.wrapper){if(this.wrapper.canReuseTensor(i,n,t))return this.wrapper.tensor;if(o){if(this.wrapper.byteLength!==ng(n,t))throw new Error("Unable to copy data to tensor with different size.");this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let u=typeof MLTensorUsage>"u"?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(e,n,t,u,!0,!0,s),o&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(e){let n=e;if(this.wrapper){if(this.wrapper.fallbackType)if(this.wrapper.fallbackType==="int32")n=qu(e,this.wrapper.type),this.wrapper.setIsDataConverted(!0);else throw new Error(`Unsupported fallback data type: ${this.wrapper.fallbackType}`);if(e.byteLength===this.wrapper.byteLength){this.wrapper.write(n);return}else ie("verbose",()=>"Data size does not match tensor size. Releasing tensor."),this.releaseTensor()}this.activeUpload?this.activeUpload.set(n):this.activeUpload=new Uint8Array(n)}async download(e){if(this.activeUpload){let n=this.wrapper?.isDataConverted?tg(this.activeUpload,this.wrapper?.type):this.activeUpload;if(e){e instanceof ArrayBuffer?new Uint8Array(e).set(n):new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(n);return}else return n.buffer}if(!this.wrapper)throw new Error("Tensor has not been created.");return e?this.wrapper.read(e):this.wrapper.read()}},Hu=class{constructor(e){this.backend=e;this.tensorTrackersById=new Map;this.freeTensors=[];this.externalTensors=new Set}getMLContext(e){let n=this.backend.getMLContext(e);if(!n)throw new Error("MLContext not found for session.");return n}getMLOpSupportLimits(e){return this.backend.getMLOpSupportLimits(e)}reserveTensorId(){let e=Ym();return this.tensorTrackersById.set(e,new Ri(this)),e}releaseTensorId(e){let n=this.tensorTrackersById.get(e);n&&(this.tensorTrackersById.delete(e),n.tensorWrapper&&this.releaseTensor(n.tensorWrapper))}async ensureTensor(e,n,t,o,i){ie("verbose",()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${n}, dataType: ${t}, shape: ${o}, copyOld: ${i}}`);let a=this.tensorTrackersById.get(n);if(!a)throw new Error("Tensor not found.");return a.ensureTensor(e,t,o,i)}upload(e,n){let t=this.tensorTrackersById.get(e);if(!t)throw new Error("Tensor not found.");t.upload(n)}async download(e,n){ie("verbose",()=>`[WebNN] TensorManager.download {tensorId: ${e}, dstBuffer: ${n?.byteLength}}`);let t=this.tensorTrackersById.get(e);if(!t)throw new Error("Tensor not found.");return t.download(n)}releaseTensorsForSession(e){for(let n of this.freeTensors)n.sessionId===e&&n.destroy();this.freeTensors=this.freeTensors.filter(n=>n.sessionId!==e)}registerTensor(e,n,t,o){let i=this.getMLContext(e),a=Ym(),s=new Li({sessionId:e,context:i,tensor:n,dataType:t,shape:o});return this.tensorTrackersById.set(a,new Ri(this,s)),this.externalTensors.add(s),a}async getCachedTensor(e,n,t,o,i,a,s){let u=this.getMLContext(e);for(let[c,d]of this.freeTensors.entries())if(d.canReuseTensor(u,n,t)){ie("verbose",()=>`[WebNN] Reusing tensor {dataType: ${n}, ${s?`fallbackDataType: ${s},`:""} shape: ${t}`);let p=this.freeTensors.splice(c,1)[0];return p.sessionId=e,p}ie("verbose",()=>`[WebNN] MLContext.createTensor {dataType: ${n}, ${s?`fallbackDataType: ${s},`:""} shape: ${t}}`);let l=await u.createTensor({dataType:s??n,shape:t,dimensions:t,usage:o,writable:i,readable:a});return new Li({sessionId:e,context:u,tensor:l,dataType:n,shape:t,fallbackDataType:s})}releaseTensor(e){this.externalTensors.has(e)&&this.externalTensors.delete(e),this.freeTensors.push(e)}},rg=(...r)=>new Hu(...r)});var Ni,US,zi,ig=$(()=>{"use strict";Z();Mn();Wu();og();mn();Ni=new Map([[1,"float32"],[10,"float16"],[6,"int32"],[12,"uint32"],[7,"int64"],[13,"uint64"],[22,"int4"],[21,"uint4"],[3,"int8"],[2,"uint8"],[9,"uint8"]]),US=(r,e)=>{if(r===e)return!0;if(r===void 0||e===void 0)return!1;let n=Object.keys(r).sort(),t=Object.keys(e).sort();return n.length===t.length&&n.every((o,i)=>o===t[i]&&r[o]===e[o])},zi=class{constructor(e){this.tensorManager=rg(this);this.mlContextBySessionId=new Map;this.sessionIdsByMLContext=new Map;this.mlContextCache=[];this.sessionGraphInputs=new Map;this.sessionGraphOutputs=new Map;this.temporaryGraphInputs=[];this.temporaryGraphOutputs=[];this.temporarySessionTensorIds=new Map;this.mlOpSupportLimitsBySessionId=new Map;Ci(e.logLevel,!!e.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw new Error("No active session");return this.activeSessionId}onRunStart(e){ie("verbose",()=>`[WebNN] onRunStart {sessionId: ${e}}`),this.activeSessionId=e}onRunEnd(e){ie("verbose",()=>`[WebNN] onRunEnd {sessionId: ${e}}`);let n=this.temporarySessionTensorIds.get(e);if(n){for(let t of n)ie("verbose",()=>`[WebNN] releasing temporary tensor {tensorId: ${t}}`),this.tensorManager.releaseTensorId(t);this.temporarySessionTensorIds.delete(e),this.activeSessionId=void 0}}async createMLContext(e){if(e instanceof GPUDevice){let t=this.mlContextCache.findIndex(o=>o.gpuDevice===e);if(t!==-1)return this.mlContextCache[t].mlContext;{let o=await navigator.ml.createContext(e);return this.mlContextCache.push({gpuDevice:e,mlContext:o}),o}}else if(e===void 0){let t=this.mlContextCache.findIndex(o=>o.options===void 0&&o.gpuDevice===void 0);if(t!==-1)return this.mlContextCache[t].mlContext;{let o=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:o}),o}}let n=this.mlContextCache.findIndex(t=>US(t.options,e));if(n!==-1)return this.mlContextCache[n].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({options:e,mlContext:t}),t}}registerMLContext(e,n){this.mlContextBySessionId.set(e,n);let t=this.sessionIdsByMLContext.get(n);t||(t=new Set,this.sessionIdsByMLContext.set(n,t)),t.add(e),this.mlOpSupportLimitsBySessionId.has(e)||this.mlOpSupportLimitsBySessionId.set(e,n.opSupportLimits()),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(e,this.temporaryGraphInputs),this.temporaryGraphInputs=[]),this.temporaryGraphOutputs.length>0&&(this.sessionGraphOutputs.set(e,this.temporaryGraphOutputs),this.temporaryGraphOutputs=[])}onReleaseSession(e){this.sessionGraphInputs.delete(e),this.sessionGraphOutputs.delete(e);let n=this.mlContextBySessionId.get(e);if(!n)return;this.tensorManager.releaseTensorsForSession(e),this.mlContextBySessionId.delete(e),this.mlOpSupportLimitsBySessionId.delete(e);let t=this.sessionIdsByMLContext.get(n);if(t.delete(e),t.size===0){this.sessionIdsByMLContext.delete(n);let o=this.mlContextCache.findIndex(i=>i.mlContext===n);o!==-1&&this.mlContextCache.splice(o,1)}}getMLContext(e){return this.mlContextBySessionId.get(e)}getMLOpSupportLimits(e){return this.mlOpSupportLimitsBySessionId.get(e)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(e){ie("verbose",()=>`[WebNN] releaseTensorId {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e)}async ensureTensor(e,n,t,o,i){let a=Ni.get(t);if(!a)throw new Error(`Unsupported ONNX data type: ${t}`);return this.tensorManager.ensureTensor(e??this.currentSessionId,n,a,o,i)}async createTemporaryTensor(e,n,t){ie("verbose",()=>`[WebNN] createTemporaryTensor {onnxDataType: ${n}, shape: ${t}}`);let o=Ni.get(n);if(!o)throw new Error(`Unsupported ONNX data type: ${n}`);let i=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(e,i,o,t,!1);let a=this.temporarySessionTensorIds.get(e);return a?a.push(i):this.temporarySessionTensorIds.set(e,[i]),i}uploadTensor(e,n){if(!we().shouldTransferToMLTensor)throw new Error("Trying to upload to a MLTensor while shouldTransferToMLTensor is false");ie("verbose",()=>`[WebNN] uploadTensor {tensorId: ${e}, data: ${n.byteLength}}`),this.tensorManager.upload(e,n)}async downloadTensor(e,n){return this.tensorManager.download(e,n)}createMLTensorDownloader(e,n){return async()=>{let t=await this.tensorManager.download(e);return ki(t,n)}}registerMLTensor(e,n,t,o){let i=Ni.get(t);if(!i)throw new Error(`Unsupported ONNX data type: ${t}`);let a=this.tensorManager.registerTensor(e,n,i,o);return ie("verbose",()=>`[WebNN] registerMLTensor {tensor: ${n}, dataType: ${i}, dimensions: ${o}} -> {tensorId: ${a}}`),a}registerMLConstant(e,n,t,o,i,a,s=!1){if(!a)throw new Error("External mounted files are not available.");let u=e;e.startsWith("./")&&(u=e.substring(2));let l=a.get(u);if(!l)throw new Error(`File with name ${u} not found in preloaded files.`);if(n+t>l.byteLength)throw new Error("Out of bounds: data offset and length exceed the external file data size.");let c=l.slice(n,n+t).buffer,d;switch(i.dataType){case"float32":d=new Float32Array(c);break;case"float16":d=typeof Float16Array<"u"&&Float16Array.from?new Float16Array(c):new Uint16Array(c);break;case"int32":d=new Int32Array(c);break;case"uint32":d=new Uint32Array(c);break;case"int64":if(s){let p=qu(new Uint8Array(c),"int64");d=new Int32Array(p.buffer),i.dataType="int32"}else d=new BigInt64Array(c);break;case"uint64":d=new BigUint64Array(c);break;case"int8":d=new Int8Array(c);break;case"int4":case"uint4":case"uint8":d=new Uint8Array(c);break;default:throw new Error(`Unsupported data type: ${i.dataType} in creating WebNN Constant from external data.`)}return ie("verbose",()=>`[WebNN] registerMLConstant {dataType: ${i.dataType}, shape: ${i.shape}}} ${s?"(Note: it was int64 data type and registered to int32 as workaround)":""}`),o.constant(i,d)}registerGraphInput(e){this.temporaryGraphInputs.push(e)}registerGraphOutput(e){this.temporaryGraphOutputs.push(e)}isGraphInput(e,n){let t=this.sessionGraphInputs.get(e);return t?t.includes(n):!1}isGraphOutput(e,n){let t=this.sessionGraphOutputs.get(e);return t?t.includes(n):!1}isGraphInputOutputTypeSupported(e,n,t=!0){let o=Ni.get(Bn(n)),i=this.mlOpSupportLimitsBySessionId.get(e);return typeof o>"u"?!1:t?!!i?.input.dataTypes.includes(o):!!i?.output.dataTypes.includes(o)}flush(){}}});var Mi=$(()=>{"use strict"});var ag,ju,Ku,WS,HS,sg,Zu,Xu,lg,cg=$(()=>{"use strict";mn();Mi();ag=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),ju=[],Ku=r=>Math.ceil(Number(r)/16)*16,WS=r=>{for(let e=0;eHS++,Zu=async(r,e,n,t)=>{let o=Ku(n),i=r.device.createBuffer({size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let a=r.getCommandEncoder();r.endComputePass(),a.copyBufferToBuffer(e,0,i,0,o),r.flush(),await i.mapAsync(GPUMapMode.READ);let s=i.getMappedRange();if(t){let u=t();return u.set(new Uint8Array(s,0,n)),u}else return new Uint8Array(s.slice(0,n))}finally{i.destroy()}},Xu=class{constructor(e){this.backend=e;this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersPending=[],this.capturedPendingBuffers=new Map;for(let[n]of ag)ju.push(n),this.freeBuffers.set(n,[]),this.freeUniformBuffers.set(n,[]);this.sessionCount=0}upload(e,n){let t=n.buffer,o=n.byteOffset,i=n.byteLength,a=Ku(i),s=this.storageCache.get(e);if(!s)throw new Error("gpu data for uploading does not exist");if(Number(s.originalSize)!==i)throw new Error(`inconsistent data size. gpu data size=${s.originalSize}, data size=${i}`);let u=this.backend.device.createBuffer({mappedAtCreation:!0,size:a,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),l=u.getMappedRange();new Uint8Array(l).set(new Uint8Array(t,o,i)),u.unmap();let c=this.backend.device.createCommandEncoder();c.copyBufferToBuffer(u,0,s.gpuData.buffer,0,a),this.backend.device.queue.submit([c.finish()]),u.destroy(),ie("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${e})`)}memcpy(e,n){let t=this.storageCache.get(e);if(!t)throw new Error("source gpu data for memcpy does not exist");let o=this.storageCache.get(n);if(!o)throw new Error("destination gpu data for memcpy does not exist");if(t.originalSize!==o.originalSize)throw new Error("inconsistent source and destination gpu data size");let i=Ku(t.originalSize),a=this.backend.getCommandEncoder();this.backend.endComputePass(),a.copyBufferToBuffer(t.gpuData.buffer,0,o.gpuData.buffer,0,i)}registerExternalBuffer(e,n,t){let o;if(t){if(o=t[0],e===t[1])return ie("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${n}) => id=${o}, buffer is the same, skip.`),o;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw new Error(`Registering a different external buffer under graph capture mode is not supported yet. + Please use the previous external buffer!`)}else o=sg();return this.storageCache.set(o,{gpuData:{id:o,type:0,buffer:e},originalSize:n}),ie("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${n}) => id=${o}, registered.`),o}unregisterExternalBuffer(e){e!==void 0&&(this.storageCache.delete(e),ie("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${e}`))}create(e,n=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let t=WS(e),o,i=(n&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,a=(n&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(i||a){let l=(i?this.freeBuffers:this.freeUniformBuffers).get(t);l?l.length>0?o=l.pop():o=this.backend.device.createBuffer({size:t,usage:n}):o=this.backend.device.createBuffer({size:t,usage:n})}else o=this.backend.device.createBuffer({size:t,usage:n});let s={id:sg(),type:0,buffer:o};return this.storageCache.set(s.id,{gpuData:s,originalSize:Number(e)}),ie("verbose",()=>`[WebGPU] GpuDataManager.create(size=${e}) => id=${s.id}`),s}get(e){return this.storageCache.get(e)?.gpuData}release(e){let n=typeof e=="bigint"?Number(e):e,t=this.storageCache.get(n);if(!t){if(this.storageCache.size===0)return 0;throw new Error("releasing data does not exist")}return ie("verbose",()=>`[WebGPU] GpuDataManager.release(id=${n}), gpuDataId=${t.gpuData.id}`),this.storageCache.delete(n),this.buffersPending.push(t.gpuData.buffer),t.originalSize}async download(e,n){let t=this.storageCache.get(Number(e));if(!t)throw new Error("data does not exist");await Zu(this.backend,t.gpuData.buffer,t.originalSize,n)}refreshPendingBuffers(){if(this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let e of this.buffersPending){let n=ag.get(e.size);if((e.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let t=this.freeBuffers.get(e.size)||[];n===void 0||t.length>=n?e.destroy():t.push(e)}else if((e.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let t=this.freeUniformBuffers.get(e.size)||[];n===void 0||t.length>=n?e.destroy():t.push(e)}else e.destroy()}this.buffersPending=[]}else{let e=this.capturedPendingBuffers.get(this.backend.currentSessionId);e||(e=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,e));for(let n of this.buffersPending)e.push(n);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(e=>{e.forEach(n=>{n.destroy()})}),this.freeUniformBuffers.forEach(e=>{e.forEach(n=>{n.destroy()})}),this.storageCache.forEach(e=>{e.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(e=>{e.forEach(n=>{n.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onCreateSession(){this.sessionCount+=1}onReleaseSession(e){let n=this.capturedPendingBuffers.get(e);n&&(n.forEach(t=>{t.destroy()}),this.capturedPendingBuffers.delete(e)),this.sessionCount-=1,this.sessionCount===0&&(ie("warning",()=>"[WebGPU] Clearing webgpu buffer cache"),this.storageCache.forEach(t=>{t.gpuData.buffer.destroy()}),this.storageCache=new Map)}},lg=(...r)=>new Xu(...r)});var Ju,J,Ee=$(()=>{"use strict";Ju=class{constructor(e){Object.assign(this,e)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(e=>`${this[e]}`).join(";")),this.key}},J=r=>new Ju(r)});var ur,Yu,ve,Ve,k,he,el,lr,$t,M,Bi,A,C,dg,Vi,Qu,pg,oe=$(()=>{"use strict";Z();ne();ur=64,Yu=(r,e)=>{if(e===3)throw new Error("vec3 has same alignment as vec4, use vec4 instead");switch(Number(r)){case 10:return e>1?`vec${e}`:"f16";case 1:return e>1?`vec${e}`:"f32";case 6:return e>1?`vec${e}`:"i32";case 12:return e>1?`vec${e}`:"u32";case 7:if(e>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(e>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(e!==4)throw new Error("bool must be vec4");return["u32","vec4"];case 22:return"i32";case 21:return"u32";default:throw new Error(`Unknown data type: ${r}`)}},ve=(r,e=1)=>{let n=Yu(r,e);return typeof n=="string"?n:n[0]},Ve=(r,e=1)=>{let n=Yu(r,e);return typeof n=="string"?n:n[1]},k=(...r)=>{let e=[];return r.forEach(n=>{n.length!==0&&e.push({type:12,data:n},{type:12,data:S.computeStrides(n)})}),e},he=r=>r%4===0?4:r%2===0?2:1,el=(r="f32",e,n="0")=>!e||e===1?`${r}(${n})`:`vec${e}<${r}>(${n})`,lr=(r,e,n)=>r==="f32"?n:e===1?`f32(${n})`:`vec${e}(${n})`,$t=(r,e)=>e===4?`(${r}.x + ${r}.y + ${r}.z + ${r}.w)`:e===2?`(${r}.x + ${r}.y)`:e===3?`(${r}.x + ${r}.y + ${r}.z)`:r,M=(r,e,n,t)=>r.startsWith("uniforms.")&&n>4?typeof e=="string"?t==="f16"?`${r}[(${e}) / 8][(${e}) % 8 / 4][(${e}) % 8 % 4]`:`${r}[(${e}) / 4][(${e}) % 4]`:t==="f16"?`${r}[${Math.floor(e/8)}][${Math.floor(e%8/4)}][${e%8%4}]`:`${r}[${Math.floor(e/4)}][${e%4}]`:n>1?`${r}[${e}]`:r,Bi=(r,e,n,t,o)=>{let i=typeof n=="number",a=i?n:n.length,s=[...new Array(a).keys()],u=a<2?"u32":a<=4?`vec${a}`:`array`,l=Yu(e,o),c=typeof l=="string"?l:l[1],d=typeof l=="string"?l:l[0],p={indices:u,value:c,storage:d,tensor:e},f=D=>typeof D=="string"?D:`${D}u`,h={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},m=i?"uniforms.":"",y=`${m}${r}_shape`,g=`${m}${r}_strides`,b="";for(let D=0;D ${p.indices} { + var indices: ${p.indices}; + var current = offset; + ${b} + return indices; + }`,w=D=>(h.offsetToIndices=!0,a<2?D:`o2i_${r}(${D})`),v=[];if(a>=2)for(let D=a-1;D>=0;D--)v.push(`${M(g,D,a)} * (indices[${D}])`);let I=a<2?"":` + fn i2o_${r}(indices: ${p.indices}) -> u32 { + return ${v.join("+")}; + }`,P=D=>(h.indicesToOffset=!0,a<2?D:`i2o_${r}(${D})`),O=(...D)=>a===0?"0u":`${p.indices}(${D.map(f).join(",")})`,E=(D,X)=>a<2?`${D}`:`${M(D,X,a)}`,R=(D,X,Ce)=>a<2?`${D}=${Ce};`:`${M(D,X,a)}=${Ce};`,q={},B=(D,X)=>{h.broadcastedIndicesToOffset=!0;let Ce=`${X.name}broadcastedIndicesTo${r}Offset`;if(Ce in q)return`${Ce}(${D})`;let lt=[];for(let Qe=a-1;Qe>=0;Qe--){let Un=X.indicesGet("outputIndices",Qe+X.rank-a);lt.push(`${E(g,Qe)} * (${Un} % ${E(y,Qe)})`)}return q[Ce]=`fn ${Ce}(outputIndices: ${X.type.indices}) -> u32 { + return ${lt.length>0?lt.join("+"):"0u"}; + }`,`${Ce}(${D})`},W=(D,X)=>(()=>{if(p.storage===p.value)return`${r}[${D}]=${X};`;if(p.storage==="vec2"&&p.value==="i32")return`${r}[${D}]=vec2(u32(${X}), select(0u, 0xFFFFFFFFu, ${X} < 0));`;if(p.storage==="vec2"&&p.value==="u32")return`${r}[${D}]=vec2(u32(${X}), 0u);`;if(p.storage==="u32"&&p.value==="vec4")return`${r}[${D}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${X}));`;throw new Error(`not supported combination of storage type ${p.storage} and value type ${p.value} yet`)})(),ae=D=>(()=>{if(p.storage===p.value)return`${r}[${D}]`;if(p.storage==="vec2"&&p.value==="i32")return`i32(${r}[${D}].x)`;if(p.storage==="vec2"&&p.value==="u32")return`u32(${r}[${D}].x)`;if(p.storage==="u32"&&p.value==="vec4")return`vec4(bool(${r}[${D}] & 0xFFu), bool(${r}[${D}] & 0xFF00u), bool(${r}[${D}] & 0xFF0000u), bool(${r}[${D}] & 0xFF000000u))`;throw new Error(`not supported combination of storage type ${p.storage} and value type ${p.value} yet`)})(),F=a<2?"":` + fn get_${r}ByIndices(indices: ${p.indices}) -> ${c} { + return ${ae(`i2o_${r}(indices)`)}; + }`,U=a<2?"":(()=>{let D=s.map(Ce=>`d${Ce}: u32`).join(", "),X=s.map(Ce=>`d${Ce}`).join(", ");return` + fn get_${r}(${D}) -> ${c} { + return get_${r}ByIndices(${O(X)}); + }`})(),K=(...D)=>{if(D.length!==a)throw new Error(`indices length must be ${a}`);let X=D.map(f).join(",");return a===0?ae("0u"):a===1?ae(X[0]):(h.get=!0,h.getByIndices=!0,h.indicesToOffset=!0,`get_${r}(${X})`)},Q=D=>a<2?ae(D):(h.getByIndices=!0,h.indicesToOffset=!0,`get_${r}ByIndices(${D})`),Y=a<2?"":` + fn set_${r}ByIndices(indices: ${p.indices}, value: ${c}) { + ${W(`i2o_${r}(indices)`,"value")} + }`,ue=a<2?"":(()=>{let D=s.map(Ce=>`d${Ce}: u32`).join(", "),X=s.map(Ce=>`d${Ce}`).join(", ");return` + fn set_${r}(${D}, value: ${c}) { + set_${r}ByIndices(${O(X)}, value); + }`})();return{impl:()=>{let D=[],X=!1;return h.offsetToIndices&&(D.push(x),X=!0),h.indicesToOffset&&(D.push(I),X=!0),h.broadcastedIndicesToOffset&&(Object.values(q).forEach(Ce=>D.push(Ce)),X=!0),h.set&&(D.push(ue),X=!0),h.setByIndices&&(D.push(Y),X=!0),h.get&&(D.push(U),X=!0),h.getByIndices&&(D.push(F),X=!0),!i&&X&&D.unshift(`const ${y} = ${p.indices}(${n.join(",")});`,`const ${g} = ${p.indices}(${S.computeStrides(n).join(",")});`),D.join(` +`)},type:p,offsetToIndices:w,indicesToOffset:P,broadcastedIndicesToOffset:B,indices:O,indicesGet:E,indicesSet:R,set:(...D)=>{if(D.length!==a+1)throw new Error(`indices length must be ${a}`);let X=D[a];if(typeof X!="string")throw new Error("value must be string");let Ce=D.slice(0,a).map(f).join(",");return a===0?W("0u",X):a===1?W(Ce[0],X):(h.set=!0,h.setByIndices=!0,h.indicesToOffset=!0,`set_${r}(${Ce}, ${X})`)},setByOffset:W,setByIndices:(D,X)=>a<2?W(D,X):(h.setByIndices=!0,h.indicesToOffset=!0,`set_${r}ByIndices(${D}, ${X});`),get:K,getByOffset:ae,getByIndices:Q,usage:t,name:r,strides:g,shape:y,rank:a}},A=(r,e,n,t=1)=>Bi(r,e,n,"input",t),C=(r,e,n,t=1)=>Bi(r,e,n,"output",t),dg=(r,e,n)=>Bi(r,e,n,"atomicOutput",1),Vi=(r,e,n,t=1)=>Bi(r,e,n,"internal",t),Qu=class{constructor(e,n){this.normalizedDispatchGroup=e;this.limits=n;this.internalVariables=[];this.variables=[];this.uniforms=[];this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(e){return`if (global_idx >= ${typeof e=="number"?`${e}u`:e}) { return; }`}mainStart(e=ur){let n=typeof e=="number"?e:e[0],t=typeof e=="number"?1:e[1],o=typeof e=="number"?1:e[2];if(n>this.limits.maxComputeWorkgroupSizeX||t>this.limits.maxComputeWorkgroupSizeY||o>this.limits.maxComputeWorkgroupSizeZ)throw new Error(`workgroup size [${n}, ${t}, ${o}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(n*t*o>this.limits.maxComputeInvocationsPerWorkgroup)throw new Error(`workgroup size [${n}, ${t}, ${o}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let i=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1,a=i?`@builtin(global_invocation_id) global_id : vec3, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(local_invocation_id) local_id : vec3`:`@builtin(global_invocation_id) global_id : vec3, + @builtin(local_invocation_id) local_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(num_workgroups) num_workgroups : vec3`,s=i?`let global_idx = global_id.x; + let workgroup_index = workgroup_id.x;`:`let workgroup_index = workgroup_id.z * num_workgroups[0] * num_workgroups[1] + + workgroup_id.y * num_workgroups[0] + workgroup_id.x; + let global_idx = workgroup_index * ${n*t*o}u + local_idx;`;return`@compute @workgroup_size(${n}, ${t}, ${o}) + fn main(${a}) { + ${s} + `}appendVariableUniforms(e){e.rank!==0&&(e.shape.startsWith("uniforms.")&&this.uniforms.push({name:e.shape.replace("uniforms.",""),type:"u32",length:e.rank}),e.strides.startsWith("uniforms.")&&this.uniforms.push({name:e.strides.replace("uniforms.",""),type:"u32",length:e.rank}))}declareVariable(e,n){if(e.usage==="internal")throw new Error("cannot use internal variable with declareVariable(). use registerInternalVariables() instead.");this.variables.push(e),this.appendVariableUniforms(e);let t=e.usage==="input"?"read":"read_write",o=e.usage==="atomicOutput"?"atomic":e.type.storage;return`@group(0) @binding(${n}) var ${e.name}: array<${o}>;`}declareVariables(...e){return e.map(n=>this.declareVariable(n,this.variableIndex++)).join(` +`)}registerInternalVariable(e){if(e.usage!=="internal")throw new Error("cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.");this.internalVariables.push(e),this.appendVariableUniforms(e)}registerInternalVariables(...e){return e.forEach(n=>this.registerInternalVariable(n)),this}registerUniform(e,n,t=1){return this.uniforms.push({name:e,type:n,length:t}),this}registerUniforms(e){return this.uniforms=this.uniforms.concat(e),this}uniformDeclaration(){if(this.uniforms.length===0)return"";let e=[];for(let{name:n,type:t,length:o}of this.uniforms)if(o&&o>4)t==="f16"?e.push(`@align(16) ${n}:array, ${Math.ceil(o/8)}>`):e.push(`${n}:array, ${Math.ceil(o/4)}>`);else{let i=o==null||o===1?t:`vec${o}<${t}>`;e.push(`${n}:${i}`)}return` + struct Uniforms { ${e.join(", ")} }; + @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map(e=>e.impl()).join(` +`)+this.internalVariables.map(e=>e.impl()).join(` +`)}get variablesInfo(){if(this.uniforms.length===0)return;let e=n=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(n)];return this.uniforms.map(n=>[e(n.type),n.length??1])}},pg=(r,e)=>new Qu(r,e)});var qS,fg,jS,KS,XS,ZS,Fe,hg,mg,An=$(()=>{"use strict";Z();ne();Ee();oe();qS=(r,e)=>{if(!r||r.length!==1)throw new Error("Transpose requires 1 input.");if(e.length!==0&&e.length!==r[0].dims.length)throw new Error(`perm size ${e.length} does not match input rank ${r[0].dims.length}`)},fg=(r,e)=>e.length!==0?e:[...new Array(r).keys()].reverse(),jS=(r,e)=>S.sortBasedOnPerm(r,fg(r.length,e)),KS=(r,e,n,t)=>{let o=`fn perm(i: ${t.type.indices}) -> ${n.type.indices} { + var a: ${n.type.indices};`;for(let i=0;i{let n=[],t=[];for(let o=0;o{let n=0;for(let t=0;t{let n=r.dataType,t=r.dims.length,o=fg(t,e),i=jS(r.dims,o),a=r.dims,s=i,u=t<2||ZS(o,r.dims),l;if(u)return l=m=>{let y=A("input",n,a,4),g=C("output",n,s,4);return` + ${m.registerUniform("output_size","u32").declareVariables(y,g)} + ${m.mainStart()} + ${m.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + output[global_idx] = input[global_idx]; + }`},{name:"TransposeCopy",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let m=S.size(i);return{outputs:[{dims:i,dataType:r.dataType}],dispatchGroup:{x:Math.ceil(m/64/4)},programUniforms:[{type:12,data:Math.ceil(m/4)}]}},getShaderSource:l};let{newShape:c,newPerm:d}=XS(r.dims,o),p=S.areEqual(d,[2,3,1]),f=S.areEqual(d,[3,1,2]);if(c.length===2||p||f){a=p?[c[0],c[1]*c[2]]:f?[c[0]*c[1],c[2]]:c,s=[a[1],a[0]];let m=16;return l=y=>{let g=A("a",n,a.length),b=C("output",n,s.length);return` + ${y.registerUniform("output_size","u32").declareVariables(g,b)} + var tile : array, ${m}>; + ${y.mainStart([m,m,1])} + let stride = (uniforms.output_shape[1] - 1) / ${m} + 1; + let workgroup_id_x = workgroup_index % stride; + let workgroup_id_y = workgroup_index / stride; + let input_col = workgroup_id_y * ${m}u + local_id.x; + let input_row = workgroup_id_x * ${m}u + local_id.y; + if (input_row < uniforms.a_shape[0] && input_col < uniforms.a_shape[1]) { + tile[local_id.y][local_id.x] = ${g.getByIndices(`${g.type.indices}(input_row, input_col)`)}; + } + workgroupBarrier(); + + let output_col = workgroup_id_x * ${m}u + local_id.x; + let output_row = workgroup_id_y * ${m}u + local_id.y; + if (output_row < uniforms.output_shape[0] && output_col < uniforms.output_shape[1]) { + ${b.setByIndices(`${b.type.indices}(output_row, output_col)`,"tile[local_id.x][local_id.y]")} + } + }`},{name:"TransposeShared",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let y=S.size(i);return{outputs:[{dims:i,dataType:r.dataType}],dispatchGroup:{x:Math.ceil(s[1]/m),y:Math.ceil(s[0]/m)},programUniforms:[{type:12,data:y},...k(a,s)]}},getShaderSource:l}}return l=m=>{let y=A("a",n,a.length),g=C("output",n,s.length);return` + ${m.registerUniform("output_size","u32").declareVariables(y,g)} + + ${KS(o,t,y,g)} + + ${m.mainStart()} + ${m.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${g.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${g.setByOffset("global_idx",y.getByIndices("aIndices"))} + }`},{name:"Transpose",shaderCache:{hint:`${e}`,inputDependencies:["rank"]},getRunData:()=>{let m=S.size(i);return{outputs:[{dims:i,dataType:r.dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:[{type:12,data:m},...k(a,s)]}},getShaderSource:l}},hg=(r,e)=>{qS(r.inputs,e.perm),r.compute(Fe(r.inputs[0],e.perm))},mg=r=>J({perm:r.perm})});var JS,QS,YS,e1,t1,n1,r1,o1,i1,a1,bn,gg,bg,yg,_g,xg,wg,Tg,vg,Ig,Sg,$g=$(()=>{"use strict";Z();ne();oe();Fi();An();JS={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},QS={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},YS={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},e1={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},t1=(r,e)=>{let n=[];for(let t=e-r;t{let n=[],t=r.length;for(let i=0;ir[i]);return[n,o]},r1=(r,e)=>{let n=r.length+e.length,t=[],o=0;for(let i=0;i{for(let n=0;n{let n=[];if(!o1(r,e)){for(let t=0;tn.push(t))}return n},a1=(r,e,n,t,o,i,a)=>{let s=n[0].dims,u=S.size(i),l=S.size(a),c=A("_A",n[0].dataType,s),d=C("output",o,i),p=64;u===1&&(p=256);let f=` + var aBestValues : array; + `,h=m=>` + ${m.registerUniform("reduceSize","u32").declareVariables(c,d)} + ${f} + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + ${m.mainStart(p)} + + let outputIndex = global_idx / ${p}; + let offset = outputIndex * uniforms.reduceSize; + + var bestValue = f32(${YS[t]}); + let Length = uniforms.reduceSize; + for (var k = local_idx; k < Length; k = k + ${p}) { + let candidate = f32(${c.getByOffset("offset + k")}); + bestValue = ${JS[t]}; + } + aBestValues[local_idx] = bestValue; + workgroupBarrier(); + + var reduceSize = min(Length, ${p}u); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (local_idx < currentSize) { + let candidate = aBestValues[local_idx + interval]; + bestValue = ${QS[t]}; + aBestValues[local_idx] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (local_idx == 0u) { + ${d.setByOffset("outputIndex",`${t==="mean"?`${d.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${d.type.storage}(${e1[t]})`}`)}; + } + }`;return{name:r,shaderCache:{hint:`${e};${p}`,inputDependencies:["type"]},getShaderSource:h,getRunData:()=>({outputs:[{dims:i,dataType:o}],dispatchGroup:{x:u},programUniforms:[{type:12,data:l}]})}},bn=(r,e,n,t)=>{let o=r.inputs.length===1?n:tl(r.inputs,n),i=o.axes;i.length===0&&!o.noopWithEmptyAxes&&(i=r.inputs[0].dims.map((f,h)=>h));let a=S.normalizeAxes(i,r.inputs[0].dims.length),s=a,u=r.inputs[0],l=i1(s,r.inputs[0].dims.length);l.length>0&&(u=r.compute(Fe(r.inputs[0],l),{inputs:[0],outputs:[-1]})[0],s=t1(s.length,u.dims.length));let[c,d]=n1(u.dims,s),p=c;o.keepDims&&(p=r1(c,a)),r.compute(a1(e,o.cacheKey,[u],t,r.inputs[0].dataType,p,d),{inputs:[u]})},gg=(r,e)=>{bn(r,"ReduceMeanShared",e,"mean")},bg=(r,e)=>{bn(r,"ReduceL1Shared",e,"l1")},yg=(r,e)=>{bn(r,"ReduceL2Shared",e,"l2")},_g=(r,e)=>{bn(r,"ReduceLogSumExpShared",e,"logSumExp")},xg=(r,e)=>{bn(r,"ReduceMaxShared",e,"max")},wg=(r,e)=>{bn(r,"ReduceMinShared",e,"min")},Tg=(r,e)=>{bn(r,"ReduceProdShared",e,"prod")},vg=(r,e)=>{bn(r,"ReduceSumShared",e,"sum")},Ig=(r,e)=>{bn(r,"ReduceSumSquareShared",e,"sumSquare")},Sg=(r,e)=>{bn(r,"ReduceLogSumShared",e,"logSum")}});var yn,s1,Gi,tl,_n,u1,l1,c1,d1,p1,f1,h1,m1,g1,b1,xn,Ag,Pg,Og,Eg,Cg,Dg,kg,Lg,Rg,Ng,Fi=$(()=>{"use strict";Z();ne();Ee();oe();$g();yn=r=>{if(!r||r.length===0||r.length>2)throw new Error("Reduce op requires 1 or 2 inputs.");if(r.length===2&&r[1].dims.length!==1)throw new Error("Invalid axes input dims.")},s1=r=>["","",`var value = ${r.getByIndices("input_indices")};`,""],Gi=(r,e,n,t,o,i,a=!1,s=!1)=>{let u=[],l=n[0].dims,c=l.length,d=S.normalizeAxes(o,c),p=!s&&d.length===0;l.forEach((y,g)=>{p||d.indexOf(g)>=0?a&&u.push(1):u.push(y)});let f=u.length,h=S.size(u);return{name:r,shaderCache:e,getShaderSource:y=>{let g=[],b=A("_A",n[0].dataType,c),x=C("output",i,f),w=t(b,x,d),v=w[2];for(let I=0,P=0;I=0?(a&&P++,v=`for(var j${I}: u32 = 0; j${I} < ${l[I]}; j${I}++) { + ${w[2].includes("last_index")?`let last_index = j${I};`:""} + ${b.indicesSet("input_indices",I,`j${I}`)} + ${v} + }`):(g.push(`${b.indicesSet("input_indices",I,x.indicesGet("output_indices",P))};`),P++);return` + + ${y.registerUniform("output_size","u32").declareVariables(b,x)} + + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var input_indices: ${b.type.indices}; + let output_indices = ${x.offsetToIndices("global_idx")}; + + ${g.join(` +`)} + ${w[0]} // init ops for reduce max/min + ${w[1]} + ${v} + ${w[3]} + ${w.length===4?x.setByOffset("global_idx","value"):w.slice(4).join(` +`)} + }`},getRunData:()=>({outputs:[{dims:u,dataType:i}],dispatchGroup:{x:Math.ceil(h/64)},programUniforms:[{type:12,data:h},...k(l,u)]})}},tl=(r,e)=>{let n=[];return r[1].dims[0]>0&&r[1].getBigInt64Array().forEach(t=>n.push(Number(t))),J({axes:n,keepDims:e.keepDims,noopWithEmptyAxes:e.noopWithEmptyAxes})},_n=(r,e,n,t)=>{let o=r.inputs,i=o.length===1?n:tl(o,n);r.compute(Gi(e,{hint:i.cacheKey,inputDependencies:["rank"]},[o[0]],i.noopWithEmptyAxes&&i.axes.length===0?s1:t,i.axes,o[0].dataType,i.keepDims,i.noopWithEmptyAxes),{inputs:[0]})},u1=(r,e)=>{yn(r.inputs),_n(r,"ReduceLogSum",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${t.getByIndices("input_indices")};`,"value = log(value);"])},l1=(r,e)=>{yn(r.inputs),_n(r,"ReduceL1",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += abs(${t.getByIndices("input_indices")});`,""])},c1=(r,e)=>{yn(r.inputs),_n(r,"ReduceL2",e,(t,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${t.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},d1=(r,e)=>{yn(r.inputs),_n(r,"ReduceLogSumExp",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += exp(${t.getByIndices("input_indices")});`,"value = log(value);"])},p1=(r,e)=>{yn(r.inputs),_n(r,"ReduceMax",e,(t,o,i)=>{let a=[];for(let s=0;s=0||i.length===0)&&a.push(t.indicesSet("input_indices",s,0));return[`${a.join(` +`)}`,`var value = ${t.getByIndices("input_indices")};`,`value = max(value, ${t.getByIndices("input_indices")});`,""]})},f1=(r,e)=>{yn(r.inputs),_n(r,"ReduceMean",e,(t,o,i)=>{let a=1;for(let s=0;s=0||i.length===0)&&(a*=r.inputs[0].dims[s]);return["var sum = f32(0);","",`sum += f32(${t.getByIndices("input_indices")});`,`let value = ${o.type.value}(sum / ${a});`]})},h1=(r,e)=>{yn(r.inputs),_n(r,"ReduceMin",e,(t,o,i)=>{let a=[];for(let s=0;s=0||i.length===0)&&a.push(`input_indices[${s}] = 0;`);return[`${a.join(` +`)}`,`var value = ${t.getByIndices("input_indices")};`,`value = min(value, ${t.getByIndices("input_indices")});`,""]})},m1=(r,e)=>{yn(r.inputs),_n(r,"ReduceProd",e,(t,o)=>[`var value = ${o.type.storage}(1);`,"",`value *= ${t.getByIndices("input_indices")};`,""])},g1=(r,e)=>{yn(r.inputs),_n(r,"ReduceSum",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${t.getByIndices("input_indices")};`,""])},b1=(r,e)=>{yn(r.inputs),_n(r,"ReduceSumSquare",e,(t,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${t.getByIndices("input_indices")}; value += t * t;`,""])},xn=(r,e,n)=>{if(e.length===0)return n;let t=1,o=1;for(let i=0;i1024},Ag=(r,e)=>{xn(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?f1(r,e):gg(r,e)},Pg=(r,e)=>{xn(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?l1(r,e):bg(r,e)},Og=(r,e)=>{xn(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?c1(r,e):yg(r,e)},Eg=(r,e)=>{xn(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?d1(r,e):_g(r,e)},Cg=(r,e)=>{xn(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?p1(r,e):xg(r,e)},Dg=(r,e)=>{xn(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?h1(r,e):wg(r,e)},kg=(r,e)=>{xn(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?m1(r,e):Tg(r,e)},Lg=(r,e)=>{xn(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?g1(r,e):vg(r,e)},Rg=(r,e)=>{xn(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?b1(r,e):Ig(r,e)},Ng=(r,e)=>{xn(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?u1(r,e):Sg(r,e)}});var zg,Mg,Bg,nl,Vg=$(()=>{"use strict";Z();Ee();Fi();zg=r=>{if(!r||r.length===0||r.length>2)throw new Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(r[0].dataType!==1)throw new Error("Invalid input type.")},Mg=(r,e)=>{zg(r.inputs);let n=(t,o,i)=>{let a=[];for(let s=0;s=0||i.length===0)&&a.push(`input_indices[${s}] = 0;`);return[`${a.join(` +`)}`,`var value = ${t.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLastIndex>0?"<=":"<"} value) { + value = ${t.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",o.setByOffset("global_idx","best_index")]};r.compute(Gi("ArgMin",{hint:e.cacheKey,inputDependencies:["rank"]},[r.inputs[0]],n,[e.axis],7,e.keepDims),{inputs:[0]})},Bg=(r,e)=>{zg(r.inputs);let n=(t,o,i)=>{let a=[];for(let s=0;s=0||i.length===0)&&a.push(`input_indices[${s}] = 0;`);return[`${a.join(` +`)}`,`var value = ${t.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLastIndex>0?">=":">"} value) { + value = ${t.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",o.setByOffset("global_idx","best_index")]};r.compute(Gi("argMax",{hint:e.cacheKey,inputDependencies:["rank"]},[r.inputs[0]],n,[e.axis],7,e.keepDims),{inputs:[0]})},nl=r=>J(r)});var y1,rl,_1,x1,w1,$r,T1,Fg,Ui=$(()=>{"use strict";Z();ne();Mi();oe();y1=(r,e)=>{let n=r[0],t=r[1],o=r[2],i=r[3],a=r[4],s=r[5];if(a&&s)throw new Error("Attention cannot have both past and attention_bias");if(n.dims.length!==3)throw new Error('Input "input" must have 3 dimensions');let u=n.dims[0],l=n.dims[1],c=n.dims[2];if(o.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimensions');if(t.dims.length!==2)throw new Error('Input "weights" is expected to have 2 dimensions');if(t.dims[0]!==c)throw new Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(o.dims[0]!==t.dims[1])throw new Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let d=o.dims[0]/3,p=d,f=p;if(e.qkvHiddenSizes.length>0){if(e.qkvHiddenSizes.length!==3)throw new Error("qkv_hidden_sizes attribute should have 3 elements");for(let x of e.qkvHiddenSizes)if(x%e.numHeads!==0)throw new Error("qkv_hidden_sizes should be divisible by num_heads");d=e.qkvHiddenSizes[0],p=e.qkvHiddenSizes[1],f=e.qkvHiddenSizes[2]}let h=l;if(d!==p)throw new Error("qkv_hidden_sizes first element should be same as the second");if(o.dims[0]!==d+p+f)throw new Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let m=0;if(a){if(p!==f)throw new Error('Input "past" expect k_hidden_size == v_hidden_size');if(a.dims.length!==5)throw new Error('Input "past" must have 5 dimensions');if(a.dims[0]!==2)throw new Error('Input "past" first dimension must be 2');if(a.dims[1]!==u)throw new Error('Input "past" second dimension must be batch_size');if(a.dims[2]!==e.numHeads)throw new Error('Input "past" third dimension must be num_heads');if(a.dims[4]!==p/e.numHeads)throw new Error('Input "past" fifth dimension must be k_hidden_size / num_heads');e.pastPresentShareBuffer||(m=a.dims[3])}let y=h+m,g=-1,b=0;if(i)throw new Error("Mask not supported");if(a)throw new Error("past is not supported");if(s){if(s.dims.length!==4)throw new Error('Input "attention_bias" must have 4 dimensions');if(s.dims[0]!==u||s.dims[1]!==e.numHeads||s.dims[2]!==l||s.dims[3]!==y)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:u,sequenceLength:l,pastSequenceLength:m,kvSequenceLength:h,totalSequenceLength:y,maxSequenceLength:g,inputHiddenSize:c,hiddenSize:d,vHiddenSize:f,headSize:Math.floor(d/e.numHeads),vHeadSize:Math.floor(f/e.numHeads),numHeads:e.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:e.maskFilterValue,maskType:b,scale:e.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},rl=(r,e,n)=>e&&r?` + let total_sequence_length_input = u32(${e.getByOffset("0")}); + let present_sequence_length = max(total_sequence_length_input, uniforms.past_sequence_length); + let is_subsequent_prompt: bool = sequence_length > 1 && sequence_length != total_sequence_length_input; + let is_first_prompt: bool = is_subsequent_prompt == false && sequence_length == total_sequence_length_input; + total_sequence_length = u32(${r?.getByOffset("batchIdx")}) + 1; + var past_sequence_length: u32 = 0; + if (is_first_prompt == false) { + past_sequence_length = total_sequence_length - sequence_length; + } + `:` + ${n?"let past_sequence_length = uniforms.past_sequence_length":""}; + let present_sequence_length = total_sequence_length; + `,_1=(r,e,n,t,o,i,a,s)=>{let u=he(a?1:i),l=64,c=i/u;c{let b=C("x",r.dataType,r.dims,u),x=[b],w=a?A("seq_lens",a.dataType,a.dims):void 0;w&&x.push(w);let v=s?A("total_sequence_length_input",s.dataType,s.dims):void 0;v&&x.push(v);let I=Ve(r.dataType),P=[{name:"batch_size",type:"u32"},{name:"num_heads",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"sequence_length",type:"u32"},{name:"total_sequence_length",type:"u32"},{name:"elements_per_thread",type:"u32"}];return` + var thread_max: array; + var thread_sum: array; + ${g.registerUniforms(P).declareVariables(...x)} + ${g.mainStart([l,1,1])} + let batchIdx = workgroup_id.z / uniforms.num_heads; + let headIdx = workgroup_id.z % uniforms.num_heads; + let sequence_length = uniforms.sequence_length; + var total_sequence_length = uniforms.total_sequence_length; + ${rl(w,v,!1)} + let local_offset = local_idx * uniforms.elements_per_thread; + let offset = (global_idx / ${l}) * uniforms.total_sequence_length + local_offset; + let seq_causal_length = ${a?"u32(past_sequence_length + workgroup_id.y + 1)":"total_sequence_length"}; + var thread_max_vector = ${h}(-3.4028234663852886e+38f); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + thread_max_vector = max(${h}(x[offset + i]), thread_max_vector); + } + thread_max[local_idx] = ${(()=>{switch(u){case 1:return"thread_max_vector";case 2:return"max(thread_max_vector.x, thread_max_vector.y)";case 4:return"max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))";default:throw new Error(`Unsupported components: ${u}`)}})()}; + workgroupBarrier(); + + var max_value = f32(-3.4028234663852886e+38f); + for (var i = 0u; i < ${l}; i++) { + max_value = max(thread_max[i], max_value); + } + + var sum_vector = ${h}(0); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + sum_vector += exp(${h}(x[offset + i]) - max_value); + } + thread_sum[local_idx] = ${(()=>{switch(u){case 1:return"sum_vector";case 2:return"sum_vector.x + sum_vector.y";case 4:return"sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w";default:throw new Error(`Unsupported components: ${u}`)}})()}; + workgroupBarrier(); + + var sum: f32 = 0; + for (var i = 0u; i < ${l}; i++) { + sum += thread_sum[i]; + } + + if (sum == 0) { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + x[offset + i] = ${b.type.value}(${I}(1.0) / ${I}(seq_causal_length)); + } + } else { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + var f32input = ${h}(x[offset + i]); + x[offset + i] = ${b.type.value}(exp(f32input - max_value) / sum); + } + } + ${a?` + for (var total_seq_id: u32 = seq_causal_length; total_seq_id + local_offset < uniforms.total_sequence_length; total_seq_id++) { + x[offset + total_seq_id] = ${b.type.value}(${I}(0)); + }`:""}; + }`};return{name:"AttentionProbsSoftmax",shaderCache:{hint:`${l};${f};${u}`,inputDependencies:m},getShaderSource:y,getRunData:()=>({outputs:[],dispatchGroup:{x:1,y:o,z:e*n},programUniforms:p})}},x1=(r,e,n,t,o,i,a,s,u)=>{let l=a+i.kvSequenceLength,c=[i.batchSize,i.numHeads,i.sequenceLength,l],d=r>1&&t,p=i.kvNumHeads?i.kvNumHeads:i.numHeads,f=d?[i.batchSize,p,l,i.headSize]:void 0,h=i.nReps?i.nReps:1,m=i.scale===0?1/Math.sqrt(i.headSize):i.scale,y=he(i.headSize),g=i.headSize/y,b=12,x={x:Math.ceil(l/b),y:Math.ceil(i.sequenceLength/b),z:i.batchSize*i.numHeads},w=[{type:12,data:i.sequenceLength},{type:12,data:g},{type:12,data:l},{type:12,data:i.numHeads},{type:12,data:i.headSize},{type:1,data:m},{type:12,data:a},{type:12,data:i.kvSequenceLength},{type:12,data:h}],v=d&&t&&S.size(t.dims)>0,I=["type","type"];v&&I.push("type"),o&&I.push("type"),s&&I.push("type"),u&&I.push("type");let P=[{dims:c,dataType:e.dataType,gpuDataType:0}];d&&P.push({dims:f,dataType:e.dataType,gpuDataType:0});let O=E=>{let R=A("q",e.dataType,e.dims,y),q=A("key",n.dataType,n.dims,y),B=[R,q];if(v){let Y=A("past_key",t.dataType,t.dims,y);B.push(Y)}o&&B.push(A("attention_bias",o.dataType,o.dims));let W=s?A("seq_lens",s.dataType,s.dims):void 0;W&&B.push(W);let ae=u?A("total_sequence_length_input",u.dataType,u.dims):void 0;ae&&B.push(ae);let F=C("output",e.dataType,c),U=[F];d&&U.push(C("present_key",e.dataType,f,y));let K=Ve(1,y),Q=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` + const TILE_SIZE = ${b}u; + + var tileQ: array<${R.type.storage}, ${b*b}>; + var tileK: array<${R.type.storage}, ${b*b}>; + ${E.registerUniforms(Q).declareVariables(...B,...U)} + ${E.mainStart([b,b,1])} + // x holds the N and y holds the M + let headIdx = workgroup_id.z % uniforms.num_heads; + let kvHeadIdx = ${h===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${h===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let m = workgroup_id.y * TILE_SIZE; + let n = workgroup_id.x * TILE_SIZE; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.N; + ${rl(W,ae,!0)} + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; + let qOffset = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + ${v&&d?"let pastKeyOffset = absKvHeadIdx * uniforms.past_sequence_length * uniforms.K;":""}; + let kOffset = absKvHeadIdx * uniforms.kv_sequence_length * uniforms.K; + ${d?"let presentKeyOffset = absKvHeadIdx * uniforms.N * uniforms.K;":""} + var value = ${K}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x]; + } + if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${v&&d?` + if (n + local_id.y < past_sequence_length) { + tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + } else if (n + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y - past_sequence_length) * uniforms.K + w + local_id.x]; + }`:` + if (n + local_id.y < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + }`} + ${d?`if (n + local_id.y < present_sequence_length) { + present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx]; + }`:""} + } + workgroupBarrier(); + + for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) { + value += ${K}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]); + } + + workgroupBarrier(); + } + + if (global_id.y < uniforms.M && global_id.x < total_sequence_length) { + let headOffset = workgroup_id.z * uniforms.M * uniforms.N; + let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x; + var sum: f32 = ${(()=>{switch(y){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw new Error(`Unsupported components: ${y}`)}})()}; + output[outputIdx] = ${F.type.value} (sum * uniforms.alpha) + ${o?"attention_bias[outputIdx]":"0.0"}; + } + }`};return{name:"AttentionProbs",shaderCache:{hint:`${y};${o!==void 0};${t!==void 0};${r}`,inputDependencies:I},getRunData:()=>({outputs:P,dispatchGroup:x,programUniforms:w}),getShaderSource:O}},w1=(r,e,n,t,o,i,a=void 0,s=void 0)=>{let u=i+o.kvSequenceLength,l=o.nReps?o.nReps:1,c=o.vHiddenSize*l,d=r>1&&t,p=o.kvNumHeads?o.kvNumHeads:o.numHeads,f=d?[o.batchSize,p,u,o.headSize]:void 0,h=[o.batchSize,o.sequenceLength,c],m=12,y={x:Math.ceil(o.vHeadSize/m),y:Math.ceil(o.sequenceLength/m),z:o.batchSize*o.numHeads},g=[{type:12,data:o.sequenceLength},{type:12,data:u},{type:12,data:o.vHeadSize},{type:12,data:o.numHeads},{type:12,data:o.headSize},{type:12,data:c},{type:12,data:i},{type:12,data:o.kvSequenceLength},{type:12,data:l}],b=d&&t&&S.size(t.dims)>0,x=["type","type"];b&&x.push("type"),a&&x.push("type"),s&&x.push("type");let w=[{dims:h,dataType:e.dataType,gpuDataType:0}];d&&w.push({dims:f,dataType:e.dataType,gpuDataType:0});let v=I=>{let P=A("probs",e.dataType,e.dims),O=A("v",n.dataType,n.dims),E=[P,O];b&&E.push(A("past_value",t.dataType,t.dims));let R=a?A("seq_lens",a.dataType,a.dims):void 0;a&&E.push(R);let q=s?A("total_sequence_length_input",s.dataType,s.dims):void 0;s&&E.push(q);let W=[C("output",e.dataType,h)];d&&W.push(C("present_value",e.dataType,f));let ae=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` + const TILE_SIZE = ${m}u; + var tileQ: array<${P.type.value}, ${m*m}>; + var tileV: array<${P.type.value}, ${m*m}>; + ${I.registerUniforms(ae).declareVariables(...E,...W)} + ${I.mainStart([m,m,1])} + let headIdx = workgroup_id.z % uniforms.num_heads; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let kvHeadIdx = ${l===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${l===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let m = global_id.y; + let n = global_id.x; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.K; + ${rl(R,q,!0)} + let offsetA = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; // kvHeadIdx is relative to the batch + ${b&&d?"let pastValueOffset = absKvHeadIdx * uniforms.N * uniforms.past_sequence_length + n;":""}; + let vOffset = absKvHeadIdx * uniforms.N * uniforms.kv_sequence_length + n; + ${d?"let presentValueOffset = absKvHeadIdx * uniforms.N * uniforms.K + n;":""} + var value = ${P.type.storage}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${b&&d?` + if (w + local_id.y < past_sequence_length) { + tileV[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N]; + } else if (w + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y - past_sequence_length) * uniforms.N]; + } + `:` + if (w + local_id.y < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y) * uniforms.N]; + }`} + ${d?` + if (w + local_id.y < present_sequence_length) { + present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileV[idx]; + }`:""} + } + workgroupBarrier(); + for (var k: u32 = 0u; k < TILE_SIZE && w+k < total_sequence_length; k++) { + value += tileQ[TILE_SIZE * local_id.y + k] * tileV[TILE_SIZE * k + local_id.x]; + } + workgroupBarrier(); + } + + // we need to transpose output from BNSH_v to BSND_v + if (m < uniforms.M && n < uniforms.N) { + let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size + + headIdx * uniforms.N + n; + output[outputIdx] = value; + } + }`};return{name:"AttentionScore",shaderCache:{hint:`${t!==void 0};${r}`,inputDependencies:x},getRunData:()=>({outputs:w,dispatchGroup:y,programUniforms:g}),getShaderSource:v}},$r=(r,e,n,t,o,i,a,s,u,l,c=void 0,d=void 0)=>{let p=Math.min(r.outputCount,1+(a?1:0)+(s?1:0)),f=p>1?l.pastSequenceLength:0,h=f+l.kvSequenceLength,m=u&&S.size(u.dims)>0?u:void 0,y=[e,n];p>1&&a&&S.size(a.dims)>0&&y.push(a),m&&y.push(m),c&&y.push(c),d&&y.push(d);let g=r.compute(x1(p,e,n,a,m,l,f,c,d),{inputs:y,outputs:p>1?[-1,1]:[-1]})[0];r.compute(_1(g,l.batchSize,l.numHeads,f,l.sequenceLength,h,c,d),{inputs:c&&d?[g,c,d]:[g],outputs:[]});let b=[g,t];p>1&&s&&S.size(s.dims)>0&&b.push(s),c&&b.push(c),d&&b.push(d),r.compute(w1(p,g,t,s,l,f,c,d),{inputs:b,outputs:p>1?[0,2]:[0]})},T1=(r,e)=>{let n=[e.batchSize,e.numHeads,e.sequenceLength,e.headSize],t=e.sequenceLength,o=e.inputHiddenSize,i=e.headSize,a=12,s={x:Math.ceil(e.headSize/a),y:Math.ceil(e.sequenceLength/a),z:e.batchSize*e.numHeads},u=[r.inputs[0],r.inputs[1],r.inputs[2]],l=[{type:12,data:t},{type:12,data:o},{type:12,data:i},{type:12,data:e.numHeads},{type:12,data:e.headSize},{type:12,data:e.hiddenSize},{type:12,data:e.hiddenSize+e.hiddenSize+e.vHiddenSize}],c=d=>{let p=C("output_q",u[0].dataType,n),f=C("output_k",u[0].dataType,n),h=C("output_v",u[0].dataType,n),m=A("input",u[0].dataType,u[0].dims),y=A("weight",u[1].dataType,u[1].dims),g=A("bias",u[2].dataType,u[2].dims),b=m.type.storage,x=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}];return` + const TILE_SIZE = ${a}u; + var tileInput: array<${b}, ${a*a}>; + var tileWeightQ: array<${b}, ${a*a}>; + var tileWeightK: array<${b}, ${a*a}>; + var tileWeightV: array<${b}, ${a*a}>; + ${d.registerUniforms(x).declareVariables(m,y,g,p,f,h)} + ${d.mainStart([a,a,1])} + let batchIndex = workgroup_id.z / uniforms.num_heads; + let headNumber = workgroup_id.z % uniforms.num_heads; + let m = global_id.y; + let n = global_id.x; + + let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K; + let biasOffsetQ = headNumber * uniforms.head_size; + let biasOffsetK = uniforms.hidden_size + biasOffsetQ; + let biasOffsetV = uniforms.hidden_size + biasOffsetK; + + var valueQ = ${b}(0); + var valueK = ${b}(0); + var valueV = ${b}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + let offset = n + (w + local_id.y) * uniforms.ldb; + tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset]; + tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset]; + tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset]; + } + workgroupBarrier(); + for (var k: u32 = 0u; k({outputs:[{dims:n,dataType:r.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:r.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:r.inputs[0].dataType,gpuDataType:0}],dispatchGroup:s,programUniforms:l}),getShaderSource:c},{inputs:u,outputs:[-1,-1,-1]})},Fg=(r,e)=>{let n=y1(r.inputs,e),[t,o,i]=T1(r,n);return $r(r,t,o,i,r.inputs[4],void 0,void 0,void 0,r.inputs[5],n)}});var v1,I1,S1,Gg,Ug=$(()=>{"use strict";qe();Z();ne();Ee();oe();v1=(r,e)=>{if(!r||r.length!==5)throw new Error("BatchNormalization requires 5 inputs");let n=(t,o,i)=>{let a=o.length;if(a!==t.length)throw new Error(`${i}: num dimensions != ${a}`);o.forEach((s,u)=>{if(s!==t[u])throw new Error(`${i}: dim[${u}] do not match`)})};if(r[0].dims.length>1){let t=e.format==="NHWC"?e.spatial?r[0].dims.slice(-1):r[0].dims.slice(-1).concat(r[0].dims.slice(1,r[0].dims.length-1)):r[0].dims.slice(1,e.spatial?2:void 0);n(r[1].dims,t,"Invalid input scale"),n(r[2].dims,t,"Invalid input B"),n(r[3].dims,t,"Invalid input mean"),n(r[4].dims,t,"Invalid input var")}else n(r[1].dims,[1],"Invalid input scale"),n(r[2].dims,[1],"Invalid input B"),n(r[3].dims,[1],"Invalid input mean"),n(r[4].dims,[1],"Invalid input var")},I1=(r,e)=>{let{epsilon:n,spatial:t,format:o}=e,i=r[0].dims,a=t?he(i[i.length-1]):1,s=o==="NHWC"&&i.length>1?a:1,u=S.size(i)/a,l=t,c=l?i.length:i,d=A("x",r[0].dataType,r[0].dims,a),p=A("scale",r[1].dataType,r[1].dims,s),f=A("bias",r[2].dataType,r[2].dims,s),h=A("inputMean",r[3].dataType,r[3].dims,s),m=A("inputVar",r[4].dataType,r[4].dims,s),y=C("y",r[0].dataType,c,a),g=()=>{let x="";if(t)x=`let cOffset = ${i.length===1?"0u":o==="NHWC"?`outputIndices[${i.length-1}] / ${a}`:"outputIndices[1]"};`;else if(o==="NCHW")x=` + ${y.indicesSet("outputIndices","0","0")} + let cOffset = ${y.indicesToOffset("outputIndices")};`;else{x=`var cIndices = ${p.type.indices}(0); + cIndices[0] = outputIndices[${i.length-1}];`;for(let w=1;w` + const epsilon = ${n}; + ${x.registerUniform("outputSize","u32").declareVariables(d,p,f,h,m,y)} + ${x.mainStart()} + ${x.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${y.offsetToIndices(`global_idx * ${a}`)}; + ${g()} + let scale = ${p.getByOffset("cOffset")}; + let bias = ${f.getByOffset("cOffset")}; + let inputMean = ${h.getByOffset("cOffset")}; + let inputVar = ${m.getByOffset("cOffset")}; + let x = ${d.getByOffset("global_idx")}; + let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias; + ${y.setByOffset("global_idx","value")} + }`;return{name:"BatchNormalization",shaderCache:{hint:`${e.epsilon}_${e.format}_${t}_${a}`,inputDependencies:l?["rank","type","type","type","type"]:void 0},getShaderSource:b,getRunData:()=>({outputs:[{dims:r[0].dims,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:l?[{type:12,data:u},...k(i)]:[{type:12,data:u}]})}},S1=r=>J(r),Gg=(r,e)=>{let{inputs:n,outputCount:t}=r,o=S1({...e,outputCount:t});if(ee.webgpu.validateInputContent&&v1(n,o),e.trainingMode)throw new Error("BatchNormalization trainingMode is not supported yet.");r.compute(I1(n,o))}});var $1,A1,Wg,Hg=$(()=>{"use strict";ne();oe();$1=r=>{if(r[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![320,640,1280].includes(r[0].dims[2]))throw new Error("number of channels should be 320, 640 or 1280");if(r[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(r[0].dims[2]!==r[1].dims[0])throw new Error("last dimension of input and bias are not the same")},A1=r=>{let e=r[0].dims,n=r[0].dims[2],t=S.size(e)/4,o=r[0].dataType,i=A("input",o,e,4),a=A("bias",o,[n],4),s=A("residual",o,e,4),u=C("output",o,e,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:e,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(t/64)}}),getShaderSource:c=>` + const channels = ${n}u / 4; + ${c.declareVariables(i,a,s,u)} + + ${c.mainStart()} + ${c.guardAgainstOutOfBoundsWorkgroupSizes(t)} + let value = ${i.getByOffset("global_idx")} + + ${a.getByOffset("global_idx % channels")} + ${s.getByOffset("global_idx")}; + ${u.setByOffset("global_idx","value")} + }`}},Wg=r=>{$1(r.inputs),r.compute(A1(r.inputs))}});var P1,be,qg,jg,Kg,Xg,Zg,Jg,Qg,Yg,eb,O1,tb,nb,rb,ob,no,ib,Wi,ab,sb,ub,lb,cb,db,pb,fb,hb,mb,gb,bb,yb,_b,xb,wb,Tb,vb,ol,il,Ib,Sb,$b,E1,C1,Ab,Hi=$(()=>{"use strict";Z();ne();Ee();oe();P1=(r,e,n,t,o,i,a)=>{let s=Math.ceil(e/4),u="";typeof o=="string"?u=`${o}(a)`:u=o("a");let l=A("inputData",n,[s],4),c=C("outputData",t,[s],4),d=[{name:"vec_size",type:"u32"}];return a&&d.push(...a),` + ${r.registerUniforms(d).declareVariables(l,c)} + + ${i??""} + + ${r.mainStart()} + ${r.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + + let a = ${l.getByOffset("global_idx")}; + ${c.setByOffset("global_idx",u)} + }`},be=(r,e,n,t,o,i=r.dataType,a,s)=>{let u=[{type:12,data:Math.ceil(S.size(r.dims)/4)}];return a&&u.push(...a),{name:e,shaderCache:{hint:o,inputDependencies:["type"]},getShaderSource:l=>P1(l,S.size(r.dims),r.dataType,i,n,t,s),getRunData:l=>({outputs:[{dims:r.dims,dataType:i}],dispatchGroup:{x:Math.ceil(S.size(l[0].dims)/64/4)},programUniforms:u})}},qg=r=>{r.compute(be(r.inputs[0],"Abs","abs"))},jg=r=>{r.compute(be(r.inputs[0],"Acos","acos"))},Kg=r=>{r.compute(be(r.inputs[0],"Acosh","acosh"))},Xg=r=>{r.compute(be(r.inputs[0],"Asin","asin"))},Zg=r=>{r.compute(be(r.inputs[0],"Asinh","asinh"))},Jg=r=>{r.compute(be(r.inputs[0],"Atan","atan"))},Qg=r=>{r.compute(be(r.inputs[0],"Atanh","atanh"))},Yg=r=>J(r),eb=(r,e)=>{let n;switch(e.to){case 10:n="vec4";break;case 1:n="vec4";break;case 12:n="vec4";break;case 6:n="vec4";break;case 9:n="vec4";break;default:throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${e.to}`)}r.compute(be(r.inputs[0],"Cast",n,void 0,e.cacheKey,e.to))},O1=r=>{let e,n,t=r.length>=2&&r[1].data!==0,o=r.length>=3&&r[2].data!==0;switch(r[0].dataType){case 1:e=t?r[1].getFloat32Array()[0]:-34028234663852886e22,n=o?r[2].getFloat32Array()[0]:34028234663852886e22;break;case 10:e=t?r[1].getUint16Array()[0]:64511,n=o?r[2].getUint16Array()[0]:31743;break;default:throw new Error("Unsupport data type")}return J({min:e,max:n})},tb=(r,e)=>{let n=e||O1(r.inputs),t=Ve(r.inputs[0].dataType);r.compute(be(r.inputs[0],"Clip",o=>`clamp(${o}, vec4<${t}>(uniforms.min), vec4<${t}>(uniforms.max))`,void 0,n.cacheKey,void 0,[{type:r.inputs[0].dataType,data:n.min},{type:r.inputs[0].dataType,data:n.max}],[{name:"min",type:t},{name:"max",type:t}]),{inputs:[0]})},nb=r=>{r.compute(be(r.inputs[0],"Ceil","ceil"))},rb=r=>{r.compute(be(r.inputs[0],"Cos","cos"))},ob=r=>{r.compute(be(r.inputs[0],"Cosh","cosh"))},no=r=>J(r),ib=(r,e)=>{let n=Ve(r.inputs[0].dataType);r.compute(be(r.inputs[0],"Elu",t=>`elu_vf32(${t})`,` + const elu_alpha_ = ${n}(${e.alpha}); + + fn elu_f32(a: ${n}) -> ${n} { + return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0); + } + + fn elu_vf32(v: vec4<${n}>) -> vec4<${n}> { + return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w)); + }`,e.cacheKey))},Wi=(r="f32")=>` +const r0: ${r} = 0.3275911; +const r1: ${r} = 0.254829592; +const r2: ${r} = -0.284496736; +const r3: ${r} = 1.421413741; +const r4: ${r} = -1.453152027; +const r5: ${r} = 1.061405429; + +fn erf_vf32(v: vec4<${r}>) -> vec4<${r}> { + let absv = abs(v); + let x = 1.0 / (1.0 + r0 * absv); + return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); +}`,ab=r=>{let e=Ve(r.inputs[0].dataType);r.compute(be(r.inputs[0],"Erf",n=>`erf_vf32(${n})`,Wi(e)))},sb=r=>{r.compute(be(r.inputs[0],"Exp","exp"))},ub=r=>{r.compute(be(r.inputs[0],"Floor","floor"))},lb=r=>{let e=Ve(r.inputs[0].dataType);r.compute(be(r.inputs[0],"Gelu",n=>`0.5 * ${n} * (1.0 + erf_vf32(${n} * 0.7071067811865475))`,Wi(e)))},cb=(r,e)=>{let n=Ve(r.inputs[0].dataType);r.compute(be(r.inputs[0],"LeakyRelu",t=>`select(leaky_relu_alpha_ * ${t}, ${t}, ${t} >= vec4<${n}>(0.0))`,`const leaky_relu_alpha_ = ${n}(${e.alpha});`,e.cacheKey))},db=r=>{r.compute(be(r.inputs[0],"Not",e=>`!${e}`))},pb=r=>{r.compute(be(r.inputs[0],"Neg",e=>`-${e}`))},fb=r=>{r.compute(be(r.inputs[0],"Reciprocal",e=>`1.0/${e}`))},hb=r=>{let e=Ve(r.inputs[0].dataType);r.compute(be(r.inputs[0],"Relu",n=>`select(vec4<${e}>(0.0), ${n}, ${n} > vec4<${e}>(0.0))`))},mb=r=>{r.compute(be(r.inputs[0],"Sigmoid",e=>`(1.0 / (1.0 + exp(-${e})))`))},gb=r=>J(r),bb=(r,e)=>{let n=Ve(r.inputs[0].dataType);r.compute(be(r.inputs[0],"HardSigmoid",t=>`max(vec4<${n}>(0.0), min(vec4<${n}>(1.0), ${e.alpha} * ${t} + vec4<${n}>(${e.beta})))`,void 0,e.cacheKey))},yb=r=>{r.compute(be(r.inputs[0],"Sin","sin"))},_b=r=>{r.compute(be(r.inputs[0],"Sinh","sinh"))},xb=r=>{r.compute(be(r.inputs[0],"Sqrt","sqrt"))},wb=r=>{r.compute(be(r.inputs[0],"Tan","tan"))},Tb=r=>`sign(${r}) * (1 - exp(-2 * abs(${r}))) / (1 + exp(-2 * abs(${r})))`,vb=r=>{r.compute(be(r.inputs[0],"Tanh",Tb))},ol=(r="f32")=>` +const fast_gelu_a: ${r} = 0.5; +const fast_gelu_b: ${r} = 0.7978845608028654; +const fast_gelu_c: ${r} = 0.035677408136300125; + +fn tanh_v(v: vec4<${r}>) -> vec4<${r}> { + return ${Tb("v")}; +} +`,il=r=>`(fast_gelu_a + fast_gelu_a * tanh_v(${r} * (fast_gelu_c * ${r} * ${r} + fast_gelu_b))) * ${r}`,Ib=r=>{let e=Ve(r.inputs[0].dataType);r.compute(be(r.inputs[0],"FastGelu",il,ol(e),void 0,r.inputs[0].dataType))},Sb=(r,e)=>{let n=Ve(r.inputs[0].dataType);return r.compute(be(r.inputs[0],"ThresholdedRelu",t=>`select(vec4<${n}>(0.0), ${t}, ${t} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${n}>(${e.alpha});`,e.cacheKey)),0},$b=r=>{r.compute(be(r.inputs[0],"Log","log"))},E1=(r,e)=>` +const alpha = vec4<${r}>(${e}); +const one = ${r}(1.0); +const zero = ${r}(0.0); + +fn quick_gelu_impl(x: vec4<${r}>) -> vec4<${r}> { + let v = x *alpha; + var x1 : vec4<${r}>; + for (var i = 0; i < 4; i = i + 1) { + if (v[i] >= zero) { + x1[i] = one / (one + exp(-v[i])); + } else { + x1[i] = one - one / (one + exp(v[i])); + } + } + return x * x1; +} +`,C1=r=>`quick_gelu_impl(${r})`,Ab=(r,e)=>{let n=Ve(r.inputs[0].dataType);r.compute(be(r.inputs[0],"QuickGelu",C1,E1(n,e.alpha),e.cacheKey,r.inputs[0].dataType))}});var D1,k1,Ob,Eb=$(()=>{"use strict";ne();oe();Hi();D1=r=>{if(r[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![2560,5120,10240].includes(r[0].dims[2]))throw new Error("hidden state should be 2560, 5120 or 10240");if(r[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(r[0].dims[2]!==r[1].dims[0])throw new Error("last dimension of input and bias are not the same")},k1=r=>{let e=r[0].dims.slice();e[2]=e[2]/2;let n=A("input",r[0].dataType,r[0].dims,4),t=A("bias",r[0].dataType,[r[0].dims[2]],4),o=C("output",r[0].dataType,e,4),i=S.size(e)/4,a=ve(r[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:e,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)}}),getShaderSource:u=>` + const M_SQRT2 = sqrt(2.0); + const halfChannels = ${r[0].dims[2]/4/2}u; + + ${u.declareVariables(n,t,o)} + + ${Wi(a)} + + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes(i)} + let biasIdx = global_idx % halfChannels; + let batchIndex = global_idx / halfChannels; + let inputOffset = biasIdx + batchIndex * halfChannels * 2; + let valueLeft = input[inputOffset] + bias[biasIdx]; + let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels]; + let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); + + ${o.setByOffset("global_idx","valueLeft * geluRight")} + }`}},Ob=r=>{D1(r.inputs),r.compute(k1(r.inputs))}});var L1,R1,wn,Cb,Db,kb,Lb,Rb,Nb,zb,Mb,Bb,Vb,Fb=$(()=>{"use strict";Z();ne();oe();L1=(r,e,n,t,o,i,a,s,u,l,c,d)=>{let p,f;typeof s=="string"?p=f=(b,x)=>`${s}((${b}),(${x}))`:typeof s=="function"?p=f=s:(p=s.scalar,f=s.vector);let h=C("outputData",c,t.length,4),m=A("aData",u,e.length,4),y=A("bData",l,n.length,4),g;if(o)if(i){let b=S.size(e)===1,x=S.size(n)===1,w=e.length>0&&e[e.length-1]%4===0,v=n.length>0&&n[n.length-1]%4===0;b||x?g=h.setByOffset("global_idx",f(b?`${m.type.value}(${m.getByOffset("0")}.x)`:m.getByOffset("global_idx"),x?`${y.type.value}(${y.getByOffset("0")}.x)`:y.getByOffset("global_idx"))):g=` + let outputIndices = ${h.offsetToIndices("global_idx * 4u")}; + let offsetA = ${m.broadcastedIndicesToOffset("outputIndices",h)}; + let offsetB = ${y.broadcastedIndicesToOffset("outputIndices",h)}; + ${h.setByOffset("global_idx",f(a||w?m.getByOffset("offsetA / 4u"):`${m.type.value}(${m.getByOffset("offsetA / 4u")}[offsetA % 4u])`,a||v?y.getByOffset("offsetB / 4u"):`${y.type.value}(${y.getByOffset("offsetB / 4u")}[offsetB % 4u])`))} + `}else g=h.setByOffset("global_idx",f(m.getByOffset("global_idx"),y.getByOffset("global_idx")));else{if(!i)throw new Error("no necessary to use scalar implementation for element-wise binary op implementation.");let b=(x,w,v="")=>{let I=`aData[indexA${w}][componentA${w}]`,P=`bData[indexB${w}][componentB${w}]`;return` + let outputIndices${w} = ${h.offsetToIndices(`global_idx * 4u + ${w}u`)}; + let offsetA${w} = ${m.broadcastedIndicesToOffset(`outputIndices${w}`,h)}; + let offsetB${w} = ${y.broadcastedIndicesToOffset(`outputIndices${w}`,h)}; + let indexA${w} = offsetA${w} / 4u; + let indexB${w} = offsetB${w} / 4u; + let componentA${w} = offsetA${w} % 4u; + let componentB${w} = offsetB${w} % 4u; + ${x}[${w}] = ${v}(${p(I,P)}); + `};c===9?g=` + var data = vec4(0); + ${b("data",0,"u32")} + ${b("data",1,"u32")} + ${b("data",2,"u32")} + ${b("data",3,"u32")} + outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:g=` + ${b("outputData[global_idx]",0)} + ${b("outputData[global_idx]",1)} + ${b("outputData[global_idx]",2)} + ${b("outputData[global_idx]",3)} + `}return` + ${r.registerUniform("vec_size","u32").declareVariables(m,y,h)} + + ${d??""} + + ${r.mainStart()} + ${r.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${g} + }`},R1=(r,e,n,t,o,i,a=n.dataType)=>{let s=n.dims.map(Number),u=t.dims.map(Number),l=!S.areEqual(s,u),c=s,d=S.size(s),p=!1,f=!1,h=[l];if(l){let m=gn.calcShape(s,u,!1);if(!m)throw new Error("Can't perform binary op on the given tensors");c=m.slice(),d=S.size(c);let y=S.size(s)===1,g=S.size(u)===1,b=s.length>0&&s[s.length-1]%4===0,x=u.length>0&&u[u.length-1]%4===0;h.push(y),h.push(g),h.push(b),h.push(x);let w=1;for(let v=1;vm.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:m=>L1(m,s,u,c,p,l,f,o,n.dataType,t.dataType,a,i),getRunData:()=>({outputs:[{dims:c,dataType:a}],dispatchGroup:{x:Math.ceil(d/64/4)},programUniforms:[{type:12,data:Math.ceil(S.size(c)/4)},...k(s,u,c)]})}},wn=(r,e,n,t,o,i)=>{r.compute(R1(e,o??"",r.inputs[0],r.inputs[1],n,t,i))},Cb=r=>{wn(r,"Add",(e,n)=>`${e}+${n}`)},Db=r=>{wn(r,"Div",(e,n)=>`${e}/${n}`)},kb=r=>{wn(r,"Equal",{scalar:(e,n)=>`u32(${e}==${n})`,vector:(e,n)=>`vec4(${e}==${n})`},void 0,void 0,9)},Lb=r=>{wn(r,"Mul",(e,n)=>`${e}*${n}`)},Rb=r=>{let e=A("input",r.inputs[0].dataType,r.inputs[0].dims).type.value;wn(r,"Pow",{scalar:(t,o)=>`pow_custom(${t},${o})`,vector:(t,o)=>`pow_vector_custom(${t},${o})`},` + fn pow_custom(a : ${e}, b : ${e}) -> ${e} { + if (b == ${e}(0.0)) { + return ${e}(1.0); + } else if (a < ${e}(0.0) && f32(b) != floor(f32(b))) { + return ${e}(pow(f32(a), f32(b))); // NaN + } + return select(sign(a), ${e}(1.0), round(f32(abs(b) % ${e}(2.0))) != 1.0) * ${e}(${e==="i32"?"round":""}(pow(f32(abs(a)), f32(b)))); + } + fn pow_vector_custom(a : vec4<${e}>, b : vec4<${e}>) -> vec4<${e}> { + // TODO: implement vectorized pow + return vec4<${e}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); + } + `)},Nb=r=>{wn(r,"Sub",(e,n)=>`${e}-${n}`)},zb=r=>{wn(r,"Greater",{scalar:(e,n)=>`u32(${e}>${n})`,vector:(e,n)=>`vec4(${e}>${n})`},void 0,void 0,9)},Mb=r=>{wn(r,"Less",{scalar:(e,n)=>`u32(${e}<${n})`,vector:(e,n)=>`vec4(${e}<${n})`},void 0,void 0,9)},Bb=r=>{wn(r,"GreaterOrEqual",{scalar:(e,n)=>`u32(${e}>=${n})`,vector:(e,n)=>`vec4(${e}>=${n})`},void 0,void 0,9)},Vb=r=>{wn(r,"LessOrEqual",{scalar:(e,n)=>`u32(${e}<=${n})`,vector:(e,n)=>`vec4(${e}<=${n})`},void 0,void 0,9)}});var z1,M1,B1,V1,Gb,Ub,Wb=$(()=>{"use strict";Z();ne();Ee();oe();z1=(r,e)=>{if(!r||r.length<1)throw new Error("too few inputs");let n=0,t=r[n],o=t.dataType,i=t.dims.length;r.forEach((a,s)=>{if(s!==n){if(a.dataType!==o)throw new Error("input tensors should be one type");if(a.dims.length!==i)throw new Error("input tensors should have the same shape");a.dims.forEach((u,l)=>{if(l!==e&&u!==t.dims[l])throw new Error("non concat dimensions must match")})}})},M1=(r,e)=>` + fn calculateInputIndex(index: u32) -> u32 { + let sizeInConcatAxis = array(${e}); + for (var i: u32 = 0u; i < ${r}; i += 1u ) { + if (index < sizeInConcatAxis[i]) { + return i; + } + } + return ${r}u; + }`,B1=(r,e)=>{let n=r.length,t=[];for(let o=0;o{let o=S.size(n),i=new Array(r.length),a=new Array(r.length),s=0,u=[],l=[],c=[{type:12,data:o}];for(let m=0;m`uniforms.sizeInConcatAxis${m}`).join(","),h=m=>` + + ${(()=>{m.registerUniform("outputSize","u32");for(let y=0;y(${f}); + ${p} -= sizeInConcatAxis[inputIndex - 1u]; + } + + ${B1(a,d)} + }`;return{name:"Concat",shaderCache:{hint:`${e}`,inputDependencies:u},getRunData:()=>({outputs:[{dims:n,dataType:t}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:c}),getShaderSource:h}},Gb=(r,e)=>{let n=r.inputs,t=n[0].dims,o=S.normalizeAxis(e.axis,t.length);z1(n,o);let i=t.slice();i[o]=n.reduce((s,u)=>s+(u.dims.length>o?u.dims[o]:0),0);let a=n.filter(s=>S.size(s.dims)>0);r.compute(V1(a,o,i,n[0].dataType),{inputs:a})},Ub=r=>J({axis:r.axis})});var At,Pt,Ot,qi,Fn=$(()=>{"use strict";Z();ne();At=(r,e,n="f32")=>{switch(r.activation){case"Relu":return`value = max(value, ${e}(0.0));`;case"Sigmoid":return`value = (${e}(1.0) / (${e}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${e}(${n}(uniforms.clip_min)), ${e}(${n}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${e}(0.0), min(${e}(1.0), ${n}(uniforms.alpha) * value + ${n}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${n}(uniforms.alpha) * value, value, value >= ${e}(0.0));`;case"Tanh":return`let e2x = exp(-2.0 * abs(value)); + value = sign(value) * (1.0 - e2x) / (1.0 + e2x); + `;case"":return"";default:throw new Error(`Unsupported activation ${r.activation}`)}},Pt=(r,e)=>{r.activation==="Clip"?e.push({type:1,data:r.clipMax},{type:1,data:r.clipMin}):r.activation==="HardSigmoid"?e.push({type:1,data:r.alpha},{type:1,data:r.beta}):r.activation==="LeakyRelu"&&e.push({type:1,data:r.alpha})},Ot=(r,e)=>{r.activation==="Clip"?e.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):r.activation==="HardSigmoid"?e.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):r.activation==="LeakyRelu"&&e.push({name:"alpha",type:"f32"})},qi=r=>{let e=r?.activation||"";if(e==="HardSigmoid"){let[n,t]=r?.activation_params||[.2,.5];return{activation:e,alpha:n,beta:t}}else if(e==="Clip"){let[n,t]=r?.activation_params||[Jm,Qm];return{activation:e,clipMax:t,clipMin:n}}else if(e==="LeakyRelu"){let[n]=r?.activation_params||[.01];return{activation:e,alpha:n}}return{activation:e}}});var ze,Hb,ji=$(()=>{"use strict";ze=(r,e)=>{switch(r){case 1:return e;case 2:return`vec2<${e}>`;case 3:return`vec3<${e}>`;case 4:return`vec4<${e}>`;default:throw new Error(`${r}-component is not supported.`)}},Hb=r=>` + ${r?"value = value + getBiasByOutputCoords(coords);":""} + `});var qb,jb=$(()=>{"use strict";qb=r=>` +fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); +} +fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + i32(${r}.x), i32(${r}.y), i32(${r}.z), 1)); +} +`});var ro,Ki,Xi=$(()=>{"use strict";Z();ne();oe();Fn();ro=(r,e,n,t,o)=>{let i=t-n;return` + ${Array.from({length:n}).map((a,s)=>` + if (${M(e.shape,s,e.rank)} != 1) { + ${e.indicesSet(r,s,M(o,s+i,t))} + } else { + ${e.indicesSet(r,s,0)} + }`).join("")} +`},Ki=(r,e,n,t,o=!1,i)=>{let a=r[0].dims,s=r[1].dims,u=a[a.length-2],l=s[s.length-1],c=a[a.length-1],d=he(l),p=he(c),f=he(u),h=S.size(n)/d/f,m=r.length>2,y=t?t.slice(0,-2):n.slice(0,-2),b=[S.size(y),u,l],x=[{type:12,data:h},{type:12,data:u},{type:12,data:l},{type:12,data:c}];Pt(e,x),x.push(...k(y,a,s)),m&&x.push(...k(r[2].dims)),x.push(...k(b));let w=v=>{let I=Vi("batch_dims",r[0].dataType,y.length),P=A("a",r[0].dataType,a.length,p),O=A("b",r[1].dataType,s.length,d),E=C("output",r[0].dataType,b.length,d),R=ve(E.type.tensor),q=At(e,E.type.value,R),B=[P,O],W="";if(m){let U=o?d:1;B.push(A("bias",r[2].dataType,r[2].dims.length,U)),W=`${o?`value += bias[col / ${U}];`:`value += ${E.type.value}(bias[row + i]);`}`}let ae=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];Ot(e,ae);let F=()=>{let U=`var a_data: ${P.type.value};`;for(let K=0;K; + for (var k: u32 = 0u; k < uniforms.K; k = k + ${p}) { + ${F()} + } + for (var i = 0u; i < ${f}u; i++) { + var value = values[i]; + ${W} + ${q} + let cur_indices = ${E.type.indices}(batch, row + i, col); + let offset = ${E.indicesToOffset("cur_indices")}; + ${E.setByOffset(`offset / ${d}`,"value")}; + } + } + `};return{name:"MatMulNaive",shaderCache:{hint:`${e.activation};${d};${p};${f};${o}`,inputDependencies:m?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:i?i(n):n,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(h/64)},programUniforms:x}),getShaderSource:w}}});var F1,G1,al,Kb,U1,sl,W1,oo,Zi=$(()=>{"use strict";Z();ne();oe();Fn();Xi();ji();F1=(r,e)=>r?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / innerElementSize + inputCol${e?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / innerElementSize + inputCol${e?", batchIndices":""}); + `,G1=(r,e)=>r?` + let ACached0 = mm_Asub[k * innerElementSize][localRow]; + let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; + ${e===3?"":"let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];"} + for (var i = 0; i < rowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${e===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} + }`:` + for (var i = 0; i < rowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${e===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} + }`,al=(r,e,n="f32",t,o=!1,i=32,a=!1,s=32)=>{let u=e[1]*r[1],l=e[0]*r[0],c=o?u:i,d=o?i:u,p=c/e[0],f=i/e[1];if(!((o&&p===4&&r[1]===4||!o&&(p===3||p===4))&&c%e[0]===0&&i%e[1]===0&&r[0]===4))throw new Error(`If transposeA ${o} is true, innerElementSize ${p} and workPerThread[1] ${r[1]} must be 4. + Otherwise, innerElementSize ${p} must be 3 or 4. + tileAWidth ${c} must be divisible by workgroupSize[0]${e[0]}. tileInner ${i} must be divisible by workgroupSize[1] ${e[1]}. colPerThread ${r[0]} must be 4.`);return` +var mm_Asub: array, ${c/p}>, ${d}>; +var mm_Bsub: array, ${l/r[0]}>, ${i}>; + +const rowPerThread = ${r[1]}; +const colPerThread = ${r[0]}; +const innerElementSize = ${p}; +const tileInner = ${i}; + +@compute @workgroup_size(${e[0]}, ${e[1]}, ${e[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let localRow = i32(localId.y); + let tileRow = localRow * rowPerThread; + let tileCol = i32(localId.x); + + let globalRow =i32(globalId.y) * rowPerThread; + let globalCol = i32(globalId.x); + let batch = ${a?"0":"i32(globalId.z)"}; + ${t?`let batchIndices = ${t.offsetToIndices("u32(batch)")};`:""} + let globalRowStart = i32(workgroupId.y) * ${u}; + + let num_tiles = ${a?`${Math.ceil(s/i)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${a?`i32(globalId.z) * ${s}`:"0"}; + + var acc: array, rowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${f}; + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${F1(o,t)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${f}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${t?", batchIndices":""}); + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < tileInner / innerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * innerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; + ${p===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} + + ${G1(o,p)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } +}`},Kb=(r,e)=>r?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol${e?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol${e?", batchIndices":""}); + `,U1=r=>r?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",sl=(r,e,n="f32",t,o=!1,i=32,a=!1,s=32,u=!1)=>{let l=r[1]*e[1],c=r[0]*e[0],d=o?l:i,p=o?i:l;if(!(p%e[1]===0&&d%e[0]===0&&i%e[1]===0))throw new Error(`tileAHight ${p} must be divisible by workgroupSize[1]${e[1]}, tileAWidth ${d} must be divisible by workgroupSize[0]${e[0]}, tileInner ${i} must be divisible by workgroupSize[1]${e[1]}`);let f=p/e[1],h=d/e[0],m=i/e[1],y=u?` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${l}; + let globalColStart = i32(workgroupId.x) * ${c}; + + // Loop over shared dimension. + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${p}; inputRow = inputRow + ${e[1]}) { + for (var inputCol = localCol; inputCol < ${d}; inputCol = inputCol + ${e[0]}) { + ${Kb(o,t)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${i}; inputRow = inputRow + ${e[1]}) { + for (var inputCol = localCol; inputCol < ${c}; inputCol = inputCol + ${e[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol${t?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${n}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${e[0]}]; + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let ACached = ${o?`mm_Asub[k][localRow + innerRow * ${e[1]}];`:`mm_Asub[localRow + innerRow * ${e[1]}][k];`} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${e[1]}; + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${e[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + `:` +let tileRow = i32(localId.y) * rowPerThread; +let tileCol = i32(localId.x) * colPerThread; + +let globalRow = i32(globalId.y) * rowPerThread; +let globalCol = i32(globalId.x) * colPerThread; +let globalRowStart = i32(workgroupId.y) * ${l}; + +let tileRowA = i32(localId.y) * ${f}; +let tileColA = i32(localId.x) * ${h}; +let tileRowB = i32(localId.y) * ${m}; +// Loop over shared dimension. +for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${f}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${h}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${Kb(o,t)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${m}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol${t?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${n}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + ${U1(o)} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); +} + +for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } +} +`;return` + var mm_Asub : array, ${p}>; + var mm_Bsub : array, ${i}>; + const rowPerThread = ${r[1]}; + const colPerThread = ${r[0]}; + const tileInner = ${i}; + +@compute @workgroup_size(${e[0]}, ${e[1]}, ${e[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let batch = ${a?"0":"i32(globalId.z)"}; + ${t?`let batchIndices = ${t.offsetToIndices("u32(batch)")};`:""} + let num_tiles = ${a?`${Math.ceil(s/i)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${a?`i32(globalId.z) * ${s}`:"0"}; + + var acc : array, rowPerThread>; + ${y} + } +`},W1=(r,e,n,t,o=!1)=>{let[i,a,s,u]=t,l=ve(t[0].type.tensor);return` + fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${i.type.indices}) -> ${ze(r,l)} { + var value = ${ze(r,l)}(0.0); + let col = colIn * ${r}; + if(row < uniforms.dim_a_outer && col < uniforms.dim_inner) + { + var aIndices: ${a.type.indices}; + ${ro("aIndices",a,a.rank-2,i.rank,"batchIndices")} + ${a.indicesSet("aIndices",a.rank-2,"u32(row)")} + ${a.indicesSet("aIndices",a.rank-1,"u32(colIn)")} + value = ${a.getByIndices("aIndices")}; + } + return value; + } + + fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${i.type.indices}) -> ${ze(r,l)} { + var value = ${ze(r,l)}(0.0); + let col = colIn * ${r}; + if(row < uniforms.dim_inner && col < uniforms.dim_b_outer) + { + var bIndices: ${s.type.indices}; + ${ro("bIndices",s,s.rank-2,i.rank,"batchIndices")} + ${s.indicesSet("bIndices",s.rank-2,"u32(row)")} + ${s.indicesSet("bIndices",s.rank-1,"u32(colIn)")} + value = ${s.getByIndices("bIndices")}; + } + return value; + } + + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${ze(r,l)}) { + let col = colIn * ${r}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) { + var value = valueIn; + let coords = vec3(batch, row, colIn); + ${e?`value = value + ${o?"bias[colIn]":`${ze(r,l)}(bias[row])`};`:""} + ${n} + ${u.setByIndices("vec3(coords)","value")} + } + } + `},oo=(r,e,n,t,o=!1,i)=>{let a=r[0].dims,s=r[1].dims,u=a.slice(0,-2),l=s.slice(0,-2),c=t?t.slice(0,-2):n.slice(0,-2),d=S.size(c),p=a[a.length-2],f=a[a.length-1],h=s[s.length-1],m=f%4===0&&h%4===0,y=p<=8?[4,1,1]:[4,4,1],g=[8,8,1],b=[Math.ceil(h/g[0]/y[0]),Math.ceil(p/g[1]/y[1]),Math.ceil(d/g[2]/y[2])],x=m?4:1,w=[...u,p,f/x],v=w.length,I=[...l,f,h/x],P=I.length,O=[d,p,h/x],E=[{type:6,data:p},{type:6,data:h},{type:6,data:f}];Pt(e,E),E.push(...k(c,w,I));let R=["rank","rank"],q=r.length>2;q&&(E.push(...k(r[2].dims)),R.push("rank")),E.push(...k(O));let B=W=>{let ae=c.length,F=Vi("batchDims",r[0].dataType,ae,1),U=ve(r[0].dataType),K=A("a",r[0].dataType,v,x),Q=A("b",r[1].dataType,P,x),Y=C("result",r[0].dataType,O.length,x),ue=[K,Q];if(q){let X=o?x:1;ue.push(A("bias",r[2].dataType,r[2].dims.length,X))}let Ie=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];Ot(e,Ie);let Me=ve(Y.type.tensor),te=At(e,Y.type.value,Me),D=W1(x,q,te,[F,K,Q,Y],o);return` + ${W.registerUniforms(Ie).registerInternalVariables(F).declareVariables(...ue,Y)} + ${D} + ${m?al(y,g,U,F):sl(y,g,U,F)} + `};return{name:"MatMul",shaderCache:{hint:`${y};${e.activation};${m};${o}`,inputDependencies:R},getRunData:()=>({outputs:[{dims:i?i(n):n,dataType:r[0].dataType}],dispatchGroup:{x:b[0],y:b[1],z:b[2]},programUniforms:E}),getShaderSource:B}}});var H1,Xb,Zb=$(()=>{"use strict";Z();mn();oe();Fn();ji();jb();Zi();H1=(r,e,n,t,o=!1,i,a=4,s=4,u=4,l="f32")=>{let c=R=>{switch(R){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${l}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${R} is not supported.`)}},d=R=>{switch(R){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw new Error(`innerElementSize ${R} is not supported.`)}},p=r?` + let coord = vec4(batch, xRow, xCol, xCh); + `:` + let coord = vec4(batch, xCh, xRow, xCol); + `,f=r?` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + `:` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `,h=r?"i32(uniforms.x_shape[1])":"i32(uniforms.x_shape[2])",m=r?"i32(uniforms.x_shape[2])":"i32(uniforms.x_shape[3])",y=r?"row":"col",g=r?"col":"row",b=` + let inChannels = i32(uniforms.w_shape[2]); + let outWidth = ${r?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + let outRow = ${y} / outWidth; + let outCol = ${y} % outWidth; + + let WRow = ${g} / (i32(uniforms.w_shape[1]) * inChannels); + let WCol = ${g} / inChannels % i32(uniforms.w_shape[1]); + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${g} % inChannels; + var resData = ${ze(a,l)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${h} && xCol >= 0 && xCol < ${m}) { + ${p} + let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape)); + ${c(a)} + } + return resData;`,x=r?e&&t?` + let col = colIn * ${a}; + ${b}`:` + let col = colIn * ${a}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) { + ${b} + } + return ${ze(a,l)}(0.0);`:t&&n?` + let col = colIn * ${a}; + ${b}`:` + let col = colIn * ${a}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${b} + } + return ${ze(a,l)}(0.0);`,w=r?t&&n?d(s):` + let col = colIn * ${s}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${d(s)} + } + return ${ze(s,l)}(0.0);`:` + let col = colIn * ${s}; + if (row < uniforms.dim_inner && col < uniforms.dim_a_outer) { + ${d(s)} + } + return ${ze(s,l)}(0.0);`,v=ze(u,l),I=r?ze(a,l):ze(s,l),P=r?ze(s,l):ze(a,l),O=At(i,v,l);return` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${I} { + ${r?x:w} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${P} { + ${r?w:x} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${v}) { + let col = colIn * ${u}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) + { + var value = valueIn; + let outWidth = ${r?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + ${f} + ${Hb(o)} + ${O} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`},Xb=(r,e,n,t,o,i,a,s,u)=>{let l=e.format==="NHWC",c=l?r[0].dims[3]:r[0].dims[1],d=n[0],p=l?n[2]:n[3],f=l?n[1]:n[2],h=l?n[3]:n[1],m=l&&(c%4===0||c%3===0)&&h%4===0,y=l?h:p*f,g=l?p*f:h,b=[8,8,1],x=t<=8?[4,1,1]:[4,4,1],w=[Math.ceil(y/b[0]/x[0]),Math.ceil(g/b[1]/x[1]),Math.ceil(d/b[2]/x[2])];ie("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${w}`);let v=m?l&&c%4!==0?3:4:1,I=b[1]*x[1],P=b[0]*x[0],O=Math.max(b[0]*v,b[1]),E=t%I===0,R=o%P===0,q=i%O===0,B=m?[v,4,4]:[1,1,1],W=[{type:6,data:t},{type:6,data:o},{type:6,data:i},{type:6,data:[e.pads[0],e.pads[1]]},{type:6,data:e.strides},{type:6,data:e.dilations}];Pt(e,W),W.push(...k(r[0].dims,r[1].dims));let ae=["rank","rank"];a&&(W.push(...k(r[2].dims)),ae.push("rank")),W.push(...k(n));let F=U=>{let K=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];Ot(e,K);let Q=m?4:1,Y=ve(r[0].dataType),ue=` + fn setOutputAtIndex(flatIndex : i32, value : ${m?`vec4<${Y}>`:Y}) { + result[flatIndex] = ${m?`vec4<${Y}>`:Y}(value); + } + fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${m?`vec4<${Y}>`:Y}) { + let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3)); + setOutputAtIndex(flatIndex ${m?"/ 4":""}, value); + }`,Ie=A("x",r[0].dataType,r[0].dims.length,v===3?1:v),Me=A("w",r[1].dataType,r[1].dims.length,Q),te=[Ie,Me],D=C("result",r[0].dataType,n.length,Q);if(a){let X=A("bias",r[2].dataType,r[2].dims.length,Q);te.push(X),ue+=` + fn getBiasByOutputCoords(coords : vec4) -> ${m?`vec4<${Y}>`:Y} { + return bias[coords.${l?"w":"y"}${m?"/ 4":""}]; + }`}return` + ${qb("uniforms.result_strides")} + //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4, + // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2, + // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; + ${U.registerUniforms(K).declareVariables(...te,D)} + ${ue} + ${H1(l,E,R,q,a,e,B[0],B[1],B[2],Y)} + ${m?al(x,b,Y,void 0,!l,O):sl(x,b,Y,void 0,!l,O,!1,void 0,s)}`};return{name:"Conv2DMatMul",shaderCache:{hint:`${e.cacheKey};${v};${m};${E};${R};${q};${I};${P};${O}`,inputDependencies:ae},getRunData:()=>({outputs:[{dims:u?u(n):n,dataType:r[0].dataType}],dispatchGroup:{x:w[0],y:w[1],z:w[2]},programUniforms:W}),getShaderSource:F}}});var q1,Jb,Ji,j1,Qb,K1,Yb,ey,ty=$(()=>{"use strict";Z();mn();ne();oe();Fn();ji();q1=r=>{let e=1;for(let n=0;ntypeof r=="number"?[r,r,r]:r,Ji=(r,e)=>e<=1?r:r+(r-1)*(e-1),j1=(r,e,n,t=1)=>{let o=Ji(e,t);return Math.floor((r[0]*(n-1)-n+o)/2)},Qb=(r,e,n,t,o)=>{o==null&&(o=j1(r,e[0],t[0]));let i=[0,0,0,n];for(let a=0;a<3;a++)r[a]+2*o>=e[a]&&(i[a]=Math.trunc((r[a]-e[a]+2*o)/t[a]+1));return i},K1=(r,e,n,t,o,i,a,s,u,l)=>{let c,d,p,f;if(r==="VALID"&&(r=0),typeof r=="number"){c={top:r,bottom:r,left:r,right:r,front:r,back:r};let h=Qb([e,n,t,1],[s,u,l],1,[o,i,a],r);d=h[0],p=h[1],f=h[2]}else if(Array.isArray(r)){if(!r.every((m,y,g)=>m===g[0]))throw Error(`Unsupported padding parameter: ${r}`);c={top:r[0],bottom:r[1],left:r[2],right:r[3],front:r[4],back:r[5]};let h=Qb([e,n,t,1],[s,u,l],1,[o,i,a],r[0]);d=h[0],p=h[1],f=h[2]}else if(r==="SAME_UPPER"){d=Math.ceil(e/o),p=Math.ceil(n/i),f=Math.ceil(t/a);let h=(d-1)*o+s-e,m=(p-1)*i+u-n,y=(f-1)*a+l-t,g=Math.floor(h/2),b=h-g,x=Math.floor(m/2),w=m-x,v=Math.floor(y/2),I=y-v;c={top:x,bottom:w,left:v,right:I,front:g,back:b}}else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:c,outDepth:d,outHeight:p,outWidth:f}},Yb=(r,e,n,t,o,i=!1,a="channelsLast")=>{let s,u,l,c,d;if(a==="channelsLast")[s,u,l,c,d]=r;else if(a==="channelsFirst")[s,d,u,l,c]=r;else throw new Error(`Unknown dataFormat ${a}`);let[p,,f,h,m]=e,[y,g,b]=Jb(n),[x,w,v]=Jb(t),I=Ji(f,x),P=Ji(h,w),O=Ji(m,v),{padInfo:E,outDepth:R,outHeight:q,outWidth:B}=K1(o,u,l,c,y,g,b,I,P,O),W=i?p*d:p,ae=[0,0,0,0,0];return a==="channelsFirst"?ae=[s,W,R,q,B]:a==="channelsLast"&&(ae=[s,R,q,B,W]),{batchSize:s,dataFormat:a,inDepth:u,inHeight:l,inWidth:c,inChannels:d,outDepth:R,outHeight:q,outWidth:B,outChannels:W,padInfo:E,strideDepth:y,strideHeight:g,strideWidth:b,filterDepth:f,filterHeight:h,filterWidth:m,effectiveFilterDepth:I,effectiveFilterHeight:P,effectiveFilterWidth:O,dilationDepth:x,dilationHeight:w,dilationWidth:v,inShape:r,outShape:ae,filterShape:e}},ey=(r,e,n,t,o,i)=>{let a=i==="channelsLast",s=a?r[0].dims[3]:r[0].dims[1],u=!1,l=[64,1,1],c={x:n.map((b,x)=>x)},d=[Math.ceil(q1(c.x.map(b=>n[b]))/l[0]),1,1];ie("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${d}`);let p=u?a&&s%4!==0?3:4:1,f=S.size(n),h=[{type:12,data:f},{type:12,data:t},{type:12,data:o},{type:12,data:e.strides},{type:12,data:e.dilations}];Pt(e,h),h.push(...k(r[0].dims,r[1].dims));let m=["rank","rank"],y=r.length===3;y&&(h.push(...k(r[2].dims)),m.push("rank")),h.push(...k(n));let g=b=>{let x=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:t.length},{name:"pads",type:"u32",length:o.length},{name:"strides",type:"u32",length:e.strides.length},{name:"dilations",type:"u32",length:e.dilations.length}];Ot(e,x);let w=u?4:1,v=ve(r[0].dataType),I=A("x",r[0].dataType,r[0].dims.length,p===3?1:p),P=A("W",r[1].dataType,r[1].dims.length,w),O=[I,P],E=C("result",r[0].dataType,n.length,w),R="";if(y){let W=A("bias",r[2].dataType,r[2].dims.length,w);O.push(W),R+=` + fn getBiasByOutputCoords(coords : array) -> ${u?`vec4<${v}>`:v} { + return bias[${a?M("coords",4,5):M("coords",1,5)}${u?"/ 4":""}]; + }`}let q=ze(p,v),B=At(e,q,v);return` + ${R} + fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${I.getByIndices("aIndices")}; + } + fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${P.getByIndices("aIndices")}; + } + ${b.registerUniforms(x).declareVariables(...O,E)} + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let coords = ${E.offsetToIndices("global_idx")}; + let batch = ${M("coords",0,I.rank)}; + let d2 = ${a?M("coords",I.rank-1,I.rank):M("coords",1,I.rank)}; + let xFRCCorner = vec3(${a?M("coords",1,I.rank):M("coords",2,I.rank)}, + ${a?M("coords",2,I.rank):M("coords",3,I.rank)}, + ${a?M("coords",3,I.rank):M("coords",4,I.rank)}) * uniforms.strides - uniforms.pads; + let xFCorner = xFRCCorner.x; + let xRCorner = xFRCCorner.y; + let xCCorner = xFRCCorner.z; + let xShapeY = ${a?M("uniforms.x_shape",1,I.rank):M("uniforms.x_shape",2,I.rank)}; + let xShapeZ = ${a?M("uniforms.x_shape",2,I.rank):M("uniforms.x_shape",3,I.rank)}; + let xShapeW = ${a?M("uniforms.x_shape",3,I.rank):M("uniforms.x_shape",4,I.rank)}; + let xShapeU = ${a?M("uniforms.x_shape",4,I.rank):M("uniforms.x_shape",1,I.rank)}; + let inputDepthNearestVec4 = (xShapeU / 4) * 4; + let inputDepthVec4Remainder = xShapeU % 4; + + var value = 0.0; + for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) { + let xF = xFCorner + wF * uniforms.dilations[0]; + if (xF < 0 || xF >= xShapeY) { + continue; + } + + for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) { + let xR = xRCorner + wR * uniforms.dilations[1]; + if (xR < 0 || xR >= xShapeZ) { + continue; + } + + for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) { + let xC = xCCorner + wC * uniforms.dilations[2]; + if (xC < 0 || xC >= xShapeW) { + continue; + } + + for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) { + ${a?`let xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3)); + `:`let xValues = vec4( + getX(batch, d1, xF, xR, xC), + getX(batch, d1 + 1, xF, xR, xC), + getX(batch, d1 + 2, xF, xR, xC), + getX(batch, d1 + 3, xF, xR, xC)); + `} + let wValues = vec4( + getW(d2, d1, wF, wR, wC), + getW(d2, d1 + 1, wF, wR, wC), + getW(d2, d1 + 2, wF, wR, wC), + getW(d2, d1 + 3, wF, wR, wC)); + value += dot(xValues, wValues); + } + if (inputDepthVec4Remainder == 1) { + ${a?`value += getX(batch, xF, xR, xC, inputDepthNearestVec4) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`:`value += getX(batch, inputDepthNearestVec4, xF, xR, xC) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`} + } else if (inputDepthVec4Remainder == 2) { + ${a?`let xValues = vec2( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1)); + `:`let xValues = vec2( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC)); + `} + let wValues = vec2( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC)); + value += dot(xValues, wValues); + } else if (inputDepthVec4Remainder == 3) { + ${a?`let xValues = vec3( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2)); + `:`let xValues = vec3( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC)); + `} + let wValues = vec3( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC)); + value += dot(xValues, wValues); + } + } + } + } + ${y?"value = value + getBiasByOutputCoords(coords)":""}; + ${B} + result[global_idx] = f32(value); + }`};return{name:"Conv3DNaive",shaderCache:{hint:`${e.cacheKey};${a};${p};${y}`,inputDependencies:m},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:d[0],y:d[1],z:d[2]},programUniforms:h}),getShaderSource:g}}});var ny,ry,oy=$(()=>{"use strict";Z();ne();oe();Fn();ny=(r,e,n,t)=>{let o=r.length>2,i=o?"value += b[output_channel];":"",a=r[0].dims,s=r[1].dims,u=e.format==="NHWC",l=u?n[3]:n[1],c=l/e.group,d=u&&c>=4?he(l):1,p=S.size(n)/d,f=[{type:12,data:p},{type:12,data:e.dilations},{type:12,data:[e.strides[0],e.strides[1]]},{type:12,data:[e.pads[0],e.pads[1]]},{type:12,data:c}];Pt(e,f),f.push(...k(a,[s[0],s[1],s[2],s[3]/d]));let h=o?["rank","rank","rank"]:["rank","rank"];f.push(...k([n[0],n[1],n[2],n[3]/d]));let m=y=>{let g=C("output",r[0].dataType,n.length,d),b=ve(g.type.tensor),x=At(e,g.type.value,b),w=A("x",r[0].dataType,a.length),v=A("w",r[1].dataType,s.length,d),I=[w,v];o&&I.push(A("b",r[2].dataType,r[2].dims,d));let P=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:e.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];Ot(e,P);let O=u?` + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[0]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[1]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[1]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[2]) { + continue; + } + + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[2]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + let xVal = ${w.get("batch","xHeight","xWidth","input_channel")}; + let wVal = ${v.get("wHeight","wWidth","wInChannel","output_channel")}; + value += xVal * wVal; + } + } + } + `:` + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[2]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[3]) { + continue; + } + + let xVal = ${w.get("batch","input_channel","xHeight","xWidth")}; + let wVal = ${v.get("output_channel","wInChannel","wHeight","wWidth")}; + value += xVal * wVal; + } + } + } + `;return` + ${y.registerUniforms(P).declareVariables(...I,g)} + + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let outputIndices = ${g.offsetToIndices("global_idx")}; + let batch: u32 = outputIndices[0]; + let output_channel: u32 = outputIndices[${u?3:1}]; + let xRCCorner: vec2 = vec2(outputIndices[${u?1:2}], outputIndices[${u?2:3}]) * uniforms.strides - uniforms.pads; + let group_id: u32 = output_channel * ${d} / uniforms.output_channels_per_group; + var in_channel_offset = group_id * uniforms.w_shape[${u?2:1}]; + + var value: ${g.type.value} = ${g.type.value}(0); + ${O} + ${i} + ${x} + ${g.setByOffset("global_idx","value")} + }`};return{name:"GroupedConv",shaderCache:{hint:`${e.cacheKey}_${d}`,inputDependencies:h},getRunData:()=>({outputs:[{dims:t?t(n):n,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:f}),getShaderSource:m}},ry=(r,e,n,t)=>{let o=r.length>2,i=he(n[3]),a=he(n[2]),s=S.size(n)/i/a,u=[r[0].dims[0],r[0].dims[1],r[0].dims[2],r[0].dims[3]/i],l=[r[1].dims[0],r[1].dims[1],r[1].dims[2],r[1].dims[3]/i],c=[n[0],n[1],n[2],n[3]/i],d=[{type:12,data:s},{type:6,data:[e.strides[0],e.strides[1]]},{type:6,data:[e.pads[0],e.pads[1]]}];Pt(e,d),d.push(...k(u,l,c));let p=(a-1)*e.strides[1]+l[1],f=h=>{let m=C("output",r[0].dataType,c.length,i),y=ve(m.type.tensor),g=At(e,m.type.value,y),b=A("x",r[0].dataType,u.length,i),x=A("w",r[1].dataType,l.length,i),w=[b,x];o&&w.push(A("b",r[2].dataType,r[2].dims,i));let v=o?"value += b[output_channel];":"",I=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return Ot(e,I),` + ${h.registerUniforms(I).declareVariables(...w,m)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let width0 = uniforms.output_shape[3]; + let output_channel = global_idx % width0; + var index1 = global_idx / width0; + let width1 = uniforms.output_shape[2] / ${a}u; + let col = (index1 % width1) * ${a}u; + index1 = index1 / width1; + let row = index1 % uniforms.output_shape[1]; + let batch = index1 / uniforms.output_shape[1]; + + let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads; + + var x_vals: array<${b.type.value}, ${p}>; + var values: array<${m.type.value}, ${a}>; + let input_channel = output_channel; + // Use constant instead of uniform can give better performance for w's height/width. + for (var w_height: u32 = 0u; w_height < ${l[0]}; w_height++) { + let x_height = x_corner.x + i32(w_height); + if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) { + for (var i = 0; i < ${p}; i++) { + let x_width = x_corner.y + i; + if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) { + x_vals[i] = ${b.get("batch","u32(x_height)","u32(x_width)","input_channel")}; + } else { + x_vals[i] = ${b.type.value}(0); + } + } + for (var w_width: u32 = 0u; w_width < ${l[1]}; w_width++) { + let w_val = ${x.get("w_height","w_width","0","output_channel")}; + for (var i = 0u; i < ${a}u; i++) { + values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]); + } + } + } + } + + for (var i = 0u; i < ${a}u; i++) { + var value = values[i]; + ${v} + ${g} + ${m.set("batch","row","col + i","output_channel","value")}; + } + }`};return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${e.cacheKey};${i};${a};${p};${l[0]};${l[1]}`,inputDependencies:o?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:t?t(n):n,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:d}),getShaderSource:f}}});var X1,ul,Z1,ll,cl,iy,J1,Q1,dl,ay=$(()=>{"use strict";ne();Zb();ty();Zi();oy();Fn();Xi();An();X1=(r,e,n,t,o,i)=>{let a=r[0],s=r.slice(i?1:2,i?3:4),u=s.length,l=e[0],d=e.slice(2).map((h,m)=>h+(h-1)*(n[m]-1)),f=s.map((h,m)=>h+t[m]+t[m+u]).map((h,m)=>Math.floor((h-d[m]+o[m])/o[m]));return f.splice(0,0,a),f.splice(i?3:1,0,l),f},ul=[2,3,1,0],Z1=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length>5)throw new Error("greater than 5D is not supported");if(r[0].dims.length!==r[1].dims.length)throw new Error("filter does not have same dimension as input");let n=r[0].dims[e.format==="NHWC"?r[0].dims.length-1:1],t=r[1].dims[1]*e.group;if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(r.length===3&&(r[2].dims.length!==1||r[1].dims[0]!==r[2].dims[0]))throw new Error("invalid bias");let o=r[0].dims.length-2;if(e.dilations.length!==o)throw new Error(`dilations should be ${o}D`);if(e.strides.length!==o)throw new Error(`strides should be ${o}D`);if(e.pads.length!==o*2)throw new Error(`pads should be ${o*2}D`);if(e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape")},ll=(r,e)=>{let n=r.kernelShape.slice();n.length{let e=qi(r),n=r.format,t=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][r.auto_pad],o=r.dilations,i=r.group,a=r.kernel_shape,s=r.pads,u=r.strides,l=r.w_is_const();return{autoPad:t,format:n,dilations:o,group:i,kernelShape:a,pads:s,strides:u,wIsConst:l,...e,cacheKey:`${r.format};${e.activation};`}},iy=(r,e,n,t)=>{let o=n.format==="NHWC",i=X1(e[0].dims,e[1].dims,n.dilations,n.pads,n.strides,o);if(n.group!==1){let I=[e[0]];if(o){let O=r.kernelCustomData.wT??r.compute(Fe(e[1],ul),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=O),I.push(O)}else I.push(e[1]);e.length===3&&I.push(e[2]),!r.adapterInfo.isArchitecture("ampere")&&o&&e[1].dims[0]===n.group&&e[1].dims[1]===1&&n.dilations[0]===1&&n.dilations[1]===1?r.compute(ry(I,n,i,t),{inputs:I}):r.compute(ny(I,n,i,t),{inputs:I});return}let a=e.length===3,s=e[0].dims[o?1:2],u=e[0].dims[o?2:3],l=e[0].dims[o?3:1],c=e[1].dims[2],d=e[1].dims[3],p=i[o?1:2],f=i[o?2:3],h=i[o?3:1],m=o&&c===s&&d===u&&n.pads[0]===0&&n.pads[1]===0;if(m||c===1&&d===1&&n.dilations[0]===1&&n.dilations[1]===1&&n.strides[0]===1&&n.strides[1]===1&&n.pads[0]===0&&n.pads[1]===0){let I=i[0],P,O,E,R=[];if(o){let W=r.kernelCustomData.wT??r.compute(Fe(e[1],ul),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];if(n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=W),m){let ae=s*u*l;P=e[0].reshape([1,I,ae]),O=W.reshape([1,ae,h]),E=[1,I,h]}else P=e[0].reshape([I,s*u,l]),O=W.reshape([1,l,h]),E=[I,p*f,h];R.push(P),R.push(O)}else P=e[0].reshape([I,l,s*u]),O=e[1].reshape([1,h,l]),E=[I,h,p*f],R.push(O),R.push(P);a&&R.push(e[2]);let q=E[2],B=R[0].dims[R[0].dims.length-1];q<8&&B<8?r.compute(Ki(R,n,i,E,o,t),{inputs:R}):r.compute(oo(R,n,i,E,o,t),{inputs:R});return}let y=!0,g=r.kernelCustomData.wT??r.compute(Fe(e[1],ul),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=g);let b=[e[0],g];a&&b.push(e[2]);let x=o?p*f:h,w=o?h:p*f,v=c*d*l;r.compute(Xb(b,n,i,x,w,v,a,y,t),{inputs:b})},J1=(r,e)=>{let n=e.format==="NHWC",t=[r.inputs[0].reshape(n?[r.inputs[0].dims[0],1,r.inputs[0].dims[1],r.inputs[0].dims[2]]:[r.inputs[0].dims[0],r.inputs[0].dims[1],1,r.inputs[0].dims[2]]),r.inputs[1].reshape([r.inputs[1].dims[0],r.inputs[1].dims[1],1,r.inputs[1].dims[2]])];r.inputs.length===3&&t.push(r.inputs[2]);let o=[0,e.pads[0],0,e.pads[1]],i=[1].concat(e.strides),a=[1].concat(e.dilations),s=[1].concat(e.kernelShape),u=ll({...e,pads:o,strides:i,dilations:a,kernelShape:s},t);iy(r,t,u,l=>n?[l[0],l[2],l[3]]:[l[0],l[1],l[3]])},Q1=(r,e,n)=>{let t=n.format==="NHWC"?"channelsLast":"channelsFirst",o=ll(n,e),i=n.autoPad==="NOTSET"?n.pads:n.autoPad,a=Yb(e[0].dims,e[1].dims,n.strides,n.dilations,i,!1,t);r.compute(ey(e,o,a.outShape,[a.filterDepth,a.filterHeight,a.filterWidth],[a.padInfo.front,a.padInfo.top,a.padInfo.left],t))},dl=(r,e)=>{if(Z1(r.inputs,e),r.inputs[0].dims.length===3)J1(r,e);else if(r.inputs[0].dims.length===5)Q1(r,r.inputs,e);else{let n=ll(e,r.inputs);iy(r,r.inputs,n)}}});var sy,uy=$(()=>{"use strict";Z();mn();ne();oe();sy=(r,e,n)=>{let t=r.length>2,o=e.outputShape,i=e.format==="NHWC",a=e.group,s=r[1].dims,u=s[2]/a,l=s[3],c=i?he(u):1,d=i&&l===1&&u>=4,p=d?Math.floor(u/4)*4:Math.floor(u/c)*c,f=u-p,h=i?he(l):1,m=i?l===1?c:h:1,y=S.size(o)/h,g=[Math.ceil(y/64),1,1];ie("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${g}`);let b=["rank","rank"],x=[e.strides[0],e.strides[1]],w=[e.kernelShape[i?1:2],e.kernelShape[i?2:3]],v=[e.dilations[0],e.dilations[1]],I=[w[0]+(e.dilations[0]<=1?0:(e.kernelShape[i?1:2]-1)*(e.dilations[0]-1)),w[1]+(e.dilations[1]<=1?0:(e.kernelShape[i?2:3]-1)*(e.dilations[1]-1))],P=[I[0]-1-Math.floor((e.pads[0]+e.pads[2])/2),I[1]-1-Math.floor((e.pads[1]+e.pads[3])/2)],O=[{type:12,data:y},{type:12,data:x},{type:12,data:w},{type:12,data:v},{type:12,data:I},{type:6,data:P},{type:12,data:p},{type:12,data:u},{type:12,data:l},...k(r[0].dims,r[1].dims)];t&&(O.push(...k(r[2].dims)),b.push("rank")),O.push(...k(o));let E=R=>{let q=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:x.length},{name:"filter_dims",type:"u32",length:w.length},{name:"dilations",type:"u32",length:w.length},{name:"effective_filter_dims",type:"u32",length:I.length},{name:"pads",type:"i32",length:P.length},{name:"input_channels_per_group_int",type:"u32"},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],B=ve(r[0].dataType),W=i?1:2,ae=i?2:3,F=i?3:1,U=A("W",r[1].dataType,r[1].dims.length,m),K=A("Dy",r[0].dataType,r[0].dims.length,c),Q=[K,U];t&&Q.push(A("bias",r[2].dataType,[o[F]].length,h));let Y=C("result",r[0].dataType,o.length,h),ue=()=>{let te="";if(d)c===4?te+=` + let xValue = ${K.getByOffset("x_offset")}; + let wValue = ${U.getByOffset("w_offset")}; + dotProd = dotProd + dot(xValue, wValue); + x_offset += 1u; + w_offset += 1u;`:c===2?te+=` + dotProd = dotProd + dot(vec4<${B}>(${K.getByOffset("x_offset")}, ${K.getByOffset("x_offset + 1u")}), vec4<${B}>(${U.getByOffset("w_offset")}, ${U.getByOffset("w_offset + 1u")})); + x_offset += 2u; + w_offset += 2u;`:c===1&&(te+=` + dotProd = dotProd + dot(vec4<${B}>(${K.getByOffset("x_offset")}, ${K.getByOffset("x_offset + 1u")}, ${K.getByOffset("x_offset + 2u")}, ${K.getByOffset("x_offset + 3u")}), vec4<${B}>(${U.getByOffset("w_offset")}, ${U.getByOffset("w_offset + 1u")}, ${U.getByOffset("w_offset + 2u")}, ${U.getByOffset("w_offset + 3u")})); + x_offset += 4u; + w_offset += 4u;`);else if(te+=` + let xValue = ${i?K.getByOffset(`${K.indicesToOffset(`${K.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${c}`):K.get("batch","inputChannel","idyR","idyC")}; + `,c===1)te+=` + let w_offset = ${U.indicesToOffset(`${U.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)}; + let wValue = ${U.getByOffset(`w_offset / ${m}`)}; + dotProd = dotProd + xValue * wValue;`;else for(let D=0;D{if(f===0)return"";if(!d)throw new Error(`packInputAs4 ${d} is not true.`);let te="";if(c===1){te+="dotProd = dotProd";for(let D=0;D(i32(r), i32(c)) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + let groupId = d1 / uniforms.output_channels_per_group; + let wOutChannel = d1 - groupId * uniforms.output_channels_per_group; + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = ${Y.type.value}(0.0); + var wR: u32 = 0; + if (uniforms.dilations.x == 1) { + // Minimum wR >= 0 that satisfies (dyRCorner + wR) % (uniforms.strides.x) == 0 + wR = u32(((dyRCorner + i32(uniforms.strides.x) - 1) / i32(uniforms.strides.x)) * i32(uniforms.strides.x) - dyRCorner); + } + for (; wR < uniforms.effective_filter_dims.x; wR = wR + 1) { + if (wR % uniforms.dilations.x != 0) { + continue; + } + let dyR = (${B}(dyRCorner) + ${B}(wR)) / ${B}(uniforms.strides[0]); + let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x; + if (dyR < 0.0 || dyR >= ${B}(uniforms.Dy_shape[${W}]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR: u32 = u32(dyR); + var wC: u32 = 0; + if (uniforms.dilations.y == 1) { + // Minimum wC >= 0 that satisfies (dyCCorner + wC) % (uniforms.strides.y) == 0 + wC = u32(((dyCCorner + i32(uniforms.strides.y) - 1) / i32(uniforms.strides.y)) * i32(uniforms.strides.y) - dyCCorner); + } + for (; wC < uniforms.effective_filter_dims.y; wC = wC + 1) { + if (wC % uniforms.dilations.y != 0) { + continue; + } + let dyC = (${B}(dyCCorner) + ${B}(wC)) / ${B}(uniforms.strides.y); + let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y; + if (dyC < 0.0 || dyC >= ${B}(uniforms.Dy_shape[${ae}]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC: u32 = u32(dyC); + var inputChannel = groupId * uniforms.input_channels_per_group; + ${d?` + var x_offset = ${K.indicesToOffset(`${K.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${c}; + var w_offset = ${U.indicesToOffset(`${U.type.indices}(wRPerm, wCPerm, inputChannel, wOutChannel)`)} / ${m}; + `:""} + for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group_int; d2 = d2 + ${d?4:c}) { + ${ue()} + inputChannel = inputChannel + ${d?4:c}; + } + ${Ie()} + wC = wC + uniforms.strides.y - 1; + } + wR = wR + uniforms.strides[0] - 1; + } + let value = dotProd${t?` + bias[d1 / ${h}]`:""}; + ${Y.setByOffset("global_idx","value")}; + `;return` + ${R.registerUniforms(q).declareVariables(...Q,Y)} + ${R.mainStart()} + ${R.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")}; + ${Me}}`};return{name:"ConvTranspose2D",shaderCache:{hint:`${e.cacheKey};${c}${m}${h}${d}${f}`,inputDependencies:b},getRunData:()=>({dispatchGroup:{x:g[0],y:g[1],z:g[2]},outputs:[{dims:n?n(o):o,dataType:r[0].dataType}],programUniforms:O}),getShaderSource:E}}});var Y1,e$,t$,ly,cy,n$,dy,r$,py,fy=$(()=>{"use strict";uy();Fn();An();Y1=(r,e,n,t,o,i)=>(r-1)*e+n+(t-1)*o+1-i,e$=(r,e,n,t,o)=>{let i=Math.floor(r/2);e==="SAME_UPPER"?(n[t]=i,n[o]=r-i):e==="SAME_LOWER"&&(n[t]=r-i,n[o]=i)},t$=(r,e,n,t,o,i,a,s,u,l)=>{let c=r.length-2,d=l.length===0;u.length{let n=r.kernelShape.slice();if(r.kernelShape.length===0||r.kernelShape.reduce((d,p)=>d*p,1)===0){n.length=0;for(let d=2;dd+p,0)===0){let d=e[0].dims.length-2;u=new Array(d).fill(1)}let l=r.strides.slice();if(l.reduce((d,p)=>d+p,0)===0){let d=e[0].dims.length-2;l=new Array(d).fill(1)}t$(s,n,u,r.autoPad,r.group,o,l,t,a,i);let c=Object.assign({},r);return Object.assign(c,{kernelShape:n,pads:o,outputPadding:a,outputShape:i,dilations:u,strides:l}),c},cy=r=>{let e=qi(r),n=r.format,t=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof r.autoPad>"u"?0:r.autoPad],o=r.dilations,i=r.group??1,a=r.kernelShape,s=r.pads,u=r.strides,l=r.wIsConst(),c=r.outputPadding,d=r.outputShape;return{autoPad:t,format:n,dilations:o,group:i,kernelShape:a,outputPadding:c,outputShape:d,pads:s,strides:u,wIsConst:l,...e,cacheKey:`${r.format};${e.activation};`}},n$=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length!==4&&r[0].dims.length!==3)throw new Error("currently only support 2-dimensional conv");if(r[0].dims.length!==r[1].dims.length)throw new Error("filter does not have same dimension as input");let n=r[0].dims[e.format==="NHWC"?r[0].dims.length-1:1],t=r[1].dims[0];if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let o=r[1].dims[1]*e.group;if(r.length===3&&(r[2].dims.length!==1||r[2].dims[0]!==o))throw new Error("invalid bias");let i=r[0].dims.length-2;if(e.dilations.reduce((c,d)=>c+d,0)>0&&e.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(e.strides.reduce((c,d)=>c+d,0)>0&&e.strides.length!==i)throw new Error(`strides should be ${i}D`);if(e.pads.reduce((c,d)=>c+d,0)>0&&e.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(e.outputPadding.length!==i&&e.outputPadding.length!==0)throw new Error(`output_padding should be ${i}D`);if(e.kernelShape.reduce((c,d)=>c+d,0)>0&&e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape");if(e.outputShape.length!==0&&e.outputShape.length!==r[0].dims.length-2)throw new Error("invalid output shape")},dy=(r,e,n,t)=>{let o=r.kernelCustomData.wT??r.compute(Fe(e[1],[2,3,0,1]),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=o);let i=[e[0],o];e.length===3&&i.push(e[2]),r.compute(sy(i,n,t),{inputs:i})},r$=(r,e)=>{let n=e.format==="NHWC",t=[r.inputs[0].reshape(n?[r.inputs[0].dims[0],1,r.inputs[0].dims[1],r.inputs[0].dims[2]]:[r.inputs[0].dims[0],r.inputs[0].dims[1],1,r.inputs[0].dims[2]]),r.inputs[1].reshape([r.inputs[1].dims[0],r.inputs[1].dims[1],1,r.inputs[1].dims[2]])];r.inputs.length===3&&t.push(r.inputs[2]);let o=e.kernelShape;(o.length===0||o[0]===0)&&(o=[r.inputs[1].dims[2]]);let i=e.dilations;(i.length===0||i[0]===0)&&(i=[1]);let a=e.strides;(a.length===0||a[0]===0)&&(a=[1]);let s=e.pads;s.length===0&&(s=[0,0]),s=[0,s[0],0,s[1]],a=[1].concat(a),i=[1].concat(i),o=[1].concat(o);let u=e.outputPadding;u=[0].concat(u);let l=ly({...e,pads:s,strides:a,dilations:i,kernelShape:o,outputPadding:u},t);dy(r,t,l,c=>n?[c[0],c[2],c[3]]:[c[0],c[1],c[3]])},py=(r,e)=>{if(n$(r.inputs,e),r.inputs[0].dims.length===3)r$(r,e);else{let n=ly(e,r.inputs);dy(r,r.inputs,n)}}});var o$,hy,my,gy=$(()=>{"use strict";Z();ne();Ee();oe();o$=(r,e,n,t)=>{let o=S.size(e),i=e.length,a=A("input",r,i),s=C("output",r,i),u=n.dataType===6?n.getInt32Array()[0]:Number(n.getBigInt64Array()[0]),l=S.normalizeAxis(u,i),c=d=>{let p=` i32(${a.indicesGet("inputIndices","uniforms.axis")}) `,f=M("uniforms.input_shape","uniforms.axis",i),h=t.reverse?p+(t.exclusive?" + 1":""):"0",m=t.reverse?f:p+(t.exclusive?"":" + 1");return` + ${d.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(a,s)} + ${d.mainStart()} + ${d.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var inputIndices = ${s.offsetToIndices("global_idx")}; + var sum = ${s.type.value}(0); + let first : i32 = ${h}; + let last : i32 = ${m}; + for (var i : i32 = first; i < last; i++) { + ${a.indicesSet("inputIndices","uniforms.axis","u32(i)")}; + sum = sum + ${a.getByIndices("inputIndices")}; + } + ${s.setByOffset("global_idx","sum")}; + }`};return{name:"CumSum",shaderCache:{hint:t.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:e,dataType:r}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:[{type:12,data:o},{type:12,data:l},...k(e,e)]}),getShaderSource:c}},hy=(r,e)=>{let n=r.inputs[0].dims,t=r.inputs[0].dataType,o=r.inputs[1];r.compute(o$(t,n,o,e),{inputs:[0]})},my=r=>{let e=r.exclusive===1,n=r.reverse===1;return J({exclusive:e,reverse:n})}});var i$,a$,s$,by,yy,_y=$(()=>{"use strict";Z();ne();Ee();oe();i$=r=>{if(!r||r.length!==1)throw new Error("DepthToSpace requires 1 input.");if(r[0].dims.length!==4)throw new Error("DepthToSpace requires 4D input.")},a$=(r,e,n,t)=>{let o=[];o.push(`fn perm(i: ${t.type.indices}) -> ${n.type.indices} { + var a: ${n.type.indices};`);for(let i=0;i{let n,t,o,i,a,s,u=e.format==="NHWC",l=e.blocksize,c=e.mode==="DCR";u?([n,t,o,i]=r.dims,a=c?[n,t,o,l,l,i/l**2]:[n,t,o,i/l**2,l,l],s=c?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([n,t,o,i]=[r.dims[0],r.dims[2],r.dims[3],r.dims[1]],a=c?[n,l,l,i/l**2,t,o]:[n,i/l**2,l,l,t,o],s=c?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let d=r.reshape(a),p=d.dims.length,f=r.dataType,h=A("a",f,p),m=C("output",f,p),y=g=>` + ${g.registerUniform("output_size","u32").declareVariables(h,m)} + + ${a$(s,p,h,m)} + + ${g.mainStart()} + ${g.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${m.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${m.setByOffset("global_idx",h.getByIndices("aIndices"))} + }`;return{name:"DepthToSpace",shaderCache:{hint:`${r.dims};${e.blocksize};${e.mode}`,inputDependencies:["rank"]},getRunData:g=>{let b=u?[n,t*l,o*l,i/l**2]:[n,i/l**2,t*l,o*l],x=S.size(b),w=d.dims,v=S.sortBasedOnPerm(w,s);return{outputs:[{dims:b,dataType:g[0].dataType}],dispatchGroup:{x:Math.ceil(x/64)},programUniforms:[{type:12,data:x},...k(w,v)]}},getShaderSource:y}},by=(r,e)=>{i$(r.inputs),r.compute(s$(r.inputs[0],e))},yy=r=>J({blocksize:r.blocksize,mode:r.mode,format:r.format})});var pl,Qi,xy,u$,l$,fl,hl,wy,c$,Ty,vy,Iy=$(()=>{"use strict";Z();ne();Ee();oe();pl="[a-zA-Z]|\\.\\.\\.",Qi="("+pl+")+",xy="^"+Qi+"$",u$="("+Qi+",)*"+Qi,l$="^"+u$+"$",fl=class{constructor(e=-1){this.symbolToIndices=new Map,this.inputIndex=e}addSymbol(e,n){let t=this.symbolToIndices.get(e);t===void 0?t=[n]:t.push(n),this.symbolToIndices.set(e,t)}},hl=class{constructor(e,n){this.equation=n;this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=new Array,this.outputDims=[];let[t,o]=n.includes("->")?n.split("->",2):[n,""];if(!t.match(RegExp(l$)))throw new Error("Invalid LHS term");if(t.split(",").forEach((s,u)=>{let l=e[u].dims.slice();if(!s.match(RegExp(xy)))throw new Error("Invalid LHS term");let c=this.processTerm(s,!0,l,u);this.lhs.push(c)}),o==="")o+=[...this.symbolToInfo.entries()].filter(([s,u])=>u.count===1||s==="...").map(([s])=>s).join("");else if(!o.match(RegExp(Qi)))throw new Error("Invalid RHS");o.match(RegExp(pl,"g"))?.forEach(s=>{if(s==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let u=this.symbolToInfo.get(s);if(u===void 0)throw new Error("Invalid RHS symbol");this.outputDims.push(u.dimValue)}}),this.rhs=this.processTerm(o,!1,this.outputDims)}addSymbol(e,n,t){let o=this.symbolToInfo.get(e);if(o!==void 0){if(o.dimValue!==n&&o.count!==1)throw new Error("Dimension mismatch");o.count++,o.inputIndices.push(t)}else o={count:1,dimValue:n,inputIndices:[t]};this.symbolToInfo.set(e,o)}processTerm(e,n,t,o=-1){let i=t.length,a=!1,s=[],u=0;if(!e.match(RegExp(xy))&&!n&&e!=="")throw new Error("Invalid LHS term");let l=e.match(RegExp(pl,"g")),c=new fl(o);return l?.forEach((d,p)=>{if(d==="..."){if(a)throw new Error("Only one ellipsis is allowed per input term");a=!0;let f=i-l.length+1;if(f<0)throw new Error("Ellipsis out of bounds");if(s=t.slice(u,u+f),this.hasEllipsis){if(this.ellipsisDims.length!==s.length||this.ellipsisDims.toString()!==s.toString())throw new Error("Ellipsis dimensions mismatch")}else if(n)this.hasEllipsis=!0,this.ellipsisDims=s;else throw new Error("Ellipsis must be specified in the LHS");for(let h=0;hr+"_max",c$=(r,e,n,t)=>{let i=r.map(c=>c.length).map((c,d)=>A(`input${d}`,e,c)),a=S.size(t),s=C("output",e,t.length),u=[...n.symbolToInfo.keys()].filter(c=>!n.rhs.symbolToIndices.has(c)),l=c=>{let d=[],p="var prod = 1.0;",f="var sum = 0.0;",h="sum += prod;",m=[],y=[],g=[],b=[],x=n.symbolToInfo.size===n.rhs.symbolToIndices.size;n.symbolToInfo.forEach((v,I)=>{if(n.rhs.symbolToIndices.has(I)){let P=n.rhs.symbolToIndices.get(I)?.[0];P!==void 0&&n.lhs.forEach((O,E)=>{if(v.inputIndices.includes(E)){let R=O.symbolToIndices.get(I);if(R===void 0)throw new Error("Invalid symbol error");R.forEach(q=>{d.push(`${i[E].indicesSet(`input${E}Indices`,q,s.indicesGet("outputIndices",P))}`)})}})}else n.lhs.forEach((P,O)=>{if(v.inputIndices.includes(O)){let E=P.symbolToIndices.get(I);if(E===void 0)throw new Error("Invalid symbol error");E.forEach(R=>{m.push(`${i[O].indicesSet(`input${O}Indices`,R,`${I}`)}`)}),b.push(`prod *= ${i[O].getByIndices(`input${O}Indices`)};`)}}),y.push(`for(var ${I}: u32 = 0; ${I} < uniforms.${wy(I)}; ${I}++) {`),g.push("}")});let w=x?[...d,`let sum = ${i.map((v,I)=>v.getByIndices(`input${I}Indices`)).join(" * ")};`]:[...d,f,...y,...m,p,...b,h,...g];return` + ${c.registerUniforms(u.map(v=>({name:`${wy(v)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...i,s)} + + ${c.mainStart()} + ${c.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${s.offsetToIndices("global_idx")}; + ${i.map((v,I)=>`var input${I}Indices: ${i[I].type.indices};`).join(` +`)} + ${w.join(` +`)}; + ${s.setByOffset("global_idx","sum")}; + }`};return{name:"Einsum",shaderCache:{hint:n.equation,inputDependencies:r.map(()=>"rank")},getRunData:()=>{let c=u.filter(p=>n.symbolToInfo.has(p)).map(p=>({type:12,data:n.symbolToInfo.get(p)?.dimValue||0}));c.push({type:12,data:a});let d=r.map((p,f)=>[...k(p)]).reduce((p,f)=>p.concat(f),c);return d.push(...k(t)),{outputs:[{dims:t,dataType:e}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:d}},getShaderSource:l}},Ty=(r,e)=>{let n=new hl(r.inputs,e.equation),t=n.outputDims,o=r.inputs.map((i,a)=>i.dims);r.compute(c$(o,r.inputs[0].dataType,n,t))},vy=r=>{let e=r.equation.replace(/\s+/g,"");return J({equation:e})}});var d$,Sy,p$,f$,$y,Ay=$(()=>{"use strict";Z();ne();oe();d$=r=>{if(!r||r.length!==2)throw new Error("Expand requires 2 input.");let e=r[0].dims,n=Array.from(r[1].getBigInt64Array(),Number),t=n.length{let n=r.length-e.length,t=[];for(let o=0;or.length>e.length?Sy(r,e):Sy(e,r),f$=r=>{let e=r[0].dims,n=Array.from(r[1].getBigInt64Array(),Number),t=p$(e,n),o=r[0].dataType,i=o===9||S.size(e)===1,a=o===9||e.length>0&&e[e.length-1]%4===0?4:1,s=i||t.length>0&&t[t.length-1]%4===0?4:1,u=Math.ceil(S.size(t)/s),l=d=>{let p=A("input",o,e.length,a),f=C("output",o,t.length,s),h;if(o===9){let m=(y,g,b="")=>` + let outputIndices${g} = ${f.offsetToIndices(`outputOffset + ${g}u`)}; + let offset${g} = ${p.broadcastedIndicesToOffset(`outputIndices${g}`,f)}; + let index${g} = offset${g} / 4u; + let component${g} = offset${g} % 4u; + ${y}[${g}] = ${b}(${p.getByOffset(`index${g}`)}[component${g}]); + `;h=` + let outputOffset = global_idx * ${s}; + var data = vec4(0); + ${m("data",0,"u32")} + ${m("data",1,"u32")} + ${m("data",2,"u32")} + ${m("data",3,"u32")} + ${f.setByOffset("global_idx","data")} + }`}else h=` + let outputIndices = ${f.offsetToIndices(`global_idx * ${s}`)}; + let inputOffset = ${p.broadcastedIndicesToOffset("outputIndices",f)}; + let data = ${f.type.value}(${p.getByOffset(`inputOffset / ${a}`)}); + ${f.setByOffset("global_idx","data")} + }`;return` + ${d.registerUniform("vec_size","u32").declareVariables(p,f)} + ${d.mainStart()} + ${d.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${h}`},c=[{type:12,data:u},...k(e,t)];return{name:"Expand",shaderCache:{hint:`${t.length};${a}${s}`,inputDependencies:["rank"]},getShaderSource:l,getRunData:()=>({outputs:[{dims:t,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:c})}},$y=r=>{d$(r.inputs),r.compute(f$(r.inputs),{inputs:[0]})}});var h$,Py,Oy=$(()=>{"use strict";Z();ne();oe();Hi();h$=r=>{let e=r[0].dataType,n=S.size(r[0].dims),t=S.size(r[1].dims),o=t%4===0,i=a=>{let s=A("x",e,[1],4),u=A("bias",e,[1],4),l=C("y",e,[1],4),c=[{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}],d=f=>` + let bias${f}_offset: u32 = (global_idx * 4 + ${f}) % uniforms.bias_size; + let bias${f} = ${u.getByOffset(`bias${f}_offset / 4`)}[bias${f}_offset % 4];`,p=o?` + let bias = ${u.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${d(0)}${d(1)}${d(2)}${d(3)} + let bias = ${s.type.value}(bias0, bias1, bias2, bias3);`;return`${a.registerUniforms(c).declareVariables(s,u,l)} + + ${ol(Ve(e))} + + ${a.mainStart(ur)} + ${a.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} + + let x = ${s.getByOffset("global_idx")}; + ${p} + let x_in = x + bias; + ${l.setByOffset("global_idx",il("x_in"))} + }`};return{name:"FastGeluWithBias",shaderCache:{hint:`${o}`,inputDependencies:["type","type"]},getShaderSource:i,getRunData:a=>({outputs:[{dims:a[0].dims,dataType:a[0].dataType}],programUniforms:[{type:12,data:Math.ceil(n/4)},{type:12,data:t}],dispatchGroup:{x:Math.ceil(n/ur/4)}})}},Py=r=>{r.inputs.length<2||S.size(r.inputs[1].dims)===0?Ib(r):r.compute(h$(r.inputs))}});var m$,g$,Ey,Cy,Dy=$(()=>{"use strict";Z();ne();Ee();oe();m$=r=>{if(!r||r.length!==2)throw new Error("Gather requires 2 inputs.")},g$=(r,e)=>{let n=r[0].dims,t=r[1].dims,o=n.length,i=S.normalizeAxis(e.axis,o),a=n.slice(0);a.splice(i,1,...t);let s=n[i],u=r[0].dataType===9?4:1,l=Math.ceil(S.size(a)/u),c=[{type:12,data:l},{type:6,data:s},{type:12,data:i},...k(r[0].dims,r[1].dims,a)],d=p=>{let f=A("data",r[0].dataType,r[0].dims.length,u),h=A("inputIndices",r[1].dataType,r[1].dims.length),m=C("output",r[0].dataType,a.length,u),y=b=>{let x=t.length,w=`var indicesIndices${b} = ${h.type.indices}(0);`;for(let v=0;v1?`indicesIndices${b}[${v}]`:`indicesIndices${b}`} = ${a.length>1?`outputIndices${b}[uniforms.axis + ${v}]`:`outputIndices${b}`};`;w+=` + var idx${b} = ${h.getByIndices(`indicesIndices${b}`)}; + if (idx${b} < 0) { + idx${b} = idx${b} + uniforms.axisDimLimit; + } + var dataIndices${b} : ${f.type.indices}; + `;for(let v=0,I=0;v1?`dataIndices${b}[${v}]`:`dataIndices${b}`} = u32(idx${b});`,I+=x):(w+=`${o>1?`dataIndices${b}[${v}]`:`dataIndices${b}`} = ${a.length>1?`outputIndices${b}[${I}]`:`outputIndices${b}`};`,I++);return w},g;if(r[0].dataType===9){let b=(x,w,v="")=>` + let outputIndices${w} = ${m.offsetToIndices(`outputOffset + ${w}u`)}; + ${y(w)}; + let offset${w} = ${f.indicesToOffset(`dataIndices${w}`)}; + let index${w} = offset${w} / 4u; + let component${w} = offset${w} % 4u; + ${x}[${w}] = ${v}(${f.getByOffset(`index${w}`)}[component${w}]); + `;g=` + let outputOffset = global_idx * ${u}; + var value = vec4(0); + ${b("value",0,"u32")} + ${b("value",1,"u32")} + ${b("value",2,"u32")} + ${b("value",3,"u32")} + ${m.setByOffset("global_idx","value")} + `}else g=` + let outputIndices = ${m.offsetToIndices("global_idx")}; + ${y("")}; + let value = ${f.getByIndices("dataIndices")}; + ${m.setByOffset("global_idx","value")}; + `;return` + ${p.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(f,h,m)} + ${p.mainStart()} + ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + ${g} + }`};return{name:"Gather",shaderCache:{hint:e.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:a,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:c}),getShaderSource:d}},Ey=r=>J({axis:r.axis}),Cy=(r,e)=>{let n=r.inputs;m$(n),r.compute(g$(r.inputs,e))}});var b$,ky,Ly,Ry=$(()=>{"use strict";Z();ne();oe();b$=(r,e,n,t,o,i,a,s,u)=>{let l=[{type:12,data:i},{type:12,data:t},{type:12,data:o},{type:12,data:n},{type:12,data:a},{type:12,data:s},{type:12,data:u}],c=[i];l.push(...k(e.dims,c));let d=p=>{let f=A("indices_data",e.dataType,e.dims.length),h=C("input_slice_offsets_data",12,1,1),m=[f,h],y=[{name:"output_size",type:"u32"},{name:"batch_dims",type:"u32"},{name:"input_dims",type:"u32",length:o.length},{name:"sizes_from_slice_dims_data",type:"u32",length:n.length},{name:"num_slices_per_batch",type:"u32"},{name:"input_batch_stride",type:"u32"},{name:"num_slice_dims",type:"u32"}];return` + ${p.registerUniforms(y).declareVariables(...m)} + ${p.mainStart()} + ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let batch_idx = global_idx / uniforms.num_slices_per_batch; + let base_offset = batch_idx * uniforms.input_batch_stride; + + let slice_indices_base_offset = global_idx * uniforms.num_slice_dims; + var relative_slice_offset = 0; + for (var dim_idx = 0u; dim_idx < uniforms.num_slice_dims; dim_idx ++) { + var index = i32(indices_data[dim_idx + slice_indices_base_offset].x); + let input_dim_idx = uniforms.batch_dims + dim_idx; + if (index < 0) { + ${o.length===1?"index += i32(uniforms.input_dims);":"index += i32(uniforms.input_dims[input_dim_idx]);"} + } + ${n.length===1?"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data);":"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data[dim_idx]);"} + } + + input_slice_offsets_data[global_idx] = base_offset + u32(relative_slice_offset); + }`};return r.compute({name:"computeSliceOffsets",shaderCache:{hint:`${o.length}_${n.length}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:c,dataType:r.inputs[1].dataType}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:l}),getShaderSource:d},{inputs:[e],outputs:[-1]})[0]},ky=(r,e)=>{let n=r.inputs,t=n[0].dims,o=n[0].dataType,i=n[1].dims,a=i[i.length-1],s=S.sizeToDimension(i,i.length-1),u=S.sizeFromDimension(t,e.batchDims+a),l=S.sizeToDimension(t,e.batchDims),c=S.sizeFromDimension(t,e.batchDims),d=s/l,p=new Array(a),f=u;for(let w=0;wt.length)throw new Error("last dimension of indices must not be larger than rank of input tensor");let y=i.slice(0,-1).concat(t.slice(m)),g=S.size(y),b=[{type:12,data:g},{type:12,data:u},...k(n[0].dims,h.dims,y)],x=w=>{let v=A("data",n[0].dataType,n[0].dims.length),I=A("slice_offsets",12,h.dims.length),P=C("output",n[0].dataType,y.length);return` + ${w.registerUniform("output_size","u32").registerUniform("slice_size","u32").declareVariables(v,I,P)} + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let slice_offset = slice_offsets[global_idx / uniforms.slice_size]; + output[global_idx] = data[u32(slice_offset) + global_idx % uniforms.slice_size]; + }`};r.compute({name:"GatherND",shaderCache:{hint:e.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:y,dataType:o}],dispatchGroup:{x:Math.ceil(g/64)},programUniforms:b}),getShaderSource:x},{inputs:[n[0],h]})},Ly=r=>({batchDims:r.batch_dims,cacheKey:""})});var y$,_$,Ny,zy,My=$(()=>{"use strict";Z();ne();Ee();oe();y$=(r,e)=>{if(r.length<3||r.length>4)throw new Error("GatherBlockQuantized requires 3 or 4 inputs.");let n=S.normalizeAxis(e.quantizeAxis,r[0].dims.length),t=e.blockSize,o=r[0],i=r[2],a=r.length===4?r[3]:void 0;if(i.dims.length!==o.dims.length||!o.dims.map((s,u)=>u===n?Math.ceil(s/t)===i.dims[u]:s===i.dims[u]).reduce((s,u)=>s&&u,!0))throw new Error("Scales must have the same rank as the input tensor and the dims should match except on gatherAxis.");if(a){if(a.dataType!==o.dataType)throw new Error("Zero point must have the same data type as the input tensor.");if(a.dims.length!==i.dims.length||!a.dims.map((s,u)=>s===i.dims[u]).reduce((s,u)=>s&&u,!0))throw new Error("Zero point must have the same rank as the input tensor and the dims should match except on quantizeAxis.")}},_$=(r,e)=>{let n=r[0].dims,t=r[1].dims,o=n.length,i=S.normalizeAxis(e.gatherAxis,o),a=S.normalizeAxis(e.quantizeAxis,o),s=n.slice(0);s.splice(i,1,...t);let u=S.size(s),l=r[2].dataType,d=r[0].dataType===22,p=[{type:12,data:u},{type:12,data:a},{type:12,data:i},{type:12,data:e.blockSize},...k(...r.map((h,m)=>h.dims),s)],f=h=>{let m=A("data",r[0].dataType,r[0].dims.length),y=A("inputIndices",r[1].dataType,r[1].dims.length),g=A("scales",r[2].dataType,r[2].dims.length),b=r.length>3?A("zeroPoint",r[3].dataType,r[3].dims.length):void 0,x=C("output",l,s.length),w=[m,y,g];b&&w.push(b);let v=[{name:"output_size",type:"u32"},{name:"quantize_axis",type:"u32"},{name:"gather_axis",type:"u32"},{name:"block_size",type:"u32"}];return` + ${h.registerUniforms(v).declareVariables(...w,x)} + ${h.mainStart()} + let output_indices = ${x.offsetToIndices("global_idx")}; + var indices_indices = ${y.type.indices}(0); + ${t.length>1?` + for (var i: u32 = 0; i < ${t.length}; i++) { + let index = ${x.indicesGet("output_indices","uniforms.gather_axis + i")}; + ${y.indicesSet("indices_indices","i","index")}; + }`:`indices_indices = ${x.indicesGet("output_indices","uniforms.gather_axis")};`}; + var data_indices = ${m.type.indices}(0); + for (var i: u32 = 0; i < uniforms.gather_axis; i++) { + let index = ${x.indicesGet("output_indices","i")}; + ${m.indicesSet("data_indices","i","index")}; + } + var index_from_indices = ${y.getByIndices("indices_indices")}; + if (index_from_indices < 0) { + index_from_indices += ${n[i]}; + } + ${m.indicesSet("data_indices","uniforms.gather_axis","u32(index_from_indices)")}; + for (var i = uniforms.gather_axis + 1; i < ${s.length}; i++) { + let index = ${x.indicesGet("output_indices",`i + ${t.length} - 1`)}; + ${m.indicesSet("data_indices","i","index")}; + } + let data_offset = ${m.indicesToOffset("data_indices")}; + let data_index = data_offset % 8; + // Convert 4-bit packed data to 8-bit packed data. + let packed_4bit_quantized_data = ${m.getByOffset("data_offset / 8")}; + let packed_8bit_quantized_data = (packed_4bit_quantized_data >> (4 * (data_index % 2))) & 0x0f0f0f0f; + let quantized_data_vec = ${d?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_quantized_data)); + let quantized_data = quantized_data_vec[data_index / 2]; + var scale_indices = data_indices; + let quantize_axis_index = ${g.indicesGet("data_indices","uniforms.quantize_axis")} / uniforms.block_size; + ${g.indicesSet("scale_indices","uniforms.quantize_axis","quantize_axis_index")}; + var scale = ${g.getByIndices("scale_indices")}; + ${b?` + let zero_point_indices = scale_indices; + let zero_point_offset = ${b.indicesToOffset("zero_point_indices")}; + let zero_point_index = zero_point_offset % 8; + let packed_4bit_zero_points = ${b.getByOffset("zero_point_offset / 8")}; + let packed_8bit_zero_points = (packed_4bit_zero_points >> (4 * (zero_point_index % 2))) & 0x0f0f0f0f; + let zero_point_vec = ${d?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_zero_points)); + let zero_point = zero_point_vec[zero_point_index / 2];`:"var zero_point = 0"}; + let dequantized_data = ${Ve(l)}(quantized_data - zero_point) * scale; + ${x.setByOffset("global_idx","dequantized_data")}; + }`};return{name:"GatherBlockQuantized",shaderCache:{hint:`${e.cacheKey};${r.filter((h,m)=>m!==1).map(h=>h.dims.join("_")).join(";")}`,inputDependencies:Array.from({length:r.length},(h,m)=>"rank")},getRunData:()=>({outputs:[{dims:s,dataType:l}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:p}),getShaderSource:f}},Ny=(r,e)=>{let n=r.inputs;y$(n,e),r.compute(_$(r.inputs,e))},zy=r=>J({blockSize:r.blockSize,gatherAxis:r.gatherAxis,quantizeAxis:r.quantizeAxis})});var x$,w$,By,Vy,Fy=$(()=>{"use strict";Z();ne();Ee();oe();x$=r=>{if(!r||r.length!==2)throw new Error("GatherElements requires 2 inputs.");if(r[0].dims.length<1)throw new Error("GatherElements requires that the data input be rank >= 1.");if(r[0].dims.length!==r[1].dims.length)throw new Error(`GatherElements requires that the data input and + indices input tensors be of same rank.`)},w$=(r,e)=>{let n=r[0].dims,t=r[0].dataType,o=n.length,i=r[1].dims,a=r[1].dataType,s=S.normalizeAxis(e.axis,o),u=n[s],l=i.slice(0),c=S.size(l),d=A("input",t,o),p=A("indicesInput",a,i.length),f=C("output",t,l.length),h=[{type:12,data:c},{type:6,data:u},{type:12,data:s}];return h.push(...k(n,i,l)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:l,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:h}),getShaderSource:g=>` + ${g.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(d,p,f)} + ${g.mainStart()} + ${g.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let outputIndices = ${f.offsetToIndices("global_idx")}; + + var idx = ${p.getByOffset("global_idx")}; + if (idx < 0) { + idx = idx + uniforms.axisDimLimit; + } + var inputIndices = ${d.type.indices}(outputIndices); + ${d.indicesSet("inputIndices","uniforms.axis","u32(idx)")}; + let value = ${d.getByIndices("inputIndices")}; + + ${f.setByOffset("global_idx","value")}; + }`}},By=r=>J({axis:r.axis}),Vy=(r,e)=>{let n=r.inputs;x$(n),r.compute(w$(r.inputs,e))}});var T$,v$,Gy,Uy,Wy=$(()=>{"use strict";Z();ne();oe();T$=r=>{if(!r)throw new Error("Input is missing");if(r.length<2||r.length>3)throw new Error("Invaid input number.");if(r.length===3&&r[2].dims.length>2)throw new Error("Invalid input shape of C");if(r[0].dataType!==r[1].dataType||r.length===3&&r[0].dataType!==r[2].dataType)throw new Error("Input types are mismatched")},v$=(r,e)=>{let n=r[0].dims.slice(),t=r[1].dims.slice(),[o,i,a]=Di.getShapeOfGemmResult(n,e.transA,t,e.transB,r.length===3?r[2].dims:void 0),s=[o,i];if(!s)throw new Error("Can't use gemm on the given tensors");let u=16,l=Math.ceil(i/u),c=Math.ceil(o/u),d=!0,p=S.size(s),f=[{type:12,data:d?l:p},{type:12,data:o},{type:12,data:i},{type:12,data:a},{type:1,data:e.alpha},{type:1,data:e.beta}],h=["type","type"];r.length===3&&(f.push(...k(r[2].dims)),h.push("rank")),f.push(...k(s));let m=g=>{let b="";e.transA&&e.transB?b="value += a[k * uniforms.M + m] * b[n * uniforms.K + k];":e.transA&&!e.transB?b="value += a[k * uniforms.M + m] * b[k * uniforms.N + n];":!e.transA&&e.transB?b="value += a[m * uniforms.K + k] * b[n * uniforms.K + k];":!e.transA&&!e.transB&&(b="value += a[m * uniforms.K + k] * b[k * uniforms.N + n];");let x=e.alpha===1?"":"value *= uniforms.alpha;",w=A("a",r[0].dataType,r[0].dims),v=A("b",r[1].dataType,r[1].dims),I=w.type.value,P=null,O=[w,v];r.length===3&&(P=A("c",r[2].dataType,r[2].dims.length),O.push(P));let E=C("output",r[0].dataType,s.length);O.push(E);let R=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}];return` + ${g.registerUniforms(R).declareVariables(...O)} + + ${g.mainStart()} + ${g.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let m = global_idx / uniforms.N; + let n = global_idx % uniforms.N; + + var value = ${I}(0); + for (var k: u32 = 0u; k < uniforms.K; k++) { + ${b} + } + + ${x} + ${P!=null?`let cOffset = ${P.broadcastedIndicesToOffset("vec2(m, n)",E)}; value += ${I}(uniforms.beta) * ${P.getByOffset("cOffset")};`:""} + output[global_idx] = value; + }`},y=g=>{let b=A("a",r[0].dataType,r[0].dims),x=A("b",r[1].dataType,r[1].dims),w=null,v=[b,x];r.length===3&&(w=A("c",r[2].dataType,r[2].dims.length),v.push(w));let I=C("output",r[0].dataType,s.length);v.push(I);let P=[{name:"num_tile_n",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}],O="",E="";e.transA&&e.transB?(E=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${b.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${x.type.value}(0); + } + `,O="value += tile_a[k][local_id.y] * tile_b[local_id.x][k];"):e.transA&&!e.transB?(E=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${b.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${x.type.value}(0); + } + `,O="value += tile_a[k][local_id.y] * tile_b[k][local_id.x];"):!e.transA&&e.transB?(E=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${b.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${x.type.value}(0); + } + `,O="value += tile_a[local_id.y][k] * tile_b[local_id.x][k];"):!e.transA&&!e.transB&&(E=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${b.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${x.type.value}(0); + } + `,O="value += tile_a[local_id.y][k] * tile_b[k][local_id.x];");let R=e.alpha===1?"":"value *= uniforms.alpha;";return` + ${g.registerUniforms(P).declareVariables(...v)} + var tile_a: array, ${u}>; + var tile_b: array, ${u}>; + ${g.mainStart([u,u,1])} + let tile_col_start = (workgroup_index % uniforms.num_tile_n) * ${u}; + let tile_row_start = (workgroup_index / uniforms.num_tile_n) * ${u}; + let num_tiles = (uniforms.K - 1) / ${u} + 1; + var k_start = 0u; + var value = ${I.type.value}(0); + for (var t: u32 = 0u; t < num_tiles; t++) { + ${E} + k_start = k_start + ${u}; + workgroupBarrier(); + + for (var k: u32 = 0u; k < ${u}; k++) { + ${O} + } + workgroupBarrier(); + } + + ${R} + let m = tile_row_start + local_id.y; + let n = tile_col_start + local_id.x; + ${w!=null?`let cOffset = ${w.broadcastedIndicesToOffset("vec2(m, n)",I)}; value += ${I.type.value}(uniforms.beta) * ${w.getByOffset("cOffset")};`:""} + if (m < uniforms.M && n < uniforms.N) { + output[m * uniforms.N + n] = value; + } + }`};return d?{name:"GemmShared",shaderCache:{hint:`${e.cacheKey}`,inputDependencies:h},getRunData:()=>({outputs:[{dims:s,dataType:r[0].dataType}],dispatchGroup:{x:l*c},programUniforms:f}),getShaderSource:y}:{name:"Gemm",shaderCache:{hint:`${e.cacheKey}`,inputDependencies:h},getRunData:()=>({outputs:[{dims:s,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:f}),getShaderSource:m}},Gy=r=>{let e=r.transA,n=r.transB,t=r.alpha,o=r.beta;return{transA:e,transB:n,alpha:t,beta:o,cacheKey:`${r.transA};${r.transB};${r.alpha===1}`}},Uy=(r,e)=>{T$(r.inputs),r.compute(v$(r.inputs,e))}});var Pn,Gn,Ar,Pr,I$,S$,$$,A$,P$,O$,E$,C$,Hy,qy,jy=$(()=>{"use strict";Z();ne();Ee();oe();[Pn,Gn,Ar,Pr]=[0,1,2,3],I$=r=>{if(r[0].dims.length!==4)throw new Error("only 4-D tensor is supported.");if(r[0].dims.length!==r[1].dims.length)throw new Error("input dimensions must be equal to grid dimensions");if(r[0].dims.length-2!==r[1].dims[r[1].dims.length-1])throw new Error(`last dimension of grid must be equal to ${r[0].dims.length-2}`);if(r[0].dims[0]!==r[1].dims[0])throw new Error("grid batch size must match input batch size")},S$=` + fn gs_get_cubic_coeffs(x: f32) -> vec4 { + let cubic_alpha = -0.75f; + let x_abs = abs(x); + var coeffs: vec4; + coeffs[0] = (((cubic_alpha * (x_abs + 1) - 5 * cubic_alpha) * (x_abs + 1) + 8 * cubic_alpha) * (x_abs + 1) - 4 * cubic_alpha); + coeffs[1] = (((cubic_alpha + 2) * x_abs - (cubic_alpha + 3)) * x_abs * x_abs + 1); + coeffs[2] = (((cubic_alpha + 2) * (1 - x_abs) - (cubic_alpha + 3)) * (1 - x_abs) * (1 - x_abs) + 1); + coeffs[3] = (((cubic_alpha * (2 - x_abs) - 5 * cubic_alpha) * (2 - x_abs) + 8 * cubic_alpha) * (2 - x_abs) - 4 * cubic_alpha); + return coeffs; + } +`,$$=r=>` + fn gs_bicubic_interpolate(p: mat4x4<${r}>, x: f32, y: f32) -> ${r} { + var v: vec4; + var coeffs = gs_get_cubic_coeffs(x); + for (var i = 0; i < 4; i++) { + v[i] = coeffs[0] * p[i][0] + coeffs[1] * p[i][1] + coeffs[2] * p[i][2] + coeffs[3] * p[i][3]; + } + coeffs = gs_get_cubic_coeffs(y); + let pixel = ${r}(coeffs[0] * v[0] + coeffs[1] * v[1] + coeffs[2] * v[2] + coeffs[3] * v[3]); + return pixel; + } +`,A$=r=>` + fn gs_denormalize(n: f32, length: i32) -> f32 { + ${r.alignCorners===0?` + // alignCorners: false => [-1, 1] to [-0.5, length - 0.5] + return ((n + 1.0) * f32(length) - 1.0) / 2.0; + `:` + // alignCorners: true => [-1, 1] to [0, length - 1] + return (n + 1.0) / 2.0 * (f32(length - 1)); + `} + } +`,P$=r=>` + ${r.paddingMode==="reflection"?` + fn gs_reflect(x: i32, x_min: f32, x_max: f32) -> u32 { + var dx = 0.0; + var fx = f32(x); + let range = x_max - x_min; + if (fx < x_min) { + dx = x_min - fx; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_min + r; + } else { + fx = x_max - r; + } + } else if (fx > x_max) { + dx = fx - x_max; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_max - r; + } else { + fx = x_min + r; + } + } + return u32(fx); + }`:""} +`,O$=(r,e,n)=>` + fn pixel_at_grid(r: i32, c: i32, H: i32, W: i32, batch: u32, channel: u32, border: vec4) -> ${e} { + var pixel = ${e}(0); + var indices = vec4(0); + indices[${Pn}] = batch; + indices[${Gn}] = channel;`+(()=>{switch(n.paddingMode){case"zeros":return` + if (r >= 0 && r < H && c >=0 && c < W) { + indices[${Ar}] = u32(r); + indices[${Pr}] = u32(c); + } else { + return ${e}(0); + } + `;case"border":return` + indices[${Ar}] = u32(clamp(r, 0, H - 1)); + indices[${Pr}] = u32(clamp(c, 0, W - 1)); + `;case"reflection":return` + indices[${Ar}] = gs_reflect(r, border[1], border[3]); + indices[${Pr}] = gs_reflect(c, border[0], border[2]); + `;default:throw new Error(`padding mode ${n.paddingMode} is not supported`)}})()+` + return ${r.getByIndices("indices")}; + } +`,E$=(r,e,n)=>(()=>{switch(n.mode){case"nearest":return` + let result = pixel_at_grid(i32(round(y)), i32(round(x)), H_in, W_in, indices[${Pn}], indices[${Gn}], border); + `;case"bilinear":return` + let x1 = i32(floor(x)); + let y1 = i32(floor(y)); + let x2 = x1 + 1; + let y2 = y1 + 1; + + let p11 = pixel_at_grid(y1, x1, H_in, W_in, indices[${Pn}], indices[${Gn}], border); + let p12 = pixel_at_grid(y1, x2, H_in, W_in, indices[${Pn}], indices[${Gn}], border); + let p21 = pixel_at_grid(y2, x1, H_in, W_in, indices[${Pn}], indices[${Gn}], border); + let p22 = pixel_at_grid(y2, x2, H_in, W_in, indices[${Pn}], indices[${Gn}], border); + + let dx2 = ${e}(f32(x2) - x); + let dx1 = ${e}(x - f32(x1)); + let dy2 = ${e}(f32(y2) - y); + let dy1 = ${e}(y - f32(y1)); + let result = dy2 * (dx2 * p11 + dx1 * p12) + dy1 * (dx2 * p21 + dx1 * p22); + `;case"bicubic":return` + let x0 = i32(floor(x)) - 1; + let y0 = i32(floor(y)) - 1; + var p: mat4x4<${e}>; + for (var h = 0; h < 4; h++) { + for (var w = 0; w < 4; w++) { + p[h][w] = pixel_at_grid(h + y0, w + x0, H_in, W_in, indices[${Pn}], indices[${Gn}], border); + } + } + + let dx = x - f32(x0 + 1); + let dy = y - f32(y0 + 1); + let result = gs_bicubic_interpolate(p, dx, dy); + `;default:throw new Error(`mode ${n.mode} is not supported`)}})()+`${r.setByOffset("global_idx","result")}`,C$=(r,e)=>{let n=A("x",r[0].dataType,r[0].dims.length),t=[r[1].dims[0],r[1].dims[1],r[1].dims[2]],o=A("grid",r[1].dataType,t.length,2),i=[r[0].dims[0],r[0].dims[1],r[1].dims[1],r[1].dims[2]];e.format==="NHWC"&&(i=[r[0].dims[0],r[1].dims[1],r[1].dims[2],r[0].dims[3]],[Pn,Gn,Ar,Pr]=[0,3,1,2]);let a=C("output",r[0].dataType,i.length),s=n.type.value,u=S.size(i),l=[{type:12,data:u},...k(r[0].dims,t,i)],c=d=>` + ${d.registerUniform("output_size","u32").declareVariables(n,o,a)} + ${S$} + ${$$(s)} + ${A$(e)} + ${P$(e)} + ${O$(n,s,e)} + + ${d.mainStart()} + ${d.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let H_in = i32(uniforms.x_shape[${Ar}]); + let W_in = i32(uniforms.x_shape[${Pr}]); + + ${e.alignCorners===0?` + let x_min = -0.5; + let x_max = f32(W_in) - 0.5; + let y_min = -0.5; + let y_max = f32(H_in) - 0.5; + `:` + let x_min = 0.0; + let x_max = f32(W_in) - 1.0; + let y_min = 0.0; + let y_max = f32(H_in) - 1.0; + `}; + let border = vec4(x_min, y_min, x_max, y_max); + + let indices = ${a.offsetToIndices("global_idx")}; + var grid_indices = vec3(indices[${Pn}], indices[${Ar}], indices[${Pr}]); + let nxy = ${o.getByIndices("grid_indices")}; + var x = gs_denormalize(f32(nxy[0]), W_in); + var y = gs_denormalize(f32(nxy[1]), H_in); + + ${E$(a,s,e)} + }`;return{name:"GridSample",shaderCache:{hint:`${e.cacheKey}`,inputDependencies:["type","type"]},getRunData:d=>{let p=S.size(i);return{outputs:[{dims:i,dataType:d[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:l}},getShaderSource:c}},Hy=(r,e)=>{I$(r.inputs),r.compute(C$(r.inputs,e))},qy=r=>J({alignCorners:r.align_corners,mode:r.mode,paddingMode:r.padding_mode,format:r.format})});var it,L$,Xy,Ky,R$,io,Zy,ml=$(()=>{"use strict";Z();ne();Ee();Mi();Ui();oe();An();it=(r,e)=>r.length>e&&r[e].dims.length>0?r[e]:void 0,L$=(r,e)=>{let n=r[0],t=it(r,1),o=it(r,2),i=it(r,3),a=it(r,4),s=it(r,5),u=it(r,6),l=it(r,7);if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let c=n.dims[0],d=n.dims[1],p=n.dims.length===3?n.dims[2]:e.numHeads*n.dims[4],f=d,h=0,m=0,y=Math.floor(p/e.numHeads);if(u&&l&&S.size(u.dims)&&S.size(l.dims)){if(u.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(u.dims[0]!==c||u.dims[1]!==e.numHeads||u.dims[3]!==y)throw new Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(l.dims[0]!==c||l.dims[1]!==e.numHeads||l.dims[3]!==y)throw new Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(u.dims[2]!==l.dims[2])throw new Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(l.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');h=u.dims[2],m=u.dims[2]}else if(u&&S.size(u.dims)||l&&S.size(l.dims))throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let g;if(t&&S.size(t.dims)>0){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(t.dims.length<3||t.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==t.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(t.dims.length===3){if(t.dims[2]!==n.dims[2])throw new Error('Input "query" and "key" shall have same dim 2 (hidden_size)');g=2,f=t.dims[1]}else if(t.dims.length===5){if(t.dims[2]!==e.numHeads||t.dims[3]!==2||t.dims[4]!==y)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');g=5,f=t.dims[1]}else{if(t.dims[1]!==e.numHeads||t.dims[3]!==y)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');g=0,f=t.dims[2]}}else{if(n.dims.length!==5)throw new Error('Input "query" is expected to have 5 dimensions when key is empty');if(n.dims[2]!==e.numHeads||n.dims[3]!==3)throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');g=3}if(i&&S.size(i.dims)>0){if(i.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimension');if(t&&t.dims.length===5&&t.dims[3]===2)throw new Error("bias is not allowed for packed kv.")}let b=h+f,x=0;if(a&&S.size(a.dims)>0){x=8;let P=a.dims;throw P.length===1?P[0]===c?x=1:P[0]===3*c+2&&(x=3):P.length===2&&P[0]===c&&P[1]===b&&(x=5),x===8?new Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, total_sequence_length)'):new Error("Mask not supported")}let w=!1,v=p;if(o&&S.size(o.dims)>0){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(f!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');v=o.dims[2]}else{if(f!==o.dims[2])throw new Error('Input "key" and "value" shall have the same dim 2 (kv_sequence_length)');v=o.dims[1]*o.dims[3],w=!0}}let I=!1;if(a&&S.size(a.dims)>0)throw new Error("Key padding mask is not supported");if(s&&S.size(s.dims)>0){if(s.dims.length!==4)throw new Error('Input "attention_bias" is expected to have 4 dimensions');if(s.dims[0]!==c||s.dims[1]!==e.numHeads||s.dims[2]!==d||s.dims[3]!==b)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:c,sequenceLength:d,pastSequenceLength:h,kvSequenceLength:f,totalSequenceLength:b,maxSequenceLength:m,inputHiddenSize:0,hiddenSize:p,vHiddenSize:v,headSize:y,vHeadSize:Math.floor(v/e.numHeads),numHeads:e.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:e.maskFilterValue,maskType:x,scale:e.scale,broadcastResPosBias:I,passPastInKv:w,qkvFormat:g}},Xy=r=>J({...r}),Ky=J({perm:[0,2,1,3]}),R$=(r,e,n,t,o,i,a)=>{let s=[t,o,i],u=S.size(s),l=[{type:12,data:u},{type:12,data:a},{type:12,data:i}],c=d=>{let p=C("qkv_with_bias",e.dataType,s),f=A("qkv",e.dataType,s),h=A("bias",n.dataType,s),m=[{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}];return` + ${d.registerUniforms(m).declareVariables(f,h,p)} + ${d.mainStart()} + ${d.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; + + qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; + }`};return r.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:s,dataType:e.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:l}),getShaderSource:c},{inputs:[e,n],outputs:[-1]})[0]},io=(r,e,n,t,o,i,a,s)=>{let u=i;if(a&&S.size(a.dims)>0){if(t===1)throw new Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return u=R$(r,i,a,e,t,n*o,s),u=u.reshape([e,t,n,o]),n===1||t===1?u:r.compute(Fe(u,Ky.perm),{inputs:[u],outputs:[-1]})[0]}else return i.dims.length===3&&(u=i.reshape([e,t,n,o])),n===1||t===1?u:r.compute(Fe(u,Ky.perm),{inputs:[u],outputs:[-1]})[0]},Zy=(r,e)=>{let n=L$(r.inputs,e),t=r.inputs[0],o=it(r.inputs,1),i=it(r.inputs,2),a=it(r.inputs,3),s=it(r.inputs,4),u=it(r.inputs,5),l=it(r.inputs,6),c=it(r.inputs,7);if(t.dims.length===5)throw new Error("Packed QKV is not implemented");if(o?.dims.length===5)throw new Error("Packed KV is not implemented");let d=o&&i&&o.dims.length===4&&i.dims.length===4,p=io(r,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,t,a,0);if(d)return $r(r,p,o,i,s,void 0,l,c,u,n);if(!o||!i)throw new Error("key and value must be provided");let f=io(r,n.batchSize,n.numHeads,n.kvSequenceLength,n.headSize,o,a,n.hiddenSize),h=io(r,n.batchSize,n.numHeads,n.kvSequenceLength,n.vHeadSize,i,a,2*n.hiddenSize);$r(r,p,f,h,s,void 0,l,c,u,n)}});var N$,z$,M$,B$,gl,Jy,Qy,bl=$(()=>{"use strict";Z();ne();Ee();oe();N$=r=>{if(!r||r.length<1)throw new Error("too few inputs")},z$=(r,e)=>{let n=[],t=e.numOutputs;return r[1].dims[0]>0&&(r[1].getBigInt64Array().forEach(o=>n.push(Number(o))),t=n.length),J({numOutputs:t,axis:e.axis,splitSizes:n})},M$=r=>` +fn calculateOutputIndex(index: u32) -> u32 { + for (var i: u32 = 0u; i < ${r}u; i += 1u ) { + if (index < ${M("uniforms.size_in_split_axis","i",r)}) { + return i; + } + } + return ${r}u; +}`,B$=r=>{let e=r.length,n=[];for(let t=0;t{let n=r[0].dims,t=S.size(n),o=r[0].dataType,i=S.normalizeAxis(e.axis,n.length),a=new Array(e.numOutputs),s=A("input",o,n.length),u=new Array(e.numOutputs),l=[],c=[],d=0,p=[{type:12,data:t}];for(let h=0;h` + ${h.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",u.length).declareVariables(s,...a)} + ${M$(u.length)} + ${B$(a)} + + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} + + var indices = ${s.offsetToIndices("global_idx")}; + var index = ${s.indicesGet("indices",i)}; + let output_number = calculateOutputIndex(index); + if (output_number != 0) { + index -= ${M("uniforms.size_in_split_axis","output_number - 1u",u.length)}; + ${s.indicesSet("indices",i,"index")}; + } + writeBufferData(output_number, indices, global_idx); + }`;return{name:"Split",shaderCache:{hint:e.cacheKey,inputDependencies:["rank"]},getShaderSource:f,getRunData:()=>({outputs:l,dispatchGroup:{x:Math.ceil(t/64)},programUniforms:p})}},Jy=(r,e)=>{N$(r.inputs);let n=r.inputs.length===1?e:z$(r.inputs,e);r.compute(gl(r.inputs,n),{inputs:[0]})},Qy=r=>{let e=r.axis,n=r.splitSizes,t=r.numOutputs<0?n.length:r.numOutputs;if(t!==n.length)throw new Error("numOutputs and splitSizes length must be equal");return J({axis:e,numOutputs:t,splitSizes:n})}});var V$,Yi,Yy,yl=$(()=>{"use strict";Z();ne();Ee();oe();V$=(r,e)=>{let[n,t,o,i]=r,{numHeads:a,rotaryEmbeddingDim:s}=e;if(n.dims.length!==3&&n.dims.length!==4)throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${n.dims.length}`);if(!S.areEqual(t.dims,[])&&!S.areEqual(t.dims,[1])&&t.dims.length!==2)throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${t.dims.length}`);if(o.dims.length!==2)throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${o.dims.length}`);if(i.dims.length!==2)throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${i.dims.length}`);if(!S.areEqual(o.dims,i.dims))throw new Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(s>0&&a===0)throw new Error("num_heads must be provided if rotary_embedding_dim is specified");let u=n.dims[0],l=n.dims[n.dims.length-2],c=o.dims[0],d=S.sizeFromDimension(n.dims,1)/l,p=s===0?o.dims[1]*2:d/a;if(s>p)throw new Error("rotary_embedding_dim must be less than or equal to head_size");if(t.dims.length===2){if(u!==t.dims[0])throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${t.dims[0]}`);if(l!==t.dims[1])throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${t.dims[1]}`)}if(p/2!==o.dims[1]&&s/2!==o.dims[1])throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${o.dims[1]}`);if(l>c)throw new Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},Yi=(r,e)=>{let{interleaved:n,numHeads:t,rotaryEmbeddingDim:o,scale:i}=e,a=r[0].dims[0],s=S.sizeFromDimension(r[0].dims,1),u=r[0].dims[r[0].dims.length-2],l=s/u,c=r[2].dims[1],d=o===0?c*2:l/t,p=new Array(a,u,l/d,d-c),f=S.computeStrides(p),h=[{type:1,data:i},{type:12,data:p},{type:12,data:f},...r[0].dims.length===3?new Array({type:12,data:[s,l,d,1]}):[],...r[0].dims.length===4?new Array({type:12,data:[s,d,u*d,1]}):[],...k(r[0].dims,r[1].dims,r[2].dims,r[3].dims,r[0].dims)],m=y=>{let g=A("input",r[0].dataType,r[0].dims.length),b=A("position_ids",r[1].dataType,r[1].dims.length),x=A("cos_cache",r[2].dataType,r[2].dims.length),w=A("sin_cache",r[3].dataType,r[3].dims.length),v=C("output",r[0].dataType,r[0].dims.length);return y.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:p.length},{name:"global_strides",type:"u32",length:f.length},{name:"input_output_strides",type:"u32",length:f.length}]),` + ${y.declareVariables(g,b,x,w,v)} + + ${y.mainStart(ur)} + let half_rotary_emb_dim = uniforms.${x.name}_shape[1]; + let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape; + let size = uniforms.global_shape[0] * uniforms.global_strides[0]; + ${y.guardAgainstOutOfBoundsWorkgroupSizes("size")} + + if (bsnh[3] < half_rotary_emb_dim) { + let position_ids_idx = + ${b.broadcastedIndicesToOffset("bsnh.xy",C("",b.type.tensor,2))}; + let position_id = + u32(${b.getByOffset("position_ids_idx")}) + select(0, bsnh[1], position_ids_idx == 0); + let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${n}); + let j = i + select(half_rotary_emb_dim, 1, ${n}); + let re = ${g.getByOffset("i")} * ${x.get("position_id","bsnh[3]")} - + ${g.getByOffset("j")} * ${w.get("position_id","bsnh[3]")}; + ${v.setByOffset("i","re")} + let im = ${g.getByOffset("i")} * ${w.get("position_id","bsnh[3]")} + + ${g.getByOffset("j")} * ${x.get("position_id","bsnh[3]")}; + ${v.setByOffset("j","im")} + } else { + let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; + ${v.setByOffset("k",g.getByOffset("k"))} + } + }`};return{name:"RotaryEmbedding",shaderCache:{hint:J({interleaved:n}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:m,getRunData:()=>({outputs:[{dims:r[0].dims,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(S.size(p)/ur)},programUniforms:h})}},Yy=(r,e)=>{V$(r.inputs,e),r.compute(Yi(r.inputs,e))}});var F$,G$,e_,U$,t_,n_=$(()=>{"use strict";Ee();Z();Ui();ml();bl();An();yl();oe();F$=(r,e)=>{if(e.doRotary&&r.length<=7)throw new Error("cos_cache and sin_cache inputs are required if do_rotary is specified");let n=r[0],t=r[1],o=r[2],i=r[3],a=r[4];if(e.doRotary!==0&&r.length<=7)throw new Error("cos_cast and sin_cache are expected if do_rotary attribute is non-zero");if(e.localWindowSize!==-1)throw new Error("Local attention is not supported");if(e.softcap!==0)throw new Error("Softcap is not supported");if(e.rotaryInterleaved!==0)throw new Error("Rotary interleaved is not supported");if(e.smoothSoftmax)throw new Error("Smooth softmax is not supported");if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let s=!1,u=n.dims[0],l=n.dims[1],c=n.dims.length===3?s?n.dims[2]/3:n.dims[2]:e.numHeads*n.dims[4],d=l,p=0,f=!t||t.dims.length===0,h=Math.floor(f?c/(e.numHeads+2*e.kvNumHeads):c/e.numHeads);f&&(c=h*e.numHeads);let m=i&&i.dims.length!==0,y=a&&a.dims.length!==0;if(m&&i.dims.length===4&&i.dims[0]===u&&i.dims[1]!==e.kvNumHeads&&i.dims[2]===e.kvNumHeads&&i.dims[3]===h)throw new Error("BSNH pastKey/pastValue is not supported");if(m&&y){if(i.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(a.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');p=i.dims[2]}else if(m||y)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let b=1;if(t&&t.dims.length>0){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(t.dims.length<3||t.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==t.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(t.dims.length===3){if(n.dims[2]%t.dims[2]!==0)throw new Error('Dimension 2 of "query" should be a multiple of "key"');d=t.dims[1]}else if(t.dims.length===5){if(t.dims[2]!==e.numHeads||t.dims[3]!==2||t.dims[4]!==h)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');d=t.dims[1]}else{if(t.dims[1]!==e.numHeads||t.dims[3]!==h)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');d=t.dims[2]}}else{if(n.dims.length!==3&&n.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(n.dims.length===5&&(n.dims[2]!==e.numHeads||n.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');b=3}let x=0,w=!1,v=e.kvNumHeads?h*e.kvNumHeads:c;if(o&&o.dims.length>0){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(d!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');v=o.dims[2]}else{if(d!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');v=o.dims[1]*o.dims[3],w=!0}}let I=r.length>4?r[5]:void 0;if(I&&I.dims.length!==1&&I.dims[0]!==u)throw new Error('Input "seqlens" is expected to have 1 dimension and the same dim 0 as batch_size');return{batchSize:u,sequenceLength:l,pastSequenceLength:p,kvSequenceLength:d,totalSequenceLength:-1,maxSequenceLength:-1,inputHiddenSize:0,hiddenSize:c,vHiddenSize:v,headSize:h,vHeadSize:Math.floor(v/e.kvNumHeads),numHeads:e.numHeads,kvNumHeads:e.kvNumHeads,nReps:e.numHeads/e.kvNumHeads,pastPresentShareBuffer:!1,maskType:x,scale:e.scale,broadcastResPosBias:!1,passPastInKv:w,qkvFormat:b}},G$=J({perm:[0,2,1,3]}),e_=(r,e,n)=>{let t=e,o=n.kvNumHeads;return e.dims.length===3&&n.kvSequenceLength!==0&&(t=e.reshape([n.batchSize,n.kvSequenceLength,o,n.headSize]),t=r.compute(Fe(t,G$.perm),{inputs:[t],outputs:[-1]})[0]),t},U$=(r,e,n,t)=>{let o=7,i=["type","type"],a=[r*e],s=r*e,u=[{type:12,data:s},{type:12,data:e},{type:12,data:r}],l=c=>{let d=A("seq_lens",n.dataType,n.dims),p=A("total_seq_lens",t.dataType,t.dims),f=C("pos_ids",o,a),h=[{name:"output_size",type:"u32"},{name:"sequence_length",type:"u32"},{name:"batch_size",type:"u32"}];return` + ${c.registerUniforms(h).declareVariables(d,p,f)} + ${c.mainStart()} + ${c.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let total_sequence_length = u32(${p.getByOffset("0")}); + let is_subsequent_prompt = uniforms.sequence_length > 1 && uniforms.sequence_length != total_sequence_length; + let is_first_prompt = !is_subsequent_prompt && uniforms.sequence_length == total_sequence_length; + let batch_idx = global_idx / uniforms.sequence_length; + let sequence_idx = i32(global_idx % uniforms.sequence_length); + var pos_id: i32 = 0; + let seqlen = ${d.getByOffset("batch_idx")}; + let total_seqlen = seqlen + 1; + if (is_first_prompt) { + if (sequence_idx < total_seqlen) { + pos_id = sequence_idx; + } else { + pos_id = 1; + } + ${f.setByOffset("global_idx","pos_id")} + } else if (is_subsequent_prompt) { + let past_seqlen = total_seqlen - i32(uniforms.sequence_length); + if (past_seqlen + sequence_idx < total_seqlen) { + pos_id = past_seqlen + sequence_idx; + } else { + pos_id = 1; + } + ${f.setByOffset("global_idx","pos_id")} + } else if (global_idx < uniforms.batch_size) { + ${f.setByOffset("global_idx","seqlen")} + }; + } + `};return{name:"GeneratePositionIds",shaderCache:{hint:`${r};${e}`,inputDependencies:i},getRunData:()=>({outputs:[{dims:a,dataType:o}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:u}),getShaderSource:l}},t_=(r,e)=>{let n=F$(r.inputs,e);if(r.inputs[0].dims.length===5)throw new Error("Packed QKV is not implemented");if(r.inputs[1]?.dims.length===5)throw new Error("Packed KV is not implemented");let t=r.inputs[0],o=r.inputs[1]&&r.inputs[1].dims.length>0?r.inputs[1]:void 0,i=r.inputs[2]&&r.inputs[2].dims.length>0?r.inputs[2]:void 0,a=r.inputs[3]&&r.inputs[3].dims.length!==0?r.inputs[3]:void 0,s=r.inputs[4]&&r.inputs[4].dims.length!==0?r.inputs[4]:void 0,u=r.inputs.length>4?r.inputs[5]:void 0,l=r.inputs.length>5?r.inputs[6]:void 0,c=n.kvNumHeads?n.kvNumHeads:n.numHeads,d=J({axis:2,numOutputs:3,splitSizes:[n.numHeads*n.headSize,c*n.headSize,c*n.headSize]}),[p,f,h]=!o&&!i?r.compute(gl([t],d),{inputs:[t],outputs:[-1,-1,-1]}):[t,o,i],m,y;if(e.doRotary){let w=r.compute(U$(n.batchSize,n.sequenceLength,u,l),{inputs:[u,l],outputs:[-1]})[0],v=r.inputs[7],I=r.inputs[8],P=J({interleaved:e.rotaryInterleaved!==0,numHeads:n.numHeads,rotaryEmbeddingDim:0,scale:e.scale}),O=[p,w,v,I],E=[-1];m=r.compute(Yi(O,P),{inputs:O,outputs:E})[0],O.splice(0,1,f);let R=J({interleaved:e.rotaryInterleaved!==0,numHeads:n.kvNumHeads,rotaryEmbeddingDim:0,scale:e.scale});y=r.compute(Yi(O,R),{inputs:O,outputs:E})[0]}let g=io(r,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,e.doRotary?m:p,void 0,0),b=e_(r,e.doRotary?y:f,n),x=e_(r,h,n);$r(r,g,b,x,void 0,void 0,a,s,void 0,n,u,l)}});var r_,W$,H$,o_,i_=$(()=>{"use strict";Z();ne();An();oe();r_=(r,e,n,t,o,i,a,s)=>{let u=he(i),l=u===1?"f32":`vec${u}f`,c=u===1?"vec2f":`mat2x${u}f`,d=o*a,p=64;d===1&&(p=256);let f=[o,a,i/u],h=[o,a,2],m=["rank","type","type"],y=[];y.push(...k(f,h));let g=b=>{let x=A("x",e.dataType,3,u),w=A("scale",n.dataType,n.dims),v=A("bias",t.dataType,t.dims),I=C("output",1,3,2),P=[x,w,v,I];return` + var workgroup_shared : array<${c}, ${p}>; + const workgroup_size = ${p}u; + ${b.declareVariables(...P)} + ${b.mainStart(p)} + let batch = workgroup_index / uniforms.x_shape[1]; + let channel = workgroup_index % uniforms.x_shape[1]; + let hight = uniforms.x_shape[2]; + // initialize workgroup memory + var sum = ${l}(0); + var squared_sum = ${l}(0); + for (var h = local_idx; h < hight; h += workgroup_size) { + let value = ${l}(${x.get("batch","channel","h")}); + sum += value; + squared_sum += value * value; + } + workgroup_shared[local_idx] = ${c}(sum, squared_sum); + workgroupBarrier(); + + for (var currSize = workgroup_size >> 1; currSize > 0; currSize = currSize >> 1) { + if (local_idx < currSize) { + workgroup_shared[local_idx] = workgroup_shared[local_idx] + workgroup_shared[local_idx + currSize]; + } + workgroupBarrier(); + } + if (local_idx == 0) { + let sum_final = ${$t("workgroup_shared[0][0]",u)} / f32(hight * ${u}); + let squared_sum_final = ${$t("workgroup_shared[0][1]",u)} / f32(hight * ${u}); + + let inv_std_dev = inverseSqrt(squared_sum_final - sum_final * sum_final + f32(${s})); + let channel_scale = inv_std_dev * f32(scale[channel]); + let channel_shift = f32(bias[channel]) - sum_final * channel_scale; + output[workgroup_index] = vec2f(channel_scale, channel_shift); + } + }`};return r.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${u};${s};${p}`,inputDependencies:m},getRunData:()=>({outputs:[{dims:h,dataType:1}],dispatchGroup:{x:d},programUniforms:y}),getShaderSource:g},{inputs:[e,n,t],outputs:[-1]})[0]},W$=(r,e,n)=>{let t=e[0].dims,o=t,i=2,a=t[0],s=t[1],u=S.sizeFromDimension(t,i),l=he(u),c=S.size(o)/l,d=r_(r,e[0],e[1],e[2],a,u,s,n.epsilon),p=[a,s,u/l],f=[a,s],h=["type","none"],m=y=>{let g=A("x",e[0].dataType,p.length,l),b=A("scale_shift",1,f.length,2),x=C("output",e[0].dataType,p.length,l),w=[g,b,x];return` + ${y.registerUniform("output_size","u32").declareVariables(...w)} + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let outputIndices = ${x.offsetToIndices("global_idx")}; + let batch = outputIndices[0]; + let channel = outputIndices[1]; + let scale_shift = ${b.getByIndices("vec2(batch, channel)")}; + let value = ${g.getByOffset("global_idx")} * ${x.type.value}(scale_shift.x) + ${x.type.value}(scale_shift.y); + ${x.setByOffset("global_idx","value")}; + }`};r.compute({name:"InstanceNormalization",shaderCache:{hint:`${l}`,inputDependencies:h},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:[{type:12,data:c},...k(p,f,p)]}),getShaderSource:m},{inputs:[e[0],d]})},H$=(r,e,n)=>{let t=e[0].dims,o=t,i=t[0],a=t[t.length-1],s=S.sizeFromDimension(t,1)/a,u=he(a),l=S.size(o)/u,c=[{type:12,data:s},{type:12,data:Math.floor(a/u)}],d=["type","type"],p=!1,f=[0,t.length-1];for(let g=0;gt[f[b]])),m=r_(r,h,e[1],e[2],i,s,a,n.epsilon),y=g=>{let b=ve(e[0].dataType),x=u===1?"vec2f":`mat${u}x2f`,w=P=>{let O=P===0?"x":"y",E=u===1?"f32":`vec${u}f`;switch(u){case 1:return`${b}(${E}(scale.${O}))`;case 2:return`vec2<${b}>(${E}(scale[0].${O}, scale[1].${O}))`;case 4:return`vec4<${b}>(${E}(scale[0].${O}, scale[1].${O}, scale[2].${O}, scale[3].${O}))`;default:throw new Error(`Not supported compoents ${u}`)}},v=A("input",e[0].dataType,e[0].dims,u),I=C("output",e[0].dataType,o,u);return` + @group(0) @binding(0) var input : array<${v.type.storage}>; + @group(0) @binding(1) var scale_input : array<${x}>; + @group(0) @binding(2) var output : array<${I.type.storage}>; + struct Uniforms {H: u32, C : u32}; + @group(0) @binding(3) var uniforms: Uniforms; + + ${g.mainStart()} + let current_image_number = global_idx / (uniforms.C * uniforms.H); + let current_channel_number = global_idx % uniforms.C; + + let scale_offset = current_image_number * uniforms.C + current_channel_number; + let scale = scale_input[scale_offset]; + output[global_idx] = fma(input[global_idx], ${w(0)}, ${w(1)}); + }`};r.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${u}`,inputDependencies:d},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:c}),getShaderSource:y},{inputs:[e[0],m]})},o_=(r,e)=>{e.format==="NHWC"?H$(r,r.inputs,e):W$(r,r.inputs,e)}});var q$,j$,a_,s_=$(()=>{"use strict";Z();ne();oe();q$=r=>{if(!r||r.length<2)throw new Error("layerNorm requires at least 2 inputs.")},j$=(r,e,n)=>{let t=e.simplified,o=r[0].dims,i=r[1],a=!t&&r[2],s=o,u=S.normalizeAxis(e.axis,o.length),l=S.sizeToDimension(o,u),c=S.sizeFromDimension(o,u),d=S.size(i.dims),p=a?S.size(a.dims):0;if(d!==c||a&&p!==c)throw new Error(`Size of X.shape()[axis:] == ${c}. + Size of scale and bias (if provided) must match this. + Got scale size of ${d} and bias size of ${p}`);let f=[];for(let v=0;v1,b=n>2,x=v=>{let I=ve(r[0].dataType),P=[A("x",r[0].dataType,r[0].dims,h),A("scale",i.dataType,i.dims,h)];a&&P.push(A("bias",a.dataType,a.dims,h)),P.push(C("output",r[0].dataType,s,h)),g&&P.push(C("mean_data_output",1,f)),b&&P.push(C("inv_std_output",1,f));let O=[{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}];return` + ${v.registerUniforms(O).declareVariables(...P)} + ${v.mainStart()} + ${v.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.norm_count")} + let offset = global_idx * uniforms.norm_size_vectorized; + var mean_vector = ${el("f32",h)}; + var mean_square_vector = ${el("f32",h)}; + + for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) { + let value = ${lr(I,h,"x[h + offset]")}; + mean_vector += value; + mean_square_vector += value * value; + } + let mean = ${$t("mean_vector",h)} / uniforms.norm_size; + let inv_std_dev = inverseSqrt(${$t("mean_square_vector",h)} / uniforms.norm_size ${t?"":"- mean * mean"} + uniforms.epsilon); + + for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) { + let f32input = ${lr(I,h,"x[j + offset]")}; + let f32scale = ${lr(I,h,"scale[j]")}; + output[j + offset] = ${P[0].type.value}((f32input ${t?"":"- mean"}) * inv_std_dev * f32scale + ${a?`+ ${lr(I,h,"bias[j]")}`:""} + ); + } + + ${g?"mean_data_output[global_idx] = mean":""}; + ${b?"inv_std_output[global_idx] = inv_std_dev":""}; + }`},w=[{dims:s,dataType:r[0].dataType}];return g&&w.push({dims:f,dataType:1}),b&&w.push({dims:f,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${h};${n};${t}`,inputDependencies:m},getRunData:()=>({outputs:w,dispatchGroup:{x:Math.ceil(l/64)},programUniforms:y}),getShaderSource:x}},a_=(r,e)=>{q$(r.inputs),r.compute(j$(r.inputs,e,r.outputCount))}});var K$,u_,l_=$(()=>{"use strict";ne();Xi();Zi();K$=r=>{if(!r||r.length!==2)throw new Error("MatMul requires 2 inputs.");if(r[0].dims[r[0].dims.length-1]!==r[1].dims[r[1].dims.length-2])throw new Error("shared dimension does not match.")},u_=r=>{K$(r.inputs);let e=gn.calcShape(r.inputs[0].dims,r.inputs[1].dims,!0);if(!e)throw new Error("Can't use matmul on the given tensors");let n=e[e.length-1],t=r.inputs[0].dims[r.inputs[0].dims.length-1];if(n<8&&t<8)r.compute(Ki(r.inputs,{activation:""},e));else{let o=e[e.length-2],i=S.size(r.inputs[0].dims.slice(0,-2)),a=S.size(r.inputs[1].dims.slice(0,-2));if(i!==1&&o===1&&a===1){let s=r.inputs[0].reshape([1,i,t]),u=r.inputs[1].reshape([1,t,n]),l=[1,i,n],c=[s,u];r.compute(oo(c,{activation:""},e,l),{inputs:c})}else r.compute(oo(r.inputs,{activation:""},e))}}});var X$,Z$,J$,c_,d_,p_=$(()=>{"use strict";Z();ne();Ee();oe();X$=(r,e)=>{if(r.length<3||r.length>4)throw new Error("MatMulNBits requires 3 or 4 inputs");let n=r[0],t=n.dims.length;if(n.dims[t-1]!==e.k)throw new Error("The last dim of input shape does not match the k value");let o=Math.floor((e.k+e.blockSize-1)/e.blockSize),i=e.blockSize/8*e.bits,a=r[1];if(!S.areEqual(a.dims,[e.n,o,i]))throw new Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let u=r[2].dims;if(S.size(u)!==e.n*o)throw new Error("scales input size error.");if(r.length===4){let c=r[3].dims,d=e.n*(e.bits===8?o:Math.floor((o*e.bits+7)/8));if(S.size(c)!==d)throw new Error("zeroPoints input size error.")}},Z$=(r,e)=>{let n=r[0].dims,t=n.length,o=n[t-2],i=e.k,a=e.n,s=n.slice(0,t-2),u=S.size(s),c=r[1].dims[2]/4,d=r[0].dataType,p=he(e.k),f=he(c),h=he(a),m=s.concat([o,a]),y=o>1&&a/h%2===0?2:1,g=S.size(m)/h/y,b=64,x=[],w=[u,o,i/p],v=S.convertShape(r[1].dims).slice();v.splice(-1,1,c/f),x.push(...k(w)),x.push(...k(v)),x.push(...k(r[2].dims)),r.length===4&&x.push(...k(S.convertShape(r[3].dims)));let I=[u,o,a/h];x.push(...k(I));let P=O=>{let E=w.length,R=A("a",r[0].dataType,E,p),q=A("b",12,v.length,f),B=A("scales",r[2].dataType,r[2].dims.length),W=[R,q,B],ae=r.length===4?A("zero_points",12,r[3].dims.length):void 0;ae&&W.push(ae);let F=I.length,U=C("output",r[0].dataType,F,h),K=ve(r[0].dataType),Q=(()=>{switch(p){case 1:return`array<${K}, 8>`;case 2:return`mat4x2<${K}>`;case 4:return`mat2x4<${K}>`;default:throw new Error(`${p}-component is not supported.`)}})(),Y=()=>{let Me=` + // reuse a data + var input_offset = ${R.indicesToOffset(`${R.type.indices}(batch, row, word_offset)`)}; + var a_data: ${Q}; + for (var j: u32 = 0; j < ${8/p}; j++) { + a_data[j] = ${R.getByOffset("input_offset")}; + input_offset++; + } + `;for(let te=0;te> 4) & b_mask); + b_quantized_values = ${Q}(${Array.from({length:4},(D,X)=>`${K}(b_value_lower[${X}]), ${K}(b_value_upper[${X}])`).join(", ")}); + b_dequantized_values = ${p===1?`${Q}(${Array.from({length:8},(D,X)=>`(b_quantized_values[${X}] - ${ae?`zero_point${te}`:"zero_point"}) * scale${te}`).join(", ")});`:`(b_quantized_values - ${Q}(${Array(8).fill(`${ae?`zero_point${te}`:"zero_point"}`).join(",")})) * scale${te};`}; + workgroup_shared[local_id.x * ${y} + ${Math.floor(te/h)}]${h>1?`[${te%h}]`:""} += ${Array.from({length:8/p},(D,X)=>`${p===1?`a_data[${X}] * b_dequantized_values[${X}]`:`dot(a_data[${X}], b_dequantized_values[${X}])`}`).join(" + ")}; + `;return Me},ue=()=>{let Me=` + var col_index = col * ${h}; + ${ae?` + let zero_point_bytes_per_col = (nBlocksPerCol + 1) / 2; + var zero_point_byte_count: u32; + var zero_point_word_index: u32; + var zero_point_byte_offset: u32; + let zero_point_nibble_offset: u32 = block & 0x1u; + var zero_point_bits_offset: u32; + var zero_point_word: u32;`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${K}(8);`} + `;for(let te=0;te> 0x1u); + zero_point_word_index = zero_point_byte_count >> 0x2u; + zero_point_byte_offset = zero_point_byte_count & 0x3u; + zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + zero_point_word = ${ae.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point${te} = ${K}((zero_point_word) & 0xFu);`:""} + col_index += 1;`;return Me},Ie=()=>{let Me=`col_index = col * ${h};`;for(let te=0;te; + var b_value_upper: vec4; + var b_quantized_values: ${Q}; + var b_dequantized_values: ${Q};`,Me};return` + var workgroup_shared: array<${U.type.value}, ${y*b}>; + ${O.declareVariables(...W,U)} + ${O.mainStart([b,1,1])} + let output_indices = ${U.offsetToIndices(`(global_idx / ${b}) * ${y}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let nBlocksPerCol = uniforms.b_shape[1]; + + for (var block = local_id.x; block < nBlocksPerCol; block += ${b}) { + //process one block + var word_offset: u32 = block * ${e.blockSize/p}; + ${ue()} + for (var word: u32 = 0; word < ${c}; word += ${f}) { + ${Ie()} + for (var i: u32 = 0; i < ${f}; i++) { + ${Y()} + word_offset += ${8/p}; + } + } + } + workgroupBarrier(); + + if (local_id.x < ${y}) { + var output_value: ${U.type.value} = ${U.type.value}(0); + var workgroup_shared_offset: u32 = local_id.x; + for (var b: u32 = 0u; b < ${b}u; b++) { + output_value += workgroup_shared[workgroup_shared_offset]; + workgroup_shared_offset += ${y}; + } + ${U.setByIndices(`${U.type.indices}(batch, row, col + local_id.x)`,"output_value")}; + } + }`};return{name:"MatMulNBits",shaderCache:{hint:`${e.blockSize};${e.bits};${p};${f};${h};${y};${b}`,inputDependencies:Array(r.length).fill("rank")},getRunData:()=>({outputs:[{dims:m,dataType:d}],dispatchGroup:{x:g},programUniforms:x}),getShaderSource:P}},J$=(r,e)=>{let n=r[0].dims,t=n.length,o=n[t-2],i=e.k,a=e.n,s=n.slice(0,t-2),u=S.size(s),c=r[1].dims[2]/4,d=r[0].dataType,p=he(e.k),f=he(c),h=s.concat([o,a]),m=128,y=a%8===0?8:a%4===0?4:1,g=m/y,b=g*f*8,x=b/p,w=b/e.blockSize,v=S.size(h)/y,I=[],P=[u,o,i/p],O=S.convertShape(r[1].dims).slice();O.splice(-1,1,c/f),I.push(...k(P)),I.push(...k(O)),I.push(...k(r[2].dims)),r.length===4&&I.push(...k(S.convertShape(r[3].dims)));let E=[u,o,a];I.push(...k(E));let R=q=>{let B=P.length,W=A("a",r[0].dataType,B,p),ae=A("b",12,O.length,f),F=A("scales",r[2].dataType,r[2].dims.length),U=[W,ae,F],K=r.length===4?A("zero_points",12,r[3].dims.length):void 0;K&&U.push(K);let Q=E.length,Y=C("output",r[0].dataType,Q),ue=ve(r[0].dataType),Ie=()=>{switch(p){case 1:return` + let a_data0 = vec4<${ue}>(sub_a[word_offset], sub_a[word_offset + 1], sub_a[word_offset + 2], sub_a[word_offset + 3]); + let a_data1 = vec4<${ue}>(sub_a[word_offset + 4], sub_a[word_offset + 5], sub_a[word_offset + 6], sub_a[word_offset + 7]);`;case 2:return` + let a_data0 = vec4<${ue}>(sub_a[word_offset], sub_a[word_offset + 1]); + let a_data1 = vec4<${ue}>(sub_a[word_offset + 2], sub_a[word_offset + 3]);`;case 4:return` + let a_data0 = sub_a[word_offset]; + let a_data1 = sub_a[word_offset + 1];`;default:throw new Error(`${p}-component is not supported.`)}};return` + var sub_a: array<${W.type.value}, ${x}>; + var inter_results: array, ${y}>; + ${q.declareVariables(...U,Y)} + ${q.mainStart([g,y,1])} + let output_indices = ${Y.offsetToIndices(`workgroup_index * ${y}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let n_blocks_per_col = uniforms.b_shape[1]; + let num_tiles = (n_blocks_per_col - 1) / ${w} + 1; + + // Loop over shared dimension. + for (var tile: u32 = 0; tile < num_tiles; tile += 1) { + let a_col_start = tile * ${x}; + // load one tile A data into shared memory. + for (var a_offset = local_idx; a_offset < ${x}; a_offset += ${m}) + { + let a_col = a_col_start + a_offset; + if (a_col < uniforms.a_shape[2]) + { + sub_a[a_offset] = ${W.getByIndices(`${W.type.indices}(batch, row, a_col)`)}; + } else { + sub_a[a_offset] = ${W.type.value}(0); + } + } + workgroupBarrier(); + + // each thread process one block + let b_row = col + local_id.y; + let block = tile * ${w} + local_id.x; + ${K?` + let zero_point_bytes_per_col = (n_blocks_per_col + 1) / 2; + let zero_point_byte_count = b_row * zero_point_bytes_per_col + (block >> 0x1u); + let zero_point_word_index = zero_point_byte_count >> 0x2u; + let zero_point_byte_offset = zero_point_byte_count & 0x3u; + let zero_point_nibble_offset: u32 = block & 0x1u; + let zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + let zero_point_word = ${K.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point = ${ue}((zero_point_word) & 0xFu);`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${ue}(8);`} + let scale = ${F.getByOffset("b_row * n_blocks_per_col + block")}; + let b_data = ${ae.getByIndices(`${ae.type.indices}(b_row, block, 0)`)}; + var word_offset = local_id.x * ${e.blockSize/p}; + for (var i: u32 = 0; i < ${f}; i++) { + ${Ie()} + let b_value = ${f===1?"b_data":"b_data[i]"}; + let b_value_lower = unpack4xU8(b_value & 0x0F0F0F0Fu); + let b_value_upper = unpack4xU8((b_value >> 4) & 0x0F0F0F0Fu); + let b_quantized_values = mat2x4<${ue}>(${Array.from({length:4},(Me,te)=>`${ue}(b_value_lower[${te}]), ${ue}(b_value_upper[${te}])`).join(", ")}); + let b_dequantized_values = (b_quantized_values - mat2x4<${ue}>(${Array(8).fill("zero_point").join(",")})) * scale; + inter_results[local_id.y][local_id.x] += ${Array.from({length:2},(Me,te)=>`${`dot(a_data${te}, b_dequantized_values[${te}])`}`).join(" + ")}; + word_offset += ${8/p}; + } + workgroupBarrier(); + } + + if (local_idx < ${y}) { + var output_value: ${Y.type.value} = ${Y.type.value}(0); + for (var b = 0u; b < ${g}; b++) { + output_value += inter_results[local_idx][b]; + } + if (col + local_idx < uniforms.output_shape[2]) + { + ${Y.setByIndices(`${Y.type.indices}(batch, row, col + local_idx)`,"output_value")} + } + } + }`};return{name:"BlockwiseMatMulNBits32",shaderCache:{hint:`${e.blockSize};${p};${f};${g};${y}`,inputDependencies:Array(r.length).fill("rank")},getRunData:()=>({outputs:[{dims:h,dataType:d}],dispatchGroup:{x:v},programUniforms:I}),getShaderSource:R}},c_=(r,e)=>{X$(r.inputs,e),e.blockSize===32&&r.adapterInfo.isVendor("intel")&&r.adapterInfo.isArchitecture("gen-12lp")?r.compute(J$(r.inputs,e)):r.compute(Z$(r.inputs,e))},d_=r=>J(r)});var Q$,Y$,eA,tA,nA,rA,oA,iA,f_,h_=$(()=>{"use strict";Z();ne();oe();Q$=r=>{if(!r||r.length<1)throw new Error("Too few inputs");if(r[0].dataType!==1&&r[0].dataType!==10)throw new Error("Input type must be float or float16.");if(r.length>=2){let e=r[0].dims.length*2===r[1].dims[0];if(r.length===4&&(e=r[3].dims[0]*2===r[1].dims[0]),!e)throw new Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},Y$=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` + k = i32(${r.indicesGet("indices",o)}) - ${M("uniforms.pads",o,n)}; + if (k < 0) { + break; + } + if (k >= i32(${M("uniforms.x_shape",o,e)})) { + break; + } + offset += k * i32(${M("uniforms.x_strides",o,e)}); + `;return` + value = ${r.type.value}(uniforms.constant_value); + for (var i = 0; i < 1; i++) { + var offset = 0; + var k = 0; + ${t} + value = x[offset]; + } + `},eA=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` + k = i32(${r.indicesGet("indices",o)}) - ${M("uniforms.pads",o,n)}; + if (k < 0) { + k = -k; + } + { + let _2n_1 = 2 * (i32(${M("uniforms.x_shape",o,e)}) - 1); + k = k % _2n_1; + if(k >= i32(${M("uniforms.x_shape",o,e)})) { + k = _2n_1 - k; + } + } + offset += k * i32(${M("uniforms.x_strides",o,e)}); + `;return` + var offset = 0; + var k = 0; + ${t} + value = x[offset]; + `},tA=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` + k = i32(${r.indicesGet("indices",o)}) - ${M("uniforms.pads",o,n)}; + if (k < 0) { + k = 0; + } + if (k >= i32(${M("uniforms.x_shape",o,e)})) { + k = i32(${M("uniforms.x_shape",o,e)}) - 1; + } + offset += k * i32(${M("uniforms.x_strides",o,e)}); + `;return` + var offset = 0; + var k = 0; + ${t} + value = x[offset]; + `},nA=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` + k = i32(${r.indicesGet("indices",o)}) - ${M("uniforms.pads",o,n)}; + if (k < 0) { + k += i32(${M("uniforms.x_shape",o,e)}]); + } + if (k >= i32(${M("uniforms.x_shape",o,e)})) { + k -= i32(${M("uniforms.x_shape",o,e)}); + } + offset += k * i32(${M("uniforms.x_strides",o,e)}); + `;return` + var offset = 0; + var k = 0; + ${t} + value = x[offset]; + `},rA=(r,e,n)=>{switch(n.mode){case 0:return Y$(r,e,n.pads.length);case 1:return eA(r,e,n.pads.length);case 2:return tA(r,e,n.pads.length);case 3:return nA(r,e,n.pads.length);default:throw new Error("Invalid mode")}},oA=(r,e)=>{let n=S.padShape(r[0].dims.slice(),e.pads),t=r[0].dims,o=S.size(n),i=[{type:12,data:o},{type:6,data:e.pads}],a=r.length>=3&&r[2].data;e.mode===0&&i.push({type:a?r[2].dataType:1,data:e.value}),i.push(...k(r[0].dims,n));let s=["rank"],u=l=>{let c=C("output",r[0].dataType,n.length),d=A("x",r[0].dataType,t.length),p=d.type.value,f=rA(c,t.length,e),h=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:e.pads.length}];return e.mode===0&&h.push({name:"constant_value",type:a?p:"f32"}),` + ${l.registerUniforms(h).declareVariables(d,c)} + ${l.mainStart()} + ${l.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${c.offsetToIndices("global_idx")}; + + var value = ${p}(0); + ${f} + output[global_idx] = value; + }`};return{name:"Pad",shaderCache:{hint:`${e.mode}${a}`,inputDependencies:s},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(S.size(n)/64)},programUniforms:i}),getShaderSource:u}},iA=(r,e)=>{if(r.length>1){let n=r[1].getBigInt64Array(),t=r.length>=3&&r[2].data?r[2].dataType===10?r[2].getUint16Array()[0]:r[2].getFloat32Array()[0]:0,o=r[0].dims.length,i=new Int32Array(2*o).fill(0);if(r.length>=4){let s=r[3].getBigInt64Array();for(let u=0;ui[Number(u)]=Number(s));let a=[];return i.forEach(s=>a.push(s)),{mode:e.mode,value:t,pads:a}}else return e},f_=(r,e)=>{Q$(r.inputs);let n=iA(r.inputs,e);r.compute(oA(r.inputs,n),{inputs:[0]})}});var ea,m_,g_,b_,y_,aA,sA,__,x_,w_,T_,v_,I_,S_,$_,A_,P_,O_,E_,C_=$(()=>{"use strict";qe();Z();ne();oe();ea=r=>{if(ee.webgpu.validateInputContent&&(!r||r.length!==1))throw new Error("Pool ops requires 1 input.")},m_=(r,e,n)=>{let t=e.format==="NHWC",o=r.dims.slice();t&&o.splice(1,0,o.pop());let i=Object.hasOwnProperty.call(e,"dilations"),a=e.kernelShape.slice(),s=e.strides.slice(),u=i?e.dilations.slice():[],l=e.pads.slice();sr.adjustPoolAttributes(n,o,a,s,u,l);let c=sr.computePoolOutputShape(n,o,s,u,a,l,e.autoPad),d=Object.assign({},e);i?Object.assign(d,{kernelShape:a,strides:s,pads:l,dilations:u,cacheKey:e.cacheKey}):Object.assign(d,{kernelShape:a,strides:s,pads:l,cacheKey:e.cacheKey});let p=c.slice();return p.push(p.splice(1,1)[0]),[d,t?p:c]},g_=(r,e)=>{let n=e.format==="NHWC",t=S.size(r),o=S.size(e.kernelShape),i=[{type:12,data:t},{type:12,data:o}],a=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(e.kernelShape.length<=2){let s=e.kernelShape[e.kernelShape.length-1],u=e.strides[e.strides.length-1],l=e.pads[e.pads.length/2-1],c=e.pads[e.pads.length-1],d=!!(l+c);i.push({type:12,data:s},{type:12,data:u},{type:12,data:l},{type:12,data:c}),a.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let p=!1;if(e.kernelShape.length===2){let f=e.kernelShape[e.kernelShape.length-2],h=e.strides[e.strides.length-2],m=e.pads[e.pads.length/2-2],y=e.pads[e.pads.length-2];p=!!(m+y),i.push({type:12,data:f},{type:12,data:h},{type:12,data:m},{type:12,data:y}),a.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[i,a,!0,d,p]}else{if(n)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let s=S.computeStrides(e.kernelShape);i.push({type:12,data:s},{type:12,data:e.pads},{type:12,data:e.strides}),a.push({name:"kernelStrides",type:"u32",length:s.length},{name:"pads",type:"u32",length:e.pads.length},{name:"strides",type:"u32",length:e.strides.length});let u=e.pads.reduce((l,c)=>l+c);return[i,a,!!u,!1,!1]}},b_=(r,e,n,t,o,i,a,s,u,l,c,d)=>{let p=o.format==="NHWC",f=e.type.value,h=C("output",e.type.tensor,t);if(o.kernelShape.length<=2){let m="",y="",g="",b=n-(p?2:1);if(c?m=` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${b}] = indices[${b}] * uniforms.sw - uniforms.pwStart + i; + if (xIndices[${b}] < 0 || xIndices[${b}] + >= uniforms.x_shape[${b}]) { + pad++; + continue; + } + let x_val = x[${e.indicesToOffset("xIndices")}]; + ${i} + }`:m=` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${b}] = indices[${b}] * uniforms.sw - uniforms.pwStart + i; + let x_val = x[${e.indicesToOffset("xIndices")}]; + ${i} + }`,o.kernelShape.length===2){let w=n-(p?3:2);d?y=` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${w}] = indices[${w}] * uniforms.sh - uniforms.phStart + j; + if (xIndices[${w}] < 0 || xIndices[${w}] >= uniforms.x_shape[${w}]) { + pad += i32(uniforms.kw); + continue; + } + `:y=` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${w}] = indices[${w}] * uniforms.sh - uniforms.phStart + j; + `,g=` + } + `}return` + ${r.registerUniforms(u).declareVariables(e,h)} + + ${r.mainStart()} + ${r.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let indices = ${h.offsetToIndices("global_idx")}; + var xIndices = ${h.offsetToIndices("global_idx")}; + + var value = ${f}(${s}); + var pad = 0; + ${y} + ${m} + ${g} + ${a} + + output[global_idx] = value; + }`}else{if(p)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let m=o.kernelShape.length,y=o.pads.length,g="";return l?g=` + if (xIndices[j] >= uniforms.x_shape[j]) { + pad++; + isPad = true; + break; + } + } + if (!isPad) { + let x_val = x[${e.indicesToOffset("xIndices")}]; + ${i} + }`:g=` + } + let x_val = x[${e.indicesToOffset("xIndices")}]; + ${i} + `,` + ${r.registerUniforms(u).declareVariables(e,h)} + + ${r.mainStart()} + ${r.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let indices = ${h.offsetToIndices("global_idx")}; + var xIndices = ${h.offsetToIndices("global_idx")}; + + var offsets: array; + + var value = ${f}(${s}); + var pad = 0; + var isPad = false; + + for (var i: u32 = 0u; i < uniforms.kernelSize; i++) { + var offset = i; + for (var j = 0u; j < ${m-1}u; j++) { + offsets[j] = offset / ${M("uniforms.kernelStrides","j",m)}; + offset -= offsets[j] * ${M("uniforms.kernelStrides","j",m)}; + } + offsets[${m-1}] = offset; + + isPad = false; + for (var j = ${n-m}u; j < ${n}u; j++) { + xIndices[j] = indices[j] * ${M("uniforms.strides",`j - ${n-m}u`,m)} + + offsets[j - ${n-m}u] - ${M("uniforms.pads","j - 2u",y)}; + ${g} + } + ${a} + + output[global_idx] = value; + }`}},y_=r=>`${r.format};${r.ceilMode};${r.autoPad};${r.kernelShape.length}`,aA=r=>`${y_(r)};${r.countIncludePad}`,sA=r=>`${y_(r)};${r.storageOrder};${r.dilations}`,__=r=>({format:r.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][r.auto_pad],ceilMode:r.ceil_mode,kernelShape:r.kernel_shape,strides:r.strides,pads:r.pads}),x_=(r,e,n,t)=>{let[o,i]=m_(e,t,n),a=A("x",e.dataType,e.dims.length),s=a.type.value,u="value += x_val;",l="";o.countIncludePad?l+=`value /= ${s}(uniforms.kernelSize);`:l+=`value /= ${s}(i32(uniforms.kernelSize) - pad);`;let[c,d,p,f,h]=g_(i,o);c.push(...k(e.dims,i));let m=["rank"];return{name:r,shaderCache:{hint:`${t.cacheKey};${p};${f};${h}`,inputDependencies:m},getRunData:()=>({outputs:[{dims:i,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(S.size(i)/64)},programUniforms:c}),getShaderSource:y=>b_(y,a,e.dims.length,i.length,o,u,l,0,d,p,f,h)}},w_=r=>{let e=r.count_include_pad!==0,n=__(r);if(n.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");let t={countIncludePad:e,...n,cacheKey:""};return{...t,cacheKey:aA(t)}},T_=(r,e)=>{ea(r.inputs),r.compute(x_("AveragePool",r.inputs[0],!1,e))},v_={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},I_=r=>{let e=r.format;return{format:e,...v_,cacheKey:e}},S_=(r,e)=>{ea(r.inputs),r.compute(x_("GlobalAveragePool",r.inputs[0],!0,e))},$_=(r,e,n,t)=>{let[o,i]=m_(e,t,n),a=` + value = max(x_val, value); + `,s="",u=A("x",e.dataType,e.dims.length),l=["rank"],[c,d,p,f,h]=g_(i,o);return c.push(...k(e.dims,i)),{name:r,shaderCache:{hint:`${t.cacheKey};${p};${f};${h}`,inputDependencies:l},getRunData:()=>({outputs:[{dims:i,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(S.size(i)/64)},programUniforms:c}),getShaderSource:m=>b_(m,u,e.dims.length,i.length,o,a,s,e.dataType===10?-65504:-1e5,d,p,f,h)}},A_=(r,e)=>{ea(r.inputs),r.compute($_("MaxPool",r.inputs[0],!1,e))},P_=r=>{let e=r.storage_order,n=r.dilations,t=__(r);if(e!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(t.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");let o={storageOrder:e,dilations:n,...t,cacheKey:""};return{...o,cacheKey:sA(o)}},O_=r=>{let e=r.format;return{format:e,...v_,cacheKey:e}},E_=(r,e)=>{ea(r.inputs),r.compute($_("GlobalMaxPool",r.inputs[0],!0,e))}});var lA,cA,D_,k_,L_=$(()=>{"use strict";Z();ne();Ee();oe();lA=(r,e)=>{if(r.length<2||r.length>3)throw new Error("DequantizeLinear requires 2 or 3 inputs.");if(r.length===3&&r[1].dims===r[2].dims)throw new Error("x-scale and x-zero-point must have the same shape.");if(r.length===3&&r[0].dataType!==r[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(r[0].dataType===6&&r.length>2)throw new Error("In the case of dequantizing int32 there is no zero point.");if(r[1].dims.length!==0&&r[1].dims.length!==1&&r[1].dims.length!==r[0].dims.length)throw new Error("scale input must be a scalar, a 1D tensor, or have the same rank as the input tensor.");if(r.length>2){if(r[0].dataType!==r[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(r[1].dims.length!==r[2].dims.length)throw new Error("scale and zero-point inputs must have the same rank.");if(!r[1].dims.map((n,t)=>n===r[2].dims[t]).reduce((n,t)=>n&&t,!0))throw new Error("scale and zero-point inputs must have the same shape.")}if(e.blockSize>0){if(r[1].dims.length===0||r[1].dims.length===1&&r[1].dims[0]===1)throw new Error("blockSize must be set only for block quantization.");if(!r[1].dims.map((o,i)=>i===e.axis||o===r[0].dims[i]).reduce((o,i)=>o&&i,!0))throw new Error("For block qunatization, scale input shape to match the input shape except for the axis");if(r[1].dims.length!==r[0].dims.length)throw new Error("For block qunatization the scale input rank must be the same as the x rank.");let n=r[0].dims[e.axis],t=r[1].dims[e.axis];if(e.blockSizeMath.ceil(n/(t-1)-1))throw new Error("blockSize must be with in the range [ceil(dI / Si), ceil(dI / (Si - 1) - 1)].")}},cA=(r,e)=>{let n=S.normalizeAxis(e.axis,r[0].dims.length),t=r[0].dataType,o=t===3,i=r[0].dims,a=r[1].dataType,s=S.size(i),u=t===3||t===2,l=u?[Math.ceil(S.size(r[0].dims)/4)]:r[0].dims,c=r[1].dims,d=r.length>2?r[2]:void 0,p=d?u?[Math.ceil(S.size(d.dims)/4)]:d.dims:void 0,f=c.length===0||c.length===1&&c[0]===1,h=f===!1&&c.length===1,m=he(s),y=f&&(!u||m===4),g=y?m:1,b=y&&!u?m:1,x=A("input",u?12:t,l.length,b),w=A("scale",a,c.length),v=d?A("zero_point",u?12:t,p.length):void 0,I=C("output",a,i.length,g),P=[x,w];v&&P.push(v);let O=[l,c];d&&O.push(p);let E=[{type:12,data:s/g},{type:12,data:n},{type:12,data:e.blockSize},...k(...O,i)],R=q=>{let B=[{name:"output_size",type:"u32"},{name:"axis",type:"u32"},{name:"block_size",type:"u32"}];return` + ${q.registerUniforms(B).declareVariables(...P,I)} + ${q.mainStart()} + ${q.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${I.offsetToIndices("global_idx")}; + + // Set input x + ${u?` + let input = ${x.getByOffset("global_idx / 4")}; + let x_vec = ${o?"unpack4xI8(input)":"unpack4xU8(input)"}; + let x_value = ${g===1?"x_vec[global_idx % 4]":"x_vec"};`:`let x_value = ${x.getByOffset("global_idx")};`}; + + // Set scale input + ${f?`let scale_value= ${w.getByOffset("0")}`:h?` + let scale_index = ${I.indicesGet("output_indices","uniforms.axis")}; + let scale_value= ${w.getByOffset("scale_index")};`:` + var scale_indices: ${w.type.indices} = output_indices; + let index = ${w.indicesGet("scale_indices","uniforms.axis")} / uniforms.block_size; + ${w.indicesSet("scale_indices","uniforms.axis","index")}; + let scale_value= ${w.getByIndices("scale_indices")};`}; + + // Set zero-point input + ${v?f?u?` + let zero_point_input = ${v.getByOffset("0")}; + let zero_point_vec = ${o?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value= zero_point_vec[0]`:`let zero_point_value = ${v.getByOffset("0")}`:h?u?` + let zero_point_index = ${I.indicesGet("output_indices","uniforms.axis")}; + let zero_point_input = ${v.getByOffset("zero_point_index / 4")}; + let zero_point_vec = ${o?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_index % 4]`:` + let zero_point_index = ${I.indicesGet("output_indices","uniforms.axis")}; + let zero_point_value = ${v.getByOffset("zero_point_index")};`:u?` + let zero_point_offset = ${w.indicesToOffset("scale_indices")}; + let zero_point_input = ${v.getByOffset("zero_point_offset / 4")}; + let zero_point_vec = ${o?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_offset % 4];`:`let zero_point_value = ${v.getByIndices("scale_indices")};`:`let zero_point_value = ${u?o?"i32":"u32":x.type.value}(0);`}; + // Compute and write output + ${I.setByOffset("global_idx",`${I.type.value}(x_value - zero_point_value) * scale_value`)}; + }`};return{name:"DequantizeLinear",shaderCache:{hint:e.cacheKey,inputDependencies:v?["rank","rank","rank"]:["rank","rank"]},getShaderSource:R,getRunData:()=>({outputs:[{dims:i,dataType:a}],dispatchGroup:{x:Math.ceil(s/g/64),y:1,z:1},programUniforms:E})}},D_=(r,e)=>{lA(r.inputs,e),r.compute(cA(r.inputs,e))},k_=r=>J({axis:r.axis,blockSize:r.blockSize})});var dA,pA,R_,N_=$(()=>{"use strict";qe();Z();oe();dA=(r,e,n)=>{let t=r===e,o=re&&n>0;if(t||o||i)throw new Error("Range these inputs' contents are invalid.")},pA=(r,e,n,t)=>{let o=Math.abs(Math.ceil((e-r)/n)),i=[o],a=o,s=[{type:12,data:a},{type:t,data:r},{type:t,data:n},...k(i)],u=l=>{let c=C("output",t,i.length),d=c.type.value,p=[{name:"outputSize",type:"u32"},{name:"start",type:d},{name:"delta",type:d}];return` + ${l.registerUniforms(p).declareVariables(c)} + ${l.mainStart()} + ${l.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + output[global_idx] = uniforms.start + ${d}(global_idx) * uniforms.delta; + }`};return{name:"Range",shaderCache:{hint:`${t}`},getShaderSource:u,getRunData:()=>({outputs:[{dims:i,dataType:t}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:s})}},R_=r=>{let e=0,n=0,t=0;r.inputs[0].dataType===6?(e=r.inputs[0].getInt32Array()[0],n=r.inputs[1].getInt32Array()[0],t=r.inputs[2].getInt32Array()[0]):r.inputs[0].dataType===1&&(e=r.inputs[0].getFloat32Array()[0],n=r.inputs[1].getFloat32Array()[0],t=r.inputs[2].getFloat32Array()[0]),ee.webgpu.validateInputContent&&dA(e,n,t),r.compute(pA(e,n,t,r.inputs[0].dataType),{inputs:[]})}});var fA,hA,z_,M_,B_=$(()=>{"use strict";Z();ne();Ee();oe();fA=(r,e,n,t)=>{if(r!=="none"&&t!=="i32"&&t!=="u32"&&t!=="f32")throw new Error(`Input ${t} is not supported with reduction ${r}.`);let o=`{ + var oldValue = 0; + loop { + let newValueF32 =`,i=`; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&${e}, oldValue, newValue); + if res.exchanged { + break; + } + oldValue = res.old_value; + } + }`;switch(r){case"none":return`${e}=${n};`;case"add":return t==="i32"||t==="u32"?`atomicAdd(&${e}, bitcast<${t}>(${n}));`:` + ${o}bitcast<${t}>(oldValue) + (${n})${i}`;case"max":return t==="i32"||t==="u32"?`atomicMax(&${e}, bitcast<${t}>(${n}));`:` + ${o}max(bitcast(oldValue), (${n}))${i}`;case"min":return t==="i32"||t==="u32"?`atomicMin(&${e}, bitcast<${t}>(${n}));`:`${o}min(bitcast<${t}>(oldValue), (${n}))${i}`;case"mul":return`${o}(bitcast<${t}>(oldValue) * (${n}))${i}`;default:throw new Error(`Reduction ${r} is not supported.`)}},hA=(r,e)=>{let n=r[0].dims,t=r[1].dims,o=n,i=1,a=Math.ceil(S.sizeToDimension(t,t.length-1)/i),s=t[t.length-1],u=S.sizeFromDimension(n,s),l=[{type:12,data:a},{type:12,data:s},{type:12,data:u},...k(r[1].dims,r[2].dims,o)],c=d=>{let p=A("indices",r[1].dataType,r[1].dims.length),f=A("updates",r[2].dataType,r[2].dims.length,i),h=e.reduction!=="none"&&e.reduction!==""?dg("output",r[0].dataType,o.length):C("output",r[0].dataType,o.length,i);return` + ${d.registerUniform("output_size","u32").registerUniform("last_index_dimension","u32").registerUniform("num_updates_elements","u32").declareVariables(p,f,h)} + ${d.mainStart()} + ${d.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var data_offset = 0u; + let indices_start = uniforms.last_index_dimension * global_idx; + let indices_end = indices_start + uniforms.last_index_dimension; + for (var i = indices_start; i < indices_end; i++) { + var index = i32(indices[i].x); + ${r[0].dims.length===1?` + let element_count_dim = uniforms.output_strides; + let dim_value = uniforms.output_shape;`:` + let element_count_dim = uniforms.output_strides[i - indices_start]; + let dim_value = uniforms.output_shape[i - indices_start];`} + if (index >= 0) { + if (index >= i32(dim_value)) { + index = i32(dim_value - 1); + } + } else { + if (index < -i32(dim_value)) { + index = 0; + } else { + index += i32(dim_value); + } + } + data_offset += u32((u32(index) * element_count_dim)); + } + + for (var i = 0u; i < uniforms.num_updates_elements; i++) { + let value = updates[uniforms.num_updates_elements * global_idx + i]; + ${fA(e.reduction,"output[data_offset + i]","value",h.type.value)} + } + + }`};return{name:"ScatterND",shaderCache:{hint:`${e.cacheKey}_${e.reduction}`,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:o,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:l}),getShaderSource:c}},z_=r=>J({reduction:r.reduction}),M_=(r,e)=>{r.compute(hA(r.inputs,e),{inputs:[r.inputs[1],r.inputs[2]],outputs:[]})}});var mA,gA,bA,V_,yA,_A,xA,wA,TA,vA,IA,SA,F_,$A,AA,PA,OA,EA,G_,U_,W_=$(()=>{"use strict";Z();ne();Ee();oe();mA=(r,e)=>{if(r.every(n=>n>0||(()=>{throw new Error("Resize requires scales input values to be positive")})),r.length>0){if(e.mode==="linear"){if(!(r.length===2||r.length===3||r.length===4&&r[0]===1&&r[1]===1||r.length===4&&r[0]===1&&r[3]===1||r.length===5&&r[0]===1&&r[1]===1))throw new Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and + one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(e.mode==="cubic"&&!(r.length===2||r.length===4&&r[0]===1&&r[1]===1||r.length===4&&r[0]===1&&r[3]===1))throw new Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},gA=(r,e,n)=>{e.every(o=>o>=0&&o{throw new Error("Resize requires axes input values to be positive and less than rank")}));let t=new Array(n).fill(1);return e.forEach((o,i)=>t[o]=r[i]),t},bA=(r,e,n,t,o,i)=>{let[a,s,u]=n>10?[1,2,3]:[-1,r.length>1?1:-1,-1],l=r[0].dims.length;if(a>0&&r.length>a&&r[a].dims.length>0)r[a].getFloat32Array().forEach(c=>i.push(c));else if(e.coordinateTransformMode==="tf_crop_and_resize")throw new Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(s>0&&r.length>s&&r[s].dims.length===1&&r[s].dims[0]>0){if(r[s].getFloat32Array().forEach(c=>t.push(c)),t.length!==0&&t.length!==l&&n>=18&&t.length!==e.axes.length)throw new Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");mA(t,e),e.axes.length>0&&gA(t,e.axes,l).forEach((c,d)=>t[d]=c)}if(u>0&&r.length>u&&r[u].dims.length===1&&r[u].dims[0]>0&&(r[u].getBigInt64Array().forEach(c=>o.push(Number(c))),o.length!==0&&o.length!==l&&n>=18&&o.length!==e.axes.length))throw new Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(e.axes.length>0){if(t.length!==0&&t.length!==e.axes.length)throw new Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(o.length!==0&&o.length!==e.axes.length)throw new Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof t<"u"&&typeof o<"u"&&t.length>0&&o.length>l)throw new Error("Resize requires only of scales or sizes to be specified")},V_=(r,e,n,t)=>` + // The whole part and the fractional part are calculated separately due to inaccuracy of floating + // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an + // offset-by-one error later in floor(). + let big = (${r}) * (${e}); + let whole = ${t}(big / (${n})); + let fract = ${t}(big % (${n})) / ${t}(${n}); + return whole + fract; +`,yA=(r,e)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, + lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${e} { `+(()=>{switch(r){case"asymmetric":return` + if (xScale < 1.0 || floor(xScale) != xScale) { + return ${e}(xResized) / ${e}(xScale); + } else { + ${V_("xResized","lengthOriginal","lengthResized",e)} + } + `;case"pytorch_half_pixel":return`if (lengthResized > 1) { + return (${e}(xResized) + 0.5) / ${e}(xScale) - 0.5; + } else { + return 0.0; + }`;case"tf_half_pixel_for_nn":return`return (${e}(xResized) + 0.5) / ${e}(xScale);`;case"align_corners":return`if (lengthResized == 1) { + return 0.0; + } else { + ${V_("xResized","lengthOriginal - 1","lengthResized - 1",e)} + }`;case"tf_crop_and_resize":return`if (lengthResized > 1) { + return ${e}(roiStart) * ${e}(lengthOriginal - 1) + + (${e}(xResized) * ${e}(roiEnd - roiStart) * ${e}(lengthOriginal - 1)) / + ${e}(lengthResized - 1); + } else { + return 0.5 * ${e}(roiStart + roiEnd) * ${e}(lengthOriginal - 1); + }`;case"half_pixel_symmetric":return`const outputWidth = ${e}xScale * ${e}(lengthResized); + const adjustment = ${e}(lengthResized) / outputWidth; + const center = ${e}(lengthOriginal) / 2; + const offset = center * (1 - adjustment); + return offset + ((${e}(xResized) + 0.5) / ${e}(xScale)) - 0.5;`;case"half_pixel":return`return ((${e}(xResized) + 0.5) / ${e}(xScale)) - 0.5;`;default:throw new Error(`Coordinate transform mode ${r} is not supported`)}})()+"}",_A=(r,e,n)=>`fn getNearestPixelFromOriginal(xOriginal: ${n}, isDownSample: bool) -> ${n} {`+(()=>{switch(r){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";case"simple":default:if(e<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw new Error(`Nearest mode ${r} is not supported`)}})()+"}",xA=(r,e,n)=>{let t=new Array(n).fill(0).concat(new Array(n).fill(1)),o=r.length===0?t:r.slice();return e.length>0?(e.forEach((i,a)=>{t[i]=o[a],t[a+n]=o[e.length+a]}),t):o},wA=(r,e,n,t)=>{let o=[];if(n.length>0)if(t.length>0){if(r.forEach(i=>o.push(i)),Math.max(...t)>r.length)throw new Error("axes is out of bound");t.forEach((i,a)=>o[i]=n[a])}else n.forEach(i=>o.push(i));else{if(e.length===0)throw new Error("Resize requires either scales or sizes.");o=r.map((i,a)=>Math.round(i*e[a]))}return o},TA=(r,e,n)=>{let t=(()=>{switch(n.keepAspectRatioPolicy){case"not_larger":return n.axes.length>0?Math.min(...n.axes.map(i=>e[i]),Number.MAX_VALUE):Math.min(...e,Number.MAX_VALUE);case"not_smaller":return n.axes.length>0?Math.max(...n.axes.map(i=>e[i]),Number.MIN_VALUE):Math.max(...e,Number.MIN_VALUE);default:throw new Error(`Keep aspect ratio policy ${n.keepAspectRatioPolicy} is not supported`)}})();e.fill(1,0,e.length);let o=r.slice();return n.axes.length>0?(n.axes.forEach(i=>e[i]=t),n.axes.forEach(i=>o[i]=Math.round(r[i]*e[i]))):(e.fill(t,0,e.length),o.forEach((i,a)=>o[a]=Math.round(i*e[a]))),o},vA=(r,e,n,t,o)=>` + fn calculateOriginalIndicesFromOutputIndices(output_indices: ${r.type.indices}) -> array<${r.type.value}, ${n.length}> { + var original_indices: array<${r.type.value}, ${n.length}>; + for (var i:u32 = 0; i < ${n.length}; i++) { + var output_index = ${r.indicesGet("output_indices","i")}; + var scale = ${M("uniforms.scales","i",t)}; + var roi_low = ${M("uniforms.roi","i",o)}; + var roi_hi = ${M("uniforms.roi",`i + ${e.length}`,o)}; + if (scale == 1.0) { + original_indices[i] = ${r.type.value}(output_index); + } else { + var input_shape_i = ${M("uniforms.input_shape","i",e.length)}; + var output_shape_i = ${M("uniforms.output_shape","i",n.length)}; + original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + } + } + return original_indices; + }`,IA=(r,e,n,t,o,i,a)=>` + fn calculateInputIndicesFromOutputIndices(output_indices: ${e.type.indices}) -> ${r.type.indices} { + var input_indices: ${r.type.indices}; + for (var i:u32 = 0; i < ${t.length}; i++) { + var output_index = ${e.indicesGet("output_indices","i")}; + var input_index: u32; + var scale = ${M("uniforms.scales","i",o)}; + if (scale == 1.0) { + input_index = output_index; + } else { + var roi_low = ${M("uniforms.roi","i",i)}; + var roi_hi = ${M("uniforms.roi",`i + ${n.length}`,i)}; + var input_shape_i = ${M("uniforms.input_shape","i",n.length)}; + var output_shape_i = ${M("uniforms.output_shape","i",t.length)}; + var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + if (!${a} || (original_idx >= 0 && original_idx < ${e.type.value}(input_shape_i))) { + if (original_idx < 0) { + input_index = 0; + } else if (original_idx > ${e.type.value}(input_shape_i - 1)) { + input_index = input_shape_i - 1; + } else { + input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1)); + } + } else { + input_index = u32(original_idx); + } + } + ${r.indicesSet("input_indices","i","input_index")} + } + return input_indices; + }`,SA=(r,e)=>` + fn checkInputIndices(input_indices: ${r.type.indices}) -> bool { + for (var i:u32 = 0; i < ${e.length}; i++) { + var input_index = ${r.indicesGet("input_indices","i")}; + if (input_index < 0 || input_index >= ${M("uniforms.input_shape","i",e.length)}) { + return false; + } + } + return true; + }`,F_=(r,e,n,t)=>r.rank>t?` + ${r.indicesSet("input_indices",e,"channel")}; + ${r.indicesSet("input_indices",n,"batch")}; +`:"",$A=(r,e,n,t,o)=>{let[a,s,u,l]=n.length===2?[-1,0,1,-1]:[0,2,3,1],c=r.type.value;return` + fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${c} { + var input_indices: ${r.type.indices}; + ${r.indicesSet("input_indices",s,`max(0, min(row, ${n[s]} - 1))`)}; + ${r.indicesSet("input_indices",u,`max(0, min(col, ${n[u]} - 1))`)}; + ${F_(r,l,a,2)} + return ${r.getByIndices("input_indices")}; + } + + fn bilinearInterpolation(output_indices: ${e.type.indices}) -> ${c} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var row:${c} = originalIndices[${s}]; + var col:${c} = originalIndices[${u}]; + ${t?`if (row < 0 || row > (${n[s]} - 1) || col < 0 || col > (${n[u]} - 1)) { + return ${o}; + }`:""}; + row = max(0, min(row, ${n[s]} - 1)); + col = max(0, min(col, ${n[u]} - 1)); + var row1: u32 = u32(row); + var col1: u32 = u32(col); + var row2: u32 = u32(row + 1); + var col2: u32 = u32(col + 1); + var channel: u32 = ${n.length>2?`u32(originalIndices[${l}])`:"0"}; + var batch: u32 = ${n.length>2?`u32(originalIndices[${a}])`:"0"}; + var x11: ${c} = getInputValue(batch, channel, row1, col1); + var x12: ${c} = getInputValue(batch, channel, row1, col2); + var x21: ${c} = getInputValue(batch, channel, row2, col1); + var x22: ${c} = getInputValue(batch, channel, row2, col2); + var dx1: ${c} = abs(row - ${c}(row1)); + var dx2: ${c} = abs(${c}(row2) - row); + var dy1: ${c} = abs(col - ${c}(col1)); + var dy2: ${c} = abs(${c}(col2) - col); + if (row1 == row2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (col1 == col2) { + dy1 = 0.5; + dy2 = 0.5; + } + return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); + }`},AA=(r,e,n,t,o,i,a,s,u,l)=>{let c=n.length===2,d=!0,[p,f]=c?[0,1]:d?[2,3]:[1,2],h=r.type.value,m=y=>{let g=y===p?"row":"col";return` + fn ${g}CubicInterpolation(input_indices: ${r.type.indices}, output_indices: ${e.type.indices}) -> ${h} { + var output_index = ${e.indicesGet("output_indices",y)}; + var originalIdx: ${h} = getOriginalCoordinateFromResizedCoordinate(output_index, ${o[y]}, + ${t[y]}, ${n[y]}, ${i[y]}, ${i[y]} + ${n.length}); + var fractOriginalIdx: ${h} = originalIdx - floor(originalIdx); + var coefs = getCubicInterpolationCoefs(fractOriginalIdx); + + if (${s} && (originalIdx < 0 || originalIdx > (${n[y]} - 1))) { + return ${u}; + } + var data: array<${h}, 4> = array<${h}, 4>(0.0, 0.0, 0.0, 0.0); + for (var i: i32 = -1; i < 3; i++) { + var ${g}: ${h} = originalIdx + ${h}(i); + if (${g} < 0 || ${g} >= ${n[y]}) { + ${l?`coefs[i + 1] = 0.0; + continue;`:s?`return ${u};`:`${g} = max(0, min(${g}, ${n[y]} - 1));`}; + } + var input_indices_copy: ${r.type.indices} = input_indices; + ${r.indicesSet("input_indices_copy",y,`u32(${g})`)}; + data[i + 1] = ${y===p?r.getByIndices("input_indices_copy"):"rowCubicInterpolation(input_indices_copy, output_indices)"}; + } + return cubicInterpolation1D(data, coefs); + }`};return` + ${m(p)}; + ${m(f)}; + fn getCubicInterpolationCoefs(s: ${h}) -> array<${h}, 4> { + var absS = abs(s); + var coeffs: array<${h}, 4> = array<${h}, 4>(0.0, 0.0, 0.0, 0.0); + var oneMinusAbsS: ${h} = 1.0 - absS; + var twoMinusAbsS: ${h} = 2.0 - absS; + var onePlusAbsS: ${h} = 1.0 + absS; + coeffs[0] = ((${a} * onePlusAbsS - 5 * ${a}) * onePlusAbsS + 8 * ${a}) * onePlusAbsS - 4 * ${a}; + coeffs[1] = ((${a} + 2) * absS - (${a} + 3)) * absS * absS + 1; + coeffs[2] = ((${a} + 2) * oneMinusAbsS - (${a} + 3)) * oneMinusAbsS * oneMinusAbsS + 1; + coeffs[3] = ((${a} * twoMinusAbsS - 5 * ${a}) * twoMinusAbsS + 8 * ${a}) * twoMinusAbsS - 4 * ${a}; + return coeffs; + } + + fn cubicInterpolation1D(x: array<${h}, 4>, coefs: array<${h}, 4>) -> ${h} { + var coefsSum: ${h} = coefs[0] + coefs[1] + coefs[2] + coefs[3]; + return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum; + } + + fn bicubicInterpolation(output_indices: ${e.type.indices}) -> ${h} { + var input_indices: ${r.type.indices} = output_indices; + return colCubicInterpolation(input_indices, output_indices); + } + `},PA=(r,e,n,t,o)=>{let[a,s,u,l,c]=n.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],d=r.type.value;return` + fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${d} { + var input_indices: ${r.type.indices}; + ${r.indicesSet("input_indices",s,`max(0, min(depth, ${n[s]} - 1))`)}; + ${r.indicesSet("input_indices",u,`max(0, min(height, ${n[u]} - 1))`)}; + ${r.indicesSet("input_indices",l,`max(0, min(width, ${n[l]} - 1))`)}; + ${F_(r,c,a,3)} + return ${r.getByIndices("input_indices")}; + } + + fn trilinearInterpolation(output_indices: ${e.type.indices}) -> ${d} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var depth:${d} = originalIndices[${s}]; + var height:${d} = originalIndices[${u}]; + var width:${d} = originalIndices[${l}]; + ${t?`if (depth < 0 || depth > (${n[s]} - 1) || height < 0 || height > (${n[u]} - 1) || width < 0 || (width > ${n[l]} - 1)) { + return ${o}; + }`:""}; + + depth = max(0, min(depth, ${n[s]} - 1)); + height = max(0, min(height, ${n[u]} - 1)); + width = max(0, min(width, ${n[l]} - 1)); + var depth1: u32 = u32(depth); + var height1: u32 = u32(height); + var width1: u32 = u32(width); + var depth2: u32 = u32(depth + 1); + var height2: u32 = u32(height + 1); + var width2: u32 = u32(width + 1); + var channel: u32 = ${n.length>3?`u32(originalIndices[${c}])`:"0"}; + var batch: u32 = ${n.length>3?`u32(originalIndices[${a}])`:"0"}; + + var x111: ${d} = getInputValue(batch, channel, depth1, height1, width1); + var x112: ${d} = getInputValue(batch, channel, depth1, height1, width2); + var x121: ${d} = getInputValue(batch, channel, depth1, height2, width1); + var x122: ${d} = getInputValue(batch, channel, depth1, height2, width2); + var x211: ${d} = getInputValue(batch, channel, depth2, height1, width1); + var x212: ${d} = getInputValue(batch, channel, depth2, height1, width2); + var x221: ${d} = getInputValue(batch, channel, depth2, height2, width1); + var x222: ${d} = getInputValue(batch, channel, depth2, height2, width2); + var dx1: ${d} = abs(depth - ${d}(depth1)); + var dx2: ${d} = abs(${d}(depth2) - depth); + var dy1: ${d} = abs(height - ${d}(height1)); + var dy2: ${d} = abs(${d}(height2) - height); + var dz1: ${d} = abs(width - ${d}(width1)); + var dz2: ${d} = abs(${d}(width2) - width); + if (depth1 == depth2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (height1 == height2) { + dy1 = 0.5; + dy2 = 0.5; + } + if (width1 == width2) { + dz1 = 0.5; + dz2 = 0.5; + } + return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + + x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); + }`},OA=(r,e,n,t,o,i)=>{let a=r.dims,s=xA(i,e.axes,a.length),u=wA(a,t,o,e.axes),l=t.slice();t.length===0&&(l=a.map((b,x)=>b===0?1:u[x]/b),e.keepAspectRatioPolicy!=="stretch"&&(u=TA(a,l,e)));let c=C("output",r.dataType,u.length),d=A("input",r.dataType,a.length),p=S.size(u),f=a.length===u.length&&a.every((b,x)=>b===u[x]),h=e.coordinateTransformMode==="tf_crop_and_resize",m=e.extrapolationValue,y=d.type.value,g=b=>` + ${f?"":` + ${yA(e.coordinateTransformMode,y)}; + ${(()=>{switch(e.mode){case"nearest":return` + ${SA(d,a)}; + ${_A(e.nearestMode,n,y)}; + ${IA(d,c,a,u,l.length,s.length,h)}; + `;case"linear":return` + ${vA(c,a,u,l.length,s.length)}; + ${(()=>{if(a.length===2||a.length===4)return`${$A(d,c,a,h,m)}`;if(a.length===3||a.length===5)return`${PA(d,c,a,h,m)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; + `;case"cubic":return` + ${(()=>{if(a.length===2||a.length===4)return`${AA(d,c,a,u,l,s,e.cubicCoeffA,h,e.extrapolationValue,e.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; + `;default:throw Error("Invalid resize mode")}})()}; + `} + ${b.registerUniform("output_size","u32").registerUniform("scales","f32",l.length).registerUniform("roi","f32",s.length).declareVariables(d,c)} + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + ${f?"output[global_idx] = input[global_idx];":` + let output_indices = ${c.offsetToIndices("global_idx")}; + var input_indices: ${d.type.indices}; + ${(()=>{switch(e.mode){case"nearest":return`input_indices = calculateInputIndicesFromOutputIndices(output_indices); + if (checkInputIndices(input_indices)) { + output[global_idx] = ${d.getByIndices("input_indices")}; + } else { + output[global_idx] = ${e.extrapolationValue}; + }`;case"linear":return`output[global_idx] = ${a.length===2||a.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${e.mode}`)}})()}; +`} + }`;return{name:"Resize",shaderCache:{hint:`${e.cacheKey}|${n}|${l.length>0?e.mode==="cubic"?l:l.length:""}|${o.length>0?o:""}|${s.length>0?s:""}|${f}|${e.mode==="nearest"?a.length:a}`,inputDependencies:["rank"]},getShaderSource:g,getRunData:()=>({outputs:[{dims:u,dataType:r.dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:[{type:12,data:p},{type:1,data:l},{type:1,data:s},...k(a,u)]})}},EA=r=>{let e=r.customDataBuffer;return new Uint32Array(e,e.byteOffset,1)[0]},G_=(r,e)=>{let n=[],t=[],o=[],i=EA(r);if(e.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");bA(r.inputs,e,i,n,t,o),r.compute(OA(r.inputs[0],e,i,n,t,o),{inputs:[0]})},U_=r=>{let e=r.antialias,n=r.axes,t=r.coordinateTransformMode,o=r.cubicCoeffA,i=r.excludeOutside!==0,a=r.extrapolationValue,s=r.keepAspectRatioPolicy,u=r.mode,l=r.nearestMode===""?"simple":r.nearestMode;return J({antialias:e,axes:n,coordinateTransformMode:t,cubicCoeffA:o,excludeOutside:i,extrapolationValue:a,keepAspectRatioPolicy:s,mode:u,nearestMode:l})}});var CA,DA,H_,q_=$(()=>{"use strict";Z();ne();oe();CA=r=>{if(!r||r.length<3)throw new Error("layerNorm requires at least 3 inputs.");let e=r[0],n=r[1],t=r[2];if(e.dataType!==n.dataType||e.dataType!==t.dataType)throw new Error("All inputs must have the same data type");if(e.dims.length!==3&&e.dims.length!==2)throw new Error("Input must be 2D or 3D");if(n.dims.length!==3&&n.dims.length!==2)throw new Error("Skip must be 2D or 3D");let o=e.dims[e.dims.length-1],i=e.dims[e.dims.length-2];if(n.dims[n.dims.length-1]!==o)throw new Error("Skip must have the same hidden size as input");if(n.dims[n.dims.length-2]!==i)throw new Error("Skip must have the same sequence length as input");if(t.dims.length!==1)throw new Error("Gamma must be 1D");if(t.dims[t.dims.length-1]!==o)throw new Error("Gamma must have the same hidden size as input");if(r.length>3){let a=r[3];if(a.dims.length!==1)throw new Error("Beta must be 1D");if(a.dims[a.dims.length-1]!==o)throw new Error("Beta must have the same hidden size as input")}if(r.length>4){let a=r[4];if(a.dims.length!==1)throw new Error("Bias must be 1D");if(a.dims[a.dims.length-1]!==o)throw new Error("Bias must have the same hidden size as input")}},DA=(r,e,n,t)=>{let o=e.simplified,i=r[0].dims,a=S.size(i),s=i,u=a,l=i.slice(-1)[0],c=t?i.slice(0,-1).concat(1):[],d=!o&&r.length>3,p=r.length>4,f=t&&n>1,h=t&&n>2,m=n>3,y=64,g=he(l),b=[{type:12,data:u},{type:12,data:g},{type:12,data:l},{type:1,data:e.epsilon}],x=v=>{let I=[{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}],P=[A("x",r[0].dataType,r[0].dims,g),A("skip",r[1].dataType,r[1].dims,g),A("gamma",r[2].dataType,r[2].dims,g)];d&&P.push(A("beta",r[3].dataType,r[3].dims,g)),p&&P.push(A("bias",r[4].dataType,r[4].dims,g)),P.push(C("output",r[0].dataType,s,g)),f&&P.push(C("mean_output",1,c)),h&&P.push(C("inv_std_output",1,c)),m&&P.push(C("input_skip_bias_sum",r[0].dataType,s,g));let O=ve(r[0].dataType),E=ve(1,g);return` + + ${v.registerUniforms(I).declareVariables(...P)} + var sum_shared : array<${E}, ${y}>; + var sum_squared_shared : array<${E}, ${y}>; + + ${v.mainStart([y,1,1])} + let ix = local_id.x; + let iy = global_id.x / ${y}; + + let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components; + var stride = hidden_size_vectorized / ${y}; + let offset = ix * stride + iy * hidden_size_vectorized; + let offset1d = stride * ix; + if (ix == ${y-1}) { + stride = hidden_size_vectorized - stride * ix; + } + for (var i: u32 = 0; i < stride; i++) { + let skip_value = skip[offset + i]; + let bias_value = ${p?"bias[offset1d + i]":O+"(0.0)"}; + let input_value = x[offset + i]; + let value = input_value + skip_value + bias_value; + ${m?"input_skip_bias_sum[offset + i] = value;":""} + output[offset + i] = value; + let f32_value = ${lr(O,g,"value")}; + sum_shared[ix] += f32_value; + sum_squared_shared[ix] += f32_value * f32_value; + } + workgroupBarrier(); + + var reduce_size : u32 = ${y}; + for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) { + reduce_size = curr_size + (reduce_size & 1); + if (ix < curr_size) { + sum_shared[ix] += sum_shared[ix + reduce_size]; + sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size]; + } + workgroupBarrier(); + } + + let sum = sum_shared[0]; + let square_sum = sum_squared_shared[0]; + let mean = ${$t("sum",g)} / f32(uniforms.hidden_size); + let inv_std_dev = inverseSqrt(${$t("square_sum",g)} / f32(uniforms.hidden_size) ${o?"":"- mean * mean"} + uniforms.epsilon); + ${f?"mean_output[global_idx] = mean;":""} + ${h?"inv_std_output[global_idx] = inv_std_dev;":""} + + for (var i: u32 = 0; i < stride; i++) { + output[offset + i] = (output[offset + i] ${o?"":`- ${O}(mean)`}) * + ${O}(inv_std_dev) * gamma[offset1d + i] + ${d?"+ beta[offset1d + i]":""}; + } + }`},w=[{dims:s,dataType:r[0].dataType}];return n>1&&w.push({dims:c,dataType:1}),n>2&&w.push({dims:c,dataType:1}),n>3&&w.push({dims:i,dataType:r[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${g};${f};${h};${m}`,inputDependencies:r.map((v,I)=>"type")},getShaderSource:x,getRunData:()=>({outputs:w,dispatchGroup:{x:Math.ceil(u/l)},programUniforms:b})}},H_=(r,e)=>{CA(r.inputs);let t=[0];r.outputCount>1&&t.push(-3),r.outputCount>2&&t.push(-3),r.outputCount>3&&t.push(3),r.compute(DA(r.inputs,e,r.outputCount,!1),{outputs:t})}});var kA,ta,LA,j_,RA,NA,K_,X_,Z_=$(()=>{"use strict";Z();ne();Ee();oe();kA=(r,e)=>{if(!r||r.length<1)throw new Error("too few inputs");if(e.axes.length!==0){if(e.axes.length!==e.starts.length||e.axes.length!==e.ends.length)throw new Error("axes, starts and ends must have the same length")}else if(e.starts.length!==e.ends.length)throw new Error("starts and ends must have the same length");r.slice(1).forEach((n,t)=>{if(r[t+1].dataType!==6&&r[t+1].dataType!==7)throw new Error(`Input ${t} must be an array of int32 or int64`)})},ta=(r,e)=>{let n=[];if(r.length>e)if(r[e].dataType===7)r[e].getBigInt64Array().forEach(t=>n.push(Number(t)));else if(r[e].dataType===6)r[e].getInt32Array().forEach(t=>n.push(Number(t)));else throw new Error(`Input ${e} must be an array of int32 or int64`);return n},LA=(r,e)=>{if(r.length>1){let n=ta(r,1),t=ta(r,2),o=ta(r,3);return o.length===0&&(o=[...Array(r[0].dims.length).keys()]),J({starts:n,ends:t,axes:o})}else return e},j_=(r,e,n,t,o)=>{let i=r;return r<0&&(i+=n[t[e]]),o[e]<0?Math.max(0,Math.min(i,n[t[e]]-1)):Math.max(0,Math.min(i,n[t[e]]))},RA=(r,e,n)=>`fn calculateInputIndices(output_indices: ${e.type.indices}) -> ${r.type.indices} { + var input_indices: ${r.type.indices}; + var carry = 0u; + for (var i = ${n.length-1}; i >= 0; i--) { + let input_shape_i = ${M("uniforms.input_shape","i",n.length)}; + let steps_i = ${M("uniforms.steps","i",n.length)}; + let signs_i = ${M("uniforms.signs","i",n.length)}; + let starts_i = ${M("uniforms.starts","i",n.length)}; + var output_index = ${e.indicesGet("output_indices","i")}; + var input_index = output_index * steps_i + starts_i + carry; + carry = input_index / input_shape_i; + input_index = input_index % input_shape_i; + if (signs_i < 0) { + input_index = input_shape_i - input_index - 1u + starts_i; + } + ${r.indicesSet("input_indices","i","input_index")}; + } + return input_indices; + }`,NA=(r,e)=>{let n=r[0].dims,t=S.size(n),o=e.axes.length>0?S.normalizeAxes(e.axes,n.length):[...Array(n.length).keys()],i=ta(r,4);i.forEach(g=>g!==0||(()=>{throw new Error("step cannot be 0")})),i.length===0&&(i=Array(o.length).fill(1));let a=e.starts.map((g,b)=>j_(g,b,n,o,i)),s=e.ends.map((g,b)=>j_(g,b,n,o,i));if(o.length!==a.length||o.length!==s.length)throw new Error("start, ends and axes should have the same number of elements");if(o.length!==n.length)for(let g=0;gMath.sign(g));i.forEach((g,b,x)=>{if(g<0){let w=(s[b]-a[b])/g,v=a[b],I=v+w*i[b];a[b]=I,s[b]=v,x[b]=-g}});let l=n.slice(0);o.forEach((g,b)=>{l[g]=Math.ceil((s[g]-a[g])/i[g])});let c={dims:l,dataType:r[0].dataType},d=C("output",r[0].dataType,l.length),p=A("input",r[0].dataType,r[0].dims.length),f=S.size(l),h=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:a.length},{name:"signs",type:"i32",length:u.length},{name:"steps",type:"u32",length:i.length}],m=[{type:12,data:f},{type:12,data:a},{type:6,data:u},{type:12,data:i},...k(r[0].dims,l)],y=g=>` + ${g.registerUniforms(h).declareVariables(p,d)} + ${RA(p,d,n)} + ${g.mainStart()} + ${g.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let output_indices = ${d.offsetToIndices("global_idx")}; + let input_indices = calculateInputIndices(output_indices); + ${d.setByOffset("global_idx",p.getByIndices("input_indices"))} + }`;return{name:"Slice",shaderCache:{hint:`${u.length}_${a.length}_${i.length}`,inputDependencies:["rank"]},getShaderSource:y,getRunData:()=>({outputs:[c],dispatchGroup:{x:Math.ceil(t/64)},programUniforms:m})}},K_=(r,e)=>{kA(r.inputs,e);let n=LA(r.inputs,e);r.compute(NA(r.inputs,n),{inputs:[0]})},X_=r=>{let e=r.starts,n=r.ends,t=r.axes;return J({starts:e,ends:n,axes:t})}});var zA,MA,J_,Q_,Y_=$(()=>{"use strict";Z();ne();Ee();An();oe();zA=r=>{if(!r||r.length!==1)throw new Error("Softmax op requires 1 input.")},MA=(r,e)=>{let n=r.inputs[0],t=n.dims,o=S.size(t),i=t.length,a=S.normalizeAxis(e.axis,i),s=aO),l[a]=i-1,l[i-1]=a,u=r.compute(Fe(n,l),{inputs:[n],outputs:[-1]})[0]):u=n;let c=u.dims,d=c[i-1],p=o/d,f=he(d),h=d/f,m=64;p===1&&(m=256);let y=(P,O)=>O===4?`max(max(${P}.x, ${P}.y), max(${P}.z, ${P}.w))`:O===2?`max(${P}.x, ${P}.y)`:O===3?`max(max(${P}.x, ${P}.y), ${P}.z)`:P,g=A("x",u.dataType,u.dims,f),b=C("result",u.dataType,u.dims,f),x=g.type.value,w=ve(u.dataType)==="f32"?`var threadMax = ${x}(-3.4028234663852886e+38f);`:`var threadMax = ${x}(-65504.0h);`,v=P=>` + var rowMaxShared : ${x}; + var rowSumShared : ${x}; + var threadShared : array<${x}, ${m}>; + + fn getValue(row: i32, col: i32, row_stride: i32) -> ${x} { + let index = row * row_stride + col; + return x[index]; + } + + fn setValue(row: i32, col: i32, row_stride: i32, value: ${x}) { + let index = row * row_stride + col; + result[index] = value; + } + ${P.registerUniform("packedCols","i32").declareVariables(g,b)} + ${P.mainStart(m)} + let gindex = i32(global_idx); + let lindex = i32(local_idx); + const wg = ${m}; + let row = gindex / wg; + let cols = uniforms.packedCols; + let row_stride : i32 = uniforms.packedCols; + + // find the rows max + ${w} + for (var col = lindex; col < cols; col += wg) { + let value = getValue(row, col, row_stride); + threadMax = max(threadMax, value); + } + if (lindex < cols) { + threadShared[lindex] = threadMax; + } + workgroupBarrier(); + + var reduceSize = min(cols, wg); + for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) { + reduceSize = currSize + (reduceSize & 1); + if (lindex < currSize) { + threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]); + } + workgroupBarrier(); + } + if (lindex == 0) { + rowMaxShared = ${x}(${y("threadShared[0]",f)}); + } + workgroupBarrier(); + + // find the rows sum + var threadSum = ${x}(0.0); + for (var col = lindex; col < cols; col += wg) { + let subExp = exp(getValue(row, col, row_stride) - rowMaxShared); + threadSum += subExp; + } + threadShared[lindex] = threadSum; + workgroupBarrier(); + + for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) { + if (lindex < currSize) { + threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize]; + } + workgroupBarrier(); + } + if (lindex == 0) { + rowSumShared = ${x}(${$t("threadShared[0]",f)}); + } + workgroupBarrier(); + + // calculate final value for each element in the row + for (var col = lindex; col < cols; col += wg) { + var value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; + // max operation protects against NaN since all values should be >=0 + value = max(value, ${x}(0.0)); + setValue(row, col, row_stride, value); + } + }`,I=r.compute({name:"Softmax",shaderCache:{hint:`${f};${m}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:c,dataType:u.dataType}],dispatchGroup:{x:p},programUniforms:[{type:6,data:h}]}),getShaderSource:v},{inputs:[u],outputs:[s?-1:0]})[0];s&&r.compute(Fe(I,l),{inputs:[I]})},J_=(r,e)=>{zA(r.inputs),MA(r,e)},Q_=r=>J({axis:r.axis})});var ex,BA,VA,FA,tx,nx=$(()=>{"use strict";Z();ne();oe();ex=r=>Array.from(r.getBigInt64Array(),Number),BA=r=>{if(!r||r.length!==2)throw new Error("Tile requires 2 inputs.");if(r[0].dataType!==1&&r[0].dataType!==10&&r[0].dataType!==6&&r[0].dataType!==12)throw new Error("Tile only support float, float16, int32, and uint32 data types");if(r[1].dataType!==7)throw new Error("Tile `repeats` input should be of int64 data type");if(r[1].dims.length!==1)throw new Error("Tile `repeats` input should be 1-D");if(ex(r[1]).length!==r[0].dims.length)throw new Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},VA=(r,e)=>{let n=[];for(let t=0;t{let n=r[0].dims,t=e??ex(r[1]),o=VA(n,t),i=S.size(o),a=r[0].dataType,s=A("input",a,n.length),u=C("output",a,o.length),l=c=>` + const inputShape = ${s.indices(...n)}; + ${c.registerUniform("output_size","u32").declareVariables(s,u)} + ${c.mainStart()} + ${c.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${u.offsetToIndices("global_idx")}; + var input_indices: ${s.type.indices}; + for (var i = 0; i < ${n.length}; i++) { + let input_dim_i = ${s.indicesGet("uniforms.input_shape","i")}; + let input_dim_value = ${u.indicesGet("output_indices","i")} % input_dim_i; + + ${s.indicesSet("input_indices","i","input_dim_value")} + } + ${u.setByOffset("global_idx",s.getByIndices("input_indices"))} + }`;return{name:"Tile",shaderCache:{hint:`${t}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:o,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:[{type:12,data:i},...k(r[0].dims,o)]}),getShaderSource:l}},tx=r=>{BA(r.inputs),r.compute(FA(r.inputs),{inputs:[0]})}});var GA,UA,rx,ox=$(()=>{"use strict";Z();ne();oe();GA=(r,e,n,t,o)=>{let i=C("output_data",o,n.length,4),a=A("a_data",e[1].dataType,e[1].dims.length,4),s=A("b_data",e[2].dataType,e[2].dims.length,4),u=A("c_data",e[0].dataType,e[0].dims.length,4),l,c=(d,p,f)=>`select(${p}, ${d}, ${f})`;if(!t)l=i.setByOffset("global_idx",c(a.getByOffset("global_idx"),s.getByOffset("global_idx"),u.getByOffset("global_idx")));else{let d=(p,f,h="")=>{let m=`a_data[index_a${f}][component_a${f}]`,y=`b_data[index_b${f}][component_b${f}]`,g=`bool(c_data[index_c${f}] & (0xffu << (component_c${f} * 8)))`;return` + let output_indices${f} = ${i.offsetToIndices(`global_idx * 4u + ${f}u`)}; + let offset_a${f} = ${a.broadcastedIndicesToOffset(`output_indices${f}`,i)}; + let offset_b${f} = ${s.broadcastedIndicesToOffset(`output_indices${f}`,i)}; + let offset_c${f} = ${u.broadcastedIndicesToOffset(`output_indices${f}`,i)}; + let index_a${f} = offset_a${f} / 4u; + let index_b${f} = offset_b${f} / 4u; + let index_c${f} = offset_c${f} / 4u; + let component_a${f} = offset_a${f} % 4u; + let component_b${f} = offset_b${f} % 4u; + let component_c${f} = offset_c${f} % 4u; + ${p}[${f}] = ${h}(${c(m,y,g)}); + `};o===9?l=` + var data = vec4(0); + ${d("data",0,"u32")} + ${d("data",1,"u32")} + ${d("data",2,"u32")} + ${d("data",3,"u32")} + output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:l=` + ${d("output_data[global_idx]",0)} + ${d("output_data[global_idx]",1)} + ${d("output_data[global_idx]",2)} + ${d("output_data[global_idx]",3)} + `}return` + ${r.registerUniform("vec_size","u32").declareVariables(u,a,s,i)} + ${r.mainStart()} + ${r.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${l} + }`},UA=r=>{let e=r[1].dims,n=r[2].dims,t=r[0].dims,o=r[1].dataType,i=!(S.areEqual(e,n)&&S.areEqual(n,t)),a=e,s=S.size(e);if(i){let l=gn.calcShape(gn.calcShape(e,n,!1),t,!1);if(!l)throw new Error("Can't perform where op on the given tensors");a=l,s=S.size(a)}let u=Math.ceil(s/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:l=>GA(l,r,a,i,o),getRunData:()=>({outputs:[{dims:a,dataType:o}],dispatchGroup:{x:Math.ceil(s/64/4)},programUniforms:[{type:12,data:u},...k(t,e,n,a)]})}},rx=r=>{r.compute(UA(r.inputs))}});var ix,ax=$(()=>{"use strict";Vg();Ui();Ug();Hg();Eb();Fb();Wb();ay();fy();gy();_y();Iy();Ay();Oy();Dy();Ry();My();Fy();Wy();jy();n_();i_();s_();l_();p_();ml();h_();C_();L_();N_();B_();Fi();W_();yl();q_();Z_();Y_();bl();nx();An();Hi();ox();ix=new Map([["Abs",[qg]],["Acos",[jg]],["Acosh",[Kg]],["Add",[Cb]],["ArgMax",[Bg,nl]],["ArgMin",[Mg,nl]],["Asin",[Xg]],["Asinh",[Zg]],["Atan",[Jg]],["Atanh",[Qg]],["Attention",[Fg]],["AveragePool",[T_,w_]],["BatchNormalization",[Gg]],["BiasAdd",[Wg]],["BiasSplitGelu",[Ob]],["Cast",[eb,Yg]],["Ceil",[nb]],["Clip",[tb]],["Concat",[Gb,Ub]],["Conv",[dl,cl]],["ConvTranspose",[py,cy]],["Cos",[rb]],["Cosh",[ob]],["CumSum",[hy,my]],["DepthToSpace",[by,yy]],["DequantizeLinear",[D_,k_]],["Div",[Db]],["Einsum",[Ty,vy]],["Elu",[ib,no]],["Equal",[kb]],["Erf",[ab]],["Exp",[sb]],["Expand",[$y]],["FastGelu",[Py]],["Floor",[ub]],["FusedConv",[dl,cl]],["Gather",[Cy,Ey]],["GatherElements",[Vy,By]],["GatherBlockQuantized",[Ny,zy]],["GatherND",[ky,Ly]],["Gelu",[lb]],["Gemm",[Uy,Gy]],["GlobalAveragePool",[S_,I_]],["GlobalMaxPool",[E_,O_]],["Greater",[zb]],["GreaterOrEqual",[Bb]],["GridSample",[Hy,qy]],["GroupQueryAttention",[t_]],["HardSigmoid",[bb,gb]],["InstanceNormalization",[o_]],["LayerNormalization",[a_]],["LeakyRelu",[cb,no]],["Less",[Mb]],["LessOrEqual",[Vb]],["Log",[$b]],["MatMul",[u_]],["MatMulNBits",[c_,d_]],["MaxPool",[A_,P_]],["Mul",[Lb]],["MultiHeadAttention",[Zy,Xy]],["Neg",[pb]],["Not",[db]],["Pad",[f_]],["Pow",[Rb]],["QuickGelu",[Ab,no]],["Range",[R_]],["Reciprocal",[fb]],["ReduceMin",[Dg]],["ReduceMean",[Ag]],["ReduceMax",[Cg]],["ReduceSum",[Lg]],["ReduceProd",[kg]],["ReduceL1",[Pg]],["ReduceL2",[Og]],["ReduceLogSum",[Ng]],["ReduceLogSumExp",[Eg]],["ReduceSumSquare",[Rg]],["Relu",[hb]],["Resize",[G_,U_]],["RotaryEmbedding",[Yy]],["ScatterND",[M_,z_]],["Sigmoid",[mb]],["Sin",[yb]],["Sinh",[_b]],["Slice",[K_,X_]],["SkipLayerNormalization",[H_]],["Split",[Jy,Qy]],["Sqrt",[xb]],["Softmax",[J_,Q_]],["Sub",[Nb]],["Tan",[wb]],["Tanh",[vb]],["ThresholdedRelu",[Sb,no]],["Tile",[tx]],["Transpose",[hg,mg]],["Where",[rx]]])});var na,sx=$(()=>{"use strict";qe();mn();oe();na=class{constructor(e){this.backend=e;this.repo=new Map,this.attributesBound=!1}getArtifact(e){return this.repo.get(e)}setArtifact(e,n){this.repo.set(e,n)}run(e,n,t,o,i){et(e.programInfo.name);let a=this.backend.device,s=this.backend.getComputePassEncoder();this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2);let u=[];for(let c of n)u.push({binding:u.length,resource:{buffer:c.buffer}});for(let c of t)u.push({binding:u.length,resource:{buffer:c.buffer}});i&&u.push({binding:u.length,resource:i});let l=a.createBindGroup({layout:e.computePipeline.getBindGroupLayout(0),entries:u,label:e.programInfo.name});if(this.backend.sessionStatus==="capturing"){let c={kernelId:this.backend.currentKernelId,computePipeline:e.computePipeline,bindGroup:l,dispatchGroup:o};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(c)}s.setPipeline(e.computePipeline),s.setBindGroup(0,l),s.dispatchWorkgroups(...o),this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),Xe(e.programInfo.name)}dispose(){}build(e,n){et(e.name);let t=this.backend.device,o=[];[{feature:"shader-f16",extension:"f16"},{feature:"subgroups",extension:"subgroups"}].forEach(d=>{t.features.has(d.feature)&&o.push(`enable ${d.extension};`)});let a=pg(n,this.backend.device.limits),s=e.getShaderSource(a),u=`${o.join(` +`)} +${a.additionalImplementations} +${s}`,l=t.createShaderModule({code:u,label:e.name});ie("verbose",()=>`[WebGPU] ${e.name} shader code: ${u}`);let c=t.createComputePipeline({compute:{module:l,entryPoint:"main"},layout:"auto",label:e.name});return Xe(e.name),{programInfo:e,computePipeline:c,uniformVariablesInfo:a.variablesInfo}}normalizeDispatchGroupSize(e){let n=typeof e=="number"?e:e.x,t=typeof e=="number"?1:e.y||1,o=typeof e=="number"?1:e.z||1,i=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(n<=i&&t<=i&&o<=i)return[n,t,o];let a=n*t*o,s=Math.ceil(Math.sqrt(a));if(s>i){if(s=Math.ceil(Math.cbrt(a)),s>i)throw new Error("Total dispatch size exceeds WebGPU maximum.");return[s,s,s]}else return[s,s,1]}}});var ux={};Wn(ux,{WebGpuBackend:()=>xl});var WA,HA,_l,xl,lx=$(()=>{"use strict";qe();Z();mn();Wu();cg();ax();sx();WA=(r,e)=>{if(e.length!==r.length)throw new Error(`inputDependencies length ${e.length} is not equal to inputTensors length ${r.length}.`);let n=[];for(let t=0;t{let t=r.name;return r.shaderCache?.hint&&(t+="["+r.shaderCache.hint+"]"),t+=":"+n+`:${WA(e,r.shaderCache?.inputDependencies??new Array(e.length).fill("dims"))}`,t},_l=class{constructor(e){e&&(this.architecture=e.architecture,this.vendor=e.vendor)}isArchitecture(e){return this.architecture===e}isVendor(e){return this.vendor===e}},xl=class{constructor(){this.currentSessionId=null;this.currentKernelId=null;this.commandEncoder=null;this.computePassEncoder=null;this.maxDispatchNumber=16;this.pendingDispatchNumber=0;this.pendingKernels=[];this.pendingQueries=new Map;this.sessionStatus="default";this.capturedCommandList=new Map;this.capturedPendingKernels=new Map;this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw new Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let e=this.kernelCustomData.get(this.currentKernelId);return e||(e={},this.kernelCustomData.set(this.currentKernelId,e)),e}async initialize(e,n){this.env=e;let t=[],o={requiredLimits:{maxComputeWorkgroupStorageSize:n.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:n.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:n.limits.maxStorageBufferBindingSize,maxBufferSize:n.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:n.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:n.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:n.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:n.limits.maxComputeWorkgroupSizeZ},requiredFeatures:t},i=a=>n.features.has(a)&&t.push(a)&&!0;i("chromium-experimental-timestamp-query-inside-passes")||i("timestamp-query"),i("shader-f16"),i("subgroups"),this.device=await n.requestDevice(o),this.adapterInfo=new _l(n.info||await n.requestAdapterInfo()),this.gpuDataManager=lg(this),this.programManager=new na(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,Ci(e.logLevel,!!e.debug),this.device.onuncapturederror=a=>{a.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${a.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:n,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let e=this.getCommandEncoder(),n={};this.queryType==="at-passes"&&(n.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:this.pendingDispatchNumber*2,endOfPassWriteIndex:this.pendingDispatchNumber*2+1}),this.computePassEncoder=e.beginComputePass(n)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;et(),this.endComputePass();let e;this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,this.pendingDispatchNumber*2,this.queryResolveBuffer,0),e=this.device.createBuffer({size:this.pendingDispatchNumber*2*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(e,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,e,0,this.pendingDispatchNumber*2*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&e.mapAsync(GPUMapMode.READ).then(()=>{let n=new BigUint64Array(e.getMappedRange()),t=this.pendingQueries.get(e);for(let o=0;o"u"&&(this.queryTimeBase=f);let m=Number(f-this.queryTimeBase),y=Number(h-this.queryTimeBase);if(!Number.isSafeInteger(m)||!Number.isSafeInteger(y))throw new RangeError("incorrect timestamp range");if(this.env.webgpu.profiling?.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:d.map(g=>({dims:g.dims,dataType:hn(g.dataType)})),outputsMetadata:p.map(g=>({dims:g.dims,dataType:hn(g.dataType)})),kernelId:a,kernelType:u,kernelName:l,programName:c,startTime:m,endTime:y});else{let g="";d.forEach((x,w)=>{g+=`input[${w}]: [${x.dims}] | ${hn(x.dataType)}, `});let b="";p.forEach((x,w)=>{b+=`output[${w}]: [${x.dims}] | ${hn(x.dataType)}, `}),console.log(`[profiling] kernel "${a}|${u}|${l}|${c}" ${g}${b}start time: ${m} ns, execution time: ${y-m} ns`)}Dr("GPU",`${c}::${f}::${h}`)}e.unmap(),this.pendingQueries.delete(e)}),Xe()}run(e,n,t,o,i,a){et(e.name);let s=[];for(let x=0;xw):t;if(d.length!==u.length)throw new Error(`Output size ${d.length} must be equal to ${u.length}.`);let p=[],f=[];for(let x=0;x=a)throw new Error(`Invalid output index: ${d[x]}`);if(d[x]===-3)continue;let w=d[x]===-1,v=d[x]===-2,I=w||v?i(u[x].dataType,u[x].dims):o(d[x],u[x].dataType,u[x].dims);if(p.push(I),I.data===0)continue;let P=this.gpuDataManager.get(I.data);if(!P)throw new Error(`no GPU data for output: ${I.data}`);if(w&&this.temporaryData.push(P),v){let O=this.kernelPersistentData.get(this.currentKernelId);O||(O=[],this.kernelPersistentData.set(this.currentKernelId,O)),O.push(P)}f.push(P)}if(s.length!==n.length||f.length!==p.length){if(f.length===0)return Xe(e.name),p;throw new Error(`Program ${e.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}let h;if(c){let x=0,w=[];c.forEach(O=>{let E=typeof O.data=="number"?[O.data]:O.data;if(E.length===0)return;let R=O.type===10?2:4,q,B;O.type===10?(B=E.length>4?16:E.length>2?8:E.length*R,q=E.length>4?16:R*E.length):(B=E.length<=2?E.length*R:16,q=16),x=Math.ceil(x/B)*B,w.push(x);let W=O.type===10?8:4;x+=E.length>4?Math.ceil(E.length/W)*q:E.length*R});let v=16;x=Math.ceil(x/v)*v;let I=new ArrayBuffer(x);c.forEach((O,E)=>{let R=w[E],q=typeof O.data=="number"?[O.data]:O.data;if(O.type===6)new Int32Array(I,R,q.length).set(q);else if(O.type===12)new Uint32Array(I,R,q.length).set(q);else if(O.type===10)new Uint16Array(I,R,q.length).set(q);else if(O.type===1)new Float32Array(I,R,q.length).set(q);else throw new Error(`Unsupported uniform type: ${hn(O.type)}`)});let P=this.gpuDataManager.create(x,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(P.buffer,0,I,0,x),this.gpuDataManager.release(P.id),h={offset:0,size:x,buffer:P.buffer}}let m=this.programManager.normalizeDispatchGroupSize(l),y=m[1]===1&&m[2]===1,g=HA(e,n,y),b=this.programManager.getArtifact(g);if(b||(b=this.programManager.build(e,m),this.programManager.setArtifact(g,b),ie("info",()=>`[artifact] key: ${g}, programName: ${e.name}`)),c&&b.uniformVariablesInfo){if(c.length!==b.uniformVariablesInfo.length)throw new Error(`Uniform variables count mismatch: expect ${b.uniformVariablesInfo.length}, got ${c.length} in program "${b.programInfo.name}".`);for(let x=0;x`[ProgramManager] run "${e.name}" (key=${g}) with ${m[0]}x${m[1]}x${m[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let x={kernelId:this.currentKernelId,programName:b.programInfo.name,inputTensorViews:n,outputTensorViews:p};this.pendingKernels.push(x),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(x)}return this.programManager.run(b,s,f,m,h),Xe(e.name),p}upload(e,n){this.gpuDataManager.upload(e,n)}memcpy(e,n){this.gpuDataManager.memcpy(e,n)}async download(e,n){await this.gpuDataManager.download(e,n)}alloc(e){return this.gpuDataManager.create(e).id}free(e){return this.gpuDataManager.release(e)}createKernel(e,n,t,o){let i=ix.get(e);if(!i)throw new Error(`kernel not implemented: ${e}`);let a={kernelType:e,kernelName:o,kernelEntry:i[0],attributes:[i[1],t]};this.kernels.set(n,a)}releaseKernel(e){let n=this.kernelPersistentData.get(e);if(n){for(let t of n)this.gpuDataManager.release(t.id);this.kernelPersistentData.delete(e)}this.kernelCustomData.delete(e),this.kernels.delete(e)}computeKernel(e,n,t){let o=this.kernels.get(e);if(!o)throw new Error(`kernel not created: ${e}`);let i=o.kernelType,a=o.kernelName,s=o.kernelEntry,u=o.attributes;if(this.currentKernelId!==null)throw new Error(`kernel "[${i}] ${a}" is not allowed to be called recursively`);this.currentKernelId=e,u[0]&&(u[1]=u[0](u[1]),u[0]=void 0),ie("info",()=>`[WebGPU] Start to run kernel "[${i}] ${a}"...`);let l=this.env.debug;this.temporaryData=[];try{return l&&this.device.pushErrorScope("validation"),s(n,u[1]),0}catch(c){return t.push(Promise.resolve(`[WebGPU] Kernel "[${i}] ${a}" failed. ${c}`)),1}finally{l&&t.push(this.device.popErrorScope().then(c=>c?`GPU validation error for kernel "[${i}] ${a}": ${c.message}`:null));for(let c of this.temporaryData)this.gpuDataManager.release(c.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(e,n,t,o){let i=this.sessionExternalDataMapping.get(e);i||(i=new Map,this.sessionExternalDataMapping.set(e,i));let a=i.get(n),s=this.gpuDataManager.registerExternalBuffer(t,o,a);return i.set(n,[s,t]),s}unregisterBuffers(e){let n=this.sessionExternalDataMapping.get(e);n&&(n.forEach(t=>this.gpuDataManager.unregisterExternalBuffer(t[0])),this.sessionExternalDataMapping.delete(e))}getBuffer(e){let n=this.gpuDataManager.get(e);if(!n)throw new Error(`no GPU data for buffer: ${e}`);return n.buffer}createDownloader(e,n,t){return async()=>{let o=await Zu(this,e,n);return ki(o.buffer,t)}}writeTimestamp(e){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,e)}setQueryType(){this.queryType="none",(this.env.webgpu.profiling?.mode==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxDispatchNumber*2}),this.queryResolveBuffer=this.device.createBuffer({size:this.maxDispatchNumber*2*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){ie("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){ie("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){ie("info","replay"),this.sessionStatus="replaying";let e=this.capturedCommandList.get(this.currentSessionId),n=this.capturedPendingKernels.get(this.currentSessionId),t=e.length;this.pendingKernels=[];for(let o=0;o=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onCreateSession(){this.gpuDataManager.onCreateSession()}onReleaseSession(e){this.unregisterBuffers(e),this.capturedCommandList.has(e)&&this.capturedCommandList.delete(e),this.capturedPendingKernels.has(e)&&this.capturedPendingKernels.delete(e),this.gpuDataManager.onReleaseSession(e)}onRunStart(e){this.currentSessionId=e,this.setQueryType()}}});var cx={};Wn(cx,{init:()=>qA});var ao,wl,qA,dx=$(()=>{"use strict";Z();mn();ne();ig();ao=class r{constructor(e,n,t,o){this.module=e;this.dataType=n;this.data=t;this.dims=o}getFloat32Array(){if(this.dataType!==1)throw new Error("Invalid data type");let e=S.size(this.dims);return e===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,e)}getBigInt64Array(){if(this.dataType!==7)throw new Error("Invalid data type");let e=S.size(this.dims);return e===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,e)}getInt32Array(){if(this.dataType!==6)throw new Error("Invalid data type");let e=S.size(this.dims);return e===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,e)}getUint16Array(){if(this.dataType!==10&&this.dataType!==4)throw new Error("Invalid data type");let e=S.size(this.dims);return e===0?new Uint16Array:new Uint16Array(this.module.HEAP8.buffer,this.data,e)}reshape(e){if(S.size(e)!==S.size(this.dims))throw new Error("Invalid new shape");return new r(this.module,this.dataType,this.data,e)}},wl=class{constructor(e,n,t){this.module=e;this.backend=n;this.customDataOffset=0;this.customDataSize=0;this.adapterInfo=n.adapterInfo;let o=e.PTR_SIZE,i=t/e.PTR_SIZE,a=o===4?"i32":"i64";this.opKernelContext=Number(e.getValue(o*i++,a));let s=Number(e.getValue(o*i++,a));this.outputCount=Number(e.getValue(o*i++,a)),this.customDataOffset=Number(e.getValue(o*i++,"*")),this.customDataSize=Number(e.getValue(o*i++,a));let u=[];for(let l=0;ltypeof s=="number"?this.inputs[s]:s)??this.inputs,o=n?.outputs??[],i=(s,u,l)=>new ao(this.module,u,this.output(s,l),l),a=(s,u)=>{let l=Vn(s,u);if(!l)throw new Error(`Unsupported data type: ${s}`);let c=l>0?this.backend.gpuDataManager.create(l).id:0;return new ao(this.module,s,c,u)};return this.backend.run(e,t,o,i,a,this.outputCount)}output(e,n){let t=this.module.stackSave();try{let o=this.module.PTR_SIZE,i=o===4?"i32":"i64",a=this.module.stackAlloc((1+n.length)*o);this.module.setValue(a,n.length,i);for(let s=0;s{let o=e.jsepInit;if(!o)throw new Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(r==="webgpu"){let i=(lx(),pr(ux)).WebGpuBackend,a=new i;await a.initialize(n,t),o("webgpu",[a,s=>a.alloc(Number(s)),s=>a.free(s),(s,u,l,c=!1)=>{if(c)ie("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${Number(s)}, dst=${Number(u)}, size=${Number(l)}`),a.memcpy(Number(s),Number(u));else{ie("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${Number(s)}, gpuDataId=${Number(u)}, size=${Number(l)}`);let d=e.HEAPU8.subarray(Number(s>>>0),Number(s>>>0)+Number(l));a.upload(Number(u),d)}},async(s,u,l)=>{ie("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${s}, dataOffset=${u}, size=${l}`),await a.download(Number(s),()=>e.HEAPU8.subarray(Number(u)>>>0,Number(u+l)>>>0))},(s,u,l)=>a.createKernel(s,Number(u),l,e.UTF8ToString(e._JsepGetNodeName(Number(u)))),s=>a.releaseKernel(s),(s,u,l,c)=>{ie("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${l}, kernel=${s}, contextDataOffset=${u}`);let d=new wl(e,a,Number(u));return a.computeKernel(Number(s),d,c)},()=>a.captureBegin(),()=>a.captureEnd(),()=>a.replay()])}else{let i=new zi(n);o("webnn",[i,()=>i.reserveTensorId(),a=>i.releaseTensorId(a),async(a,s,u,l,c)=>i.ensureTensor(a,s,u,l,c),(a,s)=>{i.uploadTensor(a,s)},async(a,s)=>i.downloadTensor(a,s),(a,s)=>i.registerMLContext(a,s),!!n.trace])}}});var jA,yi,_i,cr,KA,px,Qr,xi,wi,fx,Ti,vi,Ii,zu=$(()=>{"use strict";qe();qm();Km();Z();Mn();Ai();Gu();jA=(r,e)=>{we()._OrtInit(r,e)!==0&&fe("Can't initialize onnxruntime.")},yi=async r=>{jA(r.wasm.numThreads,eo(r.logLevel))},_i=async(r,e)=>{we().asyncInit?.();let n=r.webgpu.adapter;if(e==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not supported in current environment");if(n){if(typeof n.limits!="object"||typeof n.features!="object"||typeof n.requestDevice!="function")throw new Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let t=r.webgpu.powerPreference;if(t!==void 0&&t!=="low-power"&&t!=="high-performance")throw new Error(`Invalid powerPreference setting: "${t}"`);let o=r.webgpu.forceFallbackAdapter;if(o!==void 0&&typeof o!="boolean")throw new Error(`Invalid forceFallbackAdapter setting: "${o}"`);if(n=await navigator.gpu.requestAdapter({powerPreference:t,forceFallbackAdapter:o}),!n)throw new Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}}if(e==="webnn"&&(typeof navigator>"u"||!navigator.ml))throw new Error("WebNN is not supported in current environment");{let t=(dx(),pr(cx)).init;e==="webgpu"&&await t("webgpu",we(),r,n),e==="webnn"&&await t("webnn",we(),r)}},cr=new Map,KA=r=>{let e=we(),n=e.stackSave();try{let t=e.PTR_SIZE,o=e.stackAlloc(2*t);e._OrtGetInputOutputCount(r,o,o+t)!==0&&fe("Can't get session input/output count.");let a=t===4?"i32":"i64";return[Number(e.getValue(o,a)),Number(e.getValue(o+t,a))]}finally{e.stackRestore(n)}},px=(r,e)=>{let n=we(),t=n.stackSave(),o=0;try{let i=n.PTR_SIZE,a=n.stackAlloc(2*i);n._OrtGetInputOutputMetadata(r,e,a,a+i)!==0&&fe("Can't get session input/output metadata.");let u=Number(n.getValue(a,"*"));o=Number(n.getValue(a+i,"*"));let l=n.HEAP32[o/4];if(l===0)return[u,0];let c=n.HEAPU32[o/4+1],d=[];for(let p=0;p{let e=we(),n=e._malloc(r.byteLength);if(n===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${r.byteLength}.`);return e.HEAPU8.set(r,n),[n,r.byteLength]},xi=async(r,e)=>{let n,t,o=we();Array.isArray(r)?[n,t]=r:r.buffer===o.HEAPU8.buffer?[n,t]=[r.byteOffset,r.byteLength]:[n,t]=Qr(r);let i=0,a=0,s=0,u=[],l=[],c=[];try{if([a,u]=await jm(e),e?.externalData&&o.mountExternalData){let w=[];for(let v of e.externalData){let I=typeof v=="string"?v:v.path;w.push(to(typeof v=="string"?v:v.data).then(P=>{o.mountExternalData(I,P)}))}await Promise.all(w)}for(let w of e?.executionProviders??[])if((typeof w=="string"?w:w.name)==="webnn"){if(o.shouldTransferToMLTensor=!1,typeof w!="string"){let I=w,P=I?.context,O=I?.gpuDevice,E=I?.deviceType,R=I?.powerPreference;P?o.currentContext=P:O?o.currentContext=await o.webnnCreateMLContext(O):o.currentContext=await o.webnnCreateMLContext({deviceType:E,powerPreference:R})}else o.currentContext=await o.webnnCreateMLContext();break}i=await o._OrtCreateSession(n,t,a),o.webgpuOnCreateSession?.(i),i===0&&fe("Can't create a session."),o.jsepOnCreateSession?.(),o.currentContext&&(o.webnnRegisterMLContext(i,o.currentContext),o.currentContext=void 0,o.shouldTransferToMLTensor=!0);let[d,p]=KA(i),f=!!e?.enableGraphCapture,h=[],m=[],y=[],g=[],b=[];for(let w=0;ww==="gpu-buffer"||w==="ml-tensor"||w==="ml-tensor-cpu-output")&&(s=o._OrtCreateBinding(i),s===0&&fe("Can't create IO binding."),x={handle:s,outputPreferredLocations:b,outputPreferredLocationsEncoded:b.map(w=>w==="ml-tensor-cpu-output"?"ml-tensor":w).map(w=>Fu(w))}),cr.set(i,[i,l,c,x,f,!1]),[i,h,m,y,g]}catch(d){throw l.forEach(p=>o._OrtFree(p)),c.forEach(p=>o._OrtFree(p)),s!==0&&o._OrtReleaseBinding(s)!==0&&fe("Can't release IO binding."),i!==0&&o._OrtReleaseSession(i)!==0&&fe("Can't release session."),d}finally{o._free(n),a!==0&&o._OrtReleaseSessionOptions(a)!==0&&fe("Can't release session options."),u.forEach(d=>o._free(d)),o.unmountExternalData?.()}},wi=r=>{let e=we(),n=cr.get(r);if(!n)throw new Error(`cannot release session. invalid session id: ${r}`);let[t,o,i,a,s]=n;a&&(s&&e._OrtClearBoundOutputs(a.handle)!==0&&fe("Can't clear bound outputs."),e._OrtReleaseBinding(a.handle)!==0&&fe("Can't release IO binding.")),e.jsepOnReleaseSession?.(r),e.webnnOnReleaseSession?.(r),e.webgpuOnReleaseSession?.(r),o.forEach(u=>e._OrtFree(u)),i.forEach(u=>e._OrtFree(u)),e._OrtReleaseSession(t)!==0&&fe("Can't release session."),cr.delete(r)},fx=async(r,e,n,t,o,i,a=!1)=>{if(!r){e.push(0);return}let s=we(),u=s.PTR_SIZE,l=r[0],c=r[1],d=r[3],p=d,f,h;if(l==="string"&&(d==="gpu-buffer"||d==="ml-tensor"))throw new Error("String tensor is not supported on GPU.");if(a&&d!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${i} when enableGraphCapture is true.`);if(d==="gpu-buffer"){let g=r[2].gpuBuffer;h=Vn(Bn(l),c);{let b=s.jsepRegisterBuffer;if(!b)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');f=b(t,i,g,h)}}else if(d==="ml-tensor"){let g=r[2].mlTensor;h=Vn(Bn(l),c);let b=s.webnnRegisterMLTensor;if(!b)throw new Error('Tensor location "ml-tensor" is not supported without using WebNN.');f=b(t,g,Bn(l),c)}else{let g=r[2];if(Array.isArray(g)){h=u*g.length,f=s._malloc(h),n.push(f);for(let b=0;bs.setValue(y+x*u,b,u===4?"i32":"i64"));let g=s._OrtCreateTensor(Bn(l),f,h,y,c.length,Fu(p));g===0&&fe(`Can't create tensor for input/output. session=${t}, index=${i}.`),e.push(g)}finally{s.stackRestore(m)}},Ti=async(r,e,n,t,o,i)=>{let a=we(),s=a.PTR_SIZE,u=cr.get(r);if(!u)throw new Error(`cannot run inference. invalid session id: ${r}`);let l=u[0],c=u[1],d=u[2],p=u[3],f=u[4],h=u[5],m=e.length,y=t.length,g=0,b=[],x=[],w=[],v=[],I=[],P=a.stackSave(),O=a.stackAlloc(m*s),E=a.stackAlloc(m*s),R=a.stackAlloc(y*s),q=a.stackAlloc(y*s);try{[g,b]=Hm(i),vn("wasm prepareInputOutputTensor");for(let F=0;FGe*De,1);ue=hn(D);let Un=p?.outputPreferredLocations[t[F]];if(ue==="string"){if(Un==="gpu-buffer"||Un==="ml-tensor")throw new Error("String tensor is not supported on GPU.");let Ge=[];for(let De=0;De0){let Ge=a.jsepGetBuffer;if(!Ge)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let De=Ge(Ie),On=Vn(D,Qe);if(On===void 0||!Oi(ue))throw new Error(`Unsupported data type: ${ue}`);Y=!0,W.push([ue,lt,{gpuBuffer:De,download:a.jsepCreateDownloader(De,On,ue),dispose:()=>{a._OrtReleaseTensor(U)!==0&&fe("Can't release tensor.")}},"gpu-buffer"])}else if(Un==="ml-tensor"&&Qe>0){let Ge=a.webnnEnsureTensor,De=a.webnnIsGraphInputOutputTypeSupported;if(!Ge||!De)throw new Error('preferredLocation "ml-tensor" is not supported without using WebNN.');if(Vn(D,Qe)===void 0||!Ei(ue))throw new Error(`Unsupported data type: ${ue}`);if(!De(r,ue,!1))throw new Error(`preferredLocation "ml-tensor" for ${ue} output is not supported by current WebNN Context.`);let uo=await Ge(r,Ie,D,lt,!1);Y=!0,W.push([ue,lt,{mlTensor:uo,download:a.webnnCreateMLTensorDownloader(Ie,ue),dispose:()=>{a.webnnReleaseTensorId(Ie),a._OrtReleaseTensor(U)}},"ml-tensor"])}else if(Un==="ml-tensor-cpu-output"&&Qe>0){let Ge=a.webnnCreateMLTensorDownloader(Ie,ue)(),De=W.length;Y=!0,ae.push((async()=>{let On=[De,await Ge];return a.webnnReleaseTensorId(Ie),a._OrtReleaseTensor(U),On})()),W.push([ue,lt,[],"cpu"])}else{let Ge=Sr(ue),De=new Ge(Qe);new Uint8Array(De.buffer,De.byteOffset,De.byteLength).set(a.HEAPU8.subarray(Ie,Ie+De.byteLength)),W.push([ue,lt,De,"cpu"])}}finally{a.stackRestore(K),ue==="string"&&Ie&&a._free(Ie),Y||a._OrtReleaseTensor(U)}}p&&!f&&(a._OrtClearBoundOutputs(p.handle)!==0&&fe("Can't clear bound outputs."),cr.set(r,[l,c,d,p,f,!1]));for(let[F,U]of await Promise.all(ae))W[F][2]=U;return In("wasm ProcessOutputTensor"),W}finally{a.webnnOnRunEnd?.(l),a.stackRestore(P),x.forEach(B=>a._OrtReleaseTensor(B)),w.forEach(B=>a._OrtReleaseTensor(B)),v.forEach(B=>a._free(B)),g!==0&&a._OrtReleaseRunOptions(g),b.forEach(B=>a._free(B))}},vi=r=>{let e=we(),n=cr.get(r);if(!n)throw new Error("invalid session id");let t=n[0],o=e._OrtEndProfiling(t);o===0&&fe("Can't get an profile file name."),e._OrtFree(o)},Ii=r=>{let e=[];for(let n of r){let t=n[2];!Array.isArray(t)&&"buffer"in t&&e.push(t.buffer)}return e}});var dr,_t,so,oa,ia,ra,Tl,vl,Or,Er,ZA,hx,mx,gx,bx,yx,_x,xx,Il=$(()=>{"use strict";qe();zu();Mn();gi();dr=()=>!!ee.wasm.proxy&&typeof document<"u",so=!1,oa=!1,ia=!1,vl=new Map,Or=(r,e)=>{let n=vl.get(r);n?n.push(e):vl.set(r,[e])},Er=()=>{if(so||!oa||ia||!_t)throw new Error("worker not ready")},ZA=r=>{switch(r.data.type){case"init-wasm":so=!1,r.data.err?(ia=!0,Tl[1](r.data.err)):(oa=!0,Tl[0]()),ra&&(URL.revokeObjectURL(ra),ra=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let e=vl.get(r.data.type);r.data.err?e.shift()[1](r.data.err):e.shift()[0](r.data.out);break}default:}},hx=async()=>{if(!oa){if(so)throw new Error("multiple calls to 'initWasm()' detected.");if(ia)throw new Error("previous call to 'initWasm()' failed.");if(so=!0,dr())return new Promise((r,e)=>{_t?.terminate(),Gm().then(([n,t])=>{try{_t=t,_t.onerror=i=>e(i),_t.onmessage=ZA,Tl=[r,e];let o={type:"init-wasm",in:ee};if(!o.in.wasm.wasmPaths&&n){let i=Si();i&&(o.in.wasm.wasmPaths=i)}_t.postMessage(o),ra=n}catch(o){e(o)}},e)});try{await bi(ee.wasm),await yi(ee),oa=!0}catch(r){throw ia=!0,r}finally{so=!1}}},mx=async r=>{if(dr())return Er(),new Promise((e,n)=>{Or("init-ep",[e,n]);let t={type:"init-ep",in:{epName:r,env:ee}};_t.postMessage(t)});await _i(ee,r)},gx=async r=>dr()?(Er(),new Promise((e,n)=>{Or("copy-from",[e,n]);let t={type:"copy-from",in:{buffer:r}};_t.postMessage(t,[r.buffer])})):Qr(r),bx=async(r,e)=>{if(dr()){if(e?.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return Er(),new Promise((n,t)=>{Or("create",[n,t]);let o={type:"create",in:{model:r,options:{...e}}},i=[];r instanceof Uint8Array&&i.push(r.buffer),_t.postMessage(o,i)})}else return xi(r,e)},yx=async r=>{if(dr())return Er(),new Promise((e,n)=>{Or("release",[e,n]);let t={type:"release",in:r};_t.postMessage(t)});wi(r)},_x=async(r,e,n,t,o,i)=>{if(dr()){if(n.some(a=>a[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(o.some(a=>a))throw new Error("pre-allocated output tensor is not supported for proxy.");return Er(),new Promise((a,s)=>{Or("run",[a,s]);let u=n,l={type:"run",in:{sessionId:r,inputIndices:e,inputs:u,outputIndices:t,options:i}};_t.postMessage(l,Ii(u))})}else return Ti(r,e,n,t,o,i)},xx=async r=>{if(dr())return Er(),new Promise((e,n)=>{Or("end-profiling",[e,n]);let t={type:"end-profiling",in:r};_t.postMessage(t)});vi(r)}});var wx,JA,aa,Tx=$(()=>{"use strict";qe();Il();Z();mi();Gu();wx=(r,e)=>{switch(r.location){case"cpu":return[r.type,r.dims,r.data,"cpu"];case"gpu-buffer":return[r.type,r.dims,{gpuBuffer:r.gpuBuffer},"gpu-buffer"];case"ml-tensor":return[r.type,r.dims,{mlTensor:r.mlTensor},"ml-tensor"];default:throw new Error(`invalid data location: ${r.location} for ${e()}`)}},JA=r=>{switch(r[3]){case"cpu":return new Ye(r[0],r[2],r[1]);case"gpu-buffer":{let e=r[0];if(!Oi(e))throw new Error(`not supported data type: ${e} for deserializing GPU tensor`);let{gpuBuffer:n,download:t,dispose:o}=r[2];return Ye.fromGpuBuffer(n,{dataType:e,dims:r[1],download:t,dispose:o})}case"ml-tensor":{let e=r[0];if(!Ei(e))throw new Error(`not supported data type: ${e} for deserializing MLTensor tensor`);let{mlTensor:n,download:t,dispose:o}=r[2];return Ye.fromMLTensor(n,{dataType:e,dims:r[1],download:t,dispose:o})}default:throw new Error(`invalid data location: ${r[3]}`)}},aa=class{async fetchModelAndCopyToWasmMemory(e){return gx(await to(e))}async loadModel(e,n){et();let t;typeof e=="string"?t=await this.fetchModelAndCopyToWasmMemory(e):t=e,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await bx(t,n),Xe()}async dispose(){return yx(this.sessionId)}async run(e,n,t){et();let o=[],i=[];Object.entries(e).forEach(p=>{let f=p[0],h=p[1],m=this.inputNames.indexOf(f);if(m===-1)throw new Error(`invalid input '${f}'`);o.push(h),i.push(m)});let a=[],s=[];Object.entries(n).forEach(p=>{let f=p[0],h=p[1],m=this.outputNames.indexOf(f);if(m===-1)throw new Error(`invalid output '${f}'`);a.push(h),s.push(m)});let u=o.map((p,f)=>wx(p,()=>`input "${this.inputNames[i[f]]}"`)),l=a.map((p,f)=>p?wx(p,()=>`output "${this.outputNames[s[f]]}"`):null),c=await _x(this.sessionId,i,u,s,l,t),d={};for(let p=0;psa,initializeFlags:()=>vx,wasmBackend:()=>QA});var vx,sa,QA,Sx=$(()=>{"use strict";qe();Il();Tx();vx=()=>{(typeof ee.wasm.initTimeout!="number"||ee.wasm.initTimeout<0)&&(ee.wasm.initTimeout=0);let r=ee.wasm.simd;if(typeof r!="boolean"&&r!==void 0&&r!=="fixed"&&r!=="relaxed"&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${r}". Reset it to \`false\` and ignore SIMD feature checking.`),ee.wasm.simd=!1),typeof ee.wasm.proxy!="boolean"&&(ee.wasm.proxy=!1),typeof ee.wasm.trace!="boolean"&&(ee.wasm.trace=!1),typeof ee.wasm.numThreads!="number"||!Number.isInteger(ee.wasm.numThreads)||ee.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)ee.wasm.numThreads=1;else{let e=typeof navigator>"u"?ua("node:os").cpus().length:navigator.hardwareConcurrency;ee.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}},sa=class{async init(e){vx(),await hx(),await mx(e)}async createInferenceSessionHandler(e,n){let t=new aa;return await t.loadModel(e,n),t}},QA=new sa});var eP={};Wn(eP,{InferenceSession:()=>Zl,TRACE:()=>Dr,TRACE_EVENT_BEGIN:()=>vn,TRACE_EVENT_END:()=>In,TRACE_FUNC_BEGIN:()=>et,TRACE_FUNC_END:()=>Xe,Tensor:()=>Ye,default:()=>YA,env:()=>ee,registerBackend:()=>Tn});qe();qe();qe();var nc="1.24.3";var YA=ha;{let r=(Lm(),pr(km)).onnxjsBackend;Tn("webgl",r,-10)}{let r=(Sx(),pr(Ix)).wasmBackend;Tn("webgpu",r,5),Tn("webnn",r,5),Tn("cpu",r,10),Tn("wasm",r,10)}Object.defineProperty(ee.versions,"web",{value:nc,enumerable:!0});return pr(eP);})(); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/*! Bundled license information: + +long/index.js: + (** + * @license + * Copyright 2009 The Closure Library Authors + * Copyright 2020 Daniel Wirtz / The long.js Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + *) +*/ +typeof exports=="object"&&typeof module=="object"&&(module.exports=ort); +//# sourceMappingURL=ort.all.min.js.map diff --git a/vendor/picocss/pico.min.css b/vendor/picocss/pico.min.css new file mode 100644 index 0000000000000000000000000000000000000000..e10ec26dd4f8959f533f22a93c9fadd0459b4ae3 --- /dev/null +++ b/vendor/picocss/pico.min.css @@ -0,0 +1,4 @@ +@charset "UTF-8";/*! + * Pico CSS ✨ v2.1.1 (https://picocss.com) + * Copyright 2019-2025 - Licensed under MIT + */:host,:root{--pico-font-family-emoji:"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--pico-font-family-sans-serif:system-ui,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,Helvetica,Arial,"Helvetica Neue",sans-serif,var(--pico-font-family-emoji);--pico-font-family-monospace:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace,var(--pico-font-family-emoji);--pico-font-family:var(--pico-font-family-sans-serif);--pico-line-height:1.5;--pico-font-weight:400;--pico-font-size:100%;--pico-text-underline-offset:0.1rem;--pico-border-radius:0.25rem;--pico-border-width:0.0625rem;--pico-outline-width:0.125rem;--pico-transition:0.2s ease-in-out;--pico-spacing:1rem;--pico-typography-spacing-vertical:1rem;--pico-block-spacing-vertical:var(--pico-spacing);--pico-block-spacing-horizontal:var(--pico-spacing);--pico-grid-column-gap:var(--pico-spacing);--pico-grid-row-gap:var(--pico-spacing);--pico-form-element-spacing-vertical:0.75rem;--pico-form-element-spacing-horizontal:1rem;--pico-group-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-primary-focus);--pico-group-box-shadow-focus-with-input:0 0 0 0.0625rem var(--pico-form-element-border-color);--pico-modal-overlay-backdrop-filter:blur(0.375rem);--pico-nav-element-spacing-vertical:1rem;--pico-nav-element-spacing-horizontal:0.5rem;--pico-nav-link-spacing-vertical:0.5rem;--pico-nav-link-spacing-horizontal:0.5rem;--pico-nav-breadcrumb-divider:">";--pico-icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--pico-icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--pico-icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--pico-icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--pico-icon-loading:url("data:image/svg+xml,%3Csvg fill='none' height='24' width='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3E%3Cstyle%3E g %7B animation: rotate 2s linear infinite; transform-origin: center center; %7D circle %7B stroke-dasharray: 75,100; stroke-dashoffset: -5; animation: dash 1.5s ease-in-out infinite; stroke-linecap: round; %7D @keyframes rotate %7B 0%25 %7B transform: rotate(0deg); %7D 100%25 %7B transform: rotate(360deg); %7D %7D @keyframes dash %7B 0%25 %7B stroke-dasharray: 1,100; stroke-dashoffset: 0; %7D 50%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -17.5; %7D 100%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -62; %7D %7D %3C/style%3E%3Cg%3E%3Ccircle cx='12' cy='12' r='10' fill='none' stroke='rgb(136, 145, 164)' stroke-width='4' /%3E%3C/g%3E%3C/svg%3E")}@media (min-width:576px){:host,:root{--pico-font-size:106.25%}}@media (min-width:768px){:host,:root{--pico-font-size:112.5%}}@media (min-width:1024px){:host,:root{--pico-font-size:118.75%}}@media (min-width:1280px){:host,:root{--pico-font-size:125%}}@media (min-width:1536px){:host,:root{--pico-font-size:131.25%}}a{--pico-text-decoration:underline}a.contrast,a.secondary{--pico-text-decoration:underline}small{--pico-font-size:0.875em}h1,h2,h3,h4,h5,h6{--pico-font-weight:700}h1{--pico-font-size:2rem;--pico-line-height:1.125;--pico-typography-spacing-top:3rem}h2{--pico-font-size:1.75rem;--pico-line-height:1.15;--pico-typography-spacing-top:2.625rem}h3{--pico-font-size:1.5rem;--pico-line-height:1.175;--pico-typography-spacing-top:2.25rem}h4{--pico-font-size:1.25rem;--pico-line-height:1.2;--pico-typography-spacing-top:1.874rem}h5{--pico-font-size:1.125rem;--pico-line-height:1.225;--pico-typography-spacing-top:1.6875rem}h6{--pico-font-size:1rem;--pico-line-height:1.25;--pico-typography-spacing-top:1.5rem}tfoot td,tfoot th,thead td,thead th{--pico-font-weight:600;--pico-border-width:0.1875rem}code,kbd,pre,samp{--pico-font-family:var(--pico-font-family-monospace)}kbd{--pico-font-weight:bolder}:where(select,textarea),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-outline-width:0.0625rem}[type=search]{--pico-border-radius:5rem}[type=checkbox],[type=radio]{--pico-border-width:0.125rem}[type=checkbox][role=switch]{--pico-border-width:0.1875rem}details.dropdown summary:not([role=button]){--pico-outline-width:0.0625rem}nav details.dropdown summary:focus-visible{--pico-outline-width:0.125rem}[role=search]{--pico-border-radius:5rem}[role=group]:has(button.secondary:focus,[type=submit].secondary:focus,[type=button].secondary:focus,[role=button].secondary:focus),[role=search]:has(button.secondary:focus,[type=submit].secondary:focus,[type=button].secondary:focus,[role=button].secondary:focus){--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}[role=group]:has(button.contrast:focus,[type=submit].contrast:focus,[type=button].contrast:focus,[role=button].contrast:focus),[role=search]:has(button.contrast:focus,[type=submit].contrast:focus,[type=button].contrast:focus,[role=button].contrast:focus){--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-contrast-focus)}[role=group] [role=button],[role=group] [type=button],[role=group] [type=submit],[role=group] button,[role=search] [role=button],[role=search] [type=button],[role=search] [type=submit],[role=search] button{--pico-form-element-spacing-horizontal:2rem}details summary[role=button]:not(.outline)::after{filter:brightness(0) invert(1)}[aria-busy=true]:not(input,select,textarea):is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0) invert(1)}:host(:not([data-theme=dark])),:root:not([data-theme=dark]),[data-theme=light]{color-scheme:light;--pico-background-color:#fff;--pico-color:#373c44;--pico-text-selection-color:rgba(2, 154, 232, 0.25);--pico-muted-color:#646b79;--pico-muted-border-color:rgb(231, 234, 239.5);--pico-primary:#0172ad;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 114, 173, 0.5);--pico-primary-hover:#015887;--pico-primary-hover-background:#02659a;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(2, 154, 232, 0.5);--pico-primary-inverse:#fff;--pico-secondary:#5d6b89;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(93, 107, 137, 0.5);--pico-secondary-hover:#48536b;--pico-secondary-hover-background:#48536b;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(93, 107, 137, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#181c25;--pico-contrast-background:#181c25;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(24, 28, 37, 0.5);--pico-contrast-hover:#000;--pico-contrast-hover-background:#000;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-secondary-hover);--pico-contrast-focus:rgba(93, 107, 137, 0.25);--pico-contrast-inverse:#fff;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(129, 145, 181, 0.01698),0.0335rem 0.067rem 0.402rem rgba(129, 145, 181, 0.024),0.0625rem 0.125rem 0.75rem rgba(129, 145, 181, 0.03),0.1125rem 0.225rem 1.35rem rgba(129, 145, 181, 0.036),0.2085rem 0.417rem 2.502rem rgba(129, 145, 181, 0.04302),0.5rem 1rem 6rem rgba(129, 145, 181, 0.06),0 0 0 0.0625rem rgba(129, 145, 181, 0.015);--pico-h1-color:#2d3138;--pico-h2-color:#373c44;--pico-h3-color:#424751;--pico-h4-color:#4d535e;--pico-h5-color:#5c6370;--pico-h6-color:#646b79;--pico-mark-background-color:rgb(252.5, 230.5, 191.5);--pico-mark-color:#0f1114;--pico-ins-color:rgb(28.5, 105.5, 84);--pico-del-color:rgb(136, 56.5, 53);--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:rgb(243, 244.5, 246.75);--pico-code-color:#646b79;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:rgb(251, 251.5, 252.25);--pico-form-element-selected-background-color:#dfe3eb;--pico-form-element-border-color:#cfd5e2;--pico-form-element-color:#23262c;--pico-form-element-placeholder-color:var(--pico-muted-color);--pico-form-element-active-background-color:#fff;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:rgb(183.5, 105.5, 106.5);--pico-form-element-invalid-active-border-color:rgb(200.25, 79.25, 72.25);--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:rgb(76, 154.5, 137.5);--pico-form-element-valid-active-border-color:rgb(39, 152.75, 118.75);--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#bfc7d9;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#dfe3eb;--pico-range-active-border-color:#bfc7d9;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:var(--pico-background-color);--pico-card-border-color:var(--pico-muted-border-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:rgb(251, 251.5, 252.25);--pico-dropdown-background-color:#fff;--pico-dropdown-border-color:#eff1f4;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#eff1f4;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(232, 234, 237, 0.75);--pico-progress-background-color:#dfe3eb;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(76, 154.5, 137.5)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(200.25, 79.25, 72.25)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E")}:host(:not([data-theme=dark])) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]),:root:not([data-theme=dark]) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]),[data-theme=light] input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}@media only screen and (prefers-color-scheme:dark){:host(:not([data-theme])),:root:not([data-theme]){color-scheme:dark;--pico-background-color:rgb(19, 22.5, 30.5);--pico-color:#c2c7d0;--pico-text-selection-color:rgba(1, 170, 255, 0.1875);--pico-muted-color:#7b8495;--pico-muted-border-color:#202632;--pico-primary:#01aaff;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 170, 255, 0.5);--pico-primary-hover:#79c0ff;--pico-primary-hover-background:#017fc0;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(1, 170, 255, 0.375);--pico-primary-inverse:#fff;--pico-secondary:#969eaf;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(150, 158, 175, 0.5);--pico-secondary-hover:#b3b9c5;--pico-secondary-hover-background:#5d6b89;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(144, 158, 190, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#dfe3eb;--pico-contrast-background:#eff1f4;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(223, 227, 235, 0.5);--pico-contrast-hover:#fff;--pico-contrast-hover-background:#fff;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-contrast-hover);--pico-contrast-focus:rgba(207, 213, 226, 0.25);--pico-contrast-inverse:#000;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(7, 8.5, 12, 0.01698),0.0335rem 0.067rem 0.402rem rgba(7, 8.5, 12, 0.024),0.0625rem 0.125rem 0.75rem rgba(7, 8.5, 12, 0.03),0.1125rem 0.225rem 1.35rem rgba(7, 8.5, 12, 0.036),0.2085rem 0.417rem 2.502rem rgba(7, 8.5, 12, 0.04302),0.5rem 1rem 6rem rgba(7, 8.5, 12, 0.06),0 0 0 0.0625rem rgba(7, 8.5, 12, 0.015);--pico-h1-color:#f0f1f3;--pico-h2-color:#e0e3e7;--pico-h3-color:#c2c7d0;--pico-h4-color:#b3b9c5;--pico-h5-color:#a4acba;--pico-h6-color:#8891a4;--pico-mark-background-color:#014063;--pico-mark-color:#fff;--pico-ins-color:#62af9a;--pico-del-color:rgb(205.5, 126, 123);--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:rgb(26, 30.5, 40.25);--pico-code-color:#8891a4;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:rgb(28, 33, 43.5);--pico-form-element-selected-background-color:#2a3140;--pico-form-element-border-color:#2a3140;--pico-form-element-color:#e0e3e7;--pico-form-element-placeholder-color:#8891a4;--pico-form-element-active-background-color:rgb(26, 30.5, 40.25);--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:rgb(149.5, 74, 80);--pico-form-element-invalid-active-border-color:rgb(183.25, 63.5, 59);--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#2a7b6f;--pico-form-element-valid-active-border-color:rgb(22, 137, 105.5);--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#333c4e;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#202632;--pico-range-active-border-color:#2a3140;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:#181c25;--pico-card-border-color:var(--pico-card-background-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:rgb(26, 30.5, 40.25);--pico-dropdown-background-color:#181c25;--pico-dropdown-border-color:#202632;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#202632;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(7.5, 8.5, 10, 0.75);--pico-progress-background-color:#202632;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(149.5, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E")}:host(:not([data-theme])) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]),:root:not([data-theme]) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}:host(:not([data-theme])) details summary[role=button].contrast:not(.outline)::after,:root:not([data-theme]) details summary[role=button].contrast:not(.outline)::after{filter:brightness(0)}:host(:not([data-theme])) [aria-busy=true]:not(input,select,textarea).contrast:is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before,:root:not([data-theme]) [aria-busy=true]:not(input,select,textarea).contrast:is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0)}}[data-theme=dark]{color-scheme:dark;--pico-background-color:rgb(19, 22.5, 30.5);--pico-color:#c2c7d0;--pico-text-selection-color:rgba(1, 170, 255, 0.1875);--pico-muted-color:#7b8495;--pico-muted-border-color:#202632;--pico-primary:#01aaff;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 170, 255, 0.5);--pico-primary-hover:#79c0ff;--pico-primary-hover-background:#017fc0;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(1, 170, 255, 0.375);--pico-primary-inverse:#fff;--pico-secondary:#969eaf;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(150, 158, 175, 0.5);--pico-secondary-hover:#b3b9c5;--pico-secondary-hover-background:#5d6b89;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(144, 158, 190, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#dfe3eb;--pico-contrast-background:#eff1f4;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(223, 227, 235, 0.5);--pico-contrast-hover:#fff;--pico-contrast-hover-background:#fff;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-contrast-hover);--pico-contrast-focus:rgba(207, 213, 226, 0.25);--pico-contrast-inverse:#000;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(7, 8.5, 12, 0.01698),0.0335rem 0.067rem 0.402rem rgba(7, 8.5, 12, 0.024),0.0625rem 0.125rem 0.75rem rgba(7, 8.5, 12, 0.03),0.1125rem 0.225rem 1.35rem rgba(7, 8.5, 12, 0.036),0.2085rem 0.417rem 2.502rem rgba(7, 8.5, 12, 0.04302),0.5rem 1rem 6rem rgba(7, 8.5, 12, 0.06),0 0 0 0.0625rem rgba(7, 8.5, 12, 0.015);--pico-h1-color:#f0f1f3;--pico-h2-color:#e0e3e7;--pico-h3-color:#c2c7d0;--pico-h4-color:#b3b9c5;--pico-h5-color:#a4acba;--pico-h6-color:#8891a4;--pico-mark-background-color:#014063;--pico-mark-color:#fff;--pico-ins-color:#62af9a;--pico-del-color:rgb(205.5, 126, 123);--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:rgb(26, 30.5, 40.25);--pico-code-color:#8891a4;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:rgb(28, 33, 43.5);--pico-form-element-selected-background-color:#2a3140;--pico-form-element-border-color:#2a3140;--pico-form-element-color:#e0e3e7;--pico-form-element-placeholder-color:#8891a4;--pico-form-element-active-background-color:rgb(26, 30.5, 40.25);--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:rgb(149.5, 74, 80);--pico-form-element-invalid-active-border-color:rgb(183.25, 63.5, 59);--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#2a7b6f;--pico-form-element-valid-active-border-color:rgb(22, 137, 105.5);--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#333c4e;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#202632;--pico-range-active-border-color:#2a3140;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:#181c25;--pico-card-border-color:var(--pico-card-background-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:rgb(26, 30.5, 40.25);--pico-dropdown-background-color:#181c25;--pico-dropdown-border-color:#202632;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#202632;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(7.5, 8.5, 10, 0.75);--pico-progress-background-color:#202632;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(149.5, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E")}[data-theme=dark] input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}[data-theme=dark] details summary[role=button].contrast:not(.outline)::after{filter:brightness(0)}[data-theme=dark] [aria-busy=true]:not(input,select,textarea).contrast:is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0)}[type=checkbox],[type=radio],[type=range],progress{accent-color:var(--pico-primary)}*,::after,::before{box-sizing:border-box;background-repeat:no-repeat}::after,::before{text-decoration:inherit;vertical-align:inherit}:where(:host),:where(:root){-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--pico-background-color);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:var(--pico-font-size);line-height:var(--pico-line-height);font-family:var(--pico-font-family);text-underline-offset:var(--pico-text-underline-offset);text-rendering:optimizeLegibility;overflow-wrap:break-word;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{width:100%;margin:0}main{display:block}body>footer,body>header,body>main{padding-block:var(--pico-block-spacing-vertical)}section{margin-bottom:var(--pico-block-spacing-vertical)}.container,.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:var(--pico-spacing);padding-left:var(--pico-spacing)}@media (min-width:576px){.container{max-width:510px;padding-right:0;padding-left:0}}@media (min-width:768px){.container{max-width:700px}}@media (min-width:1024px){.container{max-width:950px}}@media (min-width:1280px){.container{max-width:1200px}}@media (min-width:1536px){.container{max-width:1450px}}.grid{grid-column-gap:var(--pico-grid-column-gap);grid-row-gap:var(--pico-grid-row-gap);display:grid;grid-template-columns:1fr}@media (min-width:768px){.grid{grid-template-columns:repeat(auto-fit,minmax(0%,1fr))}}.grid>*{min-width:0}.overflow-auto{overflow:auto}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}address,blockquote,dl,ol,p,pre,table,ul{margin-top:0;margin-bottom:var(--pico-typography-spacing-vertical);color:var(--pico-color);font-style:normal;font-weight:var(--pico-font-weight)}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:var(--pico-typography-spacing-vertical);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:var(--pico-font-size);line-height:var(--pico-line-height);font-family:var(--pico-font-family)}h1{--pico-color:var(--pico-h1-color)}h2{--pico-color:var(--pico-h2-color)}h3{--pico-color:var(--pico-h3-color)}h4{--pico-color:var(--pico-h4-color)}h5{--pico-color:var(--pico-h5-color)}h6{--pico-color:var(--pico-h6-color)}:where(article,address,blockquote,dl,figure,form,ol,p,pre,table,ul)~:is(h1,h2,h3,h4,h5,h6){margin-top:var(--pico-typography-spacing-top)}p{margin-bottom:var(--pico-typography-spacing-vertical)}hgroup{margin-bottom:var(--pico-typography-spacing-vertical)}hgroup>*{margin-top:0;margin-bottom:0}hgroup>:not(:first-child):last-child{--pico-color:var(--pico-muted-color);--pico-font-weight:unset;font-size:1rem}:where(ol,ul) li{margin-bottom:calc(var(--pico-typography-spacing-vertical) * .25)}:where(dl,ol,ul) :where(dl,ol,ul){margin:0;margin-top:calc(var(--pico-typography-spacing-vertical) * .25)}ul li{list-style:square}mark{padding:.125rem .25rem;background-color:var(--pico-mark-background-color);color:var(--pico-mark-color);vertical-align:baseline}blockquote{display:block;margin:var(--pico-typography-spacing-vertical) 0;padding:var(--pico-spacing);border-right:none;border-left:.25rem solid var(--pico-blockquote-border-color);border-inline-start:0.25rem solid var(--pico-blockquote-border-color);border-inline-end:none}blockquote footer{margin-top:calc(var(--pico-typography-spacing-vertical) * .5);color:var(--pico-blockquote-footer-color)}abbr[title]{border-bottom:1px dotted;text-decoration:none;cursor:help}ins{color:var(--pico-ins-color);text-decoration:none}del{color:var(--pico-del-color)}::-moz-selection{background-color:var(--pico-text-selection-color)}::selection{background-color:var(--pico-text-selection-color)}:where(a:not([role=button])),[role=link]{--pico-color:var(--pico-primary);--pico-background-color:transparent;--pico-underline:var(--pico-primary-underline);outline:0;background-color:var(--pico-background-color);color:var(--pico-color);-webkit-text-decoration:var(--pico-text-decoration);text-decoration:var(--pico-text-decoration);text-decoration-color:var(--pico-underline);text-underline-offset:0.125em;transition:background-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition),-webkit-text-decoration var(--pico-transition);transition:background-color var(--pico-transition),color var(--pico-transition),text-decoration var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),color var(--pico-transition),text-decoration var(--pico-transition),box-shadow var(--pico-transition),-webkit-text-decoration var(--pico-transition)}:where(a:not([role=button])):is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-primary-hover);--pico-underline:var(--pico-primary-hover-underline);--pico-text-decoration:underline}:where(a:not([role=button])):focus-visible,[role=link]:focus-visible{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}:where(a:not([role=button])).secondary,[role=link].secondary{--pico-color:var(--pico-secondary);--pico-underline:var(--pico-secondary-underline)}:where(a:not([role=button])).secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link].secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-secondary-hover);--pico-underline:var(--pico-secondary-hover-underline)}:where(a:not([role=button])).contrast,[role=link].contrast{--pico-color:var(--pico-contrast);--pico-underline:var(--pico-contrast-underline)}:where(a:not([role=button])).contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link].contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-contrast-hover);--pico-underline:var(--pico-contrast-hover-underline)}a[role=button]{display:inline-block}button{margin:0;overflow:visible;font-family:inherit;text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[role=button],[type=button],[type=file]::file-selector-button,[type=reset],[type=submit],button{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);--pico-color:var(--pico-primary-inverse);--pico-box-shadow:var(--pico-button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal);border:var(--pico-border-width) solid var(--pico-border-color);border-radius:var(--pico-border-radius);outline:0;background-color:var(--pico-background-color);box-shadow:var(--pico-box-shadow);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:1rem;line-height:var(--pico-line-height);text-align:center;text-decoration:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}[role=button]:is(:hover,:active,:focus),[role=button]:is([aria-current]:not([aria-current=false])),[type=button]:is(:hover,:active,:focus),[type=button]:is([aria-current]:not([aria-current=false])),[type=file]::file-selector-button:is(:hover,:active,:focus),[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])),[type=reset]:is(:hover,:active,:focus),[type=reset]:is([aria-current]:not([aria-current=false])),[type=submit]:is(:hover,:active,:focus),[type=submit]:is([aria-current]:not([aria-current=false])),button:is(:hover,:active,:focus),button:is([aria-current]:not([aria-current=false])){--pico-background-color:var(--pico-primary-hover-background);--pico-border-color:var(--pico-primary-hover-border);--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0));--pico-color:var(--pico-primary-inverse)}[role=button]:focus,[role=button]:is([aria-current]:not([aria-current=false])):focus,[type=button]:focus,[type=button]:is([aria-current]:not([aria-current=false])):focus,[type=file]::file-selector-button:focus,[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus,[type=reset]:focus,[type=reset]:is([aria-current]:not([aria-current=false])):focus,[type=submit]:focus,[type=submit]:is([aria-current]:not([aria-current=false])):focus,button:focus,button:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}[type=button],[type=reset],[type=submit]{margin-bottom:var(--pico-spacing)}:is(button,[type=submit],[type=button],[role=button]).secondary,[type=file]::file-selector-button,[type=reset]{--pico-background-color:var(--pico-secondary-background);--pico-border-color:var(--pico-secondary-border);--pico-color:var(--pico-secondary-inverse);cursor:pointer}:is(button,[type=submit],[type=button],[role=button]).secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=file]::file-selector-button:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:var(--pico-secondary-hover-background);--pico-border-color:var(--pico-secondary-hover-border);--pico-color:var(--pico-secondary-inverse)}:is(button,[type=submit],[type=button],[role=button]).secondary:focus,:is(button,[type=submit],[type=button],[role=button]).secondary:is([aria-current]:not([aria-current=false])):focus,[type=file]::file-selector-button:focus,[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus,[type=reset]:focus,[type=reset]:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}:is(button,[type=submit],[type=button],[role=button]).contrast{--pico-background-color:var(--pico-contrast-background);--pico-border-color:var(--pico-contrast-border);--pico-color:var(--pico-contrast-inverse)}:is(button,[type=submit],[type=button],[role=button]).contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:var(--pico-contrast-hover-background);--pico-border-color:var(--pico-contrast-hover-border);--pico-color:var(--pico-contrast-inverse)}:is(button,[type=submit],[type=button],[role=button]).contrast:focus,:is(button,[type=submit],[type=button],[role=button]).contrast:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-contrast-focus)}:is(button,[type=submit],[type=button],[role=button]).outline,[type=reset].outline{--pico-background-color:transparent;--pico-color:var(--pico-primary);--pico-border-color:var(--pico-primary)}:is(button,[type=submit],[type=button],[role=button]).outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset].outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:transparent;--pico-color:var(--pico-primary-hover);--pico-border-color:var(--pico-primary-hover)}:is(button,[type=submit],[type=button],[role=button]).outline.secondary,[type=reset].outline{--pico-color:var(--pico-secondary);--pico-border-color:var(--pico-secondary)}:is(button,[type=submit],[type=button],[role=button]).outline.secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset].outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-secondary-hover);--pico-border-color:var(--pico-secondary-hover)}:is(button,[type=submit],[type=button],[role=button]).outline.contrast{--pico-color:var(--pico-contrast);--pico-border-color:var(--pico-contrast)}:is(button,[type=submit],[type=button],[role=button]).outline.contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-contrast-hover);--pico-border-color:var(--pico-contrast-hover)}:where(button,[type=submit],[type=reset],[type=button],[role=button])[disabled],:where(fieldset[disabled]) :is(button,[type=submit],[type=button],[type=reset],[role=button]){opacity:.5;pointer-events:none}:where(table){width:100%;border-collapse:collapse;border-spacing:0;text-indent:0}td,th{padding:calc(var(--pico-spacing)/ 2) var(--pico-spacing);border-bottom:var(--pico-border-width) solid var(--pico-table-border-color);background-color:var(--pico-background-color);color:var(--pico-color);font-weight:var(--pico-font-weight);text-align:left;text-align:start}tfoot td,tfoot th{border-top:var(--pico-border-width) solid var(--pico-table-border-color);border-bottom:0}table.striped tbody tr:nth-child(odd) td,table.striped tbody tr:nth-child(odd) th{background-color:var(--pico-table-row-stripped-background-color)}:where(audio,canvas,iframe,img,svg,video){vertical-align:middle}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}:where(iframe){border-style:none}img{max-width:100%;height:auto;border-style:none}:where(svg:not([fill])){fill:currentColor}svg:not(:host),svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-size:.875em;font-family:var(--pico-font-family)}pre code,pre samp{font-size:inherit;font-family:inherit}pre{-ms-overflow-style:scrollbar;overflow:auto}code,kbd,pre,samp{border-radius:var(--pico-border-radius);background:var(--pico-code-background-color);color:var(--pico-code-color);font-weight:var(--pico-font-weight);line-height:initial}code,kbd,samp{display:inline-block;padding:.375rem}pre{display:block;margin-bottom:var(--pico-spacing);overflow-x:auto}pre>code,pre>samp{display:block;padding:var(--pico-spacing);background:0 0;line-height:var(--pico-line-height)}kbd{background-color:var(--pico-code-kbd-background-color);color:var(--pico-code-kbd-color);vertical-align:baseline}figure{display:block;margin:0;padding:0}figure figcaption{padding:calc(var(--pico-spacing) * .5) 0;color:var(--pico-muted-color)}hr{height:0;margin:var(--pico-typography-spacing-vertical) 0;border:0;border-top:1px solid var(--pico-muted-border-color);color:inherit}[hidden],template{display:none!important}canvas{display:inline-block}input,optgroup,select,textarea{margin:0;font-size:1rem;line-height:var(--pico-line-height);font-family:inherit;letter-spacing:inherit}input{overflow:visible}select{text-transform:none}legend{max-width:100%;padding:0;color:inherit;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{padding:0}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}::-moz-focus-inner{padding:0;border-style:none}:-moz-focusring{outline:0}:-moz-ui-invalid{box-shadow:none}::-ms-expand{display:none}[type=file],[type=range]{padding:0;border-width:0}input:not([type=checkbox],[type=radio],[type=range]){height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2)}fieldset{width:100%;margin:0;margin-bottom:var(--pico-spacing);padding:0;border:0}fieldset legend,label{display:block;margin-bottom:calc(var(--pico-spacing) * .375);color:var(--pico-color);font-weight:var(--pico-form-label-font-weight,var(--pico-font-weight))}fieldset legend{margin-bottom:calc(var(--pico-spacing) * .5)}button[type=submit],input:not([type=checkbox],[type=radio]),select,textarea{width:100%}input:not([type=checkbox],[type=radio],[type=range],[type=file]),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal)}input,select,textarea{--pico-background-color:var(--pico-form-element-background-color);--pico-border-color:var(--pico-form-element-border-color);--pico-color:var(--pico-form-element-color);--pico-box-shadow:none;border:var(--pico-border-width) solid var(--pico-border-color);border-radius:var(--pico-border-radius);outline:0;background-color:var(--pico-background-color);box-shadow:var(--pico-box-shadow);color:var(--pico-color);font-weight:var(--pico-font-weight);transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}:where(select,textarea):not([readonly]):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[readonly]):is(:active,:focus){--pico-background-color:var(--pico-form-element-active-background-color)}:where(select,textarea):not([readonly]):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[role=switch],[readonly]):is(:active,:focus){--pico-border-color:var(--pico-form-element-active-border-color)}:where(select,textarea):not([readonly]):focus,input:not([type=submit],[type=button],[type=reset],[type=range],[type=file],[readonly]):focus{--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color)}:where(fieldset[disabled]) :is(input:not([type=submit],[type=button],[type=reset]),select,textarea),input:not([type=submit],[type=button],[type=reset])[disabled],label[aria-disabled=true],select[disabled],textarea[disabled]{opacity:var(--pico-form-element-disabled-opacity);pointer-events:none}label[aria-disabled=true] input[disabled]{opacity:1}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid]{padding-right:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem)!important;padding-left:var(--pico-form-element-spacing-horizontal);padding-inline-start:var(--pico-form-element-spacing-horizontal)!important;padding-inline-end:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem)!important;background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid=false]:not(select){background-image:var(--pico-icon-valid)}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid=true]:not(select){background-image:var(--pico-icon-invalid)}:where(input,select,textarea)[aria-invalid=false]{--pico-border-color:var(--pico-form-element-valid-border-color)}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus){--pico-border-color:var(--pico-form-element-valid-active-border-color)!important}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus):not([type=checkbox],[type=radio]){--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-valid-focus-color)!important}:where(input,select,textarea)[aria-invalid=true]{--pico-border-color:var(--pico-form-element-invalid-border-color)}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus){--pico-border-color:var(--pico-form-element-invalid-active-border-color)!important}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus):not([type=checkbox],[type=radio]){--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-invalid-focus-color)!important}[dir=rtl] :where(input,select,textarea):not([type=checkbox],[type=radio]):is([aria-invalid],[aria-invalid=true],[aria-invalid=false]){background-position:center left .75rem}input::-webkit-input-placeholder,input::placeholder,select:invalid,textarea::-webkit-input-placeholder,textarea::placeholder{color:var(--pico-form-element-placeholder-color);opacity:1}input:not([type=checkbox],[type=radio]),select,textarea{margin-bottom:var(--pico-spacing)}select::-ms-expand{border:0;background-color:transparent}select:not([multiple],[size]){padding-right:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem);padding-left:var(--pico-form-element-spacing-horizontal);padding-inline-start:var(--pico-form-element-spacing-horizontal);padding-inline-end:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem);background-image:var(--pico-icon-chevron);background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}select[multiple] option:checked{background:var(--pico-form-element-selected-background-color);color:var(--pico-form-element-color)}[dir=rtl] select:not([multiple],[size]){background-position:center left .75rem}textarea{display:block;resize:vertical}textarea[aria-invalid]{--pico-icon-height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2);background-position:top right .75rem!important;background-size:1rem var(--pico-icon-height)!important}:where(input,select,textarea,fieldset,.grid)+small{display:block;width:100%;margin-top:calc(var(--pico-spacing) * -.75);margin-bottom:var(--pico-spacing);color:var(--pico-muted-color)}:where(input,select,textarea,fieldset,.grid)[aria-invalid=false]+small{color:var(--pico-ins-color)}:where(input,select,textarea,fieldset,.grid)[aria-invalid=true]+small{color:var(--pico-del-color)}label>:where(input,select,textarea){margin-top:calc(var(--pico-spacing) * .25)}label:has([type=checkbox],[type=radio]){width:-moz-fit-content;width:fit-content;cursor:pointer}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:1.25em;height:1.25em;margin-top:-.125em;margin-inline-end:.5em;border-width:var(--pico-border-width);vertical-align:middle;cursor:pointer}[type=checkbox]::-ms-check,[type=radio]::-ms-check{display:none}[type=checkbox]:checked,[type=checkbox]:checked:active,[type=checkbox]:checked:focus,[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);background-image:var(--pico-icon-checkbox);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=checkbox]~label,[type=radio]~label{display:inline-block;margin-bottom:0;cursor:pointer}[type=checkbox]~label:not(:last-of-type),[type=radio]~label:not(:last-of-type){margin-inline-end:1em}[type=checkbox]:indeterminate{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);background-image:var(--pico-icon-minus);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=radio]{border-radius:50%}[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--pico-background-color:var(--pico-primary-inverse);border-width:.35em;background-image:none}[type=checkbox][role=switch]{--pico-background-color:var(--pico-switch-background-color);--pico-color:var(--pico-switch-color);width:2.25em;height:1.25em;border:var(--pico-border-width) solid var(--pico-border-color);border-radius:1.25em;background-color:var(--pico-background-color);line-height:1.25em}[type=checkbox][role=switch]:not([aria-invalid]){--pico-border-color:var(--pico-switch-background-color)}[type=checkbox][role=switch]:before{display:block;aspect-ratio:1;height:100%;border-radius:50%;background-color:var(--pico-color);box-shadow:var(--pico-switch-thumb-box-shadow);content:"";transition:margin .1s ease-in-out}[type=checkbox][role=switch]:focus{--pico-background-color:var(--pico-switch-background-color);--pico-border-color:var(--pico-switch-background-color)}[type=checkbox][role=switch]:checked{--pico-background-color:var(--pico-switch-checked-background-color);--pico-border-color:var(--pico-switch-checked-background-color);background-image:none}[type=checkbox][role=switch]:checked::before{margin-inline-start:calc(2.25em - 1.25em)}[type=checkbox][role=switch][disabled]{--pico-background-color:var(--pico-border-color)}[type=checkbox][aria-invalid=false]:checked,[type=checkbox][aria-invalid=false]:checked:active,[type=checkbox][aria-invalid=false]:checked:focus,[type=checkbox][role=switch][aria-invalid=false]:checked,[type=checkbox][role=switch][aria-invalid=false]:checked:active,[type=checkbox][role=switch][aria-invalid=false]:checked:focus{--pico-background-color:var(--pico-form-element-valid-border-color)}[type=checkbox]:checked:active[aria-invalid=true],[type=checkbox]:checked:focus[aria-invalid=true],[type=checkbox]:checked[aria-invalid=true],[type=checkbox][role=switch]:checked:active[aria-invalid=true],[type=checkbox][role=switch]:checked:focus[aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true]{--pico-background-color:var(--pico-form-element-invalid-border-color)}[type=checkbox][aria-invalid=false]:checked,[type=checkbox][aria-invalid=false]:checked:active,[type=checkbox][aria-invalid=false]:checked:focus,[type=checkbox][role=switch][aria-invalid=false]:checked,[type=checkbox][role=switch][aria-invalid=false]:checked:active,[type=checkbox][role=switch][aria-invalid=false]:checked:focus,[type=radio][aria-invalid=false]:checked,[type=radio][aria-invalid=false]:checked:active,[type=radio][aria-invalid=false]:checked:focus{--pico-border-color:var(--pico-form-element-valid-border-color)}[type=checkbox]:checked:active[aria-invalid=true],[type=checkbox]:checked:focus[aria-invalid=true],[type=checkbox]:checked[aria-invalid=true],[type=checkbox][role=switch]:checked:active[aria-invalid=true],[type=checkbox][role=switch]:checked:focus[aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true],[type=radio]:checked:active[aria-invalid=true],[type=radio]:checked:focus[aria-invalid=true],[type=radio]:checked[aria-invalid=true]{--pico-border-color:var(--pico-form-element-invalid-border-color)}[type=color]::-webkit-color-swatch-wrapper{padding:0}[type=color]::-moz-focus-inner{padding:0}[type=color]::-webkit-color-swatch{border:0;border-radius:calc(var(--pico-border-radius) * .5)}[type=color]::-moz-color-swatch{border:0;border-radius:calc(var(--pico-border-radius) * .5)}input:not([type=checkbox],[type=radio],[type=range],[type=file]):is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){--pico-icon-position:0.75rem;--pico-icon-width:1rem;padding-right:calc(var(--pico-icon-width) + var(--pico-icon-position));background-image:var(--pico-icon-date);background-position:center right var(--pico-icon-position);background-size:var(--pico-icon-width) auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=time]{background-image:var(--pico-icon-time)}[type=date]::-webkit-calendar-picker-indicator,[type=datetime-local]::-webkit-calendar-picker-indicator,[type=month]::-webkit-calendar-picker-indicator,[type=time]::-webkit-calendar-picker-indicator,[type=week]::-webkit-calendar-picker-indicator{width:var(--pico-icon-width);margin-right:calc(var(--pico-icon-width) * -1);margin-left:var(--pico-icon-position);opacity:0}@-moz-document url-prefix(){[type=date],[type=datetime-local],[type=month],[type=time],[type=week]{padding-right:var(--pico-form-element-spacing-horizontal)!important;background-image:none!important}}[dir=rtl] :is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){text-align:right}[type=file]{--pico-color:var(--pico-muted-color);margin-left:calc(var(--pico-outline-width) * -1);padding:calc(var(--pico-form-element-spacing-vertical) * .5) 0;padding-left:var(--pico-outline-width);border:0;border-radius:0;background:0 0}[type=file]::file-selector-button{margin-right:calc(var(--pico-spacing)/ 2);padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal)}[type=file]:is(:hover,:active,:focus)::file-selector-button{--pico-background-color:var(--pico-secondary-hover-background);--pico-border-color:var(--pico-secondary-hover-border)}[type=file]:focus::file-selector-button{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}[type=range]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:1.25rem;background:0 0}[type=range]::-webkit-slider-runnable-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-webkit-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-moz-range-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-moz-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-ms-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-ms-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-webkit-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]::-moz-range-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-moz-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]::-ms-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-ms-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]:active,[type=range]:focus-within{--pico-range-border-color:var(--pico-range-active-border-color);--pico-range-thumb-color:var(--pico-range-thumb-active-color)}[type=range]:active::-webkit-slider-thumb{transform:scale(1.25)}[type=range]:active::-moz-range-thumb{transform:scale(1.25)}[type=range]:active::-ms-thumb{transform:scale(1.25)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{padding-inline-start:calc(var(--pico-form-element-spacing-horizontal) + 1.75rem);background-image:var(--pico-icon-search);background-position:center left calc(var(--pico-form-element-spacing-horizontal) + .125rem);background-size:1rem auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{padding-inline-start:calc(var(--pico-form-element-spacing-horizontal) + 1.75rem)!important;background-position:center left 1.125rem,center right .75rem}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=false]{background-image:var(--pico-icon-search),var(--pico-icon-valid)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=true]{background-image:var(--pico-icon-search),var(--pico-icon-invalid)}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{background-position:center right 1.125rem}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{background-position:center right 1.125rem,center left .75rem}details{display:block;margin-bottom:var(--pico-spacing)}details summary{line-height:1rem;list-style-type:none;cursor:pointer;transition:color var(--pico-transition)}details summary:not([role]){color:var(--pico-accordion-close-summary-color)}details summary::-webkit-details-marker{display:none}details summary::marker{display:none}details summary::-moz-list-bullet{list-style-type:none}details summary::after{display:block;width:1rem;height:1rem;margin-inline-start:calc(var(--pico-spacing,1rem) * .5);float:right;transform:rotate(-90deg);background-image:var(--pico-icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:"";transition:transform var(--pico-transition)}details summary:focus{outline:0}details summary:focus:not([role]){color:var(--pico-accordion-active-summary-color)}details summary:focus-visible:not([role]){outline:var(--pico-outline-width) solid var(--pico-primary-focus);outline-offset:calc(var(--pico-spacing,1rem) * 0.5);color:var(--pico-primary)}details summary[role=button]{width:100%;text-align:left}details summary[role=button]::after{height:calc(1rem * var(--pico-line-height,1.5))}details[open]>summary{margin-bottom:var(--pico-spacing)}details[open]>summary:not([role]):not(:focus){color:var(--pico-accordion-open-summary-color)}details[open]>summary::after{transform:rotate(0)}[dir=rtl] details summary{text-align:right}[dir=rtl] details summary::after{float:left;background-position:left center}article{margin-bottom:var(--pico-block-spacing-vertical);padding:var(--pico-block-spacing-vertical) var(--pico-block-spacing-horizontal);border-radius:var(--pico-border-radius);background:var(--pico-card-background-color);box-shadow:var(--pico-card-box-shadow)}article>footer,article>header{margin-right:calc(var(--pico-block-spacing-horizontal) * -1);margin-left:calc(var(--pico-block-spacing-horizontal) * -1);padding:calc(var(--pico-block-spacing-vertical) * .66) var(--pico-block-spacing-horizontal);background-color:var(--pico-card-sectioning-background-color)}article>header{margin-top:calc(var(--pico-block-spacing-vertical) * -1);margin-bottom:var(--pico-block-spacing-vertical);border-bottom:var(--pico-border-width) solid var(--pico-card-border-color);border-top-right-radius:var(--pico-border-radius);border-top-left-radius:var(--pico-border-radius)}article>footer{margin-top:var(--pico-block-spacing-vertical);margin-bottom:calc(var(--pico-block-spacing-vertical) * -1);border-top:var(--pico-border-width) solid var(--pico-card-border-color);border-bottom-right-radius:var(--pico-border-radius);border-bottom-left-radius:var(--pico-border-radius)}details.dropdown{position:relative;border-bottom:none}details.dropdown>a::after,details.dropdown>button::after,details.dropdown>summary::after{display:block;width:1rem;height:calc(1rem * var(--pico-line-height,1.5));margin-inline-start:.25rem;float:right;transform:rotate(0) translateX(.2rem);background-image:var(--pico-icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:""}nav details.dropdown{margin-bottom:0}details.dropdown>summary:not([role]){height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2);padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal);border:var(--pico-border-width) solid var(--pico-form-element-border-color);border-radius:var(--pico-border-radius);background-color:var(--pico-form-element-background-color);color:var(--pico-form-element-placeholder-color);line-height:inherit;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}details.dropdown>summary:not([role]):active,details.dropdown>summary:not([role]):focus{border-color:var(--pico-form-element-active-border-color);background-color:var(--pico-form-element-active-background-color)}details.dropdown>summary:not([role]):focus{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color)}details.dropdown>summary:not([role]):focus-visible{outline:0}details.dropdown>summary:not([role])[aria-invalid=false]{--pico-form-element-border-color:var(--pico-form-element-valid-border-color);--pico-form-element-active-border-color:var(--pico-form-element-valid-focus-color);--pico-form-element-focus-color:var(--pico-form-element-valid-focus-color)}details.dropdown>summary:not([role])[aria-invalid=true]{--pico-form-element-border-color:var(--pico-form-element-invalid-border-color);--pico-form-element-active-border-color:var(--pico-form-element-invalid-focus-color);--pico-form-element-focus-color:var(--pico-form-element-invalid-focus-color)}nav details.dropdown{display:inline;margin:calc(var(--pico-nav-element-spacing-vertical) * -1) 0}nav details.dropdown>summary::after{transform:rotate(0) translateX(0)}nav details.dropdown>summary:not([role]){height:calc(1rem * var(--pico-line-height) + var(--pico-nav-link-spacing-vertical) * 2);padding:calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal)}nav details.dropdown>summary:not([role]):focus-visible{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}details.dropdown>summary+ul{display:flex;z-index:99;position:absolute;left:0;flex-direction:column;width:100%;min-width:-moz-fit-content;min-width:fit-content;margin:0;margin-top:var(--pico-outline-width);padding:0;border:var(--pico-border-width) solid var(--pico-dropdown-border-color);border-radius:var(--pico-border-radius);background-color:var(--pico-dropdown-background-color);box-shadow:var(--pico-dropdown-box-shadow);color:var(--pico-dropdown-color);white-space:nowrap;opacity:0;transition:opacity var(--pico-transition),transform 0s ease-in-out 1s}details.dropdown>summary+ul[dir=rtl]{right:0;left:auto}details.dropdown>summary+ul li{width:100%;margin-bottom:0;padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal);list-style:none}details.dropdown>summary+ul li:first-of-type{margin-top:calc(var(--pico-form-element-spacing-vertical) * .5)}details.dropdown>summary+ul li:last-of-type{margin-bottom:calc(var(--pico-form-element-spacing-vertical) * .5)}details.dropdown>summary+ul li a{display:block;margin:calc(var(--pico-form-element-spacing-vertical) * -.5) calc(var(--pico-form-element-spacing-horizontal) * -1);padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal);overflow:hidden;border-radius:0;color:var(--pico-dropdown-color);text-decoration:none;text-overflow:ellipsis}details.dropdown>summary+ul li a:active,details.dropdown>summary+ul li a:focus,details.dropdown>summary+ul li a:focus-visible,details.dropdown>summary+ul li a:hover,details.dropdown>summary+ul li a[aria-current]:not([aria-current=false]){background-color:var(--pico-dropdown-hover-background-color)}details.dropdown>summary+ul li label{width:100%}details.dropdown>summary+ul li:has(label):hover{background-color:var(--pico-dropdown-hover-background-color)}details.dropdown[open]>summary{margin-bottom:0}details.dropdown[open]>summary+ul{transform:scaleY(1);opacity:1;transition:opacity var(--pico-transition),transform 0s ease-in-out 0s}details.dropdown[open]>summary::before{display:block;z-index:1;position:fixed;width:100vw;height:100vh;inset:0;background:0 0;content:"";cursor:default}label>details.dropdown{margin-top:calc(var(--pico-spacing) * .25)}[role=group],[role=search]{display:inline-flex;position:relative;width:100%;margin-bottom:var(--pico-spacing);border-radius:var(--pico-border-radius);box-shadow:var(--pico-group-box-shadow,0 0 0 transparent);vertical-align:middle;transition:box-shadow var(--pico-transition)}[role=group] input:not([type=checkbox],[type=radio]),[role=group] select,[role=group]>*,[role=search] input:not([type=checkbox],[type=radio]),[role=search] select,[role=search]>*{position:relative;flex:1 1 auto;margin-bottom:0}[role=group] input:not([type=checkbox],[type=radio]):not(:first-child),[role=group] select:not(:first-child),[role=group]>:not(:first-child),[role=search] input:not([type=checkbox],[type=radio]):not(:first-child),[role=search] select:not(:first-child),[role=search]>:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}[role=group] input:not([type=checkbox],[type=radio]):not(:last-child),[role=group] select:not(:last-child),[role=group]>:not(:last-child),[role=search] input:not([type=checkbox],[type=radio]):not(:last-child),[role=search] select:not(:last-child),[role=search]>:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}[role=group] input:not([type=checkbox],[type=radio]):focus,[role=group] select:focus,[role=group]>:focus,[role=search] input:not([type=checkbox],[type=radio]):focus,[role=search] select:focus,[role=search]>:focus{z-index:2}[role=group] [role=button]:not(:first-child),[role=group] [type=button]:not(:first-child),[role=group] [type=reset]:not(:first-child),[role=group] [type=submit]:not(:first-child),[role=group] button:not(:first-child),[role=group] input:not([type=checkbox],[type=radio]):not(:first-child),[role=group] select:not(:first-child),[role=search] [role=button]:not(:first-child),[role=search] [type=button]:not(:first-child),[role=search] [type=reset]:not(:first-child),[role=search] [type=submit]:not(:first-child),[role=search] button:not(:first-child),[role=search] input:not([type=checkbox],[type=radio]):not(:first-child),[role=search] select:not(:first-child){margin-left:calc(var(--pico-border-width) * -1)}[role=group] [role=button],[role=group] [type=button],[role=group] [type=reset],[role=group] [type=submit],[role=group] button,[role=search] [role=button],[role=search] [type=button],[role=search] [type=reset],[role=search] [type=submit],[role=search] button{width:auto}@supports selector(:has(*)){[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus),[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus){--pico-group-box-shadow:var(--pico-group-box-shadow-focus-with-button)}[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) input:not([type=checkbox],[type=radio]),[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) select,[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) input:not([type=checkbox],[type=radio]),[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) select{border-color:transparent}[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus),[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus){--pico-group-box-shadow:var(--pico-group-box-shadow-focus-with-input)}[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [role=button],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=button],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=submit],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) button,[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [role=button],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=button],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=submit],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) button{--pico-button-box-shadow:0 0 0 var(--pico-border-width) var(--pico-primary-border);--pico-button-hover-box-shadow:0 0 0 var(--pico-border-width) var(--pico-primary-hover-border)}[role=group] [role=button]:focus,[role=group] [type=button]:focus,[role=group] [type=reset]:focus,[role=group] [type=submit]:focus,[role=group] button:focus,[role=search] [role=button]:focus,[role=search] [type=button]:focus,[role=search] [type=reset]:focus,[role=search] [type=submit]:focus,[role=search] button:focus{box-shadow:none}}[role=search]>:first-child{border-top-left-radius:5rem;border-bottom-left-radius:5rem}[role=search]>:last-child{border-top-right-radius:5rem;border-bottom-right-radius:5rem}[aria-busy=true]:not(input,select,textarea,html,form){white-space:nowrap}[aria-busy=true]:not(input,select,textarea,html,form)::before{display:inline-block;width:1em;height:1em;background-image:var(--pico-icon-loading);background-size:1em auto;background-repeat:no-repeat;content:"";vertical-align:-.125em}[aria-busy=true]:not(input,select,textarea,html,form):not(:empty)::before{margin-inline-end:calc(var(--pico-spacing) * .5)}[aria-busy=true]:not(input,select,textarea,html,form):empty{text-align:center}[role=button][aria-busy=true],[type=button][aria-busy=true],[type=reset][aria-busy=true],[type=submit][aria-busy=true],a[aria-busy=true],button[aria-busy=true]{pointer-events:none}:host,:root{--pico-scrollbar-width:0px}dialog{display:flex;z-index:999;position:fixed;top:0;right:0;bottom:0;left:0;align-items:center;justify-content:center;width:inherit;min-width:100%;height:inherit;min-height:100%;padding:0;border:0;-webkit-backdrop-filter:var(--pico-modal-overlay-backdrop-filter);backdrop-filter:var(--pico-modal-overlay-backdrop-filter);background-color:var(--pico-modal-overlay-background-color);color:var(--pico-color)}dialog>article{width:100%;max-height:calc(100vh - var(--pico-spacing) * 2);margin:var(--pico-spacing);overflow:auto}@media (min-width:576px){dialog>article{max-width:510px}}@media (min-width:768px){dialog>article{max-width:700px}}dialog>article>header>*{margin-bottom:0}dialog>article>header .close,dialog>article>header :is(a,button)[rel=prev]{margin:0;margin-left:var(--pico-spacing);padding:0;float:right}dialog>article>footer{text-align:right}dialog>article>footer [role=button],dialog>article>footer button{margin-bottom:0}dialog>article>footer [role=button]:not(:first-of-type),dialog>article>footer button:not(:first-of-type){margin-left:calc(var(--pico-spacing) * .5)}dialog>article .close,dialog>article :is(a,button)[rel=prev]{display:block;width:1rem;height:1rem;margin-top:calc(var(--pico-spacing) * -1);margin-bottom:var(--pico-spacing);margin-left:auto;border:none;background-image:var(--pico-icon-close);background-position:center;background-size:auto 1rem;background-repeat:no-repeat;background-color:transparent;opacity:.5;transition:opacity var(--pico-transition)}dialog>article .close:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),dialog>article :is(a,button)[rel=prev]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){opacity:1}dialog:not([open]),dialog[open=false]{display:none}.modal-is-open{padding-right:var(--pico-scrollbar-width,0);overflow:hidden;pointer-events:none;touch-action:none}.modal-is-open dialog{pointer-events:auto;touch-action:auto}:where(.modal-is-opening,.modal-is-closing) dialog,:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-duration:.2s;animation-timing-function:ease-in-out;animation-fill-mode:both}:where(.modal-is-opening,.modal-is-closing) dialog{animation-duration:.8s;animation-name:modal-overlay}:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-delay:.2s;animation-name:modal}.modal-is-closing dialog,.modal-is-closing dialog>article{animation-delay:0s;animation-direction:reverse}@keyframes modal-overlay{from{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:transparent}}@keyframes modal{from{transform:translateY(-100%);opacity:0}}:where(nav li)::before{float:left;content:"​"}nav,nav ul{display:flex}nav{justify-content:space-between;overflow:visible}nav ol,nav ul{align-items:center;margin-bottom:0;padding:0;list-style:none}nav ol:first-of-type,nav ul:first-of-type{margin-left:calc(var(--pico-nav-element-spacing-horizontal) * -1)}nav ol:last-of-type,nav ul:last-of-type{margin-right:calc(var(--pico-nav-element-spacing-horizontal) * -1)}nav li{display:inline-block;margin:0;padding:var(--pico-nav-element-spacing-vertical) var(--pico-nav-element-spacing-horizontal)}nav li :where(a,[role=link]){display:inline-block;margin:calc(var(--pico-nav-link-spacing-vertical) * -1) calc(var(--pico-nav-link-spacing-horizontal) * -1);padding:var(--pico-nav-link-spacing-vertical) var(--pico-nav-link-spacing-horizontal);border-radius:var(--pico-border-radius)}nav li :where(a,[role=link]):not(:hover){text-decoration:none}nav li [role=button],nav li [type=button],nav li button,nav li input:not([type=checkbox],[type=radio],[type=range],[type=file]),nav li select{height:auto;margin-right:inherit;margin-bottom:0;margin-left:inherit;padding:calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal)}nav[aria-label=breadcrumb]{align-items:center;justify-content:start}nav[aria-label=breadcrumb] ul li:not(:first-child){margin-inline-start:var(--pico-nav-link-spacing-horizontal)}nav[aria-label=breadcrumb] ul li a{margin:calc(var(--pico-nav-link-spacing-vertical) * -1) 0;margin-inline-start:calc(var(--pico-nav-link-spacing-horizontal) * -1)}nav[aria-label=breadcrumb] ul li:not(:last-child)::after{display:inline-block;position:absolute;width:calc(var(--pico-nav-link-spacing-horizontal) * 4);margin:0 calc(var(--pico-nav-link-spacing-horizontal) * -1);content:var(--pico-nav-breadcrumb-divider);color:var(--pico-muted-color);text-align:center;text-decoration:none;white-space:nowrap}nav[aria-label=breadcrumb] a[aria-current]:not([aria-current=false]){background-color:transparent;color:inherit;text-decoration:none;pointer-events:none}aside li,aside nav,aside ol,aside ul{display:block}aside li{padding:calc(var(--pico-nav-element-spacing-vertical) * .5) var(--pico-nav-element-spacing-horizontal)}aside li a{display:block}aside li [role=button]{margin:inherit}[dir=rtl] nav[aria-label=breadcrumb] ul li:not(:last-child) ::after{content:"\\"}progress{display:inline-block;vertical-align:baseline}progress{-webkit-appearance:none;-moz-appearance:none;display:inline-block;appearance:none;width:100%;height:.5rem;margin-bottom:calc(var(--pico-spacing) * .5);overflow:hidden;border:0;border-radius:var(--pico-border-radius);background-color:var(--pico-progress-background-color);color:var(--pico-progress-color)}progress::-webkit-progress-bar{border-radius:var(--pico-border-radius);background:0 0}progress[value]::-webkit-progress-value{background-color:var(--pico-progress-color);-webkit-transition:inline-size var(--pico-transition);transition:inline-size var(--pico-transition)}progress::-moz-progress-bar{background-color:var(--pico-progress-color)}@media (prefers-reduced-motion:no-preference){progress:indeterminate{background:var(--pico-progress-background-color) linear-gradient(to right,var(--pico-progress-color) 30%,var(--pico-progress-background-color) 30%) top left/150% 150% no-repeat;animation:progress-indeterminate 1s linear infinite}progress:indeterminate[value]::-webkit-progress-value{background-color:transparent}progress:indeterminate::-moz-progress-bar{background-color:transparent}}@media (prefers-reduced-motion:no-preference){[dir=rtl] progress:indeterminate{animation-direction:reverse}}@keyframes progress-indeterminate{0%{background-position:200% 0}100%{background-position:-200% 0}}[data-tooltip]{position:relative}[data-tooltip]:not(a,button,input,[role=button]){border-bottom:1px dotted;text-decoration:none;cursor:help}[data-tooltip]::after,[data-tooltip]::before,[data-tooltip][data-placement=top]::after,[data-tooltip][data-placement=top]::before{display:block;z-index:99;position:absolute;bottom:100%;left:50%;padding:.25rem .5rem;overflow:hidden;transform:translate(-50%,-.25rem);border-radius:var(--pico-border-radius);background:var(--pico-tooltip-background-color);content:attr(data-tooltip);color:var(--pico-tooltip-color);font-style:normal;font-weight:var(--pico-font-weight);font-size:.875rem;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;opacity:0;pointer-events:none}[data-tooltip]::after,[data-tooltip][data-placement=top]::after{padding:0;transform:translate(-50%,0);border-top:.3rem solid;border-right:.3rem solid transparent;border-left:.3rem solid transparent;border-radius:0;background-color:transparent;content:"";color:var(--pico-tooltip-background-color)}[data-tooltip][data-placement=bottom]::after,[data-tooltip][data-placement=bottom]::before{top:100%;bottom:auto;transform:translate(-50%,.25rem)}[data-tooltip][data-placement=bottom]:after{transform:translate(-50%,-.3rem);border:.3rem solid transparent;border-bottom:.3rem solid}[data-tooltip][data-placement=left]::after,[data-tooltip][data-placement=left]::before{top:50%;right:100%;bottom:auto;left:auto;transform:translate(-.25rem,-50%)}[data-tooltip][data-placement=left]:after{transform:translate(.3rem,-50%);border:.3rem solid transparent;border-left:.3rem solid}[data-tooltip][data-placement=right]::after,[data-tooltip][data-placement=right]::before{top:50%;right:auto;bottom:auto;left:100%;transform:translate(.25rem,-50%)}[data-tooltip][data-placement=right]:after{transform:translate(-.3rem,-50%);border:.3rem solid transparent;border-right:.3rem solid}[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{opacity:1}@media (hover:hover) and (pointer:fine){[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{--pico-tooltip-slide-to:translate(-50%, -0.25rem);transform:translate(-50%,.75rem);animation-duration:.2s;animation-fill-mode:forwards;animation-name:tooltip-slide;opacity:0}[data-tooltip]:focus::after,[data-tooltip]:hover::after{--pico-tooltip-caret-slide-to:translate(-50%, 0rem);transform:translate(-50%,-.25rem);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:focus::before,[data-tooltip][data-placement=bottom]:hover::after,[data-tooltip][data-placement=bottom]:hover::before{--pico-tooltip-slide-to:translate(-50%, 0.25rem);transform:translate(-50%,-.75rem);animation-name:tooltip-slide}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:hover::after{--pico-tooltip-caret-slide-to:translate(-50%, -0.3rem);transform:translate(-50%,-.5rem);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:focus::before,[data-tooltip][data-placement=left]:hover::after,[data-tooltip][data-placement=left]:hover::before{--pico-tooltip-slide-to:translate(-0.25rem, -50%);transform:translate(.75rem,-50%);animation-name:tooltip-slide}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:hover::after{--pico-tooltip-caret-slide-to:translate(0.3rem, -50%);transform:translate(.05rem,-50%);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:focus::before,[data-tooltip][data-placement=right]:hover::after,[data-tooltip][data-placement=right]:hover::before{--pico-tooltip-slide-to:translate(0.25rem, -50%);transform:translate(-.75rem,-50%);animation-name:tooltip-slide}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:hover::after{--pico-tooltip-caret-slide-to:translate(-0.3rem, -50%);transform:translate(-.05rem,-50%);animation-name:tooltip-caret-slide}}@keyframes tooltip-slide{to{transform:var(--pico-tooltip-slide-to);opacity:1}}@keyframes tooltip-caret-slide{50%{opacity:0}to{transform:var(--pico-tooltip-caret-slide-to);opacity:1}}[aria-controls]{cursor:pointer}[aria-disabled=true],[disabled]{cursor:not-allowed}[aria-hidden=false][hidden]{display:initial}[aria-hidden=false][hidden]:not(:focus){clip:rect(0,0,0,0);position:absolute}[tabindex],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation}[dir=rtl]{direction:rtl}@media (prefers-reduced-motion:reduce){:not([aria-busy=true]),:not([aria-busy=true])::after,:not([aria-busy=true])::before{background-attachment:initial!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important}} \ No newline at end of file