From f8ed234ada656613e74027d4e8292781ecab4b38 Mon Sep 17 00:00:00 2001
From: w-okada <48346627+w-okada@users.noreply.github.com>
Date: Wed, 14 Sep 2022 15:51:26 +0900
Subject: [PATCH 1/6] =?UTF-8?q?Colaboratory=20=E3=82=92=E4=BD=BF=E7=94=A8?=
=?UTF-8?q?=E3=81=97=E3=81=A6=E4=BD=9C=E6=88=90=E3=81=97=E3=81=BE=E3=81=97?=
=?UTF-8?q?=E3=81=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
SOFT_VC_FLASK.ipynb | 335 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 335 insertions(+)
create mode 100644 SOFT_VC_FLASK.ipynb
diff --git a/SOFT_VC_FLASK.ipynb b/SOFT_VC_FLASK.ipynb
new file mode 100644
index 00000000..f3d5c789
--- /dev/null
+++ b/SOFT_VC_FLASK.ipynb
@@ -0,0 +1,335 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "view-in-github",
+ "colab_type": "text"
+ },
+ "source": [
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "5m_Xf_2NY6mI"
+ },
+ "outputs": [],
+ "source": [
+ "import torch, torchaudio\n",
+ "import requests\n",
+ "import IPython.display as display"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "GGiC0rT2hoik"
+ },
+ "outputs": [],
+ "source": [
+ "!apt-get install -y espeak libsndfile1-dev\n",
+ "!pip install flask\n",
+ "!pip install python-socketio\n",
+ "!pip install eventlet\n",
+ "!pip install unidecode\n",
+ "!pip install phonemizer\n",
+ "!pip install retry\n",
+ "!pip install flask\n",
+ "!pip install flask_cors"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "WO8XzrFMZGoj"
+ },
+ "outputs": [],
+ "source": [
+ "# hubert = torch.hub.load(\"bshall/hubert:main\", \"hubert_soft\").cuda()\n",
+ "# acoustic = torch.hub.load(\"bshall/acoustic-model:main\", \"hubert_soft\").cuda()\n",
+ "# hifigan = torch.hub.load(\"bshall/hifigan:main\", \"hifigan_hubert_soft\").cuda()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "v7xM7CnEZMTL"
+ },
+ "outputs": [],
+ "source": [
+ "# with open(\"example.wav\", \"wb\") as file:\n",
+ "# response = requests.get(\"https://drive.google.com/uc?export=preview&id=1Y3KuPAhB5VcsmIaokBVKu3LUEZOfhSu8\")\n",
+ "# file.write(response.content)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "UZox3YDVZOya"
+ },
+ "outputs": [],
+ "source": [
+ "# source, sr = torchaudio.load(\"emotion059.wav\")\n",
+ "# source = torchaudio.functional.resample(source, sr, 16000)\n",
+ "# source = source.unsqueeze(0).cuda()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "dEZ9_zCKnXpZ"
+ },
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "DSAA2CMfZY7C"
+ },
+ "outputs": [],
+ "source": [
+ "# with torch.inference_mode():\n",
+ "# # Extract speech units\n",
+ "# units = hubert.units(source)\n",
+ "# # Generate target spectrogram\n",
+ "# mel = acoustic.generate(units).transpose(1, 2)\n",
+ "# # Generate audio waveform\n",
+ "# target = hifigan(mel)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "VCwjKdIUZZoi"
+ },
+ "outputs": [],
+ "source": [
+ "# display.Audio(target.squeeze().cpu(), rate=16000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "vjJs35ifZbSK"
+ },
+ "outputs": [],
+ "source": [
+ "# data = target.squeeze().cpu()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "0SuFlButeKXG"
+ },
+ "outputs": [],
+ "source": [
+ "# display.Audio(data, rate=16000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "vFwF5Uh0eMLV"
+ },
+ "outputs": [],
+ "source": [
+ "# dest = torchaudio.functional.resample(target, 16000,24000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "eIWedhF6ebuV"
+ },
+ "outputs": [],
+ "source": [
+ "# display.Audio(dest.squeeze().cpu(), rate=24000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "XkCO-j9teccu"
+ },
+ "outputs": [],
+ "source": [
+ "# dest"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "lzo_ZWmAjaby",
+ "outputId": "ed0af7dc-1614-4d28-e9b4-b3a600cafd88"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "fatal: destination path 'voice-changer' already exists and is not an empty directory.\n",
+ "\u001b[0m\u001b[01;34massets\u001b[0m/ \u001b[01;32mfavicon.ico\u001b[0m* \u001b[01;32mindex.js\u001b[0m*\n",
+ "\u001b[01;32mcoffee.png\u001b[0m* \u001b[01;32mindex.html\u001b[0m* \u001b[01;32mindex.js.LICENSE.txt\u001b[0m*\n"
+ ]
+ }
+ ],
+ "source": [
+ "# (3) リポジトリのクローン\n",
+ "!git clone https://github.com/w-okada/voice-changer.git\n",
+ "%ls voice-changer/frontend/dist\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {
+ "id": "8-z9j4e_j-Wb"
+ },
+ "outputs": [],
+ "source": [
+ "# (4-1) 設定ファイルの配置\n",
+ "!cp voice-changer/template/setting_colab.json voice-changer/frontend/dist/assets/setting.json\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {
+ "id": "-iPiSzvAepCl"
+ },
+ "outputs": [],
+ "source": [
+ "# (6-1) サーバの起動\n",
+ "PORT=8087\n",
+ "get_ipython().system_raw(f'python3 serverFlask.py {PORT} >foo 2>&1 &')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "IiWSwDjQidc7",
+ "outputId": "2bb83f5f-965c-4b54-ac6c-7fd407daa5dc"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "[2022-09-14 06:41:12,893] INFO in serverFlask: INITIALIZE MODEL\n",
+ "[2022-09-14 06:41:12,893] INFO in serverFlask: START APP\n",
+ "Removing weight norm...\n",
+ " * Serving Flask app \"serverFlask\" (lazy loading)\n",
+ " * Environment: production\n",
+ " WARNING: This is a development server. Do not use it in a production deployment.\n",
+ " Use a production WSGI server instead.\n",
+ " * Debug mode: on\n",
+ "[2022-09-14 06:41:12,902] INFO in _internal: * Running on http://0.0.0.0:8087/ (Press CTRL+C to quit)\n",
+ "[2022-09-14 06:41:12,903] INFO in _internal: * Restarting with stat\n"
+ ]
+ }
+ ],
+ "source": [
+ "# (6-2) サーバの起動確認 (Ctrl+Retで実行)\n",
+ "!cat foo"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 205
+ },
+ "id": "WWn3HJlpin4R",
+ "outputId": "ab69bc12-969b-46b8-8705-6ef84c4ab34f"
+ },
+ "outputs": [
+ {
+ "output_type": "error",
+ "ename": "NameError",
+ "evalue": "ignored",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mgoogle\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolab\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0moutput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0moutput\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mserve_kernel_port_as_window\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mPORT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m: name 'PORT' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "# (7) プロキシを起動\n",
+ "from google.colab import output\n",
+ "\n",
+ "output.serve_kernel_port_as_window(PORT)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "k9OqZ-hLjKIx",
+ "outputId": "28f3b99d-29cc-4581-c6f8-9ff0f55359a1"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[0m\u001b[01;34massets\u001b[0m/ \u001b[01;32mfavicon.ico\u001b[0m* \u001b[01;32mindex.js\u001b[0m*\n",
+ "\u001b[01;32mcoffee.png\u001b[0m* \u001b[01;32mindex.html\u001b[0m* \u001b[01;32mindex.js.LICENSE.txt\u001b[0m*\n"
+ ]
+ }
+ ],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "collapsed_sections": [],
+ "provenance": [],
+ "authorship_tag": "ABX9TyPxoYe+Y2QsMoX8N7iTlceN",
+ "include_colab_link": true
+ },
+ "gpuClass": "standard",
+ "kernelspec": {
+ "display_name": "Python 3",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
From 8fadd67d51df76e1d95d2014dc80aab7d0d3b1bf Mon Sep 17 00:00:00 2001
From: w-okada <48346627+w-okada@users.noreply.github.com>
Date: Thu, 15 Sep 2022 19:26:26 +0900
Subject: [PATCH 2/6] =?UTF-8?q?Colaboratory=20=E3=82=92=E4=BD=BF=E7=94=A8?=
=?UTF-8?q?=E3=81=97=E3=81=A6=E4=BD=9C=E6=88=90=E3=81=97=E3=81=BE=E3=81=97?=
=?UTF-8?q?=E3=81=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
SOFT_VC_FLASK.ipynb | 563 +++++++++++++++++++++++++++++++++++++++-----
1 file changed, 509 insertions(+), 54 deletions(-)
diff --git a/SOFT_VC_FLASK.ipynb b/SOFT_VC_FLASK.ipynb
index f3d5c789..e5e70013 100644
--- a/SOFT_VC_FLASK.ipynb
+++ b/SOFT_VC_FLASK.ipynb
@@ -12,7 +12,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 25,
"metadata": {
"id": "5m_Xf_2NY6mI"
},
@@ -25,26 +25,52 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 26,
"metadata": {
- "id": "GGiC0rT2hoik"
+ "id": "GGiC0rT2hoik",
+ "outputId": "6c8bd028-f83c-4a37-e7ad-344deb01dc2a",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
},
- "outputs": [],
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
+ "Requirement already satisfied: flask in /usr/local/lib/python3.7/dist-packages (1.1.4)\n",
+ "Requirement already satisfied: Werkzeug<2.0,>=0.15 in /usr/local/lib/python3.7/dist-packages (from flask) (1.0.1)\n",
+ "Requirement already satisfied: Jinja2<3.0,>=2.10.1 in /usr/local/lib/python3.7/dist-packages (from flask) (2.11.3)\n",
+ "Requirement already satisfied: itsdangerous<2.0,>=0.24 in /usr/local/lib/python3.7/dist-packages (from flask) (1.1.0)\n",
+ "Requirement already satisfied: click<8.0,>=5.1 in /usr/local/lib/python3.7/dist-packages (from flask) (7.1.2)\n",
+ "Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from Jinja2<3.0,>=2.10.1->flask) (2.0.1)\n",
+ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
+ "Requirement already satisfied: flask_cors in /usr/local/lib/python3.7/dist-packages (3.0.10)\n",
+ "Requirement already satisfied: Flask>=0.9 in /usr/local/lib/python3.7/dist-packages (from flask_cors) (1.1.4)\n",
+ "Requirement already satisfied: Six in /usr/local/lib/python3.7/dist-packages (from flask_cors) (1.15.0)\n",
+ "Requirement already satisfied: click<8.0,>=5.1 in /usr/local/lib/python3.7/dist-packages (from Flask>=0.9->flask_cors) (7.1.2)\n",
+ "Requirement already satisfied: Jinja2<3.0,>=2.10.1 in /usr/local/lib/python3.7/dist-packages (from Flask>=0.9->flask_cors) (2.11.3)\n",
+ "Requirement already satisfied: Werkzeug<2.0,>=0.15 in /usr/local/lib/python3.7/dist-packages (from Flask>=0.9->flask_cors) (1.0.1)\n",
+ "Requirement already satisfied: itsdangerous<2.0,>=0.24 in /usr/local/lib/python3.7/dist-packages (from Flask>=0.9->flask_cors) (1.1.0)\n",
+ "Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from Jinja2<3.0,>=2.10.1->Flask>=0.9->flask_cors) (2.0.1)\n"
+ ]
+ }
+ ],
"source": [
- "!apt-get install -y espeak libsndfile1-dev\n",
- "!pip install flask\n",
- "!pip install python-socketio\n",
- "!pip install eventlet\n",
- "!pip install unidecode\n",
- "!pip install phonemizer\n",
- "!pip install retry\n",
+ "#!apt-get install -y espeak libsndfile1-dev\n",
"!pip install flask\n",
+ "# !pip install python-socketio\n",
+ "# !pip install eventlet\n",
+ "# !pip install unidecode\n",
+ "# !pip install phonemizer\n",
+ "# !pip install retry\n",
"!pip install flask_cors"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 27,
"metadata": {
"id": "WO8XzrFMZGoj"
},
@@ -57,7 +83,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 28,
"metadata": {
"id": "v7xM7CnEZMTL"
},
@@ -70,7 +96,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 29,
"metadata": {
"id": "UZox3YDVZOya"
},
@@ -90,7 +116,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 30,
"metadata": {
"id": "DSAA2CMfZY7C"
},
@@ -107,7 +133,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 31,
"metadata": {
"id": "VCwjKdIUZZoi"
},
@@ -118,7 +144,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 32,
"metadata": {
"id": "vjJs35ifZbSK"
},
@@ -129,7 +155,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 33,
"metadata": {
"id": "0SuFlButeKXG"
},
@@ -140,7 +166,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 34,
"metadata": {
"id": "vFwF5Uh0eMLV"
},
@@ -151,7 +177,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 35,
"metadata": {
"id": "eIWedhF6ebuV"
},
@@ -162,7 +188,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 36,
"metadata": {
"id": "XkCO-j9teccu"
},
@@ -173,13 +199,13 @@
},
{
"cell_type": "code",
- "execution_count": 41,
+ "execution_count": 37,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "lzo_ZWmAjaby",
- "outputId": "ed0af7dc-1614-4d28-e9b4-b3a600cafd88"
+ "outputId": "85fb1cbe-0a09-437a-fe97-056e4360161b"
},
"outputs": [
{
@@ -200,7 +226,7 @@
},
{
"cell_type": "code",
- "execution_count": 42,
+ "execution_count": 38,
"metadata": {
"id": "8-z9j4e_j-Wb"
},
@@ -212,7 +238,7 @@
},
{
"cell_type": "code",
- "execution_count": 50,
+ "execution_count": 39,
"metadata": {
"id": "-iPiSzvAepCl"
},
@@ -225,13 +251,13 @@
},
{
"cell_type": "code",
- "execution_count": 54,
+ "execution_count": 43,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "IiWSwDjQidc7",
- "outputId": "2bb83f5f-965c-4b54-ac6c-7fd407daa5dc"
+ "outputId": "d8b15e64-efbf-411a-bd76-f51e5557e077"
},
"outputs": [
{
@@ -241,16 +267,22 @@
"Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
"Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
"Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
- "[2022-09-14 06:41:12,893] INFO in serverFlask: INITIALIZE MODEL\n",
- "[2022-09-14 06:41:12,893] INFO in serverFlask: START APP\n",
+ "[2022-09-15 08:22:01,380] INFO in serverFlask: INITIALIZE MODEL\n",
+ "[2022-09-15 08:22:01,380] INFO in serverFlask: START APP\n",
"Removing weight norm...\n",
" * Serving Flask app \"serverFlask\" (lazy loading)\n",
" * Environment: production\n",
" WARNING: This is a development server. Do not use it in a production deployment.\n",
" Use a production WSGI server instead.\n",
" * Debug mode: on\n",
- "[2022-09-14 06:41:12,902] INFO in _internal: * Running on http://0.0.0.0:8087/ (Press CTRL+C to quit)\n",
- "[2022-09-14 06:41:12,903] INFO in _internal: * Restarting with stat\n"
+ "Traceback (most recent call last):\n",
+ " File \"serverFlask.py\", line 108, in \n",
+ " app.run(debug=True, host='0.0.0.0',port=PORT)\n",
+ " File \"/usr/local/lib/python3.7/dist-packages/flask/app.py\", line 990, in run\n",
+ " run_simple(host, port, self, **options)\n",
+ " File \"/usr/local/lib/python3.7/dist-packages/werkzeug/serving.py\", line 1030, in run_simple\n",
+ " s.bind(server_address)\n",
+ "OSError: [Errno 98] Address already in use\n"
]
}
],
@@ -261,26 +293,39 @@
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 24,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
- "height": 205
+ "height": 34
},
"id": "WWn3HJlpin4R",
- "outputId": "ab69bc12-969b-46b8-8705-6ef84c4ab34f"
+ "outputId": "00f58001-04bf-44dc-aa8e-a2c42074e00d"
},
"outputs": [
{
- "output_type": "error",
- "ename": "NameError",
- "evalue": "ignored",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mgoogle\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolab\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0moutput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0moutput\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mserve_kernel_port_as_window\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mPORT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[0;31mNameError\u001b[0m: name 'PORT' is not defined"
- ]
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "application/javascript": [
+ "(async (port, path, text, element) => {\n",
+ " if (!google.colab.kernel.accessAllowed) {\n",
+ " return;\n",
+ " }\n",
+ " element.appendChild(document.createTextNode(''));\n",
+ " const url = await google.colab.kernel.proxyPort(port);\n",
+ " const anchor = document.createElement('a');\n",
+ " anchor.href = new URL(path, url).toString();\n",
+ " anchor.target = '_blank';\n",
+ " anchor.setAttribute('data-href', url + path);\n",
+ " anchor.textContent = text;\n",
+ " element.appendChild(anchor);\n",
+ " })(8087, \"/\", \"https://localhost:8087/\", window.element)"
+ ]
+ },
+ "metadata": {}
}
],
"source": [
@@ -292,25 +337,435 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 44,
"metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "k9OqZ-hLjKIx",
- "outputId": "28f3b99d-29cc-4581-c6f8-9ff0f55359a1"
+ "id": "k9OqZ-hLjKIx"
},
+ "outputs": [],
+ "source": [
+ "import librosa\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import torch, torchaudio\n",
+ "import IPython.display as display"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "wave, sr = librosa.load(\"received_data.wav\", sr=24000)\n",
+ "rms = librosa.feature.rms(y=wave)\n",
+ "times = librosa.times_like(rms, sr=sr)\n",
+ "plt.plot(times, rms[0]*2**(1/2))\n",
+ "volume_db = 20 * np.log10(wave) \n"
+ ],
+ "metadata": {
+ "id": "fQL4SEwaCidb",
+ "outputId": "6c91ef39-d020-4922-a735-5d4f7e3bef29",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 334
+ }
+ },
+ "execution_count": 48,
"outputs": [
{
- "name": "stdout",
"output_type": "stream",
+ "name": "stderr",
"text": [
- "\u001b[0m\u001b[01;34massets\u001b[0m/ \u001b[01;32mfavicon.ico\u001b[0m* \u001b[01;32mindex.js\u001b[0m*\n",
- "\u001b[01;32mcoffee.png\u001b[0m* \u001b[01;32mindex.html\u001b[0m* \u001b[01;32mindex.js.LICENSE.txt\u001b[0m*\n"
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log10\n",
+ " \"\"\"\n",
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: invalid value encountered in log10\n",
+ " \"\"\"\n"
]
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
}
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "plt.plot(times, rms[0])"
],
- "source": []
+ "metadata": {
+ "id": "ofxeYX7IPySW",
+ "outputId": "5520f5a9-b38f-4b05-90af-eb9934570295",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 282
+ }
+ },
+ "execution_count": 54,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 54
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "wave, sr = librosa.load(\"converted_data.wav\", sr=24000)\n",
+ "rms = librosa.feature.rms(y=wave)\n",
+ "times = librosa.times_like(rms, sr=sr)\n",
+ "plt.plot(times, rms[0]*2**(1/2))\n",
+ "volume_db = 20 * np.log10(wave) \n"
+ ],
+ "metadata": {
+ "id": "gOnUNqLKDB28",
+ "outputId": "257dbc72-48b8-4cbf-a19f-928398c0cc74",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 334
+ }
+ },
+ "execution_count": 46,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log10\n",
+ " \"\"\"\n",
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: invalid value encountered in log10\n",
+ " \"\"\"\n"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "times"
+ ],
+ "metadata": {
+ "id": "ZSGa8WXIQd50",
+ "outputId": "efd6e6e1-5023-4cc6-e555-0d3c0bad509e",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "execution_count": 55,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([0. , 0.02133333, 0.04266667, 0.064 , 0.08533333,\n",
+ " 0.10666667, 0.128 , 0.14933333, 0.17066667, 0.192 ,\n",
+ " 0.21333333, 0.23466667, 0.256 , 0.27733333, 0.29866667,\n",
+ " 0.32 , 0.34133333, 0.36266667, 0.384 , 0.40533333,\n",
+ " 0.42666667, 0.448 , 0.46933333, 0.49066667, 0.512 ,\n",
+ " 0.53333333, 0.55466667, 0.576 , 0.59733333, 0.61866667,\n",
+ " 0.64 , 0.66133333, 0.68266667, 0.704 , 0.72533333,\n",
+ " 0.74666667, 0.768 , 0.78933333, 0.81066667, 0.832 ,\n",
+ " 0.85333333, 0.87466667, 0.896 , 0.91733333, 0.93866667,\n",
+ " 0.96 , 0.98133333, 1.00266667, 1.024 , 1.04533333,\n",
+ " 1.06666667, 1.088 , 1.10933333, 1.13066667, 1.152 ,\n",
+ " 1.17333333, 1.19466667, 1.216 , 1.23733333, 1.25866667,\n",
+ " 1.28 , 1.30133333, 1.32266667, 1.344 , 1.36533333,\n",
+ " 1.38666667, 1.408 , 1.42933333, 1.45066667, 1.472 ,\n",
+ " 1.49333333, 1.51466667, 1.536 , 1.55733333, 1.57866667,\n",
+ " 1.6 , 1.62133333, 1.64266667, 1.664 , 1.68533333,\n",
+ " 1.70666667, 1.728 , 1.74933333, 1.77066667, 1.792 ,\n",
+ " 1.81333333, 1.83466667, 1.856 , 1.87733333, 1.89866667,\n",
+ " 1.92 , 1.94133333, 1.96266667, 1.984 , 2.00533333,\n",
+ " 2.02666667, 2.048 , 2.06933333, 2.09066667, 2.112 ,\n",
+ " 2.13333333, 2.15466667, 2.176 , 2.19733333, 2.21866667,\n",
+ " 2.24 , 2.26133333, 2.28266667, 2.304 , 2.32533333,\n",
+ " 2.34666667, 2.368 , 2.38933333, 2.41066667, 2.432 ,\n",
+ " 2.45333333, 2.47466667, 2.496 , 2.51733333, 2.53866667,\n",
+ " 2.56 , 2.58133333, 2.60266667, 2.624 , 2.64533333,\n",
+ " 2.66666667, 2.688 , 2.70933333, 2.73066667, 2.752 ,\n",
+ " 2.77333333, 2.79466667])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 55
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "source, sr = torchaudio.load(\"received_data.wav\")\n",
+ "specgram = torchaudio.transforms.MelSpectrogram(sample_rate=24000)(source)\n",
+ "print(\"Shape of spectrogram: {}\".format(specgram.size()))\n",
+ "plt.figure()\n",
+ "p = plt.imshow(specgram.log2()[0,:,:].detach().numpy(), cmap='gray')"
+ ],
+ "metadata": {
+ "id": "C2nZWLIqDMUa",
+ "outputId": "732a3c6f-e444-416f-897c-02a3c3c4a3b7",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 175
+ }
+ },
+ "execution_count": 4,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/torchaudio/functional/functional.py:540: UserWarning: At least one mel filterbank has all zero values. The value for `n_mels` (128) may be set too high. Or, the value for `n_freqs` (201) may be set too low.\n",
+ " \"At least one mel filterbank has all zero values. \"\n"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Shape of spectrogram: torch.Size([1, 128, 835])\n"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "source, sr = torchaudio.load(\"converted_data.wav\")\n",
+ "specgram = torchaudio.transforms.MelSpectrogram(sample_rate=24000)(source)\n",
+ "print(\"Shape of spectrogram: {}\".format(specgram.size()))\n",
+ "plt.figure()\n",
+ "p = plt.imshow(specgram.log2()[0,:,:].detach().numpy(), cmap='gray')"
+ ],
+ "metadata": {
+ "id": "aEmVgMLKIsNE",
+ "outputId": "652e6753-f0a2-4c53-d7a0-83473a8a4293",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 120
+ }
+ },
+ "execution_count": 5,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Shape of spectrogram: torch.Size([1, 128, 833])\n"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "source, sr = torchaudio.load(\"received_data.wav\")\n",
+ "# window = torch.hann_window(window_length=400).cuda()\n",
+ "# pitch = torchaudio.transforms.PitchShift(sample_rate=24000, n_steps=12, window=window)(source.cuda())\n",
+ "source = source.cuda()\n",
+ "chunks = torch.split(source,24000,1)\n",
+ "chunks = [torchaudio.transforms.Vol(i*3)(c) for i, c in enumerate(chunks)]\n",
+ "r = torch.cat(chunks,1)\n",
+ "# pitch = torchaudio.transforms.Vol(1)(source)\n",
+ "#pitch = torchaudio.transforms.Vol(3)(torch.split(source, 36000,1)[0])\n",
+ "\n",
+ "torchaudio.save(\"pitach.wav\", r.cpu(), 24000)\n"
+ ],
+ "metadata": {
+ "id": "KMznFbWGJBrt"
+ },
+ "execution_count": 115,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "len(chunks), len(r)"
+ ],
+ "metadata": {
+ "id": "caNhRHlOJNCW",
+ "outputId": "9d39193b-7584-4082-87f0-c1498897b049",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "execution_count": 113,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(6, 1)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 113
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "len(t), len(source[0])"
+ ],
+ "metadata": {
+ "id": "k9VYNQK7XG_C",
+ "outputId": "54c31a8d-4836-4789-b38e-649169972fb6",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "execution_count": 89,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(16768, 67072)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 89
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "display.Audio(\"pitach.wav\", rate=24000)"
+ ],
+ "metadata": {
+ "id": "FHUFYjjAJScV",
+ "outputId": "6b196ff9-ed05-4792-fcff-a742fa67b8d2",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 75
+ }
+ },
+ "execution_count": 116,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ " "
+ ]
+ },
+ "metadata": {},
+ "execution_count": 116
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "display.Audio(\"received_data.wav\", rate=24000)"
+ ],
+ "metadata": {
+ "id": "gcb7CJupK7-C",
+ "outputId": "2c682e7e-2713-4d7a-bdfd-2766b2b050eb",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 75
+ }
+ },
+ "execution_count": 111,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ " "
+ ]
+ },
+ "metadata": {},
+ "execution_count": 111
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [],
+ "metadata": {
+ "id": "HApZLF54LV7j"
+ },
+ "execution_count": null,
+ "outputs": []
}
],
"metadata": {
@@ -318,7 +773,7 @@
"colab": {
"collapsed_sections": [],
"provenance": [],
- "authorship_tag": "ABX9TyPxoYe+Y2QsMoX8N7iTlceN",
+ "authorship_tag": "ABX9TyODIrdorZyaMEWBU9At8XBp",
"include_colab_link": true
},
"gpuClass": "standard",
From 52dd87e6b96c2781160e693614cb70f87248785e Mon Sep 17 00:00:00 2001
From: w-okada <48346627+w-okada@users.noreply.github.com>
Date: Sun, 18 Sep 2022 07:27:31 +0900
Subject: [PATCH 3/6] =?UTF-8?q?Colaboratory=20=E3=82=92=E4=BD=BF=E7=94=A8?=
=?UTF-8?q?=E3=81=97=E3=81=A6=E4=BD=9C=E6=88=90=E3=81=97=E3=81=BE=E3=81=97?=
=?UTF-8?q?=E3=81=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
SOFT_VC_FLASK.ipynb | 1969 +++++++++++++++++++++++++++++--------------
1 file changed, 1344 insertions(+), 625 deletions(-)
diff --git a/SOFT_VC_FLASK.ipynb b/SOFT_VC_FLASK.ipynb
index e5e70013..aff5a893 100644
--- a/SOFT_VC_FLASK.ipynb
+++ b/SOFT_VC_FLASK.ipynb
@@ -12,7 +12,7 @@
},
{
"cell_type": "code",
- "execution_count": 25,
+ "execution_count": 1,
"metadata": {
"id": "5m_Xf_2NY6mI"
},
@@ -25,13 +25,13 @@
},
{
"cell_type": "code",
- "execution_count": 26,
+ "execution_count": 6,
"metadata": {
"id": "GGiC0rT2hoik",
- "outputId": "6c8bd028-f83c-4a37-e7ad-344deb01dc2a",
"colab": {
"base_uri": "https://localhost:8080/"
- }
+ },
+ "outputId": "37af24c7-2f22-46b5-af7c-e5487816abd0"
},
"outputs": [
{
@@ -39,180 +39,194 @@
"name": "stdout",
"text": [
"Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
- "Requirement already satisfied: flask in /usr/local/lib/python3.7/dist-packages (1.1.4)\n",
- "Requirement already satisfied: Werkzeug<2.0,>=0.15 in /usr/local/lib/python3.7/dist-packages (from flask) (1.0.1)\n",
- "Requirement already satisfied: Jinja2<3.0,>=2.10.1 in /usr/local/lib/python3.7/dist-packages (from flask) (2.11.3)\n",
- "Requirement already satisfied: itsdangerous<2.0,>=0.24 in /usr/local/lib/python3.7/dist-packages (from flask) (1.1.0)\n",
- "Requirement already satisfied: click<8.0,>=5.1 in /usr/local/lib/python3.7/dist-packages (from flask) (7.1.2)\n",
- "Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from Jinja2<3.0,>=2.10.1->flask) (2.0.1)\n",
+ "Collecting fastapi\n",
+ " Downloading fastapi-0.85.0-py3-none-any.whl (55 kB)\n",
+ "\u001b[K |████████████████████████████████| 55 kB 3.7 MB/s \n",
+ "\u001b[?25hRequirement already satisfied: pydantic!=1.7,!=1.7.1,!=1.7.2,!=1.7.3,!=1.8,!=1.8.1,<2.0.0,>=1.6.2 in /usr/local/lib/python3.7/dist-packages (from fastapi) (1.9.2)\n",
+ "Collecting starlette==0.20.4\n",
+ " Downloading starlette-0.20.4-py3-none-any.whl (63 kB)\n",
+ "\u001b[K |████████████████████████████████| 63 kB 2.8 MB/s \n",
+ "\u001b[?25hCollecting anyio<5,>=3.4.0\n",
+ " Downloading anyio-3.6.1-py3-none-any.whl (80 kB)\n",
+ "\u001b[K |████████████████████████████████| 80 kB 10.5 MB/s \n",
+ "\u001b[?25hRequirement already satisfied: typing-extensions>=3.10.0 in /usr/local/lib/python3.7/dist-packages (from starlette==0.20.4->fastapi) (4.1.1)\n",
+ "Collecting sniffio>=1.1\n",
+ " Downloading sniffio-1.3.0-py3-none-any.whl (10 kB)\n",
+ "Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.7/dist-packages (from anyio<5,>=3.4.0->starlette==0.20.4->fastapi) (2.10)\n",
+ "Installing collected packages: sniffio, anyio, starlette, fastapi\n",
+ "Successfully installed anyio-3.6.1 fastapi-0.85.0 sniffio-1.3.0 starlette-0.20.4\n",
"Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
- "Requirement already satisfied: flask_cors in /usr/local/lib/python3.7/dist-packages (3.0.10)\n",
- "Requirement already satisfied: Flask>=0.9 in /usr/local/lib/python3.7/dist-packages (from flask_cors) (1.1.4)\n",
- "Requirement already satisfied: Six in /usr/local/lib/python3.7/dist-packages (from flask_cors) (1.15.0)\n",
- "Requirement already satisfied: click<8.0,>=5.1 in /usr/local/lib/python3.7/dist-packages (from Flask>=0.9->flask_cors) (7.1.2)\n",
- "Requirement already satisfied: Jinja2<3.0,>=2.10.1 in /usr/local/lib/python3.7/dist-packages (from Flask>=0.9->flask_cors) (2.11.3)\n",
- "Requirement already satisfied: Werkzeug<2.0,>=0.15 in /usr/local/lib/python3.7/dist-packages (from Flask>=0.9->flask_cors) (1.0.1)\n",
- "Requirement already satisfied: itsdangerous<2.0,>=0.24 in /usr/local/lib/python3.7/dist-packages (from Flask>=0.9->flask_cors) (1.1.0)\n",
- "Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from Jinja2<3.0,>=2.10.1->Flask>=0.9->flask_cors) (2.0.1)\n"
+ "Collecting uvicorn\n",
+ " Downloading uvicorn-0.18.3-py3-none-any.whl (57 kB)\n",
+ "\u001b[K |████████████████████████████████| 57 kB 5.3 MB/s \n",
+ "\u001b[?25hCollecting h11>=0.8\n",
+ " Downloading h11-0.13.0-py3-none-any.whl (58 kB)\n",
+ "\u001b[K |████████████████████████████████| 58 kB 6.6 MB/s \n",
+ "\u001b[?25hRequirement already satisfied: click>=7.0 in /usr/local/lib/python3.7/dist-packages (from uvicorn) (7.1.2)\n",
+ "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from uvicorn) (4.1.1)\n",
+ "Installing collected packages: h11, uvicorn\n",
+ "Successfully installed h11-0.13.0 uvicorn-0.18.3\n"
]
}
],
"source": [
- "#!apt-get install -y espeak libsndfile1-dev\n",
- "!pip install flask\n",
- "# !pip install python-socketio\n",
- "# !pip install eventlet\n",
- "# !pip install unidecode\n",
- "# !pip install phonemizer\n",
- "# !pip install retry\n",
- "!pip install flask_cors"
+ "!pip install fastapi\n",
+ "!pip install uvicorn\n"
]
},
{
"cell_type": "code",
- "execution_count": 27,
+ "execution_count": 3,
"metadata": {
- "id": "WO8XzrFMZGoj"
+ "id": "WO8XzrFMZGoj",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 324,
+ "referenced_widgets": [
+ "1fb6c0e3138f4b488bb34e37146ff37d",
+ "54917384fe31484c819d5a8553026da4",
+ "cbf282697ea84126bab4449e9f03446b",
+ "c52a3c133bcb432cad237073f5aab054",
+ "4ecce5ec14504bbc9aed0f47923ccfb6",
+ "582c624f0437497ca264a1e5cd2fcb5f",
+ "607a419839644cbc837faee0cf085d1c",
+ "7932c1cff373439a8a8eb1f003cf8c4b",
+ "548c4156f681472493a8af30af129e3c",
+ "86394b2dfdc04a1db206c34710abde8f",
+ "98f9877b91024110a0845bcad5aa9373",
+ "a8f2eeaf998d4931b0a393874b1dab47",
+ "57976d7425c74a6ba59fc8690c71556f",
+ "41b7d72ce3164b79ad0206cf9372e35c",
+ "88580af9b2e24861824c3a699be36b57",
+ "87080b573d3841d9847db312969c20d2",
+ "96552e354a024d0caee5420e43097791",
+ "a6de0a8cc9744b38b672d4f95a6b6435",
+ "0712aeb95eaf4c5fb02abb7f6b34d232",
+ "4a69c62156f74ca4bc3e5a0415ab1606",
+ "035468979725405bbc64a007325432e8",
+ "88457d91184a40daa2d90c6ef8d05ff8",
+ "136e831d42c74b3790488c8916628b1b",
+ "5368bc852ae241039e85f45ddf4d3700",
+ "c4d9c5c9097e4fd4882b05dec71c826b",
+ "d6f2bf9acb7941cc94712b8f66cc9d09",
+ "3f3a1d0685694ff3b2c3d7b111c1d59b",
+ "d381d89f351544369a3f1744f69a62b8",
+ "de05063b4f75466fadc672c2a9c085e1",
+ "18dde4dbce394d43a7f6e2e6657136bd",
+ "bee40572e9d440f6bf8ce945a599dc92",
+ "8593cbf5e07d46038a8fe307adc34984",
+ "730f342e75244fba90d5fc32c9acc2e6"
+ ]
+ },
+ "outputId": "f5836b09-bc6d-4914-bf71-583f4aa531b4"
},
- "outputs": [],
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/torch/hub.py:267: UserWarning: You are about to download and run code from an untrusted repository. In a future release, this won't be allowed. To add the repository to your trusted list, change the command to {calling_fn}(..., trust_repo=False) and a command prompt will appear asking for an explicit confirmation of trust, or load(..., trust_repo=True), which will assume that the prompt is to be answered with 'yes'. You can also use load(..., trust_repo='check') which will only prompt for confirmation if the repo is not already trusted. This will eventually be the default behaviour\n",
+ " \"You are about to download and run code from an untrusted repository. In a future release, this won't \"\n",
+ "Downloading: \"https://github.com/bshall/hubert/zipball/main\" to /root/.cache/torch/hub/main.zip\n",
+ "Downloading: \"https://github.com/bshall/hubert/releases/download/v0.1/hubert-soft-0d54a1f4.pt\" to /root/.cache/torch/hub/checkpoints/hubert-soft-0d54a1f4.pt\n"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " 0%| | 0.00/361M [00:00, ?B/s]"
+ ],
+ "application/vnd.jupyter.widget-view+json": {
+ "version_major": 2,
+ "version_minor": 0,
+ "model_id": "1fb6c0e3138f4b488bb34e37146ff37d"
+ }
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/torch/hub.py:267: UserWarning: You are about to download and run code from an untrusted repository. In a future release, this won't be allowed. To add the repository to your trusted list, change the command to {calling_fn}(..., trust_repo=False) and a command prompt will appear asking for an explicit confirmation of trust, or load(..., trust_repo=True), which will assume that the prompt is to be answered with 'yes'. You can also use load(..., trust_repo='check') which will only prompt for confirmation if the repo is not already trusted. This will eventually be the default behaviour\n",
+ " \"You are about to download and run code from an untrusted repository. In a future release, this won't \"\n",
+ "Downloading: \"https://github.com/bshall/acoustic-model/zipball/main\" to /root/.cache/torch/hub/main.zip\n",
+ "Downloading: \"https://github.com/bshall/acoustic-model/releases/download/v0.1/hubert-soft-0321fd7e.pt\" to /root/.cache/torch/hub/checkpoints/hubert-soft-0321fd7e.pt\n"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " 0%| | 0.00/71.8M [00:00, ?B/s]"
+ ],
+ "application/vnd.jupyter.widget-view+json": {
+ "version_major": 2,
+ "version_minor": 0,
+ "model_id": "a8f2eeaf998d4931b0a393874b1dab47"
+ }
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "Downloading: \"https://github.com/bshall/hifigan/zipball/main\" to /root/.cache/torch/hub/main.zip\n",
+ "Downloading: \"https://github.com/bshall/hifigan/releases/download/v0.1/hifigan-hubert-discrete-bbad3043.pt\" to /root/.cache/torch/hub/checkpoints/hifigan-hubert-discrete-bbad3043.pt\n"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " 0%| | 0.00/54.9M [00:00, ?B/s]"
+ ],
+ "application/vnd.jupyter.widget-view+json": {
+ "version_major": 2,
+ "version_minor": 0,
+ "model_id": "136e831d42c74b3790488c8916628b1b"
+ }
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Removing weight norm...\n"
+ ]
+ }
+ ],
"source": [
- "# hubert = torch.hub.load(\"bshall/hubert:main\", \"hubert_soft\").cuda()\n",
- "# acoustic = torch.hub.load(\"bshall/acoustic-model:main\", \"hubert_soft\").cuda()\n",
- "# hifigan = torch.hub.load(\"bshall/hifigan:main\", \"hifigan_hubert_soft\").cuda()"
+ "hubert = torch.hub.load(\"bshall/hubert:main\", \"hubert_soft\").cuda()\n",
+ "acoustic = torch.hub.load(\"bshall/acoustic-model:main\", \"hubert_soft\").cuda()\n",
+ "hifigan = torch.hub.load(\"bshall/hifigan:main\", \"hifigan_hubert_soft\").cuda()"
]
},
{
"cell_type": "code",
- "execution_count": 28,
- "metadata": {
- "id": "v7xM7CnEZMTL"
- },
- "outputs": [],
- "source": [
- "# with open(\"example.wav\", \"wb\") as file:\n",
- "# response = requests.get(\"https://drive.google.com/uc?export=preview&id=1Y3KuPAhB5VcsmIaokBVKu3LUEZOfhSu8\")\n",
- "# file.write(response.content)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {
- "id": "UZox3YDVZOya"
- },
- "outputs": [],
- "source": [
- "# source, sr = torchaudio.load(\"emotion059.wav\")\n",
- "# source = torchaudio.functional.resample(source, sr, 16000)\n",
- "# source = source.unsqueeze(0).cuda()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "dEZ9_zCKnXpZ"
- },
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {
- "id": "DSAA2CMfZY7C"
- },
- "outputs": [],
- "source": [
- "# with torch.inference_mode():\n",
- "# # Extract speech units\n",
- "# units = hubert.units(source)\n",
- "# # Generate target spectrogram\n",
- "# mel = acoustic.generate(units).transpose(1, 2)\n",
- "# # Generate audio waveform\n",
- "# target = hifigan(mel)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {
- "id": "VCwjKdIUZZoi"
- },
- "outputs": [],
- "source": [
- "# display.Audio(target.squeeze().cpu(), rate=16000)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {
- "id": "vjJs35ifZbSK"
- },
- "outputs": [],
- "source": [
- "# data = target.squeeze().cpu()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 33,
- "metadata": {
- "id": "0SuFlButeKXG"
- },
- "outputs": [],
- "source": [
- "# display.Audio(data, rate=16000)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "metadata": {
- "id": "vFwF5Uh0eMLV"
- },
- "outputs": [],
- "source": [
- "# dest = torchaudio.functional.resample(target, 16000,24000)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 35,
- "metadata": {
- "id": "eIWedhF6ebuV"
- },
- "outputs": [],
- "source": [
- "# display.Audio(dest.squeeze().cpu(), rate=24000)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 36,
- "metadata": {
- "id": "XkCO-j9teccu"
- },
- "outputs": [],
- "source": [
- "# dest"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 37,
+ "execution_count": 7,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "lzo_ZWmAjaby",
- "outputId": "85fb1cbe-0a09-437a-fe97-056e4360161b"
+ "outputId": "4a86a60b-3aef-4d05-d165-00060b341ba4"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
- "fatal: destination path 'voice-changer' already exists and is not an empty directory.\n",
+ "Cloning into 'voice-changer'...\n",
+ "remote: Enumerating objects: 509, done.\u001b[K\n",
+ "remote: Counting objects: 100% (93/93), done.\u001b[K\n",
+ "remote: Compressing objects: 100% (77/77), done.\u001b[K\n",
+ "remote: Total 509 (delta 31), reused 27 (delta 16), pack-reused 416\u001b[K\n",
+ "Receiving objects: 100% (509/509), 21.40 MiB | 17.42 MiB/s, done.\n",
+ "Resolving deltas: 100% (258/258), done.\n",
"\u001b[0m\u001b[01;34massets\u001b[0m/ \u001b[01;32mfavicon.ico\u001b[0m* \u001b[01;32mindex.js\u001b[0m*\n",
"\u001b[01;32mcoffee.png\u001b[0m* \u001b[01;32mindex.html\u001b[0m* \u001b[01;32mindex.js.LICENSE.txt\u001b[0m*\n"
]
@@ -221,12 +235,12 @@
"source": [
"# (3) リポジトリのクローン\n",
"!git clone https://github.com/w-okada/voice-changer.git\n",
- "%ls voice-changer/frontend/dist\n"
+ "%ls voice-changer/frontend/dist"
]
},
{
"cell_type": "code",
- "execution_count": 38,
+ "execution_count": 11,
"metadata": {
"id": "8-z9j4e_j-Wb"
},
@@ -238,26 +252,26 @@
},
{
"cell_type": "code",
- "execution_count": 39,
+ "execution_count": 26,
"metadata": {
"id": "-iPiSzvAepCl"
},
"outputs": [],
"source": [
"# (6-1) サーバの起動\n",
- "PORT=8087\n",
- "get_ipython().system_raw(f'python3 serverFlask.py {PORT} >foo 2>&1 &')"
+ "PORT=8092\n",
+ "get_ipython().system_raw(f'python3 SoftVcServerFastAPI.py {PORT} >foo 2>&1 &')"
]
},
{
"cell_type": "code",
- "execution_count": 43,
+ "execution_count": 37,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "IiWSwDjQidc7",
- "outputId": "d8b15e64-efbf-411a-bd76-f51e5557e077"
+ "outputId": "46ac3638-9525-4b7c-9139-bd43ffad87b5"
},
"outputs": [
{
@@ -267,22 +281,138 @@
"Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
"Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
"Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
- "[2022-09-15 08:22:01,380] INFO in serverFlask: INITIALIZE MODEL\n",
- "[2022-09-15 08:22:01,380] INFO in serverFlask: START APP\n",
+ "INFO: Will watch for changes in these directories: ['/content']\n",
+ "INFO: Uvicorn running on http://0.0.0.0:8092 (Press CTRL+C to quit)\n",
+ "INFO: Started reloader process [301] using StatReload\n",
"Removing weight norm...\n",
- " * Serving Flask app \"serverFlask\" (lazy loading)\n",
- " * Environment: production\n",
- " WARNING: This is a development server. Do not use it in a production deployment.\n",
- " Use a production WSGI server instead.\n",
- " * Debug mode: on\n",
- "Traceback (most recent call last):\n",
- " File \"serverFlask.py\", line 108, in \n",
- " app.run(debug=True, host='0.0.0.0',port=PORT)\n",
- " File \"/usr/local/lib/python3.7/dist-packages/flask/app.py\", line 990, in run\n",
- " run_simple(host, port, self, **options)\n",
- " File \"/usr/local/lib/python3.7/dist-packages/werkzeug/serving.py\", line 1030, in run_simple\n",
- " s.bind(server_address)\n",
- "OSError: [Errno 98] Address already in use\n"
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "INFO: Started server process [311]\n",
+ "INFO: Waiting for application startup.\n",
+ "INFO: Application startup complete.\n",
+ "Removing weight norm...\n",
+ "Removing weight norm...\n",
+ "INFO: 127.0.0.1:38374 - \"GET / HTTP/1.1\" 404 Not Found\n",
+ "INFO: 127.0.0.1:38118 - \"GET / HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:38120 - \"GET /index.js HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:38086 - \"GET /assets/setting.json HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:38094 - \"GET /coffee.png HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45478 - \"GET /assets/icons/flect.png HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45492 - \"GET /assets/vrm/zundamon/zundamon.vrm HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45502 - \"GET /assets/tflite-simd.wasm1f6a0e789251efcdaa4d HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45504 - \"GET /assets/palm_detection_lite.binba92fbef448d5b4334bc HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45518 - \"GET /assets/hand_landmark_lite.bin037c09b22c066e04d3ff HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45532 - \"GET /assets/pose_detection.bin5f6876fde03ed33ebc9a HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45534 - \"GET /assets/images/bg_natural_sougen.jpg HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45536 - \"GET /assets/face_detection_short_range.binc083ebee6df759da467d HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45540 - \"GET /assets/pose_landmark_lite.bin80f1d546bddf782578f3 HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45546 - \"GET /assets/model_float16_quant.bin33ee0cfa3b13c82ace2a HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:45552 - \"GET / HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:54030 - \"POST /test HTTP/1.1\" 405 Method Not Allowed\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "INFO: Shutting down\n",
+ "INFO: Waiting for application shutdown.\n",
+ "INFO: Application shutdown complete.\n",
+ "INFO: Finished server process [311]\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "INFO: Started server process [345]\n",
+ "INFO: Waiting for application startup.\n",
+ "INFO: Application startup complete.\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "INFO: Shutting down\n",
+ "INFO: Waiting for application shutdown.\n",
+ "INFO: Application shutdown complete.\n",
+ "INFO: Finished server process [345]\n",
+ "Removing weight norm...\n",
+ "Removing weight norm...\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "INFO: Started server process [356]\n",
+ "INFO: Waiting for application startup.\n",
+ "INFO: Application startup complete.\n",
+ "Removing weight norm...\n",
+ "Removing weight norm...\n",
+ "INFO: 127.0.0.1:56660 - \"POST /test HTTP/1.1\" 405 Method Not Allowed\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "INFO: Shutting down\n",
+ "INFO: Waiting for application shutdown.\n",
+ "INFO: Application shutdown complete.\n",
+ "INFO: Finished server process [356]\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "INFO: Started server process [366]\n",
+ "INFO: Waiting for application startup.\n",
+ "INFO: Application startup complete.\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "INFO: Shutting down\n",
+ "INFO: Waiting for application shutdown.\n",
+ "INFO: Application shutdown complete.\n",
+ "INFO: Finished server process [366]\n",
+ "Removing weight norm...\n",
+ "Removing weight norm...\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "INFO: Started server process [402]\n",
+ "INFO: Waiting for application startup.\n",
+ "INFO: Application startup complete.\n",
+ "Removing weight norm...\n",
+ "Removing weight norm...\n",
+ "INFO: 127.0.0.1:32880 - \"POST /front/test HTTP/1.1\" 404 Not Found\n",
+ "INFO: 127.0.0.1:49254 - \"POST /front/test HTTP/1.1\" 404 Not Found\n",
+ "/usr/local/lib/python3.7/dist-packages/torchaudio/functional/functional.py:540: UserWarning: At least one mel filterbank has all zero values. The value for `n_mels` (128) may be set too high. Or, the value for `n_freqs` (201) may be set too low.\n",
+ " \"At least one mel filterbank has all zero values. \"\n",
+ "INFO: prepro:0.15424752235412598, softvc:3.7410171031951904, postpro:0.060701847076416016 \n",
+ "INFO: prepros:0.00015926361083984375, 0.0014684200286865234, 0.0002689361572265625, 0.004341840744018555, 0.14786338806152344, 0.0001456737518310547, \n",
+ "INFO: prexxxxxxxxxxxxxxx:1.6689300537109375e-06, prepros:4.76837158203125e-07, prepros:4.76837158203125e-07, \n",
+ "POST REQUEST PROCESSING....\n",
+ "INFO: 127.0.0.1:59618 - \"POST /test HTTP/1.1\" 200 OK\n",
+ "INFO: prepro:0.005713939666748047, softvc:0.1370687484741211, postpro:0.006365537643432617 \n",
+ "INFO: prepros:0.00034618377685546875, 0.002839803695678711, 0.00032806396484375, 0.0006778240203857422, 0.0013592243194580078, 0.0001628398895263672, \n",
+ "INFO: prexxxxxxxxxxxxxxx:1.6689300537109375e-06, prepros:4.76837158203125e-07, prepros:2.384185791015625e-07, \n",
+ "POST REQUEST PROCESSING....\n",
+ "INFO: 127.0.0.1:59782 - \"POST /test HTTP/1.1\" 200 OK\n",
+ "INFO: prepro:0.006774425506591797, softvc:0.18008971214294434, postpro:0.008988618850708008 \n",
+ "INFO: prepros:0.0004303455352783203, 0.003702878952026367, 0.0003914833068847656, 0.00066375732421875, 0.0013895034790039062, 0.0001964569091796875, \n",
+ "INFO: prexxxxxxxxxxxxxxx:1.6689300537109375e-06, prepros:4.76837158203125e-07, prepros:4.76837158203125e-07, \n",
+ "POST REQUEST PROCESSING....\n",
+ "INFO: 127.0.0.1:59790 - \"POST /test HTTP/1.1\" 200 OK\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "INFO: Shutting down\n",
+ "INFO: Waiting for application shutdown.\n",
+ "INFO: Application shutdown complete.\n",
+ "INFO: Finished server process [402]\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n",
+ "WARNING: StatReload detected changes in 'SoftVcServerFastAPI.py'. Reloading...\n"
]
}
],
@@ -293,468 +423,27 @@
},
{
"cell_type": "code",
- "execution_count": 24,
+ "source": [
+ "from google.colab.output import eval_js\n",
+ "proxy = eval_js( \"google.colab.kernel.proxyPort(\" + str(PORT) + \")\" )\n",
+ "print(f\"{proxy}front/\")"
+ ],
"metadata": {
+ "id": "H8EpnHqDjknR",
+ "outputId": "f637993b-75a7-44a5-804b-cb75f9765ba5",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
- },
- "id": "WWn3HJlpin4R",
- "outputId": "00f58001-04bf-44dc-aa8e-a2c42074e00d"
- },
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- ""
- ],
- "application/javascript": [
- "(async (port, path, text, element) => {\n",
- " if (!google.colab.kernel.accessAllowed) {\n",
- " return;\n",
- " }\n",
- " element.appendChild(document.createTextNode(''));\n",
- " const url = await google.colab.kernel.proxyPort(port);\n",
- " const anchor = document.createElement('a');\n",
- " anchor.href = new URL(path, url).toString();\n",
- " anchor.target = '_blank';\n",
- " anchor.setAttribute('data-href', url + path);\n",
- " anchor.textContent = text;\n",
- " element.appendChild(anchor);\n",
- " })(8087, \"/\", \"https://localhost:8087/\", window.element)"
- ]
- },
- "metadata": {}
- }
- ],
- "source": [
- "# (7) プロキシを起動\n",
- "from google.colab import output\n",
- "\n",
- "output.serve_kernel_port_as_window(PORT)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 44,
- "metadata": {
- "id": "k9OqZ-hLjKIx"
- },
- "outputs": [],
- "source": [
- "import librosa\n",
- "import matplotlib.pyplot as plt\n",
- "import numpy as np\n",
- "import torch, torchaudio\n",
- "import IPython.display as display"
- ]
- },
- {
- "cell_type": "code",
- "source": [
- "wave, sr = librosa.load(\"received_data.wav\", sr=24000)\n",
- "rms = librosa.feature.rms(y=wave)\n",
- "times = librosa.times_like(rms, sr=sr)\n",
- "plt.plot(times, rms[0]*2**(1/2))\n",
- "volume_db = 20 * np.log10(wave) \n"
- ],
- "metadata": {
- "id": "fQL4SEwaCidb",
- "outputId": "6c91ef39-d020-4922-a735-5d4f7e3bef29",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 334
}
},
- "execution_count": 48,
- "outputs": [
- {
- "output_type": "stream",
- "name": "stderr",
- "text": [
- "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log10\n",
- " \"\"\"\n",
- "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: invalid value encountered in log10\n",
- " \"\"\"\n"
- ]
- },
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "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\n"
- },
- "metadata": {
- "needs_background": "light"
- }
- }
- ]
- },
- {
- "cell_type": "code",
- "source": [
- "plt.plot(times, rms[0])"
- ],
- "metadata": {
- "id": "ofxeYX7IPySW",
- "outputId": "5520f5a9-b38f-4b05-90af-eb9934570295",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 282
- }
- },
- "execution_count": 54,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- "[]"
- ]
- },
- "metadata": {},
- "execution_count": 54
- },
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "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\n"
- },
- "metadata": {
- "needs_background": "light"
- }
- }
- ]
- },
- {
- "cell_type": "code",
- "source": [
- "wave, sr = librosa.load(\"converted_data.wav\", sr=24000)\n",
- "rms = librosa.feature.rms(y=wave)\n",
- "times = librosa.times_like(rms, sr=sr)\n",
- "plt.plot(times, rms[0]*2**(1/2))\n",
- "volume_db = 20 * np.log10(wave) \n"
- ],
- "metadata": {
- "id": "gOnUNqLKDB28",
- "outputId": "257dbc72-48b8-4cbf-a19f-928398c0cc74",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 334
- }
- },
- "execution_count": 46,
- "outputs": [
- {
- "output_type": "stream",
- "name": "stderr",
- "text": [
- "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log10\n",
- " \"\"\"\n",
- "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: invalid value encountered in log10\n",
- " \"\"\"\n"
- ]
- },
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "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\n"
- },
- "metadata": {
- "needs_background": "light"
- }
- }
- ]
- },
- {
- "cell_type": "code",
- "source": [
- "times"
- ],
- "metadata": {
- "id": "ZSGa8WXIQd50",
- "outputId": "efd6e6e1-5023-4cc6-e555-0d3c0bad509e",
- "colab": {
- "base_uri": "https://localhost:8080/"
- }
- },
- "execution_count": 55,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- "array([0. , 0.02133333, 0.04266667, 0.064 , 0.08533333,\n",
- " 0.10666667, 0.128 , 0.14933333, 0.17066667, 0.192 ,\n",
- " 0.21333333, 0.23466667, 0.256 , 0.27733333, 0.29866667,\n",
- " 0.32 , 0.34133333, 0.36266667, 0.384 , 0.40533333,\n",
- " 0.42666667, 0.448 , 0.46933333, 0.49066667, 0.512 ,\n",
- " 0.53333333, 0.55466667, 0.576 , 0.59733333, 0.61866667,\n",
- " 0.64 , 0.66133333, 0.68266667, 0.704 , 0.72533333,\n",
- " 0.74666667, 0.768 , 0.78933333, 0.81066667, 0.832 ,\n",
- " 0.85333333, 0.87466667, 0.896 , 0.91733333, 0.93866667,\n",
- " 0.96 , 0.98133333, 1.00266667, 1.024 , 1.04533333,\n",
- " 1.06666667, 1.088 , 1.10933333, 1.13066667, 1.152 ,\n",
- " 1.17333333, 1.19466667, 1.216 , 1.23733333, 1.25866667,\n",
- " 1.28 , 1.30133333, 1.32266667, 1.344 , 1.36533333,\n",
- " 1.38666667, 1.408 , 1.42933333, 1.45066667, 1.472 ,\n",
- " 1.49333333, 1.51466667, 1.536 , 1.55733333, 1.57866667,\n",
- " 1.6 , 1.62133333, 1.64266667, 1.664 , 1.68533333,\n",
- " 1.70666667, 1.728 , 1.74933333, 1.77066667, 1.792 ,\n",
- " 1.81333333, 1.83466667, 1.856 , 1.87733333, 1.89866667,\n",
- " 1.92 , 1.94133333, 1.96266667, 1.984 , 2.00533333,\n",
- " 2.02666667, 2.048 , 2.06933333, 2.09066667, 2.112 ,\n",
- " 2.13333333, 2.15466667, 2.176 , 2.19733333, 2.21866667,\n",
- " 2.24 , 2.26133333, 2.28266667, 2.304 , 2.32533333,\n",
- " 2.34666667, 2.368 , 2.38933333, 2.41066667, 2.432 ,\n",
- " 2.45333333, 2.47466667, 2.496 , 2.51733333, 2.53866667,\n",
- " 2.56 , 2.58133333, 2.60266667, 2.624 , 2.64533333,\n",
- " 2.66666667, 2.688 , 2.70933333, 2.73066667, 2.752 ,\n",
- " 2.77333333, 2.79466667])"
- ]
- },
- "metadata": {},
- "execution_count": 55
- }
- ]
- },
- {
- "cell_type": "code",
- "source": [
- "source, sr = torchaudio.load(\"received_data.wav\")\n",
- "specgram = torchaudio.transforms.MelSpectrogram(sample_rate=24000)(source)\n",
- "print(\"Shape of spectrogram: {}\".format(specgram.size()))\n",
- "plt.figure()\n",
- "p = plt.imshow(specgram.log2()[0,:,:].detach().numpy(), cmap='gray')"
- ],
- "metadata": {
- "id": "C2nZWLIqDMUa",
- "outputId": "732a3c6f-e444-416f-897c-02a3c3c4a3b7",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 175
- }
- },
- "execution_count": 4,
- "outputs": [
- {
- "output_type": "stream",
- "name": "stderr",
- "text": [
- "/usr/local/lib/python3.7/dist-packages/torchaudio/functional/functional.py:540: UserWarning: At least one mel filterbank has all zero values. The value for `n_mels` (128) may be set too high. Or, the value for `n_freqs` (201) may be set too low.\n",
- " \"At least one mel filterbank has all zero values. \"\n"
- ]
- },
- {
- "output_type": "stream",
- "name": "stdout",
- "text": [
- "Shape of spectrogram: torch.Size([1, 128, 835])\n"
- ]
- },
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "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\n"
- },
- "metadata": {
- "needs_background": "light"
- }
- }
- ]
- },
- {
- "cell_type": "code",
- "source": [
- "source, sr = torchaudio.load(\"converted_data.wav\")\n",
- "specgram = torchaudio.transforms.MelSpectrogram(sample_rate=24000)(source)\n",
- "print(\"Shape of spectrogram: {}\".format(specgram.size()))\n",
- "plt.figure()\n",
- "p = plt.imshow(specgram.log2()[0,:,:].detach().numpy(), cmap='gray')"
- ],
- "metadata": {
- "id": "aEmVgMLKIsNE",
- "outputId": "652e6753-f0a2-4c53-d7a0-83473a8a4293",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 120
- }
- },
- "execution_count": 5,
+ "execution_count": 42,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
- "Shape of spectrogram: torch.Size([1, 128, 833])\n"
+ "https://llhntm6iyu-496ff2e9c6d22116-8092-colab.googleusercontent.com/front/\n"
]
- },
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "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\n"
- },
- "metadata": {
- "needs_background": "light"
- }
- }
- ]
- },
- {
- "cell_type": "code",
- "source": [
- "source, sr = torchaudio.load(\"received_data.wav\")\n",
- "# window = torch.hann_window(window_length=400).cuda()\n",
- "# pitch = torchaudio.transforms.PitchShift(sample_rate=24000, n_steps=12, window=window)(source.cuda())\n",
- "source = source.cuda()\n",
- "chunks = torch.split(source,24000,1)\n",
- "chunks = [torchaudio.transforms.Vol(i*3)(c) for i, c in enumerate(chunks)]\n",
- "r = torch.cat(chunks,1)\n",
- "# pitch = torchaudio.transforms.Vol(1)(source)\n",
- "#pitch = torchaudio.transforms.Vol(3)(torch.split(source, 36000,1)[0])\n",
- "\n",
- "torchaudio.save(\"pitach.wav\", r.cpu(), 24000)\n"
- ],
- "metadata": {
- "id": "KMznFbWGJBrt"
- },
- "execution_count": 115,
- "outputs": []
- },
- {
- "cell_type": "code",
- "source": [
- "len(chunks), len(r)"
- ],
- "metadata": {
- "id": "caNhRHlOJNCW",
- "outputId": "9d39193b-7584-4082-87f0-c1498897b049",
- "colab": {
- "base_uri": "https://localhost:8080/"
- }
- },
- "execution_count": 113,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- "(6, 1)"
- ]
- },
- "metadata": {},
- "execution_count": 113
- }
- ]
- },
- {
- "cell_type": "code",
- "source": [
- "len(t), len(source[0])"
- ],
- "metadata": {
- "id": "k9VYNQK7XG_C",
- "outputId": "54c31a8d-4836-4789-b38e-649169972fb6",
- "colab": {
- "base_uri": "https://localhost:8080/"
- }
- },
- "execution_count": 89,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- "(16768, 67072)"
- ]
- },
- "metadata": {},
- "execution_count": 89
- }
- ]
- },
- {
- "cell_type": "code",
- "source": [
- "display.Audio(\"pitach.wav\", rate=24000)"
- ],
- "metadata": {
- "id": "FHUFYjjAJScV",
- "outputId": "6b196ff9-ed05-4792-fcff-a742fa67b8d2",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 75
- }
- },
- "execution_count": 116,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- ""
- ],
- "text/html": [
- "\n",
- " \n",
- " "
- ]
- },
- "metadata": {},
- "execution_count": 116
- }
- ]
- },
- {
- "cell_type": "code",
- "source": [
- "display.Audio(\"received_data.wav\", rate=24000)"
- ],
- "metadata": {
- "id": "gcb7CJupK7-C",
- "outputId": "2c682e7e-2713-4d7a-bdfd-2766b2b050eb",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 75
- }
- },
- "execution_count": 111,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- ""
- ],
- "text/html": [
- "\n",
- " \n",
- " "
- ]
- },
- "metadata": {},
- "execution_count": 111
}
]
},
@@ -762,7 +451,7 @@
"cell_type": "code",
"source": [],
"metadata": {
- "id": "HApZLF54LV7j"
+ "id": "0XQDeuYijm3Y"
},
"execution_count": null,
"outputs": []
@@ -773,7 +462,7 @@
"colab": {
"collapsed_sections": [],
"provenance": [],
- "authorship_tag": "ABX9TyODIrdorZyaMEWBU9At8XBp",
+ "authorship_tag": "ABX9TyM1jk828jtJk/yxGlemtIFq",
"include_colab_link": true
},
"gpuClass": "standard",
@@ -783,6 +472,1036 @@
},
"language_info": {
"name": "python"
+ },
+ "widgets": {
+ "application/vnd.jupyter.widget-state+json": {
+ "1fb6c0e3138f4b488bb34e37146ff37d": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_54917384fe31484c819d5a8553026da4",
+ "IPY_MODEL_cbf282697ea84126bab4449e9f03446b",
+ "IPY_MODEL_c52a3c133bcb432cad237073f5aab054"
+ ],
+ "layout": "IPY_MODEL_4ecce5ec14504bbc9aed0f47923ccfb6"
+ }
+ },
+ "54917384fe31484c819d5a8553026da4": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_582c624f0437497ca264a1e5cd2fcb5f",
+ "placeholder": "",
+ "style": "IPY_MODEL_607a419839644cbc837faee0cf085d1c",
+ "value": "100%"
+ }
+ },
+ "cbf282697ea84126bab4449e9f03446b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_7932c1cff373439a8a8eb1f003cf8c4b",
+ "max": 378435957,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_548c4156f681472493a8af30af129e3c",
+ "value": 378435957
+ }
+ },
+ "c52a3c133bcb432cad237073f5aab054": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_86394b2dfdc04a1db206c34710abde8f",
+ "placeholder": "",
+ "style": "IPY_MODEL_98f9877b91024110a0845bcad5aa9373",
+ "value": " 361M/361M [01:39<00:00, 5.81MB/s]"
+ }
+ },
+ "4ecce5ec14504bbc9aed0f47923ccfb6": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "582c624f0437497ca264a1e5cd2fcb5f": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "607a419839644cbc837faee0cf085d1c": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "7932c1cff373439a8a8eb1f003cf8c4b": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "548c4156f681472493a8af30af129e3c": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "86394b2dfdc04a1db206c34710abde8f": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "98f9877b91024110a0845bcad5aa9373": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "a8f2eeaf998d4931b0a393874b1dab47": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_57976d7425c74a6ba59fc8690c71556f",
+ "IPY_MODEL_41b7d72ce3164b79ad0206cf9372e35c",
+ "IPY_MODEL_88580af9b2e24861824c3a699be36b57"
+ ],
+ "layout": "IPY_MODEL_87080b573d3841d9847db312969c20d2"
+ }
+ },
+ "57976d7425c74a6ba59fc8690c71556f": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_96552e354a024d0caee5420e43097791",
+ "placeholder": "",
+ "style": "IPY_MODEL_a6de0a8cc9744b38b672d4f95a6b6435",
+ "value": "100%"
+ }
+ },
+ "41b7d72ce3164b79ad0206cf9372e35c": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_0712aeb95eaf4c5fb02abb7f6b34d232",
+ "max": 75329769,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_4a69c62156f74ca4bc3e5a0415ab1606",
+ "value": 75329769
+ }
+ },
+ "88580af9b2e24861824c3a699be36b57": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_035468979725405bbc64a007325432e8",
+ "placeholder": "",
+ "style": "IPY_MODEL_88457d91184a40daa2d90c6ef8d05ff8",
+ "value": " 71.8M/71.8M [00:05<00:00, 10.4MB/s]"
+ }
+ },
+ "87080b573d3841d9847db312969c20d2": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "96552e354a024d0caee5420e43097791": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "a6de0a8cc9744b38b672d4f95a6b6435": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "0712aeb95eaf4c5fb02abb7f6b34d232": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "4a69c62156f74ca4bc3e5a0415ab1606": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "035468979725405bbc64a007325432e8": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "88457d91184a40daa2d90c6ef8d05ff8": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "136e831d42c74b3790488c8916628b1b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_5368bc852ae241039e85f45ddf4d3700",
+ "IPY_MODEL_c4d9c5c9097e4fd4882b05dec71c826b",
+ "IPY_MODEL_d6f2bf9acb7941cc94712b8f66cc9d09"
+ ],
+ "layout": "IPY_MODEL_3f3a1d0685694ff3b2c3d7b111c1d59b"
+ }
+ },
+ "5368bc852ae241039e85f45ddf4d3700": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_d381d89f351544369a3f1744f69a62b8",
+ "placeholder": "",
+ "style": "IPY_MODEL_de05063b4f75466fadc672c2a9c085e1",
+ "value": "100%"
+ }
+ },
+ "c4d9c5c9097e4fd4882b05dec71c826b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_18dde4dbce394d43a7f6e2e6657136bd",
+ "max": 57562349,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_bee40572e9d440f6bf8ce945a599dc92",
+ "value": 57562349
+ }
+ },
+ "d6f2bf9acb7941cc94712b8f66cc9d09": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_8593cbf5e07d46038a8fe307adc34984",
+ "placeholder": "",
+ "style": "IPY_MODEL_730f342e75244fba90d5fc32c9acc2e6",
+ "value": " 54.9M/54.9M [00:19<00:00, 2.82MB/s]"
+ }
+ },
+ "3f3a1d0685694ff3b2c3d7b111c1d59b": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "d381d89f351544369a3f1744f69a62b8": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "de05063b4f75466fadc672c2a9c085e1": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "18dde4dbce394d43a7f6e2e6657136bd": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "bee40572e9d440f6bf8ce945a599dc92": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "8593cbf5e07d46038a8fe307adc34984": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "730f342e75244fba90d5fc32c9acc2e6": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ }
+ }
}
},
"nbformat": 4,
From 177644d6eb7476116568f70bfd02b5eeacc43a4e Mon Sep 17 00:00:00 2001
From: w-okada <48346627+w-okada@users.noreply.github.com>
Date: Sun, 18 Sep 2022 07:45:10 +0900
Subject: [PATCH 4/6] =?UTF-8?q?Colaboratory=20=E3=82=92=E4=BD=BF=E7=94=A8?=
=?UTF-8?q?=E3=81=97=E3=81=A6=E4=BD=9C=E6=88=90=E3=81=97=E3=81=BE=E3=81=97?=
=?UTF-8?q?=E3=81=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
SOFT_VC_FAST_API.ipynb | 1413 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 1413 insertions(+)
create mode 100644 SOFT_VC_FAST_API.ipynb
diff --git a/SOFT_VC_FAST_API.ipynb b/SOFT_VC_FAST_API.ipynb
new file mode 100644
index 00000000..72249f89
--- /dev/null
+++ b/SOFT_VC_FAST_API.ipynb
@@ -0,0 +1,1413 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "view-in-github",
+ "colab_type": "text"
+ },
+ "source": [
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "id": "5m_Xf_2NY6mI"
+ },
+ "outputs": [],
+ "source": [
+ "import torch, torchaudio\n",
+ "import IPython.display as display"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "id": "GGiC0rT2hoik",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "385002ae-9694-4524-cf46-d8cf650e7352"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
+ "Collecting fastapi\n",
+ " Downloading fastapi-0.85.0-py3-none-any.whl (55 kB)\n",
+ "\u001b[K |████████████████████████████████| 55 kB 3.2 MB/s \n",
+ "\u001b[?25hCollecting starlette==0.20.4\n",
+ " Downloading starlette-0.20.4-py3-none-any.whl (63 kB)\n",
+ "\u001b[K |████████████████████████████████| 63 kB 2.7 MB/s \n",
+ "\u001b[?25hRequirement already satisfied: pydantic!=1.7,!=1.7.1,!=1.7.2,!=1.7.3,!=1.8,!=1.8.1,<2.0.0,>=1.6.2 in /usr/local/lib/python3.7/dist-packages (from fastapi) (1.9.2)\n",
+ "Collecting anyio<5,>=3.4.0\n",
+ " Downloading anyio-3.6.1-py3-none-any.whl (80 kB)\n",
+ "\u001b[K |████████████████████████████████| 80 kB 10.4 MB/s \n",
+ "\u001b[?25hRequirement already satisfied: typing-extensions>=3.10.0 in /usr/local/lib/python3.7/dist-packages (from starlette==0.20.4->fastapi) (4.1.1)\n",
+ "Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.7/dist-packages (from anyio<5,>=3.4.0->starlette==0.20.4->fastapi) (2.10)\n",
+ "Collecting sniffio>=1.1\n",
+ " Downloading sniffio-1.3.0-py3-none-any.whl (10 kB)\n",
+ "Installing collected packages: sniffio, anyio, starlette, fastapi\n",
+ "Successfully installed anyio-3.6.1 fastapi-0.85.0 sniffio-1.3.0 starlette-0.20.4\n",
+ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
+ "Collecting uvicorn\n",
+ " Downloading uvicorn-0.18.3-py3-none-any.whl (57 kB)\n",
+ "\u001b[K |████████████████████████████████| 57 kB 3.7 MB/s \n",
+ "\u001b[?25hRequirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from uvicorn) (4.1.1)\n",
+ "Collecting h11>=0.8\n",
+ " Downloading h11-0.13.0-py3-none-any.whl (58 kB)\n",
+ "\u001b[K |████████████████████████████████| 58 kB 6.9 MB/s \n",
+ "\u001b[?25hRequirement already satisfied: click>=7.0 in /usr/local/lib/python3.7/dist-packages (from uvicorn) (7.1.2)\n",
+ "Installing collected packages: h11, uvicorn\n",
+ "Successfully installed h11-0.13.0 uvicorn-0.18.3\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install fastapi\n",
+ "!pip install uvicorn"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "id": "WO8XzrFMZGoj",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 324,
+ "referenced_widgets": [
+ "59130a24d78442fab37f308ec40c6ec1",
+ "7de0337681804ad5b2cb6eec63640da5",
+ "3d5bfdb058d1434a94a707535dd064d3",
+ "f52ca324950241c5b4cdc2ffdb16adf5",
+ "103df4895b5e4cb7bb3ee13d1bbae0c8",
+ "f61224d1ffe94c269933bd3ea9426191",
+ "8e3d4ea821ec49bda506f9d5c6f32f65",
+ "1755b3b74ad94ebba43065d3b2ea11ff",
+ "d603a317013447ff905bb9cddfb89c3c",
+ "3cda3959374f425794d30f8607e54935",
+ "22b4867a12854b349c83fdfc23828306",
+ "77d92a8b06244f349c9429ce0d6b5646",
+ "a3e565771b654f04b7fa7d17eff4498a",
+ "d1c5249aba734a27b9cf97090875a755",
+ "2796ff89616547d48b0274a10d19de42",
+ "1ecce93dbc824c7d93693c3d1ba3be1e",
+ "17f29a1b667a41ecb4960911662c5ba8",
+ "0e68580417254be7b3026ccfcf3966fa",
+ "4d5c0625a5ff4568a1f0f7dd980ccbd1",
+ "720428035a66479f84cd6e98c10aa7a6",
+ "bfb4fd8960e14c46826b2da3601b3855",
+ "be83a450500047649c83a91774c30144",
+ "5cd60b05ba72413a802b6d11577caec9",
+ "5e510a0ad68f40df839df000359e4289",
+ "403f28bec1bd4d53a269e222d7bdea0a",
+ "55a1c151ccf34282ad1850d97478a303",
+ "58007eecdc7f4889a90ec47f07523dae",
+ "04723c372431499a9adcd004d3f8d43c",
+ "644baefa63c8441d9cdaf1cddc6a592c",
+ "20b3545c4cec485e8d3344dacd15050d",
+ "6d63907f4d6c48568a9bacaae0fb13ca",
+ "82edeb585559410fa596270063d071ae",
+ "8010dbdad97b48568beff61af1230785"
+ ]
+ },
+ "outputId": "fc8a57f8-08dc-43f2-9991-1cc6e5155c42"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/torch/hub.py:267: UserWarning: You are about to download and run code from an untrusted repository. In a future release, this won't be allowed. To add the repository to your trusted list, change the command to {calling_fn}(..., trust_repo=False) and a command prompt will appear asking for an explicit confirmation of trust, or load(..., trust_repo=True), which will assume that the prompt is to be answered with 'yes'. You can also use load(..., trust_repo='check') which will only prompt for confirmation if the repo is not already trusted. This will eventually be the default behaviour\n",
+ " \"You are about to download and run code from an untrusted repository. In a future release, this won't \"\n",
+ "Downloading: \"https://github.com/bshall/hubert/zipball/main\" to /root/.cache/torch/hub/main.zip\n",
+ "Downloading: \"https://github.com/bshall/hubert/releases/download/v0.1/hubert-soft-0d54a1f4.pt\" to /root/.cache/torch/hub/checkpoints/hubert-soft-0d54a1f4.pt\n"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " 0%| | 0.00/361M [00:00, ?B/s]"
+ ],
+ "application/vnd.jupyter.widget-view+json": {
+ "version_major": 2,
+ "version_minor": 0,
+ "model_id": "59130a24d78442fab37f308ec40c6ec1"
+ }
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/torch/hub.py:267: UserWarning: You are about to download and run code from an untrusted repository. In a future release, this won't be allowed. To add the repository to your trusted list, change the command to {calling_fn}(..., trust_repo=False) and a command prompt will appear asking for an explicit confirmation of trust, or load(..., trust_repo=True), which will assume that the prompt is to be answered with 'yes'. You can also use load(..., trust_repo='check') which will only prompt for confirmation if the repo is not already trusted. This will eventually be the default behaviour\n",
+ " \"You are about to download and run code from an untrusted repository. In a future release, this won't \"\n",
+ "Downloading: \"https://github.com/bshall/acoustic-model/zipball/main\" to /root/.cache/torch/hub/main.zip\n",
+ "Downloading: \"https://github.com/bshall/acoustic-model/releases/download/v0.1/hubert-soft-0321fd7e.pt\" to /root/.cache/torch/hub/checkpoints/hubert-soft-0321fd7e.pt\n"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " 0%| | 0.00/71.8M [00:00, ?B/s]"
+ ],
+ "application/vnd.jupyter.widget-view+json": {
+ "version_major": 2,
+ "version_minor": 0,
+ "model_id": "77d92a8b06244f349c9429ce0d6b5646"
+ }
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "Downloading: \"https://github.com/bshall/hifigan/zipball/main\" to /root/.cache/torch/hub/main.zip\n",
+ "Downloading: \"https://github.com/bshall/hifigan/releases/download/v0.1/hifigan-hubert-discrete-bbad3043.pt\" to /root/.cache/torch/hub/checkpoints/hifigan-hubert-discrete-bbad3043.pt\n"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " 0%| | 0.00/54.9M [00:00, ?B/s]"
+ ],
+ "application/vnd.jupyter.widget-view+json": {
+ "version_major": 2,
+ "version_minor": 0,
+ "model_id": "5cd60b05ba72413a802b6d11577caec9"
+ }
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Removing weight norm...\n"
+ ]
+ }
+ ],
+ "source": [
+ "hubert = torch.hub.load(\"bshall/hubert:main\", \"hubert_soft\").cuda()\n",
+ "acoustic = torch.hub.load(\"bshall/acoustic-model:main\", \"hubert_soft\").cuda()\n",
+ "hifigan = torch.hub.load(\"bshall/hifigan:main\", \"hifigan_hubert_soft\").cuda()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "lzo_ZWmAjaby",
+ "outputId": "6448cb77-6245-4c6d-cbe9-24df4d1b028b"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Cloning into 'voice-changer'...\n",
+ "remote: Enumerating objects: 512, done.\u001b[K\n",
+ "remote: Counting objects: 100% (96/96), done.\u001b[K\n",
+ "remote: Compressing objects: 100% (80/80), done.\u001b[K\n",
+ "remote: Total 512 (delta 32), reused 27 (delta 16), pack-reused 416\u001b[K\n",
+ "Receiving objects: 100% (512/512), 21.40 MiB | 24.00 MiB/s, done.\n",
+ "Resolving deltas: 100% (259/259), done.\n",
+ "\u001b[0m\u001b[01;34massets\u001b[0m/ \u001b[01;32mfavicon.ico\u001b[0m* \u001b[01;32mindex.js\u001b[0m*\n",
+ "\u001b[01;32mcoffee.png\u001b[0m* \u001b[01;32mindex.html\u001b[0m* \u001b[01;32mindex.js.LICENSE.txt\u001b[0m*\n"
+ ]
+ }
+ ],
+ "source": [
+ "# (3) リポジトリのクローン\n",
+ "!git clone https://github.com/w-okada/voice-changer.git\n",
+ "%ls voice-changer/frontend/dist"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "id": "8-z9j4e_j-Wb"
+ },
+ "outputs": [],
+ "source": [
+ "# (4-1) 設定ファイルの配置\n",
+ "!cp voice-changer/template/setting_colab.json voice-changer/frontend/dist/assets/setting.json\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "id": "-iPiSzvAepCl"
+ },
+ "outputs": [],
+ "source": [
+ "# (6-1) サーバの起動\n",
+ "PORT=8092\n",
+ "get_ipython().system_raw(f'python3 SoftVcServerFastAPI.py {PORT} >foo 2>&1 &')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "IiWSwDjQidc7",
+ "outputId": "c16aacfc-3673-4ffa-9721-f1d4cb143cba"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "INFO: Will watch for changes in these directories: ['/content']\n",
+ "INFO: Uvicorn running on http://0.0.0.0:8092 (Press CTRL+C to quit)\n",
+ "INFO: Started reloader process [192] using StatReload\n",
+ "Removing weight norm...\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hubert_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_acoustic-model_main\n",
+ "Using cache found in /root/.cache/torch/hub/bshall_hifigan_main\n",
+ "INFO: Started server process [202]\n",
+ "INFO: Waiting for application startup.\n",
+ "INFO: Application startup complete.\n",
+ "Removing weight norm...\n",
+ "Removing weight norm...\n",
+ "INFO: 127.0.0.1:38464 - \"GET / HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59848 - \"GET /index.js HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59856 - \"GET /assets/setting.json HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59872 - \"GET /coffee.png HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59886 - \"GET /favicon.ico HTTP/1.1\" 404 Not Found\n",
+ "INFO: 127.0.0.1:59892 - \"GET /assets/icons/flect.png HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59906 - \"GET /assets/vrm/zundamon/zundamon.vrm HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59910 - \"GET /assets/tflite-simd.wasm1f6a0e789251efcdaa4d HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59920 - \"GET /assets/face_detection_short_range.binc083ebee6df759da467d HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59922 - \"GET /assets/palm_detection_lite.binba92fbef448d5b4334bc HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59938 - \"GET /assets/model_float16_quant.bin33ee0cfa3b13c82ace2a HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59942 - \"GET /assets/images/bg_natural_sougen.jpg HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59944 - \"GET /assets/hand_landmark_lite.bin037c09b22c066e04d3ff HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59954 - \"GET /assets/pose_landmark_lite.bin80f1d546bddf782578f3 HTTP/1.1\" 200 OK\n",
+ "INFO: 127.0.0.1:59956 - \"GET /assets/pose_detection.bin5f6876fde03ed33ebc9a HTTP/1.1\" 200 OK\n",
+ "/usr/local/lib/python3.7/dist-packages/torchaudio/functional/functional.py:540: UserWarning: At least one mel filterbank has all zero values. The value for `n_mels` (128) may be set too high. Or, the value for `n_freqs` (201) may be set too low.\n",
+ " \"At least one mel filterbank has all zero values. \"\n",
+ "INFO: prepro:0.13489079475402832, softvc:3.5477583408355713, postpro:0.054923057556152344 \n",
+ "INFO: prepros:0.0002541542053222656, 0.002245187759399414, 0.00030684471130371094, 0.0040721893310546875, 0.12777447700500488, 0.00023794174194335938, \n",
+ "INFO: prexxxxxxxxxxxxxxx:2.1457672119140625e-06, prepros:7.152557373046875e-07, prepros:4.76837158203125e-07, \n",
+ "POST REQUEST PROCESSING....\n",
+ "INFO: 127.0.0.1:55830 - \"POST /test HTTP/1.1\" 200 OK\n"
+ ]
+ }
+ ],
+ "source": [
+ "# (6-2) サーバの起動確認 (Ctrl+Retで実行)\n",
+ "!cat foo"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "from google.colab.output import eval_js\n",
+ "proxy = eval_js( \"google.colab.kernel.proxyPort(\" + str(PORT) + \")\" )\n",
+ "print(f\"{proxy}front/\")"
+ ],
+ "metadata": {
+ "id": "H8EpnHqDjknR",
+ "outputId": "36d48855-fbb7-4514-d386-e15755be3df9",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ }
+ },
+ "execution_count": 13,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "https://qakmhnfzna9-496ff2e9c6d22116-8092-colab.googleusercontent.com/front/\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [],
+ "metadata": {
+ "id": "0XQDeuYijm3Y"
+ },
+ "execution_count": null,
+ "outputs": []
+ }
+ ],
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "collapsed_sections": [],
+ "provenance": [],
+ "authorship_tag": "ABX9TyO82DgowZLSXg7p0qKN6GHb",
+ "include_colab_link": true
+ },
+ "gpuClass": "standard",
+ "kernelspec": {
+ "display_name": "Python 3",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python"
+ },
+ "widgets": {
+ "application/vnd.jupyter.widget-state+json": {
+ "59130a24d78442fab37f308ec40c6ec1": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_7de0337681804ad5b2cb6eec63640da5",
+ "IPY_MODEL_3d5bfdb058d1434a94a707535dd064d3",
+ "IPY_MODEL_f52ca324950241c5b4cdc2ffdb16adf5"
+ ],
+ "layout": "IPY_MODEL_103df4895b5e4cb7bb3ee13d1bbae0c8"
+ }
+ },
+ "7de0337681804ad5b2cb6eec63640da5": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_f61224d1ffe94c269933bd3ea9426191",
+ "placeholder": "",
+ "style": "IPY_MODEL_8e3d4ea821ec49bda506f9d5c6f32f65",
+ "value": "100%"
+ }
+ },
+ "3d5bfdb058d1434a94a707535dd064d3": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_1755b3b74ad94ebba43065d3b2ea11ff",
+ "max": 378435957,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_d603a317013447ff905bb9cddfb89c3c",
+ "value": 378435957
+ }
+ },
+ "f52ca324950241c5b4cdc2ffdb16adf5": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_3cda3959374f425794d30f8607e54935",
+ "placeholder": "",
+ "style": "IPY_MODEL_22b4867a12854b349c83fdfc23828306",
+ "value": " 361M/361M [00:42<00:00, 11.6MB/s]"
+ }
+ },
+ "103df4895b5e4cb7bb3ee13d1bbae0c8": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "f61224d1ffe94c269933bd3ea9426191": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "8e3d4ea821ec49bda506f9d5c6f32f65": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "1755b3b74ad94ebba43065d3b2ea11ff": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "d603a317013447ff905bb9cddfb89c3c": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "3cda3959374f425794d30f8607e54935": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "22b4867a12854b349c83fdfc23828306": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "77d92a8b06244f349c9429ce0d6b5646": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_a3e565771b654f04b7fa7d17eff4498a",
+ "IPY_MODEL_d1c5249aba734a27b9cf97090875a755",
+ "IPY_MODEL_2796ff89616547d48b0274a10d19de42"
+ ],
+ "layout": "IPY_MODEL_1ecce93dbc824c7d93693c3d1ba3be1e"
+ }
+ },
+ "a3e565771b654f04b7fa7d17eff4498a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_17f29a1b667a41ecb4960911662c5ba8",
+ "placeholder": "",
+ "style": "IPY_MODEL_0e68580417254be7b3026ccfcf3966fa",
+ "value": "100%"
+ }
+ },
+ "d1c5249aba734a27b9cf97090875a755": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_4d5c0625a5ff4568a1f0f7dd980ccbd1",
+ "max": 75329769,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_720428035a66479f84cd6e98c10aa7a6",
+ "value": 75329769
+ }
+ },
+ "2796ff89616547d48b0274a10d19de42": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_bfb4fd8960e14c46826b2da3601b3855",
+ "placeholder": "",
+ "style": "IPY_MODEL_be83a450500047649c83a91774c30144",
+ "value": " 71.8M/71.8M [00:02<00:00, 33.1MB/s]"
+ }
+ },
+ "1ecce93dbc824c7d93693c3d1ba3be1e": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "17f29a1b667a41ecb4960911662c5ba8": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "0e68580417254be7b3026ccfcf3966fa": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "4d5c0625a5ff4568a1f0f7dd980ccbd1": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "720428035a66479f84cd6e98c10aa7a6": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "bfb4fd8960e14c46826b2da3601b3855": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "be83a450500047649c83a91774c30144": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "5cd60b05ba72413a802b6d11577caec9": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_5e510a0ad68f40df839df000359e4289",
+ "IPY_MODEL_403f28bec1bd4d53a269e222d7bdea0a",
+ "IPY_MODEL_55a1c151ccf34282ad1850d97478a303"
+ ],
+ "layout": "IPY_MODEL_58007eecdc7f4889a90ec47f07523dae"
+ }
+ },
+ "5e510a0ad68f40df839df000359e4289": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_04723c372431499a9adcd004d3f8d43c",
+ "placeholder": "",
+ "style": "IPY_MODEL_644baefa63c8441d9cdaf1cddc6a592c",
+ "value": "100%"
+ }
+ },
+ "403f28bec1bd4d53a269e222d7bdea0a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_20b3545c4cec485e8d3344dacd15050d",
+ "max": 57562349,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_6d63907f4d6c48568a9bacaae0fb13ca",
+ "value": 57562349
+ }
+ },
+ "55a1c151ccf34282ad1850d97478a303": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_82edeb585559410fa596270063d071ae",
+ "placeholder": "",
+ "style": "IPY_MODEL_8010dbdad97b48568beff61af1230785",
+ "value": " 54.9M/54.9M [00:01<00:00, 30.4MB/s]"
+ }
+ },
+ "58007eecdc7f4889a90ec47f07523dae": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "04723c372431499a9adcd004d3f8d43c": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "644baefa63c8441d9cdaf1cddc6a592c": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "20b3545c4cec485e8d3344dacd15050d": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "6d63907f4d6c48568a9bacaae0fb13ca": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "82edeb585559410fa596270063d071ae": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "8010dbdad97b48568beff61af1230785": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ }
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
From c510a52b10f38a99635a217b44fa0280902c9326 Mon Sep 17 00:00:00 2001
From: wataru
Date: Sun, 18 Sep 2022 22:09:33 +0900
Subject: [PATCH 5/6] update
---
demo/SoftVcServerFastAPI.py | 158 +
demo/serverFastAPI.py | 144 +
demo/serverFlask.py | 3 -
demo/serverSIO.py | 3 +-
demo/setup.sh | 24 +-
frontend/dist/index.html | 14 +-
frontend/dist/index.js | 4820 +++++++++++++++++++++++++++-
start2.sh | 4 +-
template/setting_colab_softvc.json | 38 +
trainer/Dockerfile | 2 +-
10 files changed, 5196 insertions(+), 14 deletions(-)
create mode 100755 demo/SoftVcServerFastAPI.py
create mode 100755 demo/serverFastAPI.py
create mode 100644 template/setting_colab_softvc.json
diff --git a/demo/SoftVcServerFastAPI.py b/demo/SoftVcServerFastAPI.py
new file mode 100755
index 00000000..b3cc18b3
--- /dev/null
+++ b/demo/SoftVcServerFastAPI.py
@@ -0,0 +1,158 @@
+import uvicorn
+from fastapi import FastAPI
+from fastapi.middleware.cors import CORSMiddleware
+from pydantic import BaseModel
+from fastapi.encoders import jsonable_encoder
+from fastapi.responses import JSONResponse
+from fastapi.staticfiles import StaticFiles
+
+import logging
+from logging.config import dictConfig
+import os, sys, math, base64, struct, traceback, time
+
+import torch, torchaudio
+import numpy as np
+from scipy.io.wavfile import write, read
+from datetime import datetime
+
+args = sys.argv
+PORT = args[1]
+MODE = args[2]
+
+
+logger = logging.getLogger('uvicorn')
+app = FastAPI()
+app.add_middleware(
+ CORSMiddleware,
+ allow_origins=["*"],
+ allow_credentials=True,
+ allow_methods=["*"],
+ allow_headers=["*"],
+)
+
+app.mount("/front", StaticFiles(directory="voice-changer/frontend/dist", html=True), name="static")
+
+if MODE == "colab":
+ print("ENV: colab")
+
+ hubert_model = torch.hub.load("bshall/hubert:main", "hubert_soft").cuda()
+ acoustic_model = torch.hub.load("bshall/acoustic-model:main", "hubert_soft").cuda()
+ hifigan_model = torch.hub.load("bshall/hifigan:main", "hifigan_hubert_soft").cuda()
+else:
+ print("ENV: Docker")
+
+ app.mount("/front", StaticFiles(directory="../frontend/dist", html=True), name="static")
+
+ sys.path.append("/hubert")
+ from hubert import hubert_discrete, hubert_soft, kmeans100
+
+ sys.path.append("/acoustic-model")
+ from acoustic import hubert_discrete, hubert_soft
+
+ sys.path.append("/hifigan")
+ from hifigan import hifigan
+
+ hubert_model = torch.load("/models/bshall_hubert_main.pt").cuda()
+ acoustic_model = torch.load("/models/bshall_acoustic-model_main.pt").cuda()
+ hifigan_model = torch.load("/models/bshall_hifigan_main.pt").cuda()
+
+
+def applyVol(i, chunk, vols):
+ curVol = vols[i] / 2
+ if curVol < 0.0001:
+ line = torch.zeros(chunk.size())
+ else:
+ line = torch.ones(chunk.size())
+
+ volApplied = torch.mul(line, chunk)
+ volApplied = volApplied.unsqueeze(0)
+ return volApplied
+
+
+@app.get("/test")
+def get_test():
+ try:
+ return request.args.get('query', '')
+ except Exception as e:
+ print("REQUEST PROCESSING!!!! EXCEPTION!!!", e)
+ print(traceback.format_exc())
+ return str(e)
+
+
+
+class VoiceModel(BaseModel):
+ gpu: int
+ srcId: int
+ dstId: int
+ timestamp: int
+ buffer: str
+
+@app.post("/test")
+def post_test(voice:VoiceModel):
+ try:
+ print("POST REQUEST PROCESSING....")
+ gpu = voice.gpu
+ srcId = voice.srcId
+ dstId = voice.dstId
+ timestamp = voice.timestamp
+ buffer = voice.buffer
+ wav = base64.b64decode(buffer)
+ unpackedData = np.array(struct.unpack('<%sh'%(len(wav) // struct.calcsize('")
+def static_dir(path):
+ return send_from_directory("../frontend/dist", path)
+
+@app.route('/', methods=['GET'])
+def redirect_to_index():
+ return send_from_directory("../frontend/dist", 'index.html')
+
+CORS(app, resources={r"/*": {"origins": "*"}})
+
+class VoiceChanger():
+ def __init__(self, config, model):
+ self.hps =utils.get_hparams_from_file(config)
+ self.net_g = SynthesizerTrn(
+ len(symbols),
+ self.hps.data.filter_length // 2 + 1,
+ self.hps.train.segment_size // self.hps.data.hop_length,
+ n_speakers=self.hps.data.n_speakers,
+ **self.hps.model)
+ self.net_g.eval()
+ self.gpu_num = torch.cuda.device_count()
+ print("GPU_NUM:",self.gpu_num)
+ utils.load_checkpoint( model, self.net_g, None)
+
+
+ def on_request(self, gpu, srcId, dstId, timestamp, wav):
+ if wav==0:
+ samplerate, data=read("dummy.wav")
+ unpackedData = data
+ else:
+ unpackedData = np.array(struct.unpack('<%sh'%(len(wav) // struct.calcsize('")
def static_dir(path):
diff --git a/demo/serverSIO.py b/demo/serverSIO.py
index eedf0049..14a91d19 100755
--- a/demo/serverSIO.py
+++ b/demo/serverSIO.py
@@ -15,8 +15,6 @@ from data_utils import TextAudioSpeakerLoader, TextAudioSpeakerCollate
from models import SynthesizerTrn
from text.symbols import symbols
-
-
class MyCustomNamespace(socketio.Namespace):
def __init__(self, namespace, config, model):
super().__init__(namespace)
@@ -91,6 +89,7 @@ if __name__ == '__main__':
sio.register_namespace(MyCustomNamespace('/test', CONFIG, MODEL))
app = socketio.WSGIApp(sio,static_files={
'': '../frontend/dist',
+ '/': '../frontend/dist/index.html',
})
eventlet.wsgi.server(eventlet.listen(('0.0.0.0',int(PORT))), app)
\ No newline at end of file
diff --git a/demo/setup.sh b/demo/setup.sh
index 7b1e1b3a..c1402868 100755
--- a/demo/setup.sh
+++ b/demo/setup.sh
@@ -1,13 +1,31 @@
#!/bin/bash
-echo config: $1
-echo model: $2
+CONFIG=$1
+MODEL=$2
+TYPE=$3
+
+echo config: $CONFIG
+echo model: $MODEL
+echo type: $TYPE
+
+
+
cp -r /resources/* .
if [[ -e ./setting.json ]]; then
cp ./setting.json ../frontend/dist/assets/setting.json
fi
-python3 serverSIO.py 8080 $1 $2
+if [ "${TYPE}" = "SOFT_VC" ] ; then
+ echo "SOFT_VCを起動します"
+ python3 SoftVcServerFlask.py 8080
+elif [ "${TYPE}" = "SOFT_VC_FAST_API" ] ; then
+ echo "SOFT_VC_FAST_APIを起動します"
+ python3 SoftVcServerFastAPI.py 8080
+else
+ echo "MMVCを起動します"
+ python3 serverSIO.py 8080 $CONFIG $MODEL
+fi
+
diff --git a/frontend/dist/index.html b/frontend/dist/index.html
index a333ab9c..89df0d0b 100755
--- a/frontend/dist/index.html
+++ b/frontend/dist/index.html
@@ -1 +1,13 @@
-voice recorder
\ No newline at end of file
+
+
+
+
+ voice recorder
+
+
+
+
+
+
diff --git a/frontend/dist/index.js b/frontend/dist/index.js
index 4acde8ee..9d3d96ba 100755
--- a/frontend/dist/index.js
+++ b/frontend/dist/index.js
@@ -1,2 +1,4818 @@
-/*! For license information please see index.js.LICENSE.txt */
-(()=>{var __webpack_modules__={914:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RawSha256=void 0;var i=n(6532),r=function(){function e(){this.state=Int32Array.from(i.INIT),this.temp=new Int32Array(64),this.buffer=new Uint8Array(64),this.bufferLength=0,this.bytesHashed=0,this.finished=!1}return e.prototype.update=function(e){if(this.finished)throw new Error("Attempted to update an already finished hash.");var t=0,n=e.byteLength;if(this.bytesHashed+=n,8*this.bytesHashed>i.MAX_HASHABLE_LENGTH)throw new Error("Cannot hash more than 2^53 - 1 bits");for(;n>0;)this.buffer[this.bufferLength++]=e[t++],n--,this.bufferLength===i.BLOCK_SIZE&&(this.hashBuffer(),this.bufferLength=0)},e.prototype.digest=function(){if(!this.finished){var e=8*this.bytesHashed,t=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),n=this.bufferLength;if(t.setUint8(this.bufferLength++,128),n%i.BLOCK_SIZE>=i.BLOCK_SIZE-8){for(var r=this.bufferLength;r>>24&255,a[4*r+1]=this.state[r]>>>16&255,a[4*r+2]=this.state[r]>>>8&255,a[4*r+3]=this.state[r]>>>0&255;return a},e.prototype.hashBuffer=function(){for(var e=this.buffer,t=this.state,n=t[0],r=t[1],a=t[2],o=t[3],s=t[4],c=t[5],l=t[6],u=t[7],d=0;d>>17|h<<15)^(h>>>19|h<<13)^h>>>10,p=((h=this.temp[d-15])>>>7|h<<25)^(h>>>18|h<<14)^h>>>3;this.temp[d]=(f+this.temp[d-7]|0)+(p+this.temp[d-16]|0)}var m=(((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))+(s&c^~s&l)|0)+(u+(i.KEY[d]+this.temp[d]|0)|0)|0,g=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+(n&r^n&a^r&a)|0;u=l,l=c,c=s,s=o+m|0,o=a,a=r,r=n,n=m+g|0}t[0]+=n,t[1]+=r,t[2]+=a,t[3]+=o,t[4]+=s,t[5]+=c,t[6]+=l,t[7]+=u},e}();t.RawSha256=r},6532:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.MAX_HASHABLE_LENGTH=t.INIT=t.KEY=t.DIGEST_LENGTH=t.BLOCK_SIZE=void 0,t.BLOCK_SIZE=64,t.DIGEST_LENGTH=32,t.KEY=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),t.INIT=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],t.MAX_HASHABLE_LENGTH=Math.pow(2,53)-1},1938:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),(0,n(655).__exportStar)(n(5430),t)},5430:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Sha256=void 0;var i=n(655),r=n(6532),a=n(914),o=n(7658),s=function(){function e(e){if(this.hash=new a.RawSha256,e){this.outer=new a.RawSha256;var t=function(e){var t=(0,o.convertToBuffer)(e);if(t.byteLength>r.BLOCK_SIZE){var n=new a.RawSha256;n.update(t),t=n.digest()}var i=new Uint8Array(r.BLOCK_SIZE);return i.set(t),i}(e),n=new Uint8Array(r.BLOCK_SIZE);n.set(t);for(var i=0;i{"use strict";var i=n(8764).Buffer;Object.defineProperty(t,"__esModule",{value:!0}),t.convertToBuffer=void 0;var r=n(470),a=void 0!==i&&i.from?function(e){return i.from(e,"utf8")}:r.fromUtf8;t.convertToBuffer=function(e){return e instanceof Uint8Array?e:"string"==typeof e?a(e):ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT):new Uint8Array(e)}},7658:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.uint32ArrayFrom=t.numToUint8=t.isEmptyData=t.convertToBuffer=void 0;var i=n(1106);Object.defineProperty(t,"convertToBuffer",{enumerable:!0,get:function(){return i.convertToBuffer}});var r=n(4304);Object.defineProperty(t,"isEmptyData",{enumerable:!0,get:function(){return r.isEmptyData}});var a=n(2174);Object.defineProperty(t,"numToUint8",{enumerable:!0,get:function(){return a.numToUint8}});var o=n(1558);Object.defineProperty(t,"uint32ArrayFrom",{enumerable:!0,get:function(){return o.uint32ArrayFrom}})},4304:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isEmptyData=void 0,t.isEmptyData=function(e){return"string"==typeof e?0===e.length:0===e.byteLength}},2174:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.numToUint8=void 0,t.numToUint8=function(e){return new Uint8Array([(4278190080&e)>>24,(16711680&e)>>16,(65280&e)>>8,255&e])}},1558:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.uint32ArrayFrom=void 0,t.uint32ArrayFrom=function(e){if(!Uint32Array.from){for(var t=new Uint32Array(e.length),n=0;n{"use strict";n.r(t),n.d(t,{fromHex:()=>s,toHex:()=>c});for(var i={},r={},a=0;a<256;a++){var o=a.toString(16).toLowerCase();1===o.length&&(o="0".concat(o)),i[a]=o,r[o]=a}function s(e){if(e.length%2!=0)throw new Error("Hex encoded strings must have an even number length");for(var t=new Uint8Array(e.length/2),n=0;n{"use strict";n.r(t),n.d(t,{fromUtf8:()=>i,toUtf8:()=>r});var i=function(e){return"function"==typeof TextEncoder?function(e){return(new TextEncoder).encode(e)}(e):function(e){for(var t=[],n=0,i=e.length;n>6|192,63&r|128);else if(n+1>18|240,a>>12&63|128,a>>6&63|128,63&a|128)}else t.push(r>>12|224,r>>6&63|128,63&r|128)}return Uint8Array.from(t)}(e)},r=function(e){return"function"==typeof TextDecoder?function(e){return new TextDecoder("utf-8").decode(e)}(e):function(e){for(var t="",n=0,i=e.length;n(()=>{var e={373:function(e,t,n){var i;"undefined"!=typeof self&&self,i=()=>(()=>{var e={252:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BlockingQueue=void 0;var n=function(){function e(){this._resolvers=[],this._promises=[]}return e.prototype._add=function(){var e=this;this._promises.push(new Promise((function(t){e._resolvers.push(t)})))},e.prototype.enqueue=function(e){this._resolvers.length||this._add(),this._resolvers.shift()(e)},e.prototype.dequeue=function(){return this._promises.length||this._add(),this._promises.shift()},e.prototype.isEmpty=function(){return!this._promises.length},e.prototype.isBlocked=function(){return!!this._resolvers.length},Object.defineProperty(e.prototype,"length",{get:function(){return this._promises.length-this._resolvers.length},enumerable:!1,configurable:!0}),e}();t.BlockingQueue=n},289:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBrowserType=t.BrowserTypes=void 0,t.BrowserTypes={MSIE:"MSIE",EDGE:"EDGE",CHROME:"CHROME",SAFARI:"SAFARI",FIREFOX:"FIREFOX",OPERA:"OPERA",OTHER:"OTHER"},t.getBrowserType=function(){var e=window.navigator.userAgent.toLowerCase();return-1!==e.indexOf("msie")||-1!==e.indexOf("trident")?t.BrowserTypes.MSIE:-1!==e.indexOf("edge")?t.BrowserTypes.EDGE:-1!==e.indexOf("chrome")?t.BrowserTypes.CHROME:-1!==e.indexOf("safari")?t.BrowserTypes.SAFARI:-1!==e.indexOf("firefox")?t.BrowserTypes.FIREFOX:-1!==e.indexOf("opera")?t.BrowserTypes.OPERA:t.BrowserTypes.OTHER}},187:function(e,t,n){"use strict";var i=n(764).lW,r=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(r,a){function o(e){try{c(i.next(e))}catch(e){a(e)}}function s(e){try{c(i.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}c((i=i.apply(e,t||[])).next())}))},a=this&&this.__generator||function(e,t){var n,i,r,a,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(a){return function(s){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,i&&(r=2&a[0]?i.return:a[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,a[1])).done)return r;switch(i=0,r&&(a=[2&a[0],r.value]),a[0]){case 0:case 1:r=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,i=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!((r=(r=o.trys).length>0&&r[r.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!r||a[1]>r[0]&&a[1]100)throw new Error("queue is fulled: ".concat(this.sem.length));return[4,this.lock()];case 1:e=a.sent(),r=new Promise((function(e,r){if(!l.worker)throw new Error("worker is not activated.");l.worker.onmessage=function(t){t.data.message===c.WorkerResponse.PREDICTED?e(t.data.prediction):(console.log("Prediction something wrong..",t.data.message),r(t))},i?n instanceof Uint8ClampedArray?l.worker.postMessage({message:c.WorkerCommand.PREDICT,params:t,data:n},[n.buffer]):l.worker.postMessage({message:c.WorkerCommand.PREDICT,params:t,data:n},[n]):l.worker.postMessage({message:c.WorkerCommand.PREDICT,params:t,data:n})})),a.label=2;case 2:return a.trys.push([2,4,5,6]),[4,r];case 3:return o=a.sent(),[3,6];case 4:return s=a.sent(),console.log("worker prediction error. :",s),[3,6];case 5:return this.unlock(e),[7];case 6:return[2,o]}}))}))},this.useWorker=function(e){return!e.processOnLocal&&(!1!==e.useWorkerForSafari||(0,s.getBrowserType)()!==s.BrowserTypes.SAFARI)},this.fetchData=function(t){return r(e,void 0,void 0,(function(){var e;return a(this,(function(n){switch(n.label){case 0:return t.startsWith("data:")?(e=t.split(",")[1],[2,i.from(e,"base64")]):[4,fetch(t,{method:"GET"})];case 1:return[4,n.sent().arrayBuffer()];case 2:return[2,n.sent()]}}))}))},this.sem.enqueue(0)},t.WorkerDispatcher=function(e){var t=this;this.imageProcessor=null,this.config=null,this.callbacks=null,this.setCallback=function(e){t.callbacks=e},this.dispach=function(e){return r(t,void 0,void 0,(function(){var t,n,i,r;return a(this,(function(a){switch(a.label){case 0:return this.callbacks?e.data.message!==c.WorkerCommand.INITIALIZE?[3,2]:(this.config=e.data.config,t=this,[4,this.callbacks.init(this.config)]):(console.warn("[worker] Dispatcher callbacks is not initialized"),[2]);case 1:return t.imageProcessor=a.sent(),this.context.postMessage({message:c.WorkerResponse.INITIALIZED}),console.log("[worker] Initialized"),[3,4];case 2:return e.data.message!==c.WorkerCommand.PREDICT?[3,4]:this.imageProcessor?this.config?(n=e.data.params,i=e.data.data,[4,this.imageProcessor.predict(this.config,n,i)]):(console.warn("[worker] Dispatcher config is not initialized"),[2]):(console.warn("[worker] ImageProcessor is not initialized"),[2]);case 3:r=a.sent(),this.context.postMessage({message:c.WorkerResponse.PREDICTED,prediction:r}),a.label=4;case 4:return[2]}}))}))},this.context=e}},301:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkerResponse=t.WorkerCommand=void 0,t.WorkerCommand={INITIALIZE:"initialize",PREDICT:"predict"},t.WorkerResponse={INITIALIZED:"initialized",PREDICTED:"predicted"}},55:function(e,t,n){"use strict";var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||i(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),r(n(187),t),r(n(289),t)},742:(e,t)=>{"use strict";t.byteLength=function(e){var t=c(e),n=t[0],i=t[1];return 3*(n+i)/4-i},t.toByteArray=function(e){var t,n,a=c(e),o=a[0],s=a[1],l=new r(function(e,t,n){return 3*(t+n)/4-n}(0,o,s)),u=0,d=s>0?o-4:o;for(n=0;n>16&255,l[u++]=t>>8&255,l[u++]=255&t;return 2===s&&(t=i[e.charCodeAt(n)]<<2|i[e.charCodeAt(n+1)]>>4,l[u++]=255&t),1===s&&(t=i[e.charCodeAt(n)]<<10|i[e.charCodeAt(n+1)]<<4|i[e.charCodeAt(n+2)]>>2,l[u++]=t>>8&255,l[u++]=255&t),l},t.fromByteArray=function(e){for(var t,i=e.length,r=i%3,a=[],o=16383,s=0,c=i-r;sc?c:s+o));return 1===r?(t=e[i-1],a.push(n[t>>2]+n[t<<4&63]+"==")):2===r&&(t=(e[i-2]<<8)+e[i-1],a.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"=")),a.join("")};for(var n=[],i=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,s=a.length;o0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,i){for(var r,a,o=[],s=t;s>18&63]+n[a>>12&63]+n[a>>6&63]+n[63&a]);return o.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},764:(e,t,n)=>{"use strict";const i=n(742),r=n(645),a="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.lW=c,t.h2=50;const o=2147483647;function s(e){if(e>o)throw new RangeError('The value "'+e+'" is invalid for option "size"');const t=new Uint8Array(e);return Object.setPrototypeOf(t,c.prototype),t}function c(e,t,n){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return d(e)}return l(e,t,n)}function l(e,t,n){if("string"==typeof e)return function(e,t){if("string"==typeof t&&""!==t||(t="utf8"),!c.isEncoding(t))throw new TypeError("Unknown encoding: "+t);const n=0|m(e,t);let i=s(n);const r=i.write(e,t);return r!==n&&(i=i.slice(0,r)),i}(e,t);if(ArrayBuffer.isView(e))return function(e){if(J(e,Uint8Array)){const t=new Uint8Array(e);return f(t.buffer,t.byteOffset,t.byteLength)}return h(e)}(e);if(null==e)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(J(e,ArrayBuffer)||e&&J(e.buffer,ArrayBuffer))return f(e,t,n);if("undefined"!=typeof SharedArrayBuffer&&(J(e,SharedArrayBuffer)||e&&J(e.buffer,SharedArrayBuffer)))return f(e,t,n);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');const i=e.valueOf&&e.valueOf();if(null!=i&&i!==e)return c.from(i,t,n);const r=function(e){if(c.isBuffer(e)){const t=0|p(e.length),n=s(t);return 0===n.length||e.copy(n,0,0,t),n}return void 0!==e.length?"number"!=typeof e.length||$(e.length)?s(0):h(e):"Buffer"===e.type&&Array.isArray(e.data)?h(e.data):void 0}(e);if(r)return r;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof e[Symbol.toPrimitive])return c.from(e[Symbol.toPrimitive]("string"),t,n);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function u(e){if("number"!=typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function d(e){return u(e),s(e<0?0:0|p(e))}function h(e){const t=e.length<0?0:0|p(e.length),n=s(t);for(let i=0;i=o)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o.toString(16)+" bytes");return 0|e}function m(e,t){if(c.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||J(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);const n=e.length,i=arguments.length>2&&!0===arguments[2];if(!i&&0===n)return 0;let r=!1;for(;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return q(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return X(e).length;default:if(r)return i?-1:q(e).length;t=(""+t).toLowerCase(),r=!0}}function g(e,t,n){let i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return A(this,t,n);case"utf8":case"utf-8":return L(this,t,n);case"ascii":return T(this,t,n);case"latin1":case"binary":return z(this,t,n);case"base64":return w(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return V(this,t,n);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function C(e,t,n){const i=e[t];e[t]=e[n],e[n]=i}function v(e,t,n,i,r){if(0===e.length)return-1;if("string"==typeof n?(i=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),$(n=+n)&&(n=r?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(r)return-1;n=e.length-1}else if(n<0){if(!r)return-1;n=0}if("string"==typeof t&&(t=c.from(t,i)),c.isBuffer(t))return 0===t.length?-1:y(e,t,n,i,r);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,i,r);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,i,r){let a,o=1,s=e.length,c=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;o=2,s/=2,c/=2,n/=2}function l(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(r){let i=-1;for(a=n;as&&(n=s-c),a=n;a>=0;a--){let n=!0;for(let i=0;ir&&(i=r):i=r;const a=t.length;let o;for(i>a/2&&(i=a/2),o=0;o>8,r=n%256,a.push(r),a.push(i);return a}(t,e.length-n),e,n,i)}function w(e,t,n){return 0===t&&n===e.length?i.fromByteArray(e):i.fromByteArray(e.slice(t,n))}function L(e,t,n){n=Math.min(e.length,n);const i=[];let r=t;for(;r239?4:t>223?3:t>191?2:1;if(r+o<=n){let n,i,s,c;switch(o){case 1:t<128&&(a=t);break;case 2:n=e[r+1],128==(192&n)&&(c=(31&t)<<6|63&n,c>127&&(a=c));break;case 3:n=e[r+1],i=e[r+2],128==(192&n)&&128==(192&i)&&(c=(15&t)<<12|(63&n)<<6|63&i,c>2047&&(c<55296||c>57343)&&(a=c));break;case 4:n=e[r+1],i=e[r+2],s=e[r+3],128==(192&n)&&128==(192&i)&&128==(192&s)&&(c=(15&t)<<18|(63&n)<<12|(63&i)<<6|63&s,c>65535&&c<1114112&&(a=c))}}null===a?(a=65533,o=1):a>65535&&(a-=65536,i.push(a>>>10&1023|55296),a=56320|1023&a),i.push(a),r+=o}return function(e){const t=e.length;if(t<=E)return String.fromCharCode.apply(String,e);let n="",i=0;for(;ii.length?(c.isBuffer(t)||(t=c.from(t)),t.copy(i,r)):Uint8Array.prototype.set.call(i,t,r);else{if(!c.isBuffer(t))throw new TypeError('"list" argument must be an Array of Buffers');t.copy(i,r)}r+=t.length}return i},c.byteLength=m,c.prototype._isBuffer=!0,c.prototype.swap16=function(){const e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let t=0;tn&&(e+=" ... "),""},a&&(c.prototype[a]=c.prototype.inspect),c.prototype.compare=function(e,t,n,i,r){if(J(e,Uint8Array)&&(e=c.from(e,e.offset,e.byteLength)),!c.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===i&&(i=0),void 0===r&&(r=this.length),t<0||n>e.length||i<0||r>this.length)throw new RangeError("out of range index");if(i>=r&&t>=n)return 0;if(i>=r)return-1;if(t>=n)return 1;if(this===e)return 0;let a=(r>>>=0)-(i>>>=0),o=(n>>>=0)-(t>>>=0);const s=Math.min(a,o),l=this.slice(i,r),u=e.slice(t,n);for(let e=0;e>>=0,isFinite(n)?(n>>>=0,void 0===i&&(i="utf8")):(i=n,n=void 0)}const r=this.length-t;if((void 0===n||n>r)&&(n=r),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");let a=!1;for(;;)switch(i){case"hex":return b(this,e,t,n);case"utf8":case"utf-8":return M(this,e,t,n);case"ascii":case"latin1":case"binary":return x(this,e,t,n);case"base64":return _(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,n);default:if(a)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),a=!0}},c.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const E=4096;function T(e,t,n){let i="";n=Math.min(e.length,n);for(let r=t;ri)&&(n=i);let r="";for(let i=t;in)throw new RangeError("Trying to access beyond buffer length")}function R(e,t,n,i,r,a){if(!c.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||te.length)throw new RangeError("Index out of range")}function P(e,t,n,i,r){U(t,i,r,e,n,7);let a=Number(t&BigInt(4294967295));e[n++]=a,a>>=8,e[n++]=a,a>>=8,e[n++]=a,a>>=8,e[n++]=a;let o=Number(t>>BigInt(32)&BigInt(4294967295));return e[n++]=o,o>>=8,e[n++]=o,o>>=8,e[n++]=o,o>>=8,e[n++]=o,n}function I(e,t,n,i,r){U(t,i,r,e,n,7);let a=Number(t&BigInt(4294967295));e[n+7]=a,a>>=8,e[n+6]=a,a>>=8,e[n+5]=a,a>>=8,e[n+4]=a;let o=Number(t>>BigInt(32)&BigInt(4294967295));return e[n+3]=o,o>>=8,e[n+2]=o,o>>=8,e[n+1]=o,o>>=8,e[n]=o,n+8}function k(e,t,n,i,r,a){if(n+i>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function N(e,t,n,i,a){return t=+t,n>>>=0,a||k(e,0,n,4),r.write(e,t,n,i,23,4),n+4}function D(e,t,n,i,a){return t=+t,n>>>=0,a||k(e,0,n,8),r.write(e,t,n,i,52,8),n+8}c.prototype.slice=function(e,t){const n=this.length;(e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t>>=0,t>>>=0,n||H(e,t,this.length);let i=this[e],r=1,a=0;for(;++a>>=0,t>>>=0,n||H(e,t,this.length);let i=this[e+--t],r=1;for(;t>0&&(r*=256);)i+=this[e+--t]*r;return i},c.prototype.readUint8=c.prototype.readUInt8=function(e,t){return e>>>=0,t||H(e,1,this.length),this[e]},c.prototype.readUint16LE=c.prototype.readUInt16LE=function(e,t){return e>>>=0,t||H(e,2,this.length),this[e]|this[e+1]<<8},c.prototype.readUint16BE=c.prototype.readUInt16BE=function(e,t){return e>>>=0,t||H(e,2,this.length),this[e]<<8|this[e+1]},c.prototype.readUint32LE=c.prototype.readUInt32LE=function(e,t){return e>>>=0,t||H(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},c.prototype.readUint32BE=c.prototype.readUInt32BE=function(e,t){return e>>>=0,t||H(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},c.prototype.readBigUInt64LE=Z((function(e){W(e>>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||G(e,this.length-8);const i=t+256*this[++e]+65536*this[++e]+this[++e]*2**24,r=this[++e]+256*this[++e]+65536*this[++e]+n*2**24;return BigInt(i)+(BigInt(r)<>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||G(e,this.length-8);const i=t*2**24+65536*this[++e]+256*this[++e]+this[++e],r=this[++e]*2**24+65536*this[++e]+256*this[++e]+n;return(BigInt(i)<>>=0,t>>>=0,n||H(e,t,this.length);let i=this[e],r=1,a=0;for(;++a=r&&(i-=Math.pow(2,8*t)),i},c.prototype.readIntBE=function(e,t,n){e>>>=0,t>>>=0,n||H(e,t,this.length);let i=t,r=1,a=this[e+--i];for(;i>0&&(r*=256);)a+=this[e+--i]*r;return r*=128,a>=r&&(a-=Math.pow(2,8*t)),a},c.prototype.readInt8=function(e,t){return e>>>=0,t||H(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},c.prototype.readInt16LE=function(e,t){e>>>=0,t||H(e,2,this.length);const n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},c.prototype.readInt16BE=function(e,t){e>>>=0,t||H(e,2,this.length);const n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},c.prototype.readInt32LE=function(e,t){return e>>>=0,t||H(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},c.prototype.readInt32BE=function(e,t){return e>>>=0,t||H(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},c.prototype.readBigInt64LE=Z((function(e){W(e>>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||G(e,this.length-8);const i=this[e+4]+256*this[e+5]+65536*this[e+6]+(n<<24);return(BigInt(i)<>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||G(e,this.length-8);const i=(t<<24)+65536*this[++e]+256*this[++e]+this[++e];return(BigInt(i)<>>=0,t||H(e,4,this.length),r.read(this,e,!0,23,4)},c.prototype.readFloatBE=function(e,t){return e>>>=0,t||H(e,4,this.length),r.read(this,e,!1,23,4)},c.prototype.readDoubleLE=function(e,t){return e>>>=0,t||H(e,8,this.length),r.read(this,e,!0,52,8)},c.prototype.readDoubleBE=function(e,t){return e>>>=0,t||H(e,8,this.length),r.read(this,e,!1,52,8)},c.prototype.writeUintLE=c.prototype.writeUIntLE=function(e,t,n,i){e=+e,t>>>=0,n>>>=0,i||R(this,e,t,n,Math.pow(2,8*n)-1,0);let r=1,a=0;for(this[t]=255&e;++a>>=0,n>>>=0,i||R(this,e,t,n,Math.pow(2,8*n)-1,0);let r=n-1,a=1;for(this[t+r]=255&e;--r>=0&&(a*=256);)this[t+r]=e/a&255;return t+n},c.prototype.writeUint8=c.prototype.writeUInt8=function(e,t,n){return e=+e,t>>>=0,n||R(this,e,t,1,255,0),this[t]=255&e,t+1},c.prototype.writeUint16LE=c.prototype.writeUInt16LE=function(e,t,n){return e=+e,t>>>=0,n||R(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},c.prototype.writeUint16BE=c.prototype.writeUInt16BE=function(e,t,n){return e=+e,t>>>=0,n||R(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},c.prototype.writeUint32LE=c.prototype.writeUInt32LE=function(e,t,n){return e=+e,t>>>=0,n||R(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},c.prototype.writeUint32BE=c.prototype.writeUInt32BE=function(e,t,n){return e=+e,t>>>=0,n||R(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},c.prototype.writeBigUInt64LE=Z((function(e,t=0){return P(this,e,t,BigInt(0),BigInt("0xffffffffffffffff"))})),c.prototype.writeBigUInt64BE=Z((function(e,t=0){return I(this,e,t,BigInt(0),BigInt("0xffffffffffffffff"))})),c.prototype.writeIntLE=function(e,t,n,i){if(e=+e,t>>>=0,!i){const i=Math.pow(2,8*n-1);R(this,e,t,n,i-1,-i)}let r=0,a=1,o=0;for(this[t]=255&e;++r>0)-o&255;return t+n},c.prototype.writeIntBE=function(e,t,n,i){if(e=+e,t>>>=0,!i){const i=Math.pow(2,8*n-1);R(this,e,t,n,i-1,-i)}let r=n-1,a=1,o=0;for(this[t+r]=255&e;--r>=0&&(a*=256);)e<0&&0===o&&0!==this[t+r+1]&&(o=1),this[t+r]=(e/a>>0)-o&255;return t+n},c.prototype.writeInt8=function(e,t,n){return e=+e,t>>>=0,n||R(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},c.prototype.writeInt16LE=function(e,t,n){return e=+e,t>>>=0,n||R(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},c.prototype.writeInt16BE=function(e,t,n){return e=+e,t>>>=0,n||R(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},c.prototype.writeInt32LE=function(e,t,n){return e=+e,t>>>=0,n||R(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},c.prototype.writeInt32BE=function(e,t,n){return e=+e,t>>>=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},c.prototype.writeBigInt64LE=Z((function(e,t=0){return P(this,e,t,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),c.prototype.writeBigInt64BE=Z((function(e,t=0){return I(this,e,t,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),c.prototype.writeFloatLE=function(e,t,n){return N(this,e,t,!0,n)},c.prototype.writeFloatBE=function(e,t,n){return N(this,e,t,!1,n)},c.prototype.writeDoubleLE=function(e,t,n){return D(this,e,t,!0,n)},c.prototype.writeDoubleBE=function(e,t,n){return D(this,e,t,!1,n)},c.prototype.copy=function(e,t,n,i){if(!c.isBuffer(e))throw new TypeError("argument should be a Buffer");if(n||(n=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i=this.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(r=t;r=i+4;n-=3)t=`_${e.slice(n-3,n)}${t}`;return`${e.slice(0,n)}${t}`}function U(e,t,n,i,r,a){if(e>n||e3?0===t||t===BigInt(0)?`>= 0${i} and < 2${i} ** ${8*(a+1)}${i}`:`>= -(2${i} ** ${8*(a+1)-1}${i}) and < 2 ** ${8*(a+1)-1}${i}`:`>= ${t}${i} and <= ${n}${i}`,new O.ERR_OUT_OF_RANGE("value",r,e)}!function(e,t,n){W(t,"offset"),void 0!==e[t]&&void 0!==e[t+n]||G(t,e.length-(n+1))}(i,r,a)}function W(e,t){if("number"!=typeof e)throw new O.ERR_INVALID_ARG_TYPE(t,"number",e)}function G(e,t,n){if(Math.floor(e)!==e)throw W(e,n),new O.ERR_OUT_OF_RANGE(n||"offset","an integer",e);if(t<0)throw new O.ERR_BUFFER_OUT_OF_BOUNDS;throw new O.ERR_OUT_OF_RANGE(n||"offset",`>= ${n?1:0} and <= ${t}`,e)}B("ERR_BUFFER_OUT_OF_BOUNDS",(function(e){return e?`${e} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),B("ERR_INVALID_ARG_TYPE",(function(e,t){return`The "${e}" argument must be of type number. Received type ${typeof t}`}),TypeError),B("ERR_OUT_OF_RANGE",(function(e,t,n){let i=`The value of "${e}" is out of range.`,r=n;return Number.isInteger(n)&&Math.abs(n)>2**32?r=F(String(n)):"bigint"==typeof n&&(r=String(n),(n>BigInt(2)**BigInt(32)||n<-(BigInt(2)**BigInt(32)))&&(r=F(r)),r+="n"),i+=` It must be ${t}. Received ${r}`,i}),RangeError);const j=/[^+/0-9A-Za-z-_]/g;function q(e,t){let n;t=t||1/0;const i=e.length;let r=null;const a=[];for(let o=0;o55295&&n<57344){if(!r){if(n>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(o+1===i){(t-=3)>-1&&a.push(239,191,189);continue}r=n;continue}if(n<56320){(t-=3)>-1&&a.push(239,191,189),r=n;continue}n=65536+(r-55296<<10|n-56320)}else r&&(t-=3)>-1&&a.push(239,191,189);if(r=null,n<128){if((t-=1)<0)break;a.push(n)}else if(n<2048){if((t-=2)<0)break;a.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function X(e){return i.toByteArray(function(e){if((e=(e=e.split("=")[0]).trim().replace(j,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function Y(e,t,n,i){let r;for(r=0;r=t.length||r>=e.length);++r)t[r+n]=e[r];return r}function J(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function $(e){return e!=e}const K=function(){const e="0123456789abcdef",t=new Array(256);for(let n=0;n<16;++n){const i=16*n;for(let r=0;r<16;++r)t[i+r]=e[n]+e[r]}return t}();function Z(e){return"undefined"==typeof BigInt?Q:e}function Q(){throw new Error("BigInt not supported")}},645:(e,t)=>{t.read=function(e,t,n,i,r){var a,o,s=8*r-i-1,c=(1<>1,u=-7,d=n?r-1:0,h=n?-1:1,f=e[t+d];for(d+=h,a=f&(1<<-u)-1,f>>=-u,u+=s;u>0;a=256*a+e[t+d],d+=h,u-=8);for(o=a&(1<<-u)-1,a>>=-u,u+=i;u>0;o=256*o+e[t+d],d+=h,u-=8);if(0===a)a=1-l;else{if(a===c)return o?NaN:1/0*(f?-1:1);o+=Math.pow(2,i),a-=l}return(f?-1:1)*o*Math.pow(2,a-i)},t.write=function(e,t,n,i,r,a){var o,s,c,l=8*a-r-1,u=(1<>1,h=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=i?0:a-1,p=i?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,o=u):(o=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-o))<1&&(o--,c*=2),(t+=o+d>=1?h/c:h*Math.pow(2,1-d))*c>=2&&(o++,c/=2),o+d>=u?(s=0,o=u):o+d>=1?(s=(t*c-1)*Math.pow(2,r),o+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,r),o=0));r>=8;e[n+f]=255&s,f+=p,s/=256,r-=8);for(o=o<0;e[n+f]=255&o,f+=p,o/=256,l-=8);e[n+f-p]|=128*m}},477:e=>{"use strict";e.exports=function(e,t,n,i){var r=self||window;try{try{var a;try{a=new r.Blob([e])}catch(t){(a=new(r.BlobBuilder||r.WebKitBlobBuilder||r.MozBlobBuilder||r.MSBlobBuilder)).append(e),a=a.getBlob()}var o=r.URL||r.webkitURL,s=o.createObjectURL(a),c=new r[t](s,n);return o.revokeObjectURL(s),c}catch(i){return new r[t]("data:application/javascript,".concat(encodeURIComponent(e)),n)}}catch(e){if(!i)throw Error("Inline worker is not supported");return new r[t](i,n)}}},503:(e,t,n)=>{var i,a=n(764).lW,o=(i=(i="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0)||"/index.js",function(e){var t,o,s=void 0!==(e=e||{})?e:{},c=Object.assign;s.ready=new Promise((function(e,n){t=e,o=n}));var l,u,d,h,f,p,m=c({},s),g=[],C="./this.program",v=(e,t)=>{throw t},y="object"==typeof window,b="function"==typeof importScripts,M="object"==typeof r&&"object"==typeof r.versions&&"string"==typeof r.versions.node,x="";M?(x=b?n(375).dirname(x)+"/":"//",p=()=>{f||(h=n(384),f=n(375))},l=function(e,t){return p(),e=f.normalize(e),h.readFileSync(e,t?null:"utf8")},d=e=>{var t=l(e,!0);return t.buffer||(t=new Uint8Array(t)),t},u=(e,t,n)=>{p(),e=f.normalize(e),h.readFile(e,(function(e,i){e?n(e):t(i.buffer)}))},r.argv.length>1&&(C=r.argv[1].replace(/\\/g,"/")),g=r.argv.slice(2),r.on("uncaughtException",(function(e){if(!(e instanceof Ae))throw e})),r.on("unhandledRejection",(function(e){throw e})),v=(e,t)=>{if(W())throw r.exitCode=e,t;var n;(n=t)instanceof Ae||w("exiting due to exception: "+n),r.exit(e)},s.inspect=function(){return"[Emscripten Module object]"}):(y||b)&&(b?x=self.location.href:"undefined"!=typeof document&&document.currentScript&&(x=document.currentScript.src),i&&(x=i),x=0!==x.indexOf("blob:")?x.substr(0,x.replace(/[?#].*/,"").lastIndexOf("/")+1):"",l=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},b&&(d=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),u=(e,t,n)=>{var i=new XMLHttpRequest;i.open("GET",e,!0),i.responseType="arraybuffer",i.onload=()=>{200==i.status||0==i.status&&i.response?t(i.response):n()},i.onerror=n,i.send(null)});var _,S=s.print||console.log.bind(console),w=s.printErr||console.warn.bind(console);c(s,m),m=null,s.arguments&&(g=s.arguments),s.thisProgram&&(C=s.thisProgram),s.quit&&(v=s.quit),s.wasmBinary&&(_=s.wasmBinary);var L,E=s.noExitRuntime||!0;"object"!=typeof WebAssembly&&Q("no native wasm support detected");var T,z,A,V,H=!1,R="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function P(e,t,n){for(var i=t+n,r=t;e[r]&&!(r>=i);)++r;if(r-t>16&&e.subarray&&R)return R.decode(e.subarray(t,r));for(var a="";t>10,56320|1023&l)}}else a+=String.fromCharCode((31&o)<<6|s)}else a+=String.fromCharCode(o)}return a}function I(e,t){return e?P(A,e,t):""}function k(e,t,n,i){if(!(i>0))return 0;for(var r=n,a=n+i-1,o=0;o=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++o)),s<=127){if(n>=a)break;t[n++]=s}else if(s<=2047){if(n+1>=a)break;t[n++]=192|s>>6,t[n++]=128|63&s}else if(s<=65535){if(n+2>=a)break;t[n++]=224|s>>12,t[n++]=128|s>>6&63,t[n++]=128|63&s}else{if(n+3>=a)break;t[n++]=240|s>>18,t[n++]=128|s>>12&63,t[n++]=128|s>>6&63,t[n++]=128|63&s}}return t[n]=0,n-r}function N(e){for(var t=0,n=0;n=55296&&i<=57343&&(i=65536+((1023&i)<<10)|1023&e.charCodeAt(++n)),i<=127?++t:t+=i<=2047?2:i<=65535?3:4}return t}function D(e){T=e,s.HEAP8=z=new Int8Array(e),s.HEAP16=new Int16Array(e),s.HEAP32=V=new Int32Array(e),s.HEAPU8=A=new Uint8Array(e),s.HEAPU16=new Uint16Array(e),s.HEAPU32=new Uint32Array(e),s.HEAPF32=new Float32Array(e),s.HEAPF64=new Float64Array(e)}s.INITIAL_MEMORY;var O,B=[],F=[],U=[];function W(){return E||!1}var G,j,q,X,Y=0,J=null,$=null;function K(e){Y++,s.monitorRunDependencies&&s.monitorRunDependencies(Y)}function Z(e){if(Y--,s.monitorRunDependencies&&s.monitorRunDependencies(Y),0==Y&&(null!==J&&(clearInterval(J),J=null),$)){var t=$;$=null,t()}}function Q(e){s.onAbort&&s.onAbort(e),w(e="Aborted("+e+")"),H=!0,e+=". Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw o(t),t}function ee(e){return e.startsWith("data:application/octet-stream;base64,")}function te(e){return e.startsWith("file://")}function ne(e){try{if(e==G&&_)return new Uint8Array(_);if(d)return d(e);throw"both async and sync fetching of the wasm failed"}catch(e){Q(e)}}function ie(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?oe(n)():oe(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(s)}}s.preloadedImages={},s.preloadedAudios={},ee(G="tflite-simd.wasm")||(j=G,G=s.locateFile?s.locateFile(j,x):x+j);var re,ae=[];function oe(e){var t=ae[e];return t||(e>=ae.length&&(ae.length=e+1),ae[e]=t=O.get(e)),t}function se(e){this.excPtr=e,this.ptr=e-16,this.set_type=function(e){V[this.ptr+4>>2]=e},this.get_type=function(){return V[this.ptr+4>>2]},this.set_destructor=function(e){V[this.ptr+8>>2]=e},this.get_destructor=function(){return V[this.ptr+8>>2]},this.set_refcount=function(e){V[this.ptr>>2]=e},this.set_caught=function(e){e=e?1:0,z[this.ptr+12>>0]=e},this.get_caught=function(){return 0!=z[this.ptr+12>>0]},this.set_rethrown=function(e){e=e?1:0,z[this.ptr+13>>0]=e},this.get_rethrown=function(){return 0!=z[this.ptr+13>>0]},this.init=function(e,t){this.set_type(e),this.set_destructor(t),this.set_refcount(0),this.set_caught(!1),this.set_rethrown(!1)},this.add_ref=function(){var e=V[this.ptr>>2];V[this.ptr>>2]=e+1},this.release_ref=function(){var e=V[this.ptr>>2];return V[this.ptr>>2]=e-1,1===e}}function ce(e){try{return L.grow(e-T.byteLength+65535>>>16),D(L.buffer),1}catch(e){}}re=M?()=>{var e=r.hrtime();return 1e3*e[0]+e[1]/1e6}:()=>performance.now();var le={};function ue(){if(!ue.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:C||"./this.program"};for(var t in le)void 0===le[t]?delete e[t]:e[t]=le[t];var n=[];for(var t in e)n.push(t+"="+e[t]);ue.strings=n}return ue.strings}var de={splitPath:function(e){return/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(e).slice(1)},normalizeArray:function(e,t){for(var n=0,i=e.length-1;i>=0;i--){var r=e[i];"."===r?e.splice(i,1):".."===r?(e.splice(i,1),n++):n&&(e.splice(i,1),n--)}if(t)for(;n;n--)e.unshift("..");return e},normalize:function(e){var t="/"===e.charAt(0),n="/"===e.substr(-1);return(e=de.normalizeArray(e.split("/").filter((function(e){return!!e})),!t).join("/"))||t||(e="."),e&&n&&(e+="/"),(t?"/":"")+e},dirname:function(e){var t=de.splitPath(e),n=t[0],i=t[1];return n||i?(i&&(i=i.substr(0,i.length-1)),n+i):"."},basename:function(e){if("/"===e)return"/";var t=(e=(e=de.normalize(e)).replace(/\/$/,"")).lastIndexOf("/");return-1===t?e:e.substr(t+1)},extname:function(e){return de.splitPath(e)[3]},join:function(){var e=Array.prototype.slice.call(arguments,0);return de.normalize(e.join("/"))},join2:function(e,t){return de.normalize(e+"/"+t)}};function he(){if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues){var e=new Uint8Array(1);return function(){return crypto.getRandomValues(e),e[0]}}if(M)try{var t=n(782);return function(){return t.randomBytes(1)[0]}}catch(e){}return function(){Q("randomDevice")}}var fe={resolve:function(){for(var e="",t=!1,n=arguments.length-1;n>=-1&&!t;n--){var i=n>=0?arguments[n]:ge.cwd();if("string"!=typeof i)throw new TypeError("Arguments to path.resolve must be strings");if(!i)return"";e=i+"/"+e,t="/"===i.charAt(0)}return(t?"/":"")+(e=de.normalizeArray(e.split("/").filter((function(e){return!!e})),!t).join("/"))||"."},relative:function(e,t){function n(e){for(var t=0;t=0&&""===e[n];n--);return t>n?[]:e.slice(t,n-t+1)}e=fe.resolve(e).substr(1),t=fe.resolve(t).substr(1);for(var i=n(e.split("/")),r=n(t.split("/")),a=Math.min(i.length,r.length),o=a,s=0;s0?n.slice(0,i).toString("utf-8"):null}else"undefined"!=typeof window&&"function"==typeof window.prompt?null!==(t=window.prompt("Input: "))&&(t+="\n"):"function"==typeof readline&&null!==(t=readline())&&(t+="\n");if(!t)return null;e.input=Se(t,!0)}return e.input.shift()},put_char:function(e,t){null===t||10===t?(S(P(e.output,0)),e.output=[]):0!=t&&e.output.push(t)},flush:function(e){e.output&&e.output.length>0&&(S(P(e.output,0)),e.output=[])}},default_tty1_ops:{put_char:function(e,t){null===t||10===t?(w(P(e.output,0)),e.output=[]):0!=t&&e.output.push(t)},flush:function(e){e.output&&e.output.length>0&&(w(P(e.output,0)),e.output=[])}}},me={ops_table:null,mount:function(e){return me.createNode(null,"/",16895,0)},createNode:function(e,t,n,i){if(ge.isBlkdev(n)||ge.isFIFO(n))throw new ge.ErrnoError(63);me.ops_table||(me.ops_table={dir:{node:{getattr:me.node_ops.getattr,setattr:me.node_ops.setattr,lookup:me.node_ops.lookup,mknod:me.node_ops.mknod,rename:me.node_ops.rename,unlink:me.node_ops.unlink,rmdir:me.node_ops.rmdir,readdir:me.node_ops.readdir,symlink:me.node_ops.symlink},stream:{llseek:me.stream_ops.llseek}},file:{node:{getattr:me.node_ops.getattr,setattr:me.node_ops.setattr},stream:{llseek:me.stream_ops.llseek,read:me.stream_ops.read,write:me.stream_ops.write,allocate:me.stream_ops.allocate,mmap:me.stream_ops.mmap,msync:me.stream_ops.msync}},link:{node:{getattr:me.node_ops.getattr,setattr:me.node_ops.setattr,readlink:me.node_ops.readlink},stream:{}},chrdev:{node:{getattr:me.node_ops.getattr,setattr:me.node_ops.setattr},stream:ge.chrdev_stream_ops}});var r=ge.createNode(e,t,n,i);return ge.isDir(r.mode)?(r.node_ops=me.ops_table.dir.node,r.stream_ops=me.ops_table.dir.stream,r.contents={}):ge.isFile(r.mode)?(r.node_ops=me.ops_table.file.node,r.stream_ops=me.ops_table.file.stream,r.usedBytes=0,r.contents=null):ge.isLink(r.mode)?(r.node_ops=me.ops_table.link.node,r.stream_ops=me.ops_table.link.stream):ge.isChrdev(r.mode)&&(r.node_ops=me.ops_table.chrdev.node,r.stream_ops=me.ops_table.chrdev.stream),r.timestamp=Date.now(),e&&(e.contents[t]=r,e.timestamp=r.timestamp),r},getFileDataAsTypedArray:function(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage:function(e,t){var n=e.contents?e.contents.length:0;if(!(n>=t)){t=Math.max(t,n*(n<1048576?2:1.125)>>>0),0!=n&&(t=Math.max(t,256));var i=e.contents;e.contents=new Uint8Array(t),e.usedBytes>0&&e.contents.set(i.subarray(0,e.usedBytes),0)}},resizeFileStorage:function(e,t){if(e.usedBytes!=t)if(0==t)e.contents=null,e.usedBytes=0;else{var n=e.contents;e.contents=new Uint8Array(t),n&&e.contents.set(n.subarray(0,Math.min(t,e.usedBytes))),e.usedBytes=t}},node_ops:{getattr:function(e){var t={};return t.dev=ge.isChrdev(e.mode)?e.id:1,t.ino=e.id,t.mode=e.mode,t.nlink=1,t.uid=0,t.gid=0,t.rdev=e.rdev,ge.isDir(e.mode)?t.size=4096:ge.isFile(e.mode)?t.size=e.usedBytes:ge.isLink(e.mode)?t.size=e.link.length:t.size=0,t.atime=new Date(e.timestamp),t.mtime=new Date(e.timestamp),t.ctime=new Date(e.timestamp),t.blksize=4096,t.blocks=Math.ceil(t.size/t.blksize),t},setattr:function(e,t){void 0!==t.mode&&(e.mode=t.mode),void 0!==t.timestamp&&(e.timestamp=t.timestamp),void 0!==t.size&&me.resizeFileStorage(e,t.size)},lookup:function(e,t){throw ge.genericErrors[44]},mknod:function(e,t,n,i){return me.createNode(e,t,n,i)},rename:function(e,t,n){if(ge.isDir(e.mode)){var i;try{i=ge.lookupNode(t,n)}catch(e){}if(i)for(var r in i.contents)throw new ge.ErrnoError(55)}delete e.parent.contents[e.name],e.parent.timestamp=Date.now(),e.name=n,t.contents[n]=e,t.timestamp=e.parent.timestamp,e.parent=t},unlink:function(e,t){delete e.contents[t],e.timestamp=Date.now()},rmdir:function(e,t){var n=ge.lookupNode(e,t);for(var i in n.contents)throw new ge.ErrnoError(55);delete e.contents[t],e.timestamp=Date.now()},readdir:function(e){var t=[".",".."];for(var n in e.contents)e.contents.hasOwnProperty(n)&&t.push(n);return t},symlink:function(e,t,n){var i=me.createNode(e,t,41471,0);return i.link=n,i},readlink:function(e){if(!ge.isLink(e.mode))throw new ge.ErrnoError(28);return e.link}},stream_ops:{read:function(e,t,n,i,r){var a=e.node.contents;if(r>=e.node.usedBytes)return 0;var o=Math.min(e.node.usedBytes-r,i);if(o>8&&a.subarray)t.set(a.subarray(r,r+o),n);else for(var s=0;s0||i+n{if(!(e=fe.resolve(ge.cwd(),e)))return{path:"",node:null};var n={follow_mount:!0,recurse_count:0};for(var i in n)void 0===t[i]&&(t[i]=n[i]);if(t.recurse_count>8)throw new ge.ErrnoError(32);for(var r=de.normalizeArray(e.split("/").filter((e=>!!e)),!1),a=ge.root,o="/",s=0;s40)throw new ge.ErrnoError(32)}}return{path:o,node:a}},getPath:e=>{for(var t;;){if(ge.isRoot(e)){var n=e.mount.mountpoint;return t?"/"!==n[n.length-1]?n+"/"+t:n+t:n}t=t?e.name+"/"+t:e.name,e=e.parent}},hashName:(e,t)=>{for(var n=0,i=0;i>>0)%ge.nameTable.length},hashAddNode:e=>{var t=ge.hashName(e.parent.id,e.name);e.name_next=ge.nameTable[t],ge.nameTable[t]=e},hashRemoveNode:e=>{var t=ge.hashName(e.parent.id,e.name);if(ge.nameTable[t]===e)ge.nameTable[t]=e.name_next;else for(var n=ge.nameTable[t];n;){if(n.name_next===e){n.name_next=e.name_next;break}n=n.name_next}},lookupNode:(e,t)=>{var n=ge.mayLookup(e);if(n)throw new ge.ErrnoError(n,e);for(var i=ge.hashName(e.id,t),r=ge.nameTable[i];r;r=r.name_next){var a=r.name;if(r.parent.id===e.id&&a===t)return r}return ge.lookup(e,t)},createNode:(e,t,n,i)=>{var r=new ge.FSNode(e,t,n,i);return ge.hashAddNode(r),r},destroyNode:e=>{ge.hashRemoveNode(e)},isRoot:e=>e===e.parent,isMountpoint:e=>!!e.mounted,isFile:e=>32768==(61440&e),isDir:e=>16384==(61440&e),isLink:e=>40960==(61440&e),isChrdev:e=>8192==(61440&e),isBlkdev:e=>24576==(61440&e),isFIFO:e=>4096==(61440&e),isSocket:e=>49152==(49152&e),flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:e=>{var t=ge.flagModes[e];if(void 0===t)throw new Error("Unknown file open mode: "+e);return t},flagsToPermissionString:e=>{var t=["r","w","rw"][3&e];return 512&e&&(t+="w"),t},nodePermissions:(e,t)=>ge.ignorePermissions||(!t.includes("r")||292&e.mode)&&(!t.includes("w")||146&e.mode)&&(!t.includes("x")||73&e.mode)?0:2,mayLookup:e=>ge.nodePermissions(e,"x")||(e.node_ops.lookup?0:2),mayCreate:(e,t)=>{try{return ge.lookupNode(e,t),20}catch(e){}return ge.nodePermissions(e,"wx")},mayDelete:(e,t,n)=>{var i;try{i=ge.lookupNode(e,t)}catch(e){return e.errno}var r=ge.nodePermissions(e,"wx");if(r)return r;if(n){if(!ge.isDir(i.mode))return 54;if(ge.isRoot(i)||ge.getPath(i)===ge.cwd())return 10}else if(ge.isDir(i.mode))return 31;return 0},mayOpen:(e,t)=>e?ge.isLink(e.mode)?32:ge.isDir(e.mode)&&("r"!==ge.flagsToPermissionString(t)||512&t)?31:ge.nodePermissions(e,ge.flagsToPermissionString(t)):44,MAX_OPEN_FDS:4096,nextfd:(e=0,t=ge.MAX_OPEN_FDS)=>{for(var n=e;n<=t;n++)if(!ge.streams[n])return n;throw new ge.ErrnoError(33)},getStream:e=>ge.streams[e],createStream:(e,t,n)=>{ge.FSStream||(ge.FSStream=function(){},ge.FSStream.prototype={object:{get:function(){return this.node},set:function(e){this.node=e}},isRead:{get:function(){return 1!=(2097155&this.flags)}},isWrite:{get:function(){return 0!=(2097155&this.flags)}},isAppend:{get:function(){return 1024&this.flags}}});var i=new ge.FSStream;for(var r in e)i[r]=e[r];e=i;var a=ge.nextfd(t,n);return e.fd=a,ge.streams[a]=e,e},closeStream:e=>{ge.streams[e]=null},chrdev_stream_ops:{open:e=>{var t=ge.getDevice(e.node.rdev);e.stream_ops=t.stream_ops,e.stream_ops.open&&e.stream_ops.open(e)},llseek:()=>{throw new ge.ErrnoError(70)}},major:e=>e>>8,minor:e=>255&e,makedev:(e,t)=>e<<8|t,registerDevice:(e,t)=>{ge.devices[e]={stream_ops:t}},getDevice:e=>ge.devices[e],getMounts:e=>{for(var t=[],n=[e];n.length;){var i=n.pop();t.push(i),n.push.apply(n,i.mounts)}return t},syncfs:(e,t)=>{"function"==typeof e&&(t=e,e=!1),ge.syncFSRequests++,ge.syncFSRequests>1&&w("warning: "+ge.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var n=ge.getMounts(ge.root.mount),i=0;function r(e){return ge.syncFSRequests--,t(e)}function a(e){if(e)return a.errored?void 0:(a.errored=!0,r(e));++i>=n.length&&r(null)}n.forEach((t=>{if(!t.type.syncfs)return a(null);t.type.syncfs(t,e,a)}))},mount:(e,t,n)=>{var i,r="/"===n,a=!n;if(r&&ge.root)throw new ge.ErrnoError(10);if(!r&&!a){var o=ge.lookupPath(n,{follow_mount:!1});if(n=o.path,i=o.node,ge.isMountpoint(i))throw new ge.ErrnoError(10);if(!ge.isDir(i.mode))throw new ge.ErrnoError(54)}var s={type:e,opts:t,mountpoint:n,mounts:[]},c=e.mount(s);return c.mount=s,s.root=c,r?ge.root=c:i&&(i.mounted=s,i.mount&&i.mount.mounts.push(s)),c},unmount:e=>{var t=ge.lookupPath(e,{follow_mount:!1});if(!ge.isMountpoint(t.node))throw new ge.ErrnoError(28);var n=t.node,i=n.mounted,r=ge.getMounts(i);Object.keys(ge.nameTable).forEach((e=>{for(var t=ge.nameTable[e];t;){var n=t.name_next;r.includes(t.mount)&&ge.destroyNode(t),t=n}})),n.mounted=null;var a=n.mount.mounts.indexOf(i);n.mount.mounts.splice(a,1)},lookup:(e,t)=>e.node_ops.lookup(e,t),mknod:(e,t,n)=>{var i=ge.lookupPath(e,{parent:!0}).node,r=de.basename(e);if(!r||"."===r||".."===r)throw new ge.ErrnoError(28);var a=ge.mayCreate(i,r);if(a)throw new ge.ErrnoError(a);if(!i.node_ops.mknod)throw new ge.ErrnoError(63);return i.node_ops.mknod(i,r,t,n)},create:(e,t)=>(t=void 0!==t?t:438,t&=4095,t|=32768,ge.mknod(e,t,0)),mkdir:(e,t)=>(t=void 0!==t?t:511,t&=1023,t|=16384,ge.mknod(e,t,0)),mkdirTree:(e,t)=>{for(var n=e.split("/"),i="",r=0;r(void 0===n&&(n=t,t=438),t|=8192,ge.mknod(e,t,n)),symlink:(e,t)=>{if(!fe.resolve(e))throw new ge.ErrnoError(44);var n=ge.lookupPath(t,{parent:!0}).node;if(!n)throw new ge.ErrnoError(44);var i=de.basename(t),r=ge.mayCreate(n,i);if(r)throw new ge.ErrnoError(r);if(!n.node_ops.symlink)throw new ge.ErrnoError(63);return n.node_ops.symlink(n,i,e)},rename:(e,t)=>{var n,i,r=de.dirname(e),a=de.dirname(t),o=de.basename(e),s=de.basename(t);if(n=ge.lookupPath(e,{parent:!0}).node,i=ge.lookupPath(t,{parent:!0}).node,!n||!i)throw new ge.ErrnoError(44);if(n.mount!==i.mount)throw new ge.ErrnoError(75);var c,l=ge.lookupNode(n,o),u=fe.relative(e,a);if("."!==u.charAt(0))throw new ge.ErrnoError(28);if("."!==(u=fe.relative(t,r)).charAt(0))throw new ge.ErrnoError(55);try{c=ge.lookupNode(i,s)}catch(e){}if(l!==c){var d=ge.isDir(l.mode),h=ge.mayDelete(n,o,d);if(h)throw new ge.ErrnoError(h);if(h=c?ge.mayDelete(i,s,d):ge.mayCreate(i,s))throw new ge.ErrnoError(h);if(!n.node_ops.rename)throw new ge.ErrnoError(63);if(ge.isMountpoint(l)||c&&ge.isMountpoint(c))throw new ge.ErrnoError(10);if(i!==n&&(h=ge.nodePermissions(n,"w")))throw new ge.ErrnoError(h);ge.hashRemoveNode(l);try{n.node_ops.rename(l,i,s)}catch(e){throw e}finally{ge.hashAddNode(l)}}},rmdir:e=>{var t=ge.lookupPath(e,{parent:!0}).node,n=de.basename(e),i=ge.lookupNode(t,n),r=ge.mayDelete(t,n,!0);if(r)throw new ge.ErrnoError(r);if(!t.node_ops.rmdir)throw new ge.ErrnoError(63);if(ge.isMountpoint(i))throw new ge.ErrnoError(10);t.node_ops.rmdir(t,n),ge.destroyNode(i)},readdir:e=>{var t=ge.lookupPath(e,{follow:!0}).node;if(!t.node_ops.readdir)throw new ge.ErrnoError(54);return t.node_ops.readdir(t)},unlink:e=>{var t=ge.lookupPath(e,{parent:!0}).node;if(!t)throw new ge.ErrnoError(44);var n=de.basename(e),i=ge.lookupNode(t,n),r=ge.mayDelete(t,n,!1);if(r)throw new ge.ErrnoError(r);if(!t.node_ops.unlink)throw new ge.ErrnoError(63);if(ge.isMountpoint(i))throw new ge.ErrnoError(10);t.node_ops.unlink(t,n),ge.destroyNode(i)},readlink:e=>{var t=ge.lookupPath(e).node;if(!t)throw new ge.ErrnoError(44);if(!t.node_ops.readlink)throw new ge.ErrnoError(28);return fe.resolve(ge.getPath(t.parent),t.node_ops.readlink(t))},stat:(e,t)=>{var n=ge.lookupPath(e,{follow:!t}).node;if(!n)throw new ge.ErrnoError(44);if(!n.node_ops.getattr)throw new ge.ErrnoError(63);return n.node_ops.getattr(n)},lstat:e=>ge.stat(e,!0),chmod:(e,t,n)=>{var i;if(!(i="string"==typeof e?ge.lookupPath(e,{follow:!n}).node:e).node_ops.setattr)throw new ge.ErrnoError(63);i.node_ops.setattr(i,{mode:4095&t|-4096&i.mode,timestamp:Date.now()})},lchmod:(e,t)=>{ge.chmod(e,t,!0)},fchmod:(e,t)=>{var n=ge.getStream(e);if(!n)throw new ge.ErrnoError(8);ge.chmod(n.node,t)},chown:(e,t,n,i)=>{var r;if(!(r="string"==typeof e?ge.lookupPath(e,{follow:!i}).node:e).node_ops.setattr)throw new ge.ErrnoError(63);r.node_ops.setattr(r,{timestamp:Date.now()})},lchown:(e,t,n)=>{ge.chown(e,t,n,!0)},fchown:(e,t,n)=>{var i=ge.getStream(e);if(!i)throw new ge.ErrnoError(8);ge.chown(i.node,t,n)},truncate:(e,t)=>{if(t<0)throw new ge.ErrnoError(28);var n;if(!(n="string"==typeof e?ge.lookupPath(e,{follow:!0}).node:e).node_ops.setattr)throw new ge.ErrnoError(63);if(ge.isDir(n.mode))throw new ge.ErrnoError(31);if(!ge.isFile(n.mode))throw new ge.ErrnoError(28);var i=ge.nodePermissions(n,"w");if(i)throw new ge.ErrnoError(i);n.node_ops.setattr(n,{size:t,timestamp:Date.now()})},ftruncate:(e,t)=>{var n=ge.getStream(e);if(!n)throw new ge.ErrnoError(8);if(0==(2097155&n.flags))throw new ge.ErrnoError(28);ge.truncate(n.node,t)},utime:(e,t,n)=>{var i=ge.lookupPath(e,{follow:!0}).node;i.node_ops.setattr(i,{timestamp:Math.max(t,n)})},open:(e,t,n,i,r)=>{if(""===e)throw new ge.ErrnoError(44);var a;if(n=void 0===n?438:n,n=64&(t="string"==typeof t?ge.modeStringToFlags(t):t)?4095&n|32768:0,"object"==typeof e)a=e;else{e=de.normalize(e);try{a=ge.lookupPath(e,{follow:!(131072&t)}).node}catch(e){}}var o=!1;if(64&t)if(a){if(128&t)throw new ge.ErrnoError(20)}else a=ge.mknod(e,n,0),o=!0;if(!a)throw new ge.ErrnoError(44);if(ge.isChrdev(a.mode)&&(t&=-513),65536&t&&!ge.isDir(a.mode))throw new ge.ErrnoError(54);if(!o){var c=ge.mayOpen(a,t);if(c)throw new ge.ErrnoError(c)}512&t&&ge.truncate(a,0),t&=-131713;var l=ge.createStream({node:a,path:ge.getPath(a),flags:t,seekable:!0,position:0,stream_ops:a.stream_ops,ungotten:[],error:!1},i,r);return l.stream_ops.open&&l.stream_ops.open(l),!s.logReadFiles||1&t||(ge.readFiles||(ge.readFiles={}),e in ge.readFiles||(ge.readFiles[e]=1)),l},close:e=>{if(ge.isClosed(e))throw new ge.ErrnoError(8);e.getdents&&(e.getdents=null);try{e.stream_ops.close&&e.stream_ops.close(e)}catch(e){throw e}finally{ge.closeStream(e.fd)}e.fd=null},isClosed:e=>null===e.fd,llseek:(e,t,n)=>{if(ge.isClosed(e))throw new ge.ErrnoError(8);if(!e.seekable||!e.stream_ops.llseek)throw new ge.ErrnoError(70);if(0!=n&&1!=n&&2!=n)throw new ge.ErrnoError(28);return e.position=e.stream_ops.llseek(e,t,n),e.ungotten=[],e.position},read:(e,t,n,i,r)=>{if(i<0||r<0)throw new ge.ErrnoError(28);if(ge.isClosed(e))throw new ge.ErrnoError(8);if(1==(2097155&e.flags))throw new ge.ErrnoError(8);if(ge.isDir(e.node.mode))throw new ge.ErrnoError(31);if(!e.stream_ops.read)throw new ge.ErrnoError(28);var a=void 0!==r;if(a){if(!e.seekable)throw new ge.ErrnoError(70)}else r=e.position;var o=e.stream_ops.read(e,t,n,i,r);return a||(e.position+=o),o},write:(e,t,n,i,r,a)=>{if(i<0||r<0)throw new ge.ErrnoError(28);if(ge.isClosed(e))throw new ge.ErrnoError(8);if(0==(2097155&e.flags))throw new ge.ErrnoError(8);if(ge.isDir(e.node.mode))throw new ge.ErrnoError(31);if(!e.stream_ops.write)throw new ge.ErrnoError(28);e.seekable&&1024&e.flags&&ge.llseek(e,0,2);var o=void 0!==r;if(o){if(!e.seekable)throw new ge.ErrnoError(70)}else r=e.position;var s=e.stream_ops.write(e,t,n,i,r,a);return o||(e.position+=s),s},allocate:(e,t,n)=>{if(ge.isClosed(e))throw new ge.ErrnoError(8);if(t<0||n<=0)throw new ge.ErrnoError(28);if(0==(2097155&e.flags))throw new ge.ErrnoError(8);if(!ge.isFile(e.node.mode)&&!ge.isDir(e.node.mode))throw new ge.ErrnoError(43);if(!e.stream_ops.allocate)throw new ge.ErrnoError(138);e.stream_ops.allocate(e,t,n)},mmap:(e,t,n,i,r,a)=>{if(0!=(2&r)&&0==(2&a)&&2!=(2097155&e.flags))throw new ge.ErrnoError(2);if(1==(2097155&e.flags))throw new ge.ErrnoError(2);if(!e.stream_ops.mmap)throw new ge.ErrnoError(43);return e.stream_ops.mmap(e,t,n,i,r,a)},msync:(e,t,n,i,r)=>e&&e.stream_ops.msync?e.stream_ops.msync(e,t,n,i,r):0,munmap:e=>0,ioctl:(e,t,n)=>{if(!e.stream_ops.ioctl)throw new ge.ErrnoError(59);return e.stream_ops.ioctl(e,t,n)},readFile:(e,t={})=>{if(t.flags=t.flags||0,t.encoding=t.encoding||"binary","utf8"!==t.encoding&&"binary"!==t.encoding)throw new Error('Invalid encoding type "'+t.encoding+'"');var n,i=ge.open(e,t.flags),r=ge.stat(e).size,a=new Uint8Array(r);return ge.read(i,a,0,r,0),"utf8"===t.encoding?n=P(a,0):"binary"===t.encoding&&(n=a),ge.close(i),n},writeFile:(e,t,n={})=>{n.flags=n.flags||577;var i=ge.open(e,n.flags,n.mode);if("string"==typeof t){var r=new Uint8Array(N(t)+1),a=k(t,r,0,r.length);ge.write(i,r,0,a,void 0,n.canOwn)}else{if(!ArrayBuffer.isView(t))throw new Error("Unsupported data type");ge.write(i,t,0,t.byteLength,void 0,n.canOwn)}ge.close(i)},cwd:()=>ge.currentPath,chdir:e=>{var t=ge.lookupPath(e,{follow:!0});if(null===t.node)throw new ge.ErrnoError(44);if(!ge.isDir(t.node.mode))throw new ge.ErrnoError(54);var n=ge.nodePermissions(t.node,"x");if(n)throw new ge.ErrnoError(n);ge.currentPath=t.path},createDefaultDirectories:()=>{ge.mkdir("/tmp"),ge.mkdir("/home"),ge.mkdir("/home/web_user")},createDefaultDevices:()=>{ge.mkdir("/dev"),ge.registerDevice(ge.makedev(1,3),{read:()=>0,write:(e,t,n,i,r)=>i}),ge.mkdev("/dev/null",ge.makedev(1,3)),pe.register(ge.makedev(5,0),pe.default_tty_ops),pe.register(ge.makedev(6,0),pe.default_tty1_ops),ge.mkdev("/dev/tty",ge.makedev(5,0)),ge.mkdev("/dev/tty1",ge.makedev(6,0));var e=he();ge.createDevice("/dev","random",e),ge.createDevice("/dev","urandom",e),ge.mkdir("/dev/shm"),ge.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{ge.mkdir("/proc");var e=ge.mkdir("/proc/self");ge.mkdir("/proc/self/fd"),ge.mount({mount:()=>{var t=ge.createNode(e,"fd",16895,73);return t.node_ops={lookup:(e,t)=>{var n=+t,i=ge.getStream(n);if(!i)throw new ge.ErrnoError(8);var r={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>i.path}};return r.parent=r,r}},t}},{},"/proc/self/fd")},createStandardStreams:()=>{s.stdin?ge.createDevice("/dev","stdin",s.stdin):ge.symlink("/dev/tty","/dev/stdin"),s.stdout?ge.createDevice("/dev","stdout",null,s.stdout):ge.symlink("/dev/tty","/dev/stdout"),s.stderr?ge.createDevice("/dev","stderr",null,s.stderr):ge.symlink("/dev/tty1","/dev/stderr"),ge.open("/dev/stdin",0),ge.open("/dev/stdout",1),ge.open("/dev/stderr",1)},ensureErrnoError:()=>{ge.ErrnoError||(ge.ErrnoError=function(e,t){this.node=t,this.setErrno=function(e){this.errno=e},this.setErrno(e),this.message="FS error"},ge.ErrnoError.prototype=new Error,ge.ErrnoError.prototype.constructor=ge.ErrnoError,[44].forEach((e=>{ge.genericErrors[e]=new ge.ErrnoError(e),ge.genericErrors[e].stack=""})))},staticInit:()=>{ge.ensureErrnoError(),ge.nameTable=new Array(4096),ge.mount(me,{},"/"),ge.createDefaultDirectories(),ge.createDefaultDevices(),ge.createSpecialDirectories(),ge.filesystems={MEMFS:me}},init:(e,t,n)=>{ge.init.initialized=!0,ge.ensureErrnoError(),s.stdin=e||s.stdin,s.stdout=t||s.stdout,s.stderr=n||s.stderr,ge.createStandardStreams()},quit:()=>{ge.init.initialized=!1;for(var e=0;e{var n=0;return e&&(n|=365),t&&(n|=146),n},findObject:(e,t)=>{var n=ge.analyzePath(e,t);return n.exists?n.object:null},analyzePath:(e,t)=>{try{e=(i=ge.lookupPath(e,{follow:!t})).path}catch(e){}var n={isRoot:!1,exists:!1,error:0,name:null,path:null,object:null,parentExists:!1,parentPath:null,parentObject:null};try{var i=ge.lookupPath(e,{parent:!0});n.parentExists=!0,n.parentPath=i.path,n.parentObject=i.node,n.name=de.basename(e),i=ge.lookupPath(e,{follow:!t}),n.exists=!0,n.path=i.path,n.object=i.node,n.name=i.node.name,n.isRoot="/"===i.path}catch(e){n.error=e.errno}return n},createPath:(e,t,n,i)=>{e="string"==typeof e?e:ge.getPath(e);for(var r=t.split("/").reverse();r.length;){var a=r.pop();if(a){var o=de.join2(e,a);try{ge.mkdir(o)}catch(e){}e=o}}return o},createFile:(e,t,n,i,r)=>{var a=de.join2("string"==typeof e?e:ge.getPath(e),t),o=ge.getMode(i,r);return ge.create(a,o)},createDataFile:(e,t,n,i,r,a)=>{var o=t;e&&(e="string"==typeof e?e:ge.getPath(e),o=t?de.join2(e,t):e);var s=ge.getMode(i,r),c=ge.create(o,s);if(n){if("string"==typeof n){for(var l=new Array(n.length),u=0,d=n.length;u{var r=de.join2("string"==typeof e?e:ge.getPath(e),t),a=ge.getMode(!!n,!!i);ge.createDevice.major||(ge.createDevice.major=64);var o=ge.makedev(ge.createDevice.major++,0);return ge.registerDevice(o,{open:e=>{e.seekable=!1},close:e=>{i&&i.buffer&&i.buffer.length&&i(10)},read:(e,t,i,r,a)=>{for(var o=0,s=0;s{for(var o=0;o{if(e.isDevice||e.isFolder||e.link||e.contents)return!0;if("undefined"!=typeof XMLHttpRequest)throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");if(!l)throw new Error("Cannot load without read() or XMLHttpRequest.");try{e.contents=Se(l(e.url),!0),e.usedBytes=e.contents.length}catch(e){throw new ge.ErrnoError(29)}},createLazyFile:(e,t,n,i,r)=>{function a(){this.lengthKnown=!1,this.chunks=[]}if(a.prototype.get=function(e){if(!(e>this.length-1||e<0)){var t=e%this.chunkSize,n=e/this.chunkSize|0;return this.getter(n)[t]}},a.prototype.setDataGetter=function(e){this.getter=e},a.prototype.cacheLength=function(){var e=new XMLHttpRequest;if(e.open("HEAD",n,!1),e.send(null),!(e.status>=200&&e.status<300||304===e.status))throw new Error("Couldn't load "+n+". Status: "+e.status);var t,i=Number(e.getResponseHeader("Content-length")),r=(t=e.getResponseHeader("Accept-Ranges"))&&"bytes"===t,a=(t=e.getResponseHeader("Content-Encoding"))&&"gzip"===t,o=1048576;r||(o=i);var s=this;s.setDataGetter((e=>{var t=e*o,r=(e+1)*o-1;if(r=Math.min(r,i-1),void 0===s.chunks[e]&&(s.chunks[e]=((e,t)=>{if(e>t)throw new Error("invalid range ("+e+", "+t+") or no bytes requested!");if(t>i-1)throw new Error("only "+i+" bytes available! programmer error!");var r=new XMLHttpRequest;if(r.open("GET",n,!1),i!==o&&r.setRequestHeader("Range","bytes="+e+"-"+t),"undefined"!=typeof Uint8Array&&(r.responseType="arraybuffer"),r.overrideMimeType&&r.overrideMimeType("text/plain; charset=x-user-defined"),r.send(null),!(r.status>=200&&r.status<300||304===r.status))throw new Error("Couldn't load "+n+". Status: "+r.status);return void 0!==r.response?new Uint8Array(r.response||[]):Se(r.responseText||"",!0)})(t,r)),void 0===s.chunks[e])throw new Error("doXHR failed!");return s.chunks[e]})),!a&&i||(o=i=1,i=this.getter(0).length,o=i,S("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=i,this._chunkSize=o,this.lengthKnown=!0},"undefined"!=typeof XMLHttpRequest){if(!b)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var o=new a;Object.defineProperties(o,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var s={isDevice:!1,contents:o}}else s={isDevice:!1,url:n};var c=ge.createFile(e,t,s,i,r);s.contents?c.contents=s.contents:s.url&&(c.contents=null,c.url=s.url),Object.defineProperties(c,{usedBytes:{get:function(){return this.contents.length}}});var l={};return Object.keys(c.stream_ops).forEach((e=>{var t=c.stream_ops[e];l[e]=function(){return ge.forceLoadFile(c),t.apply(null,arguments)}})),l.read=(e,t,n,i,r)=>{ge.forceLoadFile(c);var a=e.node.contents;if(r>=a.length)return 0;var o=Math.min(a.length-r,i);if(a.slice)for(var s=0;s{var d=t?fe.resolve(de.join2(e,t)):e;function h(n){function u(n){l&&l(),s||ge.createDataFile(e,t,n,i,r,c),a&&a(),Z()}Browser.handledByPreloadPlugin(n,d,u,(()=>{o&&o(),Z()}))||u(n)}K(),"string"==typeof n?function(e,t,n,i){var r="al "+e;u(e,(function(t){t||Q('Loading data file "'+e+'" failed (no arrayBuffer).'),(e=>{h(e)})(new Uint8Array(t)),r&&Z()}),(function(t){if(!n)throw'Loading data file "'+e+'" failed.';n()})),r&&K()}(n,0,o):h(n)},indexedDB:()=>window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB,DB_NAME:()=>"EM_FS_"+window.location.pathname,DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(e,t,n)=>{t=t||(()=>{}),n=n||(()=>{});var i=ge.indexedDB();try{var r=i.open(ge.DB_NAME(),ge.DB_VERSION)}catch(e){return n(e)}r.onupgradeneeded=()=>{S("creating db"),r.result.createObjectStore(ge.DB_STORE_NAME)},r.onsuccess=()=>{var i=r.result.transaction([ge.DB_STORE_NAME],"readwrite"),a=i.objectStore(ge.DB_STORE_NAME),o=0,s=0,c=e.length;function l(){0==s?t():n()}e.forEach((e=>{var t=a.put(ge.analyzePath(e).object.contents,e);t.onsuccess=()=>{++o+s==c&&l()},t.onerror=()=>{s++,o+s==c&&l()}})),i.onerror=n},r.onerror=n},loadFilesFromDB:(e,t,n)=>{t=t||(()=>{}),n=n||(()=>{});var i=ge.indexedDB();try{var r=i.open(ge.DB_NAME(),ge.DB_VERSION)}catch(e){return n(e)}r.onupgradeneeded=n,r.onsuccess=()=>{var i=r.result;try{var a=i.transaction([ge.DB_STORE_NAME],"readonly")}catch(e){return void n(e)}var o=a.objectStore(ge.DB_STORE_NAME),s=0,c=0,l=e.length;function u(){0==c?t():n()}e.forEach((e=>{var t=o.get(e);t.onsuccess=()=>{ge.analyzePath(e).exists&&ge.unlink(e),ge.createDataFile(de.dirname(e),de.basename(e),t.result,!0,!0,!0),++s+c==l&&u()},t.onerror=()=>{c++,s+c==l&&u()}})),a.onerror=n},r.onerror=n}},Ce={mappings:{},DEFAULT_POLLMASK:5,calculateAt:function(e,t,n){if("/"===t[0])return t;var i;if(-100===e)i=ge.cwd();else{var r=ge.getStream(e);if(!r)throw new ge.ErrnoError(8);i=r.path}if(0==t.length){if(!n)throw new ge.ErrnoError(44);return i}return de.join2(i,t)},doStat:function(e,t,n){try{var i=e(t)}catch(e){if(e&&e.node&&de.normalize(t)!==de.normalize(ge.getPath(e.node)))return-54;throw e}return V[n>>2]=i.dev,V[n+4>>2]=0,V[n+8>>2]=i.ino,V[n+12>>2]=i.mode,V[n+16>>2]=i.nlink,V[n+20>>2]=i.uid,V[n+24>>2]=i.gid,V[n+28>>2]=i.rdev,V[n+32>>2]=0,X=[i.size>>>0,(q=i.size,+Math.abs(q)>=1?q>0?(0|Math.min(+Math.floor(q/4294967296),4294967295))>>>0:~~+Math.ceil((q-+(~~q>>>0))/4294967296)>>>0:0)],V[n+40>>2]=X[0],V[n+44>>2]=X[1],V[n+48>>2]=4096,V[n+52>>2]=i.blocks,V[n+56>>2]=i.atime.getTime()/1e3|0,V[n+60>>2]=0,V[n+64>>2]=i.mtime.getTime()/1e3|0,V[n+68>>2]=0,V[n+72>>2]=i.ctime.getTime()/1e3|0,V[n+76>>2]=0,X=[i.ino>>>0,(q=i.ino,+Math.abs(q)>=1?q>0?(0|Math.min(+Math.floor(q/4294967296),4294967295))>>>0:~~+Math.ceil((q-+(~~q>>>0))/4294967296)>>>0:0)],V[n+80>>2]=X[0],V[n+84>>2]=X[1],0},doMsync:function(e,t,n,i,r){var a=A.slice(e,e+n);ge.msync(t,a,r,n,i)},doMkdir:function(e,t){return"/"===(e=de.normalize(e))[e.length-1]&&(e=e.substr(0,e.length-1)),ge.mkdir(e,t,0),0},doMknod:function(e,t,n){switch(61440&t){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return ge.mknod(e,t,n),0},doReadlink:function(e,t,n){if(n<=0)return-28;var i=ge.readlink(e),r=Math.min(n,N(i)),a=z[t+r];return k(i,A,t,n+1),z[t+r]=a,r},doAccess:function(e,t){if(-8&t)return-28;var n=ge.lookupPath(e,{follow:!0}).node;if(!n)return-44;var i="";return 4&t&&(i+="r"),2&t&&(i+="w"),1&t&&(i+="x"),i&&ge.nodePermissions(n,i)?-2:0},doDup:function(e,t,n){var i=ge.getStream(n);return i&&ge.close(i),ge.open(e,t,0,n,n).fd},doReadv:function(e,t,n,i){for(var r=0,a=0;a>2],s=V[t+(8*a+4)>>2],c=ge.read(e,z,o,s,i);if(c<0)return-1;if(r+=c,c>2],s=V[t+(8*a+4)>>2],c=ge.write(e,z,o,s,i);if(c<0)return-1;r+=c}return r},varargs:void 0,get:function(){return Ce.varargs+=4,V[Ce.varargs-4>>2]},getStr:function(e){return I(e)},getStreamFromFD:function(e){var t=ge.getStream(e);if(!t)throw new ge.ErrnoError(8);return t},get64:function(e,t){return e}};function ve(e){return e%4==0&&(e%100!=0||e%400==0)}function ye(e,t){for(var n=0,i=0;i<=t;n+=e[i++]);return n}var be=[31,29,31,30,31,30,31,31,30,31,30,31],Me=[31,28,31,30,31,30,31,31,30,31,30,31];function xe(e,t){for(var n=new Date(e.getTime());t>0;){var i=ve(n.getFullYear()),r=n.getMonth(),a=(i?be:Me)[r];if(!(t>a-n.getDate()))return n.setDate(n.getDate()+t),n;t-=a-n.getDate()+1,n.setDate(1),r<11?n.setMonth(r+1):(n.setMonth(0),n.setFullYear(n.getFullYear()+1))}return n}var _e=function(e,t,n,i){e||(e=this),this.parent=e,this.mount=e.mount,this.mounted=null,this.id=ge.nextInode++,this.name=t,this.mode=n,this.node_ops={},this.stream_ops={},this.rdev=i};function Se(e,t,n){var i=n>0?n:N(e)+1,r=new Array(i),a=k(e,r,0,r.length);return t&&(r.length=a),r}Object.defineProperties(_e.prototype,{read:{get:function(){return 365==(365&this.mode)},set:function(e){e?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146==(146&this.mode)},set:function(e){e?this.mode|=146:this.mode&=-147}},isFolder:{get:function(){return ge.isDir(this.mode)}},isDevice:{get:function(){return ge.isChrdev(this.mode)}}}),ge.FSNode=_e,ge.staticInit();var we,Le={d:function(e){return Ee(e+16)+16},c:function(e,t,n){throw new se(e).init(t,n),e},f:function(e,t){Q("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},i:function(e,t){Q("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},a:function(){Q("")},b:function(e,t){var n;if(0===e)n=Date.now();else{if(1!==e&&4!==e)return V[Te()>>2]=28,-1;n=re()}return V[t>>2]=n/1e3|0,V[t+4>>2]=n%1e3*1e3*1e3|0,0},o:function(){return 2147483648},g:re,h:function(e,t,n){A.copyWithin(e,t,t+n)},n:function(e){var t,n=A.length,i=2147483648;if((e>>>=0)>i)return!1;for(var r=1;r<=4;r*=2){var a=n*(1+.2/r);if(a=Math.min(a,e+100663296),ce(Math.min(i,((t=Math.max(e,a))%65536>0&&(t+=65536-t%65536),t))))return!0}return!1},p:function(e,t){var n=0;return ue().forEach((function(i,r){var a=t+n;V[e+4*r>>2]=a,function(e,t,n){for(var i=0;i>0]=e.charCodeAt(i);z[t>>0]=0}(i,a),n+=i.length+1})),0},q:function(e,t){var n=ue();V[e>>2]=n.length;var i=0;return n.forEach((function(e){i+=e.length+1})),V[t>>2]=i,0},s:function(e){!function(e,t){var n;W(),n=e,W()||(s.onExit&&s.onExit(n),H=!0),v(n,new Ae(n))}(e)},j:function(e){try{var t=Ce.getStreamFromFD(e);return ge.close(t),0}catch(e){if(void 0===ge||!(e instanceof ge.ErrnoError))throw e;return e.errno}},r:function(e,t,n,i){try{var r=Ce.getStreamFromFD(e),a=Ce.doReadv(r,t,n);return V[i>>2]=a,0}catch(e){if(void 0===ge||!(e instanceof ge.ErrnoError))throw e;return e.errno}},k:function(e,t,n,i,r){try{var a=Ce.getStreamFromFD(e),o=4294967296*n+(t>>>0),s=9007199254740992;return o<=-s||o>=s?-61:(ge.llseek(a,o,i),X=[a.position>>>0,(q=a.position,+Math.abs(q)>=1?q>0?(0|Math.min(+Math.floor(q/4294967296),4294967295))>>>0:~~+Math.ceil((q-+(~~q>>>0))/4294967296)>>>0:0)],V[r>>2]=X[0],V[r+4>>2]=X[1],a.getdents&&0===o&&0===i&&(a.getdents=null),0)}catch(e){if(void 0===ge||!(e instanceof ge.ErrnoError))throw e;return e.errno}},e:function(e,t,n,i){try{var r=Ce.getStreamFromFD(e),a=Ce.doWritev(r,t,n);return V[i>>2]=a,0}catch(e){if(void 0===ge||!(e instanceof ge.ErrnoError))throw e;return e.errno}},l:function e(t,n){e.randomDevice||(e.randomDevice=he());for(var i=0;i>0]=e.randomDevice();return 0},m:function(e,t,n,i){return function(e,t,n,i){var r=V[i+40>>2],a={tm_sec:V[i>>2],tm_min:V[i+4>>2],tm_hour:V[i+8>>2],tm_mday:V[i+12>>2],tm_mon:V[i+16>>2],tm_year:V[i+20>>2],tm_wday:V[i+24>>2],tm_yday:V[i+28>>2],tm_isdst:V[i+32>>2],tm_gmtoff:V[i+36>>2],tm_zone:r?I(r):""},o=I(n),s={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var c in s)o=o.replace(new RegExp(c,"g"),s[c]);var l=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],u=["January","February","March","April","May","June","July","August","September","October","November","December"];function d(e,t,n){for(var i="number"==typeof e?e.toString():e||"";i.length0?1:0}var i;return 0===(i=n(e.getFullYear()-t.getFullYear()))&&0===(i=n(e.getMonth()-t.getMonth()))&&(i=n(e.getDate()-t.getDate())),i}function p(e){switch(e.getDay()){case 0:return new Date(e.getFullYear()-1,11,29);case 1:return e;case 2:return new Date(e.getFullYear(),0,3);case 3:return new Date(e.getFullYear(),0,2);case 4:return new Date(e.getFullYear(),0,1);case 5:return new Date(e.getFullYear()-1,11,31);case 6:return new Date(e.getFullYear()-1,11,30)}}function m(e){var t=xe(new Date(e.tm_year+1900,0,1),e.tm_yday),n=new Date(t.getFullYear(),0,4),i=new Date(t.getFullYear()+1,0,4),r=p(n),a=p(i);return f(r,t)<=0?f(a,t)<=0?t.getFullYear()+1:t.getFullYear():t.getFullYear()-1}var g={"%a":function(e){return l[e.tm_wday].substring(0,3)},"%A":function(e){return l[e.tm_wday]},"%b":function(e){return u[e.tm_mon].substring(0,3)},"%B":function(e){return u[e.tm_mon]},"%C":function(e){return h((e.tm_year+1900)/100|0,2)},"%d":function(e){return h(e.tm_mday,2)},"%e":function(e){return d(e.tm_mday,2," ")},"%g":function(e){return m(e).toString().substring(2)},"%G":function(e){return m(e)},"%H":function(e){return h(e.tm_hour,2)},"%I":function(e){var t=e.tm_hour;return 0==t?t=12:t>12&&(t-=12),h(t,2)},"%j":function(e){return h(e.tm_mday+ye(ve(e.tm_year+1900)?be:Me,e.tm_mon-1),3)},"%m":function(e){return h(e.tm_mon+1,2)},"%M":function(e){return h(e.tm_min,2)},"%n":function(){return"\n"},"%p":function(e){return e.tm_hour>=0&&e.tm_hour<12?"AM":"PM"},"%S":function(e){return h(e.tm_sec,2)},"%t":function(){return"\t"},"%u":function(e){return e.tm_wday||7},"%U":function(e){var t=new Date(e.tm_year+1900,0,1),n=0===t.getDay()?t:xe(t,7-t.getDay()),i=new Date(e.tm_year+1900,e.tm_mon,e.tm_mday);if(f(n,i)<0){var r=ye(ve(i.getFullYear())?be:Me,i.getMonth()-1)-31,a=31-n.getDate()+r+i.getDate();return h(Math.ceil(a/7),2)}return 0===f(n,t)?"01":"00"},"%V":function(e){var t,n=new Date(e.tm_year+1900,0,4),i=new Date(e.tm_year+1901,0,4),r=p(n),a=p(i),o=xe(new Date(e.tm_year+1900,0,1),e.tm_yday);return f(o,r)<0?"53":f(a,o)<=0?"01":(t=r.getFullYear()=0;return t=(t=Math.abs(t)/60)/60*100+t%60,(n?"+":"-")+String("0000"+t).slice(-4)},"%Z":function(e){return e.tm_zone},"%%":function(){return"%"}};for(var c in g)o.includes(c)&&(o=o.replace(new RegExp(c,"g"),g[c](a)));var C=Se(o,!1);return C.length>t?0:(function(e,t){z.set(e,t)}(C,e),C.length-1)}(e,t,n,i)}},Ee=(function(){var e={a:Le};function t(e,t){var n,i=e.exports;s.asm=i,D((L=s.asm.t).buffer),O=s.asm.H,n=s.asm.u,F.unshift(n),Z()}function n(e){t(e.instance)}function i(t){return function(){if(!_&&(y||b)){if("function"==typeof fetch&&!te(G))return fetch(G,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+G+"'";return e.arrayBuffer()})).catch((function(){return ne(G)}));if(u)return new Promise((function(e,t){u(G,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return ne(G)}))}().then((function(t){return WebAssembly.instantiate(t,e)})).then((function(e){return e})).then(t,(function(e){w("failed to asynchronously prepare wasm: "+e),Q(e)}))}if(K(),s.instantiateWasm)try{return s.instantiateWasm(e,t)}catch(e){return w("Module.instantiateWasm callback failed with error: "+e),!1}(_||"function"!=typeof WebAssembly.instantiateStreaming||ee(G)||te(G)||"function"!=typeof fetch?i(n):fetch(G,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,e).then(n,(function(e){return w("wasm streaming compile failed: "+e),w("falling back to ArrayBuffer instantiation"),i(n)}))}))).catch(o)}(),s.___wasm_call_ctors=function(){return(s.___wasm_call_ctors=s.asm.u).apply(null,arguments)},s._initPoseDetectorModelBuffer=function(){return(s._initPoseDetectorModelBuffer=s.asm.v).apply(null,arguments)},s._getPoseDetectorModelBufferAddress=function(){return(s._getPoseDetectorModelBufferAddress=s.asm.w).apply(null,arguments)},s._loadPoseDetectorModel=function(){return(s._loadPoseDetectorModel=s.asm.x).apply(null,arguments)},s._initPoseLandmarkModelBuffer=function(){return(s._initPoseLandmarkModelBuffer=s.asm.y).apply(null,arguments)},s._getPoseLandmarkModelBufferAddress=function(){return(s._getPoseLandmarkModelBufferAddress=s.asm.z).apply(null,arguments)},s._loadPoseLandmarkModel=function(){return(s._loadPoseLandmarkModel=s.asm.A).apply(null,arguments)},s._initPoseInputBuffer=function(){return(s._initPoseInputBuffer=s.asm.B).apply(null,arguments)},s._getPoseInputBufferAddress=function(){return(s._getPoseInputBufferAddress=s.asm.C).apply(null,arguments)},s._getPoseOutputBufferAddress=function(){return(s._getPoseOutputBufferAddress=s.asm.D).apply(null,arguments)},s._getPoseTemporaryBufferAddress=function(){return(s._getPoseTemporaryBufferAddress=s.asm.E).apply(null,arguments)},s._execPose=function(){return(s._execPose=s.asm.F).apply(null,arguments)},s._set_pose_calculate_mode=function(){return(s._set_pose_calculate_mode=s.asm.G).apply(null,arguments)},s._initPalmDetectorModelBuffer=function(){return(s._initPalmDetectorModelBuffer=s.asm.I).apply(null,arguments)},s._getPalmDetectorModelBufferAddress=function(){return(s._getPalmDetectorModelBufferAddress=s.asm.J).apply(null,arguments)},s._loadPalmDetectorModel=function(){return(s._loadPalmDetectorModel=s.asm.K).apply(null,arguments)},s._initHandLandmarkModelBuffer=function(){return(s._initHandLandmarkModelBuffer=s.asm.L).apply(null,arguments)},s._getHandLandmarkModelBufferAddress=function(){return(s._getHandLandmarkModelBufferAddress=s.asm.M).apply(null,arguments)},s._loadHandLandmarkModel=function(){return(s._loadHandLandmarkModel=s.asm.N).apply(null,arguments)},s._initHandInputBuffer=function(){return(s._initHandInputBuffer=s.asm.O).apply(null,arguments)},s._getHandInputBufferAddress=function(){return(s._getHandInputBufferAddress=s.asm.P).apply(null,arguments)},s._getHandOutputBufferAddress=function(){return(s._getHandOutputBufferAddress=s.asm.Q).apply(null,arguments)},s._getHandTemporaryBufferAddress=function(){return(s._getHandTemporaryBufferAddress=s.asm.R).apply(null,arguments)},s._execHand=function(){return(s._execHand=s.asm.S).apply(null,arguments)},s._initFaceDetectorModelBuffer=function(){return(s._initFaceDetectorModelBuffer=s.asm.T).apply(null,arguments)},s._getFaceDetectorModelBufferAddress=function(){return(s._getFaceDetectorModelBufferAddress=s.asm.U).apply(null,arguments)},s._loadFaceDetectorModel=function(){return(s._loadFaceDetectorModel=s.asm.V).apply(null,arguments)},s._initFaceLandmarkModelBuffer=function(){return(s._initFaceLandmarkModelBuffer=s.asm.W).apply(null,arguments)},s._getFaceLandmarkModelBufferAddress=function(){return(s._getFaceLandmarkModelBufferAddress=s.asm.X).apply(null,arguments)},s._loadFaceLandmarkModel=function(){return(s._loadFaceLandmarkModel=s.asm.Y).apply(null,arguments)},s._initFaceInputBuffer=function(){return(s._initFaceInputBuffer=s.asm.Z).apply(null,arguments)},s._getFaceInputBufferAddress=function(){return(s._getFaceInputBufferAddress=s.asm._).apply(null,arguments)},s._getFaceOutputBufferAddress=function(){return(s._getFaceOutputBufferAddress=s.asm.$).apply(null,arguments)},s._getFaceTemporaryBufferAddress=function(){return(s._getFaceTemporaryBufferAddress=s.asm.aa).apply(null,arguments)},s._execFace=function(){return(s._execFace=s.asm.ba).apply(null,arguments)},s._malloc=function(){return(Ee=s._malloc=s.asm.ca).apply(null,arguments)}),Te=s.___errno_location=function(){return(Te=s.___errno_location=s.asm.da).apply(null,arguments)},ze=s._memalign=function(){return(ze=s._memalign=s.asm.ea).apply(null,arguments)};function Ae(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function Ve(e){function n(){we||(we=!0,s.calledRun=!0,H||(s.noFSInit||ge.init.initialized||ge.init(),ge.ignorePermissions=!1,pe.init(),ie(F),t(s),s.onRuntimeInitialized&&s.onRuntimeInitialized(),function(){if(s.postRun)for("function"==typeof s.postRun&&(s.postRun=[s.postRun]);s.postRun.length;)e=s.postRun.shift(),U.unshift(e);var e;ie(U)}()))}e=e||g,Y>0||(function(){if(s.preRun)for("function"==typeof s.preRun&&(s.preRun=[s.preRun]);s.preRun.length;)e=s.preRun.shift(),B.unshift(e);var e;ie(B)}(),Y>0||(s.setStatus?(s.setStatus("Running..."),setTimeout((function(){setTimeout((function(){s.setStatus("")}),1),n()}),1)):n()))}if($=function e(){we||Ve(),we||($=e)},s.run=Ve,s.preInit)for("function"==typeof s.preInit&&(s.preInit=[s.preInit]);s.preInit.length>0;)s.preInit.pop()();return Ve(),e.ready});e.exports=o},363:e=>{"use strict";e.exports=n(363)},102:e=>{"use strict";e.exports=n(102)},914:e=>{"use strict";e.exports=n(914)},583:e=>{"use strict";e.exports=n(583)},180:e=>{"use strict";e.exports=n(180)},747:e=>{"use strict";e.exports=n(747)},81:e=>{"use strict";e.exports=n(81)},782:()=>{},384:()=>{},375:()=>{}},t={};function i(n){var r=t[n];if(void 0!==r)return r.exports;var a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,i),a.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};return(()=>{"use strict";i.r(a),i.d(a,{FingerLookupIndices:()=>r,MediapipeMix2WorkerManager:()=>v,NUM_KEYPOINTS:()=>l,OperationType:()=>t,PartsLookupIndices:()=>n,RefinedLeftEyePoints:()=>h,RefinedLeftIrisPoints:()=>p,RefinedLipPoints:()=>d,RefinedPoints:()=>g,RefinedRightEyePoints:()=>f,RefinedRightIrisPoints:()=>m,TRIANGULATION:()=>u});var e=i(55);const t={hand:"hand",face:"face",pose:"pose"},n={leftEye:[0,1,2,3,7],rightEye:[0,4,5,6,8],mouth:[9,10],body:[11,12,24,23,11],leftArm:[11,13,15],leftThum:[15,21],leftIndex:[15,19],leftPinly:[15,17],rightArm:[12,14,16],rightThum:[16,22],rightIndex:[16,20],rightPinly:[16,18],leftLeg:[23,25,27],leftFoot:[27,29,31],rightLeg:[24,26,28],rightFoot:[28,30,32]},r={thumb:[0,1,2,3,4],indexFinger:[0,5,6,7,8],middleFinger:[0,9,10,11,12],ringFinger:[0,13,14,15,16],pinky:[0,17,18,19,20]};var o=i(477),s=i.n(o);function c(){return s()('/*! For license information please see index.worker.js.LICENSE.txt */\n(()=>{var t={252:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BlockingQueue=void 0;var r=function(){function t(){this._resolvers=[],this._promises=[]}return t.prototype._add=function(){var t=this;this._promises.push(new Promise((function(e){t._resolvers.push(e)})))},t.prototype.enqueue=function(t){this._resolvers.length||this._add(),this._resolvers.shift()(t)},t.prototype.dequeue=function(){return this._promises.length||this._add(),this._promises.shift()},t.prototype.isEmpty=function(){return!this._promises.length},t.prototype.isBlocked=function(){return!!this._resolvers.length},Object.defineProperty(t.prototype,"length",{get:function(){return this._promises.length-this._resolvers.length},enumerable:!1,configurable:!0}),t}();e.BlockingQueue=r},289:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getBrowserType=e.BrowserTypes=void 0,e.BrowserTypes={MSIE:"MSIE",EDGE:"EDGE",CHROME:"CHROME",SAFARI:"SAFARI",FIREFOX:"FIREFOX",OPERA:"OPERA",OTHER:"OTHER"},e.getBrowserType=function(){var t=window.navigator.userAgent.toLowerCase();return-1!==t.indexOf("msie")||-1!==t.indexOf("trident")?e.BrowserTypes.MSIE:-1!==t.indexOf("edge")?e.BrowserTypes.EDGE:-1!==t.indexOf("chrome")?e.BrowserTypes.CHROME:-1!==t.indexOf("safari")?e.BrowserTypes.SAFARI:-1!==t.indexOf("firefox")?e.BrowserTypes.FIREFOX:-1!==t.indexOf("opera")?e.BrowserTypes.OPERA:e.BrowserTypes.OTHER}},187:function(t,e,r){"use strict";var n=r(764).lW,o=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function s(t){try{u(n.next(t))}catch(t){i(t)}}function a(t){try{u(n.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}u((n=n.apply(t,e||[])).next())}))},i=this&&this.__generator||function(t,e){var r,n,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;s;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,n=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]100)throw new Error("queue is fulled: ".concat(this.sem.length));return[4,this.lock()];case 1:t=i.sent(),o=new Promise((function(t,o){if(!f.worker)throw new Error("worker is not activated.");f.worker.onmessage=function(e){e.data.message===u.WorkerResponse.PREDICTED?t(e.data.prediction):(console.log("Prediction something wrong..",e.data.message),o(e))},n?r instanceof Uint8ClampedArray?f.worker.postMessage({message:u.WorkerCommand.PREDICT,params:e,data:r},[r.buffer]):f.worker.postMessage({message:u.WorkerCommand.PREDICT,params:e,data:r},[r]):f.worker.postMessage({message:u.WorkerCommand.PREDICT,params:e,data:r})})),i.label=2;case 2:return i.trys.push([2,4,5,6]),[4,o];case 3:return s=i.sent(),[3,6];case 4:return a=i.sent(),console.log("worker prediction error. :",a),[3,6];case 5:return this.unlock(t),[7];case 6:return[2,s]}}))}))},this.useWorker=function(t){return!t.processOnLocal&&(!1!==t.useWorkerForSafari||(0,a.getBrowserType)()!==a.BrowserTypes.SAFARI)},this.fetchData=function(e){return o(t,void 0,void 0,(function(){var t;return i(this,(function(r){switch(r.label){case 0:return e.startsWith("data:")?(t=e.split(",")[1],[2,n.from(t,"base64")]):[4,fetch(e,{method:"GET"})];case 1:return[4,r.sent().arrayBuffer()];case 2:return[2,r.sent()]}}))}))},this.sem.enqueue(0)};e.WorkerDispatcher=function(t){var e=this;this.imageProcessor=null,this.config=null,this.callbacks=null,this.setCallback=function(t){e.callbacks=t},this.dispach=function(t){return o(e,void 0,void 0,(function(){var e,r,n,o;return i(this,(function(i){switch(i.label){case 0:return this.callbacks?t.data.message!==u.WorkerCommand.INITIALIZE?[3,2]:(this.config=t.data.config,e=this,[4,this.callbacks.init(this.config)]):(console.warn("[worker] Dispatcher callbacks is not initialized"),[2]);case 1:return e.imageProcessor=i.sent(),this.context.postMessage({message:u.WorkerResponse.INITIALIZED}),console.log("[worker] Initialized"),[3,4];case 2:return t.data.message!==u.WorkerCommand.PREDICT?[3,4]:this.imageProcessor?this.config?(r=t.data.params,n=t.data.data,[4,this.imageProcessor.predict(this.config,r,n)]):(console.warn("[worker] Dispatcher config is not initialized"),[2]):(console.warn("[worker] ImageProcessor is not initialized"),[2]);case 3:o=i.sent(),this.context.postMessage({message:u.WorkerResponse.PREDICTED,prediction:o}),i.label=4;case 4:return[2]}}))}))},this.context=t}},301:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WorkerResponse=e.WorkerCommand=void 0,e.WorkerCommand={INITIALIZE:"initialize",PREDICT:"predict"},e.WorkerResponse={INITIALIZED:"initialized",PREDICTED:"predicted"}},55:function(t,e,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||n(e,t,r)};Object.defineProperty(e,"__esModule",{value:!0}),o(r(187),e),o(r(289),e)},742:(t,e)=>{"use strict";e.byteLength=function(t){var e=u(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function(t){var e,r,i=u(t),s=i[0],a=i[1],f=new o(function(t,e,r){return 3*(e+r)/4-r}(0,s,a)),l=0,c=a>0?s-4:s;for(r=0;r>16&255,f[l++]=e>>8&255,f[l++]=255&e;return 2===a&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,f[l++]=255&e),1===a&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,f[l++]=e>>8&255,f[l++]=255&e),f},e.fromByteArray=function(t){for(var e,n=t.length,o=n%3,i=[],s=16383,a=0,u=n-o;au?u:a+s));return 1===o?(e=t[n-1],i.push(r[e>>2]+r[e<<4&63]+"==")):2===o&&(e=(t[n-2]<<8)+t[n-1],i.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+"=")),i.join("")};for(var r=[],n=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,a=i.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function f(t,e,n){for(var o,i,s=[],a=e;a>18&63]+r[i>>12&63]+r[i>>6&63]+r[63&i]);return s.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},764:(t,e,r)=>{"use strict";const n=r(742),o=r(645),i="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;e.lW=u,e.h2=50;const s=2147483647;function a(t){if(t>s)throw new RangeError(\'The value "\'+t+\'" is invalid for option "size"\');const e=new Uint8Array(t);return Object.setPrototypeOf(e,u.prototype),e}function u(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError(\'The "string" argument must be of type string. Received type number\');return c(t)}return f(t,e,r)}function f(t,e,r){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!u.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const r=0|m(t,e);let n=a(r);const o=n.write(t,e);return o!==r&&(n=n.slice(0,o)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(G(t,Uint8Array)){const e=new Uint8Array(t);return h(e.buffer,e.byteOffset,e.byteLength)}return d(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(G(t,ArrayBuffer)||t&&G(t.buffer,ArrayBuffer))return h(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(G(t,SharedArrayBuffer)||t&&G(t.buffer,SharedArrayBuffer)))return h(t,e,r);if("number"==typeof t)throw new TypeError(\'The "value" argument must not be of type number. Received type number\');const n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return u.from(n,e,r);const o=function(t){if(u.isBuffer(t)){const e=0|p(t.length),r=a(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?"number"!=typeof t.length||V(t.length)?a(0):d(t):"Buffer"===t.type&&Array.isArray(t.data)?d(t.data):void 0}(t);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return u.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function l(t){if("number"!=typeof t)throw new TypeError(\'"size" argument must be of type number\');if(t<0)throw new RangeError(\'The value "\'+t+\'" is invalid for option "size"\')}function c(t){return l(t),a(t<0?0:0|p(t))}function d(t){const e=t.length<0?0:0|p(t.length),r=a(e);for(let n=0;n=s)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s.toString(16)+" bytes");return 0|t}function m(t,e){if(u.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||G(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError(\'The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type \'+typeof t);const r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let o=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return X(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return $(t).length;default:if(o)return n?-1:X(t).length;e=(""+e).toLowerCase(),o=!0}}function y(t,e,r){let n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return I(this,e,r);case"utf8":case"utf-8":return B(this,e,r);case"ascii":return M(this,e,r);case"latin1":case"binary":return D(this,e,r);case"base64":return P(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return x(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function g(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function w(t,e,r,n,o){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),V(r=+r)&&(r=o?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(o)return-1;r=t.length-1}else if(r<0){if(!o)return-1;r=0}if("string"==typeof e&&(e=u.from(e,n)),u.isBuffer(e))return 0===e.length?-1:E(t,e,r,n,o);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):E(t,[e],r,n,o);throw new TypeError("val must be string, number or Buffer")}function E(t,e,r,n,o){let i,s=1,a=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,a/=2,u/=2,r/=2}function f(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(o){let n=-1;for(i=r;ia&&(r=a-u),i=r;i>=0;i--){let r=!0;for(let n=0;no&&(n=o):n=o;const i=e.length;let s;for(n>i/2&&(n=i/2),s=0;s>8,o=r%256,i.push(o),i.push(n);return i}(e,t.length-r),t,r,n)}function P(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function B(t,e,r){r=Math.min(t.length,r);const n=[];let o=e;for(;o239?4:e>223?3:e>191?2:1;if(o+s<=r){let r,n,a,u;switch(s){case 1:e<128&&(i=e);break;case 2:r=t[o+1],128==(192&r)&&(u=(31&e)<<6|63&r,u>127&&(i=u));break;case 3:r=t[o+1],n=t[o+2],128==(192&r)&&128==(192&n)&&(u=(15&e)<<12|(63&r)<<6|63&n,u>2047&&(u<55296||u>57343)&&(i=u));break;case 4:r=t[o+1],n=t[o+2],a=t[o+3],128==(192&r)&&128==(192&n)&&128==(192&a)&&(u=(15&e)<<18|(63&r)<<12|(63&n)<<6|63&a,u>65535&&u<1114112&&(i=u))}}null===i?(i=65533,s=1):i>65535&&(i-=65536,n.push(i>>>10&1023|55296),i=56320|1023&i),n.push(i),o+=s}return function(t){const e=t.length;if(e<=F)return String.fromCharCode.apply(String,t);let r="",n=0;for(;nn.length?(u.isBuffer(e)||(e=u.from(e)),e.copy(n,o)):Uint8Array.prototype.set.call(n,e,o);else{if(!u.isBuffer(e))throw new TypeError(\'"list" argument must be an Array of Buffers\');e.copy(n,o)}o+=e.length}return n},u.byteLength=m,u.prototype._isBuffer=!0,u.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;er&&(t+=" ... "),""},i&&(u.prototype[i]=u.prototype.inspect),u.prototype.compare=function(t,e,r,n,o){if(G(t,Uint8Array)&&(t=u.from(t,t.offset,t.byteLength)),!u.isBuffer(t))throw new TypeError(\'The "target" argument must be one of type Buffer or Uint8Array. Received type \'+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),e<0||r>t.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&e>=r)return 0;if(n>=o)return-1;if(e>=r)return 1;if(this===t)return 0;let i=(o>>>=0)-(n>>>=0),s=(r>>>=0)-(e>>>=0);const a=Math.min(i,s),f=this.slice(n,o),l=t.slice(e,r);for(let t=0;t>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const o=this.length-e;if((void 0===r||r>o)&&(r=o),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let i=!1;for(;;)switch(n){case"hex":return v(this,t,e,r);case"utf8":case"utf-8":return _(this,t,e,r);case"ascii":case"latin1":case"binary":return b(this,t,e,r);case"base64":return A(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return k(this,t,e,r);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const F=4096;function M(t,e,r){let n="";r=Math.min(t.length,r);for(let o=e;on)&&(r=n);let o="";for(let n=e;nr)throw new RangeError("Trying to access beyond buffer length")}function O(t,e,r,n,o,i){if(!u.isBuffer(t))throw new TypeError(\'"buffer" argument must be a Buffer instance\');if(e>o||et.length)throw new RangeError("Index out of range")}function H(t,e,r,n,o){j(e,n,o,t,r,7);let i=Number(e&BigInt(4294967295));t[r++]=i,i>>=8,t[r++]=i,i>>=8,t[r++]=i,i>>=8,t[r++]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,r}function S(t,e,r,n,o){j(e,n,o,t,r,7);let i=Number(e&BigInt(4294967295));t[r+7]=i,i>>=8,t[r+6]=i,i>>=8,t[r+5]=i,i>>=8,t[r+4]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=s,s>>=8,t[r+2]=s,s>>=8,t[r+1]=s,s>>=8,t[r]=s,r+8}function T(t,e,r,n,o,i){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function L(t,e,r,n,i){return e=+e,r>>>=0,i||T(t,0,r,4),o.write(t,e,r,n,23,4),r+4}function U(t,e,r,n,i){return e=+e,r>>>=0,i||T(t,0,r,8),o.write(t,e,r,n,52,8),r+8}u.prototype.slice=function(t,e){const r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],o=1,i=0;for(;++i>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t+--e],o=1;for(;e>0&&(o*=256);)n+=this[t+--e]*o;return n},u.prototype.readUint8=u.prototype.readUInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),this[t]},u.prototype.readUint16LE=u.prototype.readUInt16LE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUint16BE=u.prototype.readUInt16BE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUint32LE=u.prototype.readUInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUint32BE=u.prototype.readUInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readBigUInt64LE=J((function(t){W(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Y(t,this.length-8);const n=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,o=this[++t]+256*this[++t]+65536*this[++t]+r*2**24;return BigInt(n)+(BigInt(o)<>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Y(t,this.length-8);const n=e*2**24+65536*this[++t]+256*this[++t]+this[++t],o=this[++t]*2**24+65536*this[++t]+256*this[++t]+r;return(BigInt(n)<>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],o=1,i=0;for(;++i=o&&(n-=Math.pow(2,8*e)),n},u.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=e,o=1,i=this[t+--n];for(;n>0&&(o*=256);)i+=this[t+--n]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},u.prototype.readInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt16BE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readBigInt64LE=J((function(t){W(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Y(t,this.length-8);const n=this[t+4]+256*this[t+5]+65536*this[t+6]+(r<<24);return(BigInt(n)<>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Y(t,this.length-8);const n=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(n)<>>=0,e||R(t,4,this.length),o.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return t>>>=0,e||R(t,4,this.length),o.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return t>>>=0,e||R(t,8,this.length),o.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return t>>>=0,e||R(t,8,this.length),o.read(this,t,!1,52,8)},u.prototype.writeUintLE=u.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||O(this,t,e,r,Math.pow(2,8*r)-1,0);let o=1,i=0;for(this[e]=255&t;++i>>=0,r>>>=0,n||O(this,t,e,r,Math.pow(2,8*r)-1,0);let o=r-1,i=1;for(this[e+o]=255&t;--o>=0&&(i*=256);)this[e+o]=t/i&255;return e+r},u.prototype.writeUint8=u.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,1,255,0),this[e]=255&t,e+1},u.prototype.writeUint16LE=u.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},u.prototype.writeUint16BE=u.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},u.prototype.writeUint32LE=u.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},u.prototype.writeUint32BE=u.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},u.prototype.writeBigUInt64LE=J((function(t,e=0){return H(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),u.prototype.writeBigUInt64BE=J((function(t,e=0){return S(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),u.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);O(this,t,e,r,n-1,-n)}let o=0,i=1,s=0;for(this[e]=255&t;++o>0)-s&255;return e+r},u.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);O(this,t,e,r,n-1,-n)}let o=r-1,i=1,s=0;for(this[e+o]=255&t;--o>=0&&(i*=256);)t<0&&0===s&&0!==this[e+o+1]&&(s=1),this[e+o]=(t/i>>0)-s&255;return e+r},u.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},u.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},u.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},u.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},u.prototype.writeBigInt64LE=J((function(t,e=0){return H(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),u.prototype.writeBigInt64BE=J((function(t,e=0){return S(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),u.prototype.writeFloatLE=function(t,e,r){return L(this,t,e,!0,r)},u.prototype.writeFloatBE=function(t,e,r){return L(this,t,e,!1,r)},u.prototype.writeDoubleLE=function(t,e,r){return U(this,t,e,!0,r)},u.prototype.writeDoubleBE=function(t,e,r){return U(this,t,e,!1,r)},u.prototype.copy=function(t,e,r,n){if(!u.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o=n+4;r-=3)e=`_${t.slice(r-3,r)}${e}`;return`${t.slice(0,r)}${e}`}function j(t,e,r,n,o,i){if(t>r||t3?0===e||e===BigInt(0)?`>= 0${n} and < 2${n} ** ${8*(i+1)}${n}`:`>= -(2${n} ** ${8*(i+1)-1}${n}) and < 2 ** ${8*(i+1)-1}${n}`:`>= ${e}${n} and <= ${r}${n}`,new C.ERR_OUT_OF_RANGE("value",o,t)}!function(t,e,r){W(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||Y(e,t.length-(r+1))}(n,o,i)}function W(t,e){if("number"!=typeof t)throw new C.ERR_INVALID_ARG_TYPE(e,"number",t)}function Y(t,e,r){if(Math.floor(t)!==t)throw W(t,r),new C.ERR_OUT_OF_RANGE(r||"offset","an integer",t);if(e<0)throw new C.ERR_BUFFER_OUT_OF_BOUNDS;throw new C.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${e}`,t)}N("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),N("ERR_INVALID_ARG_TYPE",(function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`}),TypeError),N("ERR_OUT_OF_RANGE",(function(t,e,r){let n=`The value of "${t}" is out of range.`,o=r;return Number.isInteger(r)&&Math.abs(r)>2**32?o=z(String(r)):"bigint"==typeof r&&(o=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(o=z(o)),o+="n"),n+=` It must be ${e}. Received ${o}`,n}),RangeError);const K=/[^+/0-9A-Za-z-_]/g;function X(t,e){let r;e=e||1/0;const n=t.length;let o=null;const i=[];for(let s=0;s55295&&r<57344){if(!o){if(r>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&i.push(239,191,189);continue}o=r;continue}if(r<56320){(e-=3)>-1&&i.push(239,191,189),o=r;continue}r=65536+(o-55296<<10|r-56320)}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,r<128){if((e-=1)<0)break;i.push(r)}else if(r<2048){if((e-=2)<0)break;i.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function $(t){return n.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(K,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function q(t,e,r,n){let o;for(o=0;o=e.length||o>=t.length);++o)e[o+r]=t[o];return o}function G(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function V(t){return t!=t}const Z=function(){const t="0123456789abcdef",e=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let o=0;o<16;++o)e[n+o]=t[r]+t[o]}return e}();function J(t){return"undefined"==typeof BigInt?Q:t}function Q(){throw new Error("BigInt not supported")}},645:(t,e)=>{e.read=function(t,e,r,n,o){var i,s,a=8*o-n-1,u=(1<>1,l=-7,c=r?o-1:0,d=r?-1:1,h=t[e+c];for(c+=d,i=h&(1<<-l)-1,h>>=-l,l+=a;l>0;i=256*i+t[e+c],c+=d,l-=8);for(s=i&(1<<-l)-1,i>>=-l,l+=n;l>0;s=256*s+t[e+c],c+=d,l-=8);if(0===i)i=1-f;else{if(i===u)return s?NaN:1/0*(h?-1:1);s+=Math.pow(2,n),i-=f}return(h?-1:1)*s*Math.pow(2,i-n)},e.write=function(t,e,r,n,o,i){var s,a,u,f=8*i-o-1,l=(1<>1,d=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=n?0:i-1,p=n?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=l):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+c>=1?d/u:d*Math.pow(2,1-c))*u>=2&&(s++,u/=2),s+c>=l?(a=0,s=l):s+c>=1?(a=(e*u-1)*Math.pow(2,o),s+=c):(a=e*Math.pow(2,c-1)*Math.pow(2,o),s=0));o>=8;t[r+h]=255&a,h+=p,a/=256,o-=8);for(s=s<0;t[r+h]=255&s,h+=p,s/=256,f-=8);t[r+h-p]|=128*m}},503:(t,e,r)=>{var n,o=r(764).lW,i=(n=(n="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0)||"/index.js",function(t){var e,i,s=void 0!==(t=t||{})?t:{},a=Object.assign;s.ready=new Promise((function(t,r){e=t,i=r}));var u,f,l,c,d,h,p=a({},s),m=[],y="./this.program",g=(t,e)=>{throw e},w="object"==typeof window,E="function"==typeof importScripts,v="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,_="";v?(_=E?r(375).dirname(_)+"/":"//",h=()=>{d||(c=r(384),d=r(375))},u=function(t,e){return h(),t=d.normalize(t),c.readFileSync(t,e?null:"utf8")},l=t=>{var e=u(t,!0);return e.buffer||(e=new Uint8Array(e)),e},f=(t,e,r)=>{h(),t=d.normalize(t),c.readFile(t,(function(t,n){t?r(t):e(n.buffer)}))},process.argv.length>1&&(y=process.argv[1].replace(/\\\\/g,"/")),m=process.argv.slice(2),process.on("uncaughtException",(function(t){if(!(t instanceof Dt))throw t})),process.on("unhandledRejection",(function(t){throw t})),g=(t,e)=>{if(j())throw process.exitCode=t,e;var r;(r=e)instanceof Dt||k("exiting due to exception: "+r),process.exit(t)},s.inspect=function(){return"[Emscripten Module object]"}):(w||E)&&(E?_=self.location.href:"undefined"!=typeof document&&document.currentScript&&(_=document.currentScript.src),n&&(_=n),_=0!==_.indexOf("blob:")?_.substr(0,_.replace(/[?#].*/,"").lastIndexOf("/")+1):"",u=t=>{var e=new XMLHttpRequest;return e.open("GET",t,!1),e.send(null),e.responseText},E&&(l=t=>{var e=new XMLHttpRequest;return e.open("GET",t,!1),e.responseType="arraybuffer",e.send(null),new Uint8Array(e.response)}),f=(t,e,r)=>{var n=new XMLHttpRequest;n.open("GET",t,!0),n.responseType="arraybuffer",n.onload=()=>{200==n.status||0==n.status&&n.response?e(n.response):r()},n.onerror=r,n.send(null)});var b,A=s.print||console.log.bind(console),k=s.printErr||console.warn.bind(console);a(s,p),p=null,s.arguments&&(m=s.arguments),s.thisProgram&&(y=s.thisProgram),s.quit&&(g=s.quit),s.wasmBinary&&(b=s.wasmBinary);var P,B=s.noExitRuntime||!0;"object"!=typeof WebAssembly&&J("no native wasm support detected");var F,M,D,I,x=!1,R="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function O(t,e,r){for(var n=e+r,o=e;t[o]&&!(o>=n);)++o;if(o-e>16&&t.subarray&&R)return R.decode(t.subarray(e,o));for(var i="";e>10,56320|1023&f)}}else i+=String.fromCharCode((31&s)<<6|a)}else i+=String.fromCharCode(s)}return i}function H(t,e){return t?O(D,t,e):""}function S(t,e,r,n){if(!(n>0))return 0;for(var o=r,i=r+n-1,s=0;s=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&t.charCodeAt(++s)),a<=127){if(r>=i)break;e[r++]=a}else if(a<=2047){if(r+1>=i)break;e[r++]=192|a>>6,e[r++]=128|63&a}else if(a<=65535){if(r+2>=i)break;e[r++]=224|a>>12,e[r++]=128|a>>6&63,e[r++]=128|63&a}else{if(r+3>=i)break;e[r++]=240|a>>18,e[r++]=128|a>>12&63,e[r++]=128|a>>6&63,e[r++]=128|63&a}}return e[r]=0,r-o}function T(t){for(var e=0,r=0;r=55296&&n<=57343&&(n=65536+((1023&n)<<10)|1023&t.charCodeAt(++r)),n<=127?++e:e+=n<=2047?2:n<=65535?3:4}return e}function L(t){F=t,s.HEAP8=M=new Int8Array(t),s.HEAP16=new Int16Array(t),s.HEAP32=I=new Int32Array(t),s.HEAPU8=D=new Uint8Array(t),s.HEAPU16=new Uint16Array(t),s.HEAPU32=new Uint32Array(t),s.HEAPF32=new Float32Array(t),s.HEAPF64=new Float64Array(t)}s.INITIAL_MEMORY;var U,C=[],N=[],z=[];function j(){return B||!1}var W,Y,K,X,$=0,q=null,G=null;function V(t){$++,s.monitorRunDependencies&&s.monitorRunDependencies($)}function Z(t){if($--,s.monitorRunDependencies&&s.monitorRunDependencies($),0==$&&(null!==q&&(clearInterval(q),q=null),G)){var e=G;G=null,e()}}function J(t){s.onAbort&&s.onAbort(t),k(t="Aborted("+t+")"),x=!0,t+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(t);throw i(e),e}function Q(t){return t.startsWith("data:application/octet-stream;base64,")}function tt(t){return t.startsWith("file://")}function et(t){try{if(t==W&&b)return new Uint8Array(b);if(l)return l(t);throw"both async and sync fetching of the wasm failed"}catch(t){J(t)}}function rt(t){for(;t.length>0;){var e=t.shift();if("function"!=typeof e){var r=e.func;"number"==typeof r?void 0===e.arg?it(r)():it(r)(e.arg):r(void 0===e.arg?null:e.arg)}else e(s)}}s.preloadedImages={},s.preloadedAudios={},Q(W="tflite-simd.wasm")||(Y=W,W=s.locateFile?s.locateFile(Y,_):_+Y);var nt,ot=[];function it(t){var e=ot[t];return e||(t>=ot.length&&(ot.length=t+1),ot[t]=e=U.get(t)),e}function st(t){this.excPtr=t,this.ptr=t-16,this.set_type=function(t){I[this.ptr+4>>2]=t},this.get_type=function(){return I[this.ptr+4>>2]},this.set_destructor=function(t){I[this.ptr+8>>2]=t},this.get_destructor=function(){return I[this.ptr+8>>2]},this.set_refcount=function(t){I[this.ptr>>2]=t},this.set_caught=function(t){t=t?1:0,M[this.ptr+12>>0]=t},this.get_caught=function(){return 0!=M[this.ptr+12>>0]},this.set_rethrown=function(t){t=t?1:0,M[this.ptr+13>>0]=t},this.get_rethrown=function(){return 0!=M[this.ptr+13>>0]},this.init=function(t,e){this.set_type(t),this.set_destructor(e),this.set_refcount(0),this.set_caught(!1),this.set_rethrown(!1)},this.add_ref=function(){var t=I[this.ptr>>2];I[this.ptr>>2]=t+1},this.release_ref=function(){var t=I[this.ptr>>2];return I[this.ptr>>2]=t-1,1===t}}function at(t){try{return P.grow(t-F.byteLength+65535>>>16),L(P.buffer),1}catch(t){}}nt=v?()=>{var t=process.hrtime();return 1e3*t[0]+t[1]/1e6}:()=>performance.now();var ut={};function ft(){if(!ft.strings){var t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:y||"./this.program"};for(var e in ut)void 0===ut[e]?delete t[e]:t[e]=ut[e];var r=[];for(var e in t)r.push(e+"="+t[e]);ft.strings=r}return ft.strings}var lt={splitPath:function(t){return/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/.exec(t).slice(1)},normalizeArray:function(t,e){for(var r=0,n=t.length-1;n>=0;n--){var o=t[n];"."===o?t.splice(n,1):".."===o?(t.splice(n,1),r++):r&&(t.splice(n,1),r--)}if(e)for(;r;r--)t.unshift("..");return t},normalize:function(t){var e="/"===t.charAt(0),r="/"===t.substr(-1);return(t=lt.normalizeArray(t.split("/").filter((function(t){return!!t})),!e).join("/"))||e||(t="."),t&&r&&(t+="/"),(e?"/":"")+t},dirname:function(t){var e=lt.splitPath(t),r=e[0],n=e[1];return r||n?(n&&(n=n.substr(0,n.length-1)),r+n):"."},basename:function(t){if("/"===t)return"/";var e=(t=(t=lt.normalize(t)).replace(/\\/$/,"")).lastIndexOf("/");return-1===e?t:t.substr(e+1)},extname:function(t){return lt.splitPath(t)[3]},join:function(){var t=Array.prototype.slice.call(arguments,0);return lt.normalize(t.join("/"))},join2:function(t,e){return lt.normalize(t+"/"+e)}};function ct(){if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues){var t=new Uint8Array(1);return function(){return crypto.getRandomValues(t),t[0]}}if(v)try{var e=r(782);return function(){return e.randomBytes(1)[0]}}catch(t){}return function(){J("randomDevice")}}var dt={resolve:function(){for(var t="",e=!1,r=arguments.length-1;r>=-1&&!e;r--){var n=r>=0?arguments[r]:mt.cwd();if("string"!=typeof n)throw new TypeError("Arguments to path.resolve must be strings");if(!n)return"";t=n+"/"+t,e="/"===n.charAt(0)}return(e?"/":"")+(t=lt.normalizeArray(t.split("/").filter((function(t){return!!t})),!e).join("/"))||"."},relative:function(t,e){function r(t){for(var e=0;e=0&&""===t[r];r--);return e>r?[]:t.slice(e,r-e+1)}t=dt.resolve(t).substr(1),e=dt.resolve(e).substr(1);for(var n=r(t.split("/")),o=r(e.split("/")),i=Math.min(n.length,o.length),s=i,a=0;a0?r.slice(0,n).toString("utf-8"):null}else"undefined"!=typeof window&&"function"==typeof window.prompt?null!==(e=window.prompt("Input: "))&&(e+="\\n"):"function"==typeof readline&&null!==(e=readline())&&(e+="\\n");if(!e)return null;t.input=At(e,!0)}return t.input.shift()},put_char:function(t,e){null===e||10===e?(A(O(t.output,0)),t.output=[]):0!=e&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&(A(O(t.output,0)),t.output=[])}},default_tty1_ops:{put_char:function(t,e){null===e||10===e?(k(O(t.output,0)),t.output=[]):0!=e&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&(k(O(t.output,0)),t.output=[])}}};var pt={ops_table:null,mount:function(t){return pt.createNode(null,"/",16895,0)},createNode:function(t,e,r,n){if(mt.isBlkdev(r)||mt.isFIFO(r))throw new mt.ErrnoError(63);pt.ops_table||(pt.ops_table={dir:{node:{getattr:pt.node_ops.getattr,setattr:pt.node_ops.setattr,lookup:pt.node_ops.lookup,mknod:pt.node_ops.mknod,rename:pt.node_ops.rename,unlink:pt.node_ops.unlink,rmdir:pt.node_ops.rmdir,readdir:pt.node_ops.readdir,symlink:pt.node_ops.symlink},stream:{llseek:pt.stream_ops.llseek}},file:{node:{getattr:pt.node_ops.getattr,setattr:pt.node_ops.setattr},stream:{llseek:pt.stream_ops.llseek,read:pt.stream_ops.read,write:pt.stream_ops.write,allocate:pt.stream_ops.allocate,mmap:pt.stream_ops.mmap,msync:pt.stream_ops.msync}},link:{node:{getattr:pt.node_ops.getattr,setattr:pt.node_ops.setattr,readlink:pt.node_ops.readlink},stream:{}},chrdev:{node:{getattr:pt.node_ops.getattr,setattr:pt.node_ops.setattr},stream:mt.chrdev_stream_ops}});var o=mt.createNode(t,e,r,n);return mt.isDir(o.mode)?(o.node_ops=pt.ops_table.dir.node,o.stream_ops=pt.ops_table.dir.stream,o.contents={}):mt.isFile(o.mode)?(o.node_ops=pt.ops_table.file.node,o.stream_ops=pt.ops_table.file.stream,o.usedBytes=0,o.contents=null):mt.isLink(o.mode)?(o.node_ops=pt.ops_table.link.node,o.stream_ops=pt.ops_table.link.stream):mt.isChrdev(o.mode)&&(o.node_ops=pt.ops_table.chrdev.node,o.stream_ops=pt.ops_table.chrdev.stream),o.timestamp=Date.now(),t&&(t.contents[e]=o,t.timestamp=o.timestamp),o},getFileDataAsTypedArray:function(t){return t.contents?t.contents.subarray?t.contents.subarray(0,t.usedBytes):new Uint8Array(t.contents):new Uint8Array(0)},expandFileStorage:function(t,e){var r=t.contents?t.contents.length:0;if(!(r>=e)){e=Math.max(e,r*(r<1048576?2:1.125)>>>0),0!=r&&(e=Math.max(e,256));var n=t.contents;t.contents=new Uint8Array(e),t.usedBytes>0&&t.contents.set(n.subarray(0,t.usedBytes),0)}},resizeFileStorage:function(t,e){if(t.usedBytes!=e)if(0==e)t.contents=null,t.usedBytes=0;else{var r=t.contents;t.contents=new Uint8Array(e),r&&t.contents.set(r.subarray(0,Math.min(e,t.usedBytes))),t.usedBytes=e}},node_ops:{getattr:function(t){var e={};return e.dev=mt.isChrdev(t.mode)?t.id:1,e.ino=t.id,e.mode=t.mode,e.nlink=1,e.uid=0,e.gid=0,e.rdev=t.rdev,mt.isDir(t.mode)?e.size=4096:mt.isFile(t.mode)?e.size=t.usedBytes:mt.isLink(t.mode)?e.size=t.link.length:e.size=0,e.atime=new Date(t.timestamp),e.mtime=new Date(t.timestamp),e.ctime=new Date(t.timestamp),e.blksize=4096,e.blocks=Math.ceil(e.size/e.blksize),e},setattr:function(t,e){void 0!==e.mode&&(t.mode=e.mode),void 0!==e.timestamp&&(t.timestamp=e.timestamp),void 0!==e.size&&pt.resizeFileStorage(t,e.size)},lookup:function(t,e){throw mt.genericErrors[44]},mknod:function(t,e,r,n){return pt.createNode(t,e,r,n)},rename:function(t,e,r){if(mt.isDir(t.mode)){var n;try{n=mt.lookupNode(e,r)}catch(t){}if(n)for(var o in n.contents)throw new mt.ErrnoError(55)}delete t.parent.contents[t.name],t.parent.timestamp=Date.now(),t.name=r,e.contents[r]=t,e.timestamp=t.parent.timestamp,t.parent=e},unlink:function(t,e){delete t.contents[e],t.timestamp=Date.now()},rmdir:function(t,e){var r=mt.lookupNode(t,e);for(var n in r.contents)throw new mt.ErrnoError(55);delete t.contents[e],t.timestamp=Date.now()},readdir:function(t){var e=[".",".."];for(var r in t.contents)t.contents.hasOwnProperty(r)&&e.push(r);return e},symlink:function(t,e,r){var n=pt.createNode(t,e,41471,0);return n.link=r,n},readlink:function(t){if(!mt.isLink(t.mode))throw new mt.ErrnoError(28);return t.link}},stream_ops:{read:function(t,e,r,n,o){var i=t.node.contents;if(o>=t.node.usedBytes)return 0;var s=Math.min(t.node.usedBytes-o,n);if(s>8&&i.subarray)e.set(i.subarray(o,o+s),r);else for(var a=0;a0||n+r{if(!(t=dt.resolve(mt.cwd(),t)))return{path:"",node:null};var r={follow_mount:!0,recurse_count:0};for(var n in r)void 0===e[n]&&(e[n]=r[n]);if(e.recurse_count>8)throw new mt.ErrnoError(32);for(var o=lt.normalizeArray(t.split("/").filter((t=>!!t)),!1),i=mt.root,s="/",a=0;a40)throw new mt.ErrnoError(32)}}return{path:s,node:i}},getPath:t=>{for(var e;;){if(mt.isRoot(t)){var r=t.mount.mountpoint;return e?"/"!==r[r.length-1]?r+"/"+e:r+e:r}e=e?t.name+"/"+e:t.name,t=t.parent}},hashName:(t,e)=>{for(var r=0,n=0;n>>0)%mt.nameTable.length},hashAddNode:t=>{var e=mt.hashName(t.parent.id,t.name);t.name_next=mt.nameTable[e],mt.nameTable[e]=t},hashRemoveNode:t=>{var e=mt.hashName(t.parent.id,t.name);if(mt.nameTable[e]===t)mt.nameTable[e]=t.name_next;else for(var r=mt.nameTable[e];r;){if(r.name_next===t){r.name_next=t.name_next;break}r=r.name_next}},lookupNode:(t,e)=>{var r=mt.mayLookup(t);if(r)throw new mt.ErrnoError(r,t);for(var n=mt.hashName(t.id,e),o=mt.nameTable[n];o;o=o.name_next){var i=o.name;if(o.parent.id===t.id&&i===e)return o}return mt.lookup(t,e)},createNode:(t,e,r,n)=>{var o=new mt.FSNode(t,e,r,n);return mt.hashAddNode(o),o},destroyNode:t=>{mt.hashRemoveNode(t)},isRoot:t=>t===t.parent,isMountpoint:t=>!!t.mounted,isFile:t=>32768==(61440&t),isDir:t=>16384==(61440&t),isLink:t=>40960==(61440&t),isChrdev:t=>8192==(61440&t),isBlkdev:t=>24576==(61440&t),isFIFO:t=>4096==(61440&t),isSocket:t=>49152==(49152&t),flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:t=>{var e=mt.flagModes[t];if(void 0===e)throw new Error("Unknown file open mode: "+t);return e},flagsToPermissionString:t=>{var e=["r","w","rw"][3&t];return 512&t&&(e+="w"),e},nodePermissions:(t,e)=>mt.ignorePermissions||(!e.includes("r")||292&t.mode)&&(!e.includes("w")||146&t.mode)&&(!e.includes("x")||73&t.mode)?0:2,mayLookup:t=>mt.nodePermissions(t,"x")||(t.node_ops.lookup?0:2),mayCreate:(t,e)=>{try{return mt.lookupNode(t,e),20}catch(t){}return mt.nodePermissions(t,"wx")},mayDelete:(t,e,r)=>{var n;try{n=mt.lookupNode(t,e)}catch(t){return t.errno}var o=mt.nodePermissions(t,"wx");if(o)return o;if(r){if(!mt.isDir(n.mode))return 54;if(mt.isRoot(n)||mt.getPath(n)===mt.cwd())return 10}else if(mt.isDir(n.mode))return 31;return 0},mayOpen:(t,e)=>t?mt.isLink(t.mode)?32:mt.isDir(t.mode)&&("r"!==mt.flagsToPermissionString(e)||512&e)?31:mt.nodePermissions(t,mt.flagsToPermissionString(e)):44,MAX_OPEN_FDS:4096,nextfd:(t=0,e=mt.MAX_OPEN_FDS)=>{for(var r=t;r<=e;r++)if(!mt.streams[r])return r;throw new mt.ErrnoError(33)},getStream:t=>mt.streams[t],createStream:(t,e,r)=>{mt.FSStream||(mt.FSStream=function(){},mt.FSStream.prototype={object:{get:function(){return this.node},set:function(t){this.node=t}},isRead:{get:function(){return 1!=(2097155&this.flags)}},isWrite:{get:function(){return 0!=(2097155&this.flags)}},isAppend:{get:function(){return 1024&this.flags}}});var n=new mt.FSStream;for(var o in t)n[o]=t[o];t=n;var i=mt.nextfd(e,r);return t.fd=i,mt.streams[i]=t,t},closeStream:t=>{mt.streams[t]=null},chrdev_stream_ops:{open:t=>{var e=mt.getDevice(t.node.rdev);t.stream_ops=e.stream_ops,t.stream_ops.open&&t.stream_ops.open(t)},llseek:()=>{throw new mt.ErrnoError(70)}},major:t=>t>>8,minor:t=>255&t,makedev:(t,e)=>t<<8|e,registerDevice:(t,e)=>{mt.devices[t]={stream_ops:e}},getDevice:t=>mt.devices[t],getMounts:t=>{for(var e=[],r=[t];r.length;){var n=r.pop();e.push(n),r.push.apply(r,n.mounts)}return e},syncfs:(t,e)=>{"function"==typeof t&&(e=t,t=!1),mt.syncFSRequests++,mt.syncFSRequests>1&&k("warning: "+mt.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var r=mt.getMounts(mt.root.mount),n=0;function o(t){return mt.syncFSRequests--,e(t)}function i(t){if(t)return i.errored?void 0:(i.errored=!0,o(t));++n>=r.length&&o(null)}r.forEach((e=>{if(!e.type.syncfs)return i(null);e.type.syncfs(e,t,i)}))},mount:(t,e,r)=>{var n,o="/"===r,i=!r;if(o&&mt.root)throw new mt.ErrnoError(10);if(!o&&!i){var s=mt.lookupPath(r,{follow_mount:!1});if(r=s.path,n=s.node,mt.isMountpoint(n))throw new mt.ErrnoError(10);if(!mt.isDir(n.mode))throw new mt.ErrnoError(54)}var a={type:t,opts:e,mountpoint:r,mounts:[]},u=t.mount(a);return u.mount=a,a.root=u,o?mt.root=u:n&&(n.mounted=a,n.mount&&n.mount.mounts.push(a)),u},unmount:t=>{var e=mt.lookupPath(t,{follow_mount:!1});if(!mt.isMountpoint(e.node))throw new mt.ErrnoError(28);var r=e.node,n=r.mounted,o=mt.getMounts(n);Object.keys(mt.nameTable).forEach((t=>{for(var e=mt.nameTable[t];e;){var r=e.name_next;o.includes(e.mount)&&mt.destroyNode(e),e=r}})),r.mounted=null;var i=r.mount.mounts.indexOf(n);r.mount.mounts.splice(i,1)},lookup:(t,e)=>t.node_ops.lookup(t,e),mknod:(t,e,r)=>{var n=mt.lookupPath(t,{parent:!0}).node,o=lt.basename(t);if(!o||"."===o||".."===o)throw new mt.ErrnoError(28);var i=mt.mayCreate(n,o);if(i)throw new mt.ErrnoError(i);if(!n.node_ops.mknod)throw new mt.ErrnoError(63);return n.node_ops.mknod(n,o,e,r)},create:(t,e)=>(e=void 0!==e?e:438,e&=4095,e|=32768,mt.mknod(t,e,0)),mkdir:(t,e)=>(e=void 0!==e?e:511,e&=1023,e|=16384,mt.mknod(t,e,0)),mkdirTree:(t,e)=>{for(var r=t.split("/"),n="",o=0;o(void 0===r&&(r=e,e=438),e|=8192,mt.mknod(t,e,r)),symlink:(t,e)=>{if(!dt.resolve(t))throw new mt.ErrnoError(44);var r=mt.lookupPath(e,{parent:!0}).node;if(!r)throw new mt.ErrnoError(44);var n=lt.basename(e),o=mt.mayCreate(r,n);if(o)throw new mt.ErrnoError(o);if(!r.node_ops.symlink)throw new mt.ErrnoError(63);return r.node_ops.symlink(r,n,t)},rename:(t,e)=>{var r,n,o=lt.dirname(t),i=lt.dirname(e),s=lt.basename(t),a=lt.basename(e);if(r=mt.lookupPath(t,{parent:!0}).node,n=mt.lookupPath(e,{parent:!0}).node,!r||!n)throw new mt.ErrnoError(44);if(r.mount!==n.mount)throw new mt.ErrnoError(75);var u,f=mt.lookupNode(r,s),l=dt.relative(t,i);if("."!==l.charAt(0))throw new mt.ErrnoError(28);if("."!==(l=dt.relative(e,o)).charAt(0))throw new mt.ErrnoError(55);try{u=mt.lookupNode(n,a)}catch(t){}if(f!==u){var c=mt.isDir(f.mode),d=mt.mayDelete(r,s,c);if(d)throw new mt.ErrnoError(d);if(d=u?mt.mayDelete(n,a,c):mt.mayCreate(n,a))throw new mt.ErrnoError(d);if(!r.node_ops.rename)throw new mt.ErrnoError(63);if(mt.isMountpoint(f)||u&&mt.isMountpoint(u))throw new mt.ErrnoError(10);if(n!==r&&(d=mt.nodePermissions(r,"w")))throw new mt.ErrnoError(d);mt.hashRemoveNode(f);try{r.node_ops.rename(f,n,a)}catch(t){throw t}finally{mt.hashAddNode(f)}}},rmdir:t=>{var e=mt.lookupPath(t,{parent:!0}).node,r=lt.basename(t),n=mt.lookupNode(e,r),o=mt.mayDelete(e,r,!0);if(o)throw new mt.ErrnoError(o);if(!e.node_ops.rmdir)throw new mt.ErrnoError(63);if(mt.isMountpoint(n))throw new mt.ErrnoError(10);e.node_ops.rmdir(e,r),mt.destroyNode(n)},readdir:t=>{var e=mt.lookupPath(t,{follow:!0}).node;if(!e.node_ops.readdir)throw new mt.ErrnoError(54);return e.node_ops.readdir(e)},unlink:t=>{var e=mt.lookupPath(t,{parent:!0}).node;if(!e)throw new mt.ErrnoError(44);var r=lt.basename(t),n=mt.lookupNode(e,r),o=mt.mayDelete(e,r,!1);if(o)throw new mt.ErrnoError(o);if(!e.node_ops.unlink)throw new mt.ErrnoError(63);if(mt.isMountpoint(n))throw new mt.ErrnoError(10);e.node_ops.unlink(e,r),mt.destroyNode(n)},readlink:t=>{var e=mt.lookupPath(t).node;if(!e)throw new mt.ErrnoError(44);if(!e.node_ops.readlink)throw new mt.ErrnoError(28);return dt.resolve(mt.getPath(e.parent),e.node_ops.readlink(e))},stat:(t,e)=>{var r=mt.lookupPath(t,{follow:!e}).node;if(!r)throw new mt.ErrnoError(44);if(!r.node_ops.getattr)throw new mt.ErrnoError(63);return r.node_ops.getattr(r)},lstat:t=>mt.stat(t,!0),chmod:(t,e,r)=>{var n;if(!(n="string"==typeof t?mt.lookupPath(t,{follow:!r}).node:t).node_ops.setattr)throw new mt.ErrnoError(63);n.node_ops.setattr(n,{mode:4095&e|-4096&n.mode,timestamp:Date.now()})},lchmod:(t,e)=>{mt.chmod(t,e,!0)},fchmod:(t,e)=>{var r=mt.getStream(t);if(!r)throw new mt.ErrnoError(8);mt.chmod(r.node,e)},chown:(t,e,r,n)=>{var o;if(!(o="string"==typeof t?mt.lookupPath(t,{follow:!n}).node:t).node_ops.setattr)throw new mt.ErrnoError(63);o.node_ops.setattr(o,{timestamp:Date.now()})},lchown:(t,e,r)=>{mt.chown(t,e,r,!0)},fchown:(t,e,r)=>{var n=mt.getStream(t);if(!n)throw new mt.ErrnoError(8);mt.chown(n.node,e,r)},truncate:(t,e)=>{if(e<0)throw new mt.ErrnoError(28);var r;if(!(r="string"==typeof t?mt.lookupPath(t,{follow:!0}).node:t).node_ops.setattr)throw new mt.ErrnoError(63);if(mt.isDir(r.mode))throw new mt.ErrnoError(31);if(!mt.isFile(r.mode))throw new mt.ErrnoError(28);var n=mt.nodePermissions(r,"w");if(n)throw new mt.ErrnoError(n);r.node_ops.setattr(r,{size:e,timestamp:Date.now()})},ftruncate:(t,e)=>{var r=mt.getStream(t);if(!r)throw new mt.ErrnoError(8);if(0==(2097155&r.flags))throw new mt.ErrnoError(28);mt.truncate(r.node,e)},utime:(t,e,r)=>{var n=mt.lookupPath(t,{follow:!0}).node;n.node_ops.setattr(n,{timestamp:Math.max(e,r)})},open:(t,e,r,n,o)=>{if(""===t)throw new mt.ErrnoError(44);var i;if(r=void 0===r?438:r,r=64&(e="string"==typeof e?mt.modeStringToFlags(e):e)?4095&r|32768:0,"object"==typeof t)i=t;else{t=lt.normalize(t);try{i=mt.lookupPath(t,{follow:!(131072&e)}).node}catch(t){}}var a=!1;if(64&e)if(i){if(128&e)throw new mt.ErrnoError(20)}else i=mt.mknod(t,r,0),a=!0;if(!i)throw new mt.ErrnoError(44);if(mt.isChrdev(i.mode)&&(e&=-513),65536&e&&!mt.isDir(i.mode))throw new mt.ErrnoError(54);if(!a){var u=mt.mayOpen(i,e);if(u)throw new mt.ErrnoError(u)}512&e&&mt.truncate(i,0),e&=-131713;var f=mt.createStream({node:i,path:mt.getPath(i),flags:e,seekable:!0,position:0,stream_ops:i.stream_ops,ungotten:[],error:!1},n,o);return f.stream_ops.open&&f.stream_ops.open(f),!s.logReadFiles||1&e||(mt.readFiles||(mt.readFiles={}),t in mt.readFiles||(mt.readFiles[t]=1)),f},close:t=>{if(mt.isClosed(t))throw new mt.ErrnoError(8);t.getdents&&(t.getdents=null);try{t.stream_ops.close&&t.stream_ops.close(t)}catch(t){throw t}finally{mt.closeStream(t.fd)}t.fd=null},isClosed:t=>null===t.fd,llseek:(t,e,r)=>{if(mt.isClosed(t))throw new mt.ErrnoError(8);if(!t.seekable||!t.stream_ops.llseek)throw new mt.ErrnoError(70);if(0!=r&&1!=r&&2!=r)throw new mt.ErrnoError(28);return t.position=t.stream_ops.llseek(t,e,r),t.ungotten=[],t.position},read:(t,e,r,n,o)=>{if(n<0||o<0)throw new mt.ErrnoError(28);if(mt.isClosed(t))throw new mt.ErrnoError(8);if(1==(2097155&t.flags))throw new mt.ErrnoError(8);if(mt.isDir(t.node.mode))throw new mt.ErrnoError(31);if(!t.stream_ops.read)throw new mt.ErrnoError(28);var i=void 0!==o;if(i){if(!t.seekable)throw new mt.ErrnoError(70)}else o=t.position;var s=t.stream_ops.read(t,e,r,n,o);return i||(t.position+=s),s},write:(t,e,r,n,o,i)=>{if(n<0||o<0)throw new mt.ErrnoError(28);if(mt.isClosed(t))throw new mt.ErrnoError(8);if(0==(2097155&t.flags))throw new mt.ErrnoError(8);if(mt.isDir(t.node.mode))throw new mt.ErrnoError(31);if(!t.stream_ops.write)throw new mt.ErrnoError(28);t.seekable&&1024&t.flags&&mt.llseek(t,0,2);var s=void 0!==o;if(s){if(!t.seekable)throw new mt.ErrnoError(70)}else o=t.position;var a=t.stream_ops.write(t,e,r,n,o,i);return s||(t.position+=a),a},allocate:(t,e,r)=>{if(mt.isClosed(t))throw new mt.ErrnoError(8);if(e<0||r<=0)throw new mt.ErrnoError(28);if(0==(2097155&t.flags))throw new mt.ErrnoError(8);if(!mt.isFile(t.node.mode)&&!mt.isDir(t.node.mode))throw new mt.ErrnoError(43);if(!t.stream_ops.allocate)throw new mt.ErrnoError(138);t.stream_ops.allocate(t,e,r)},mmap:(t,e,r,n,o,i)=>{if(0!=(2&o)&&0==(2&i)&&2!=(2097155&t.flags))throw new mt.ErrnoError(2);if(1==(2097155&t.flags))throw new mt.ErrnoError(2);if(!t.stream_ops.mmap)throw new mt.ErrnoError(43);return t.stream_ops.mmap(t,e,r,n,o,i)},msync:(t,e,r,n,o)=>t&&t.stream_ops.msync?t.stream_ops.msync(t,e,r,n,o):0,munmap:t=>0,ioctl:(t,e,r)=>{if(!t.stream_ops.ioctl)throw new mt.ErrnoError(59);return t.stream_ops.ioctl(t,e,r)},readFile:(t,e={})=>{if(e.flags=e.flags||0,e.encoding=e.encoding||"binary","utf8"!==e.encoding&&"binary"!==e.encoding)throw new Error(\'Invalid encoding type "\'+e.encoding+\'"\');var r,n=mt.open(t,e.flags),o=mt.stat(t).size,i=new Uint8Array(o);return mt.read(n,i,0,o,0),"utf8"===e.encoding?r=O(i,0):"binary"===e.encoding&&(r=i),mt.close(n),r},writeFile:(t,e,r={})=>{r.flags=r.flags||577;var n=mt.open(t,r.flags,r.mode);if("string"==typeof e){var o=new Uint8Array(T(e)+1),i=S(e,o,0,o.length);mt.write(n,o,0,i,void 0,r.canOwn)}else{if(!ArrayBuffer.isView(e))throw new Error("Unsupported data type");mt.write(n,e,0,e.byteLength,void 0,r.canOwn)}mt.close(n)},cwd:()=>mt.currentPath,chdir:t=>{var e=mt.lookupPath(t,{follow:!0});if(null===e.node)throw new mt.ErrnoError(44);if(!mt.isDir(e.node.mode))throw new mt.ErrnoError(54);var r=mt.nodePermissions(e.node,"x");if(r)throw new mt.ErrnoError(r);mt.currentPath=e.path},createDefaultDirectories:()=>{mt.mkdir("/tmp"),mt.mkdir("/home"),mt.mkdir("/home/web_user")},createDefaultDevices:()=>{mt.mkdir("/dev"),mt.registerDevice(mt.makedev(1,3),{read:()=>0,write:(t,e,r,n,o)=>n}),mt.mkdev("/dev/null",mt.makedev(1,3)),ht.register(mt.makedev(5,0),ht.default_tty_ops),ht.register(mt.makedev(6,0),ht.default_tty1_ops),mt.mkdev("/dev/tty",mt.makedev(5,0)),mt.mkdev("/dev/tty1",mt.makedev(6,0));var t=ct();mt.createDevice("/dev","random",t),mt.createDevice("/dev","urandom",t),mt.mkdir("/dev/shm"),mt.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{mt.mkdir("/proc");var t=mt.mkdir("/proc/self");mt.mkdir("/proc/self/fd"),mt.mount({mount:()=>{var e=mt.createNode(t,"fd",16895,73);return e.node_ops={lookup:(t,e)=>{var r=+e,n=mt.getStream(r);if(!n)throw new mt.ErrnoError(8);var o={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>n.path}};return o.parent=o,o}},e}},{},"/proc/self/fd")},createStandardStreams:()=>{s.stdin?mt.createDevice("/dev","stdin",s.stdin):mt.symlink("/dev/tty","/dev/stdin"),s.stdout?mt.createDevice("/dev","stdout",null,s.stdout):mt.symlink("/dev/tty","/dev/stdout"),s.stderr?mt.createDevice("/dev","stderr",null,s.stderr):mt.symlink("/dev/tty1","/dev/stderr"),mt.open("/dev/stdin",0),mt.open("/dev/stdout",1),mt.open("/dev/stderr",1)},ensureErrnoError:()=>{mt.ErrnoError||(mt.ErrnoError=function(t,e){this.node=e,this.setErrno=function(t){this.errno=t},this.setErrno(t),this.message="FS error"},mt.ErrnoError.prototype=new Error,mt.ErrnoError.prototype.constructor=mt.ErrnoError,[44].forEach((t=>{mt.genericErrors[t]=new mt.ErrnoError(t),mt.genericErrors[t].stack=""})))},staticInit:()=>{mt.ensureErrnoError(),mt.nameTable=new Array(4096),mt.mount(pt,{},"/"),mt.createDefaultDirectories(),mt.createDefaultDevices(),mt.createSpecialDirectories(),mt.filesystems={MEMFS:pt}},init:(t,e,r)=>{mt.init.initialized=!0,mt.ensureErrnoError(),s.stdin=t||s.stdin,s.stdout=e||s.stdout,s.stderr=r||s.stderr,mt.createStandardStreams()},quit:()=>{mt.init.initialized=!1;for(var t=0;t{var r=0;return t&&(r|=365),e&&(r|=146),r},findObject:(t,e)=>{var r=mt.analyzePath(t,e);return r.exists?r.object:null},analyzePath:(t,e)=>{try{t=(n=mt.lookupPath(t,{follow:!e})).path}catch(t){}var r={isRoot:!1,exists:!1,error:0,name:null,path:null,object:null,parentExists:!1,parentPath:null,parentObject:null};try{var n=mt.lookupPath(t,{parent:!0});r.parentExists=!0,r.parentPath=n.path,r.parentObject=n.node,r.name=lt.basename(t),n=mt.lookupPath(t,{follow:!e}),r.exists=!0,r.path=n.path,r.object=n.node,r.name=n.node.name,r.isRoot="/"===n.path}catch(t){r.error=t.errno}return r},createPath:(t,e,r,n)=>{t="string"==typeof t?t:mt.getPath(t);for(var o=e.split("/").reverse();o.length;){var i=o.pop();if(i){var s=lt.join2(t,i);try{mt.mkdir(s)}catch(t){}t=s}}return s},createFile:(t,e,r,n,o)=>{var i=lt.join2("string"==typeof t?t:mt.getPath(t),e),s=mt.getMode(n,o);return mt.create(i,s)},createDataFile:(t,e,r,n,o,i)=>{var s=e;t&&(t="string"==typeof t?t:mt.getPath(t),s=e?lt.join2(t,e):t);var a=mt.getMode(n,o),u=mt.create(s,a);if(r){if("string"==typeof r){for(var f=new Array(r.length),l=0,c=r.length;l{var o=lt.join2("string"==typeof t?t:mt.getPath(t),e),i=mt.getMode(!!r,!!n);mt.createDevice.major||(mt.createDevice.major=64);var s=mt.makedev(mt.createDevice.major++,0);return mt.registerDevice(s,{open:t=>{t.seekable=!1},close:t=>{n&&n.buffer&&n.buffer.length&&n(10)},read:(t,e,n,o,i)=>{for(var s=0,a=0;a{for(var s=0;s{if(t.isDevice||t.isFolder||t.link||t.contents)return!0;if("undefined"!=typeof XMLHttpRequest)throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");if(!u)throw new Error("Cannot load without read() or XMLHttpRequest.");try{t.contents=At(u(t.url),!0),t.usedBytes=t.contents.length}catch(t){throw new mt.ErrnoError(29)}},createLazyFile:(t,e,r,n,o)=>{function i(){this.lengthKnown=!1,this.chunks=[]}if(i.prototype.get=function(t){if(!(t>this.length-1||t<0)){var e=t%this.chunkSize,r=t/this.chunkSize|0;return this.getter(r)[e]}},i.prototype.setDataGetter=function(t){this.getter=t},i.prototype.cacheLength=function(){var t=new XMLHttpRequest;if(t.open("HEAD",r,!1),t.send(null),!(t.status>=200&&t.status<300||304===t.status))throw new Error("Couldn\'t load "+r+". Status: "+t.status);var e,n=Number(t.getResponseHeader("Content-length")),o=(e=t.getResponseHeader("Accept-Ranges"))&&"bytes"===e,i=(e=t.getResponseHeader("Content-Encoding"))&&"gzip"===e,s=1048576;o||(s=n);var a=this;a.setDataGetter((t=>{var e=t*s,o=(t+1)*s-1;if(o=Math.min(o,n-1),void 0===a.chunks[t]&&(a.chunks[t]=((t,e)=>{if(t>e)throw new Error("invalid range ("+t+", "+e+") or no bytes requested!");if(e>n-1)throw new Error("only "+n+" bytes available! programmer error!");var o=new XMLHttpRequest;if(o.open("GET",r,!1),n!==s&&o.setRequestHeader("Range","bytes="+t+"-"+e),"undefined"!=typeof Uint8Array&&(o.responseType="arraybuffer"),o.overrideMimeType&&o.overrideMimeType("text/plain; charset=x-user-defined"),o.send(null),!(o.status>=200&&o.status<300||304===o.status))throw new Error("Couldn\'t load "+r+". Status: "+o.status);return void 0!==o.response?new Uint8Array(o.response||[]):At(o.responseText||"",!0)})(e,o)),void 0===a.chunks[t])throw new Error("doXHR failed!");return a.chunks[t]})),!i&&n||(s=n=1,n=this.getter(0).length,s=n,A("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=n,this._chunkSize=s,this.lengthKnown=!0},"undefined"!=typeof XMLHttpRequest){if(!E)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var s=new i;Object.defineProperties(s,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var a={isDevice:!1,contents:s}}else a={isDevice:!1,url:r};var u=mt.createFile(t,e,a,n,o);a.contents?u.contents=a.contents:a.url&&(u.contents=null,u.url=a.url),Object.defineProperties(u,{usedBytes:{get:function(){return this.contents.length}}});var f={};return Object.keys(u.stream_ops).forEach((t=>{var e=u.stream_ops[t];f[t]=function(){return mt.forceLoadFile(u),e.apply(null,arguments)}})),f.read=(t,e,r,n,o)=>{mt.forceLoadFile(u);var i=t.node.contents;if(o>=i.length)return 0;var s=Math.min(i.length-o,n);if(i.slice)for(var a=0;a{var c=e?dt.resolve(lt.join2(t,e)):t;function d(r){function f(r){l&&l(),a||mt.createDataFile(t,e,r,n,o,u),i&&i(),Z()}Browser.handledByPreloadPlugin(r,c,f,(()=>{s&&s(),Z()}))||f(r)}V(),"string"==typeof r?function(t,e,r,n){var o=n?"":"al "+t;f(t,(function(r){r||J(\'Loading data file "\'+t+\'" failed (no arrayBuffer).\'),e(new Uint8Array(r)),o&&Z()}),(function(e){if(!r)throw\'Loading data file "\'+t+\'" failed.\';r()})),o&&V()}(r,(t=>d(t)),s):d(r)},indexedDB:()=>window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB,DB_NAME:()=>"EM_FS_"+window.location.pathname,DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(t,e,r)=>{e=e||(()=>{}),r=r||(()=>{});var n=mt.indexedDB();try{var o=n.open(mt.DB_NAME(),mt.DB_VERSION)}catch(t){return r(t)}o.onupgradeneeded=()=>{A("creating db"),o.result.createObjectStore(mt.DB_STORE_NAME)},o.onsuccess=()=>{var n=o.result.transaction([mt.DB_STORE_NAME],"readwrite"),i=n.objectStore(mt.DB_STORE_NAME),s=0,a=0,u=t.length;function f(){0==a?e():r()}t.forEach((t=>{var e=i.put(mt.analyzePath(t).object.contents,t);e.onsuccess=()=>{++s+a==u&&f()},e.onerror=()=>{a++,s+a==u&&f()}})),n.onerror=r},o.onerror=r},loadFilesFromDB:(t,e,r)=>{e=e||(()=>{}),r=r||(()=>{});var n=mt.indexedDB();try{var o=n.open(mt.DB_NAME(),mt.DB_VERSION)}catch(t){return r(t)}o.onupgradeneeded=r,o.onsuccess=()=>{var n=o.result;try{var i=n.transaction([mt.DB_STORE_NAME],"readonly")}catch(t){return void r(t)}var s=i.objectStore(mt.DB_STORE_NAME),a=0,u=0,f=t.length;function l(){0==u?e():r()}t.forEach((t=>{var e=s.get(t);e.onsuccess=()=>{mt.analyzePath(t).exists&&mt.unlink(t),mt.createDataFile(lt.dirname(t),lt.basename(t),e.result,!0,!0,!0),++a+u==f&&l()},e.onerror=()=>{u++,a+u==f&&l()}})),i.onerror=r},o.onerror=r}},yt={mappings:{},DEFAULT_POLLMASK:5,calculateAt:function(t,e,r){if("/"===e[0])return e;var n;if(-100===t)n=mt.cwd();else{var o=mt.getStream(t);if(!o)throw new mt.ErrnoError(8);n=o.path}if(0==e.length){if(!r)throw new mt.ErrnoError(44);return n}return lt.join2(n,e)},doStat:function(t,e,r){try{var n=t(e)}catch(t){if(t&&t.node&<.normalize(e)!==lt.normalize(mt.getPath(t.node)))return-54;throw t}return I[r>>2]=n.dev,I[r+4>>2]=0,I[r+8>>2]=n.ino,I[r+12>>2]=n.mode,I[r+16>>2]=n.nlink,I[r+20>>2]=n.uid,I[r+24>>2]=n.gid,I[r+28>>2]=n.rdev,I[r+32>>2]=0,X=[n.size>>>0,(K=n.size,+Math.abs(K)>=1?K>0?(0|Math.min(+Math.floor(K/4294967296),4294967295))>>>0:~~+Math.ceil((K-+(~~K>>>0))/4294967296)>>>0:0)],I[r+40>>2]=X[0],I[r+44>>2]=X[1],I[r+48>>2]=4096,I[r+52>>2]=n.blocks,I[r+56>>2]=n.atime.getTime()/1e3|0,I[r+60>>2]=0,I[r+64>>2]=n.mtime.getTime()/1e3|0,I[r+68>>2]=0,I[r+72>>2]=n.ctime.getTime()/1e3|0,I[r+76>>2]=0,X=[n.ino>>>0,(K=n.ino,+Math.abs(K)>=1?K>0?(0|Math.min(+Math.floor(K/4294967296),4294967295))>>>0:~~+Math.ceil((K-+(~~K>>>0))/4294967296)>>>0:0)],I[r+80>>2]=X[0],I[r+84>>2]=X[1],0},doMsync:function(t,e,r,n,o){var i=D.slice(t,t+r);mt.msync(e,i,o,r,n)},doMkdir:function(t,e){return"/"===(t=lt.normalize(t))[t.length-1]&&(t=t.substr(0,t.length-1)),mt.mkdir(t,e,0),0},doMknod:function(t,e,r){switch(61440&e){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return mt.mknod(t,e,r),0},doReadlink:function(t,e,r){if(r<=0)return-28;var n=mt.readlink(t),o=Math.min(r,T(n)),i=M[e+o];return S(n,D,e,r+1),M[e+o]=i,o},doAccess:function(t,e){if(-8&e)return-28;var r=mt.lookupPath(t,{follow:!0}).node;if(!r)return-44;var n="";return 4&e&&(n+="r"),2&e&&(n+="w"),1&e&&(n+="x"),n&&mt.nodePermissions(r,n)?-2:0},doDup:function(t,e,r){var n=mt.getStream(r);return n&&mt.close(n),mt.open(t,e,0,r,r).fd},doReadv:function(t,e,r,n){for(var o=0,i=0;i>2],a=I[e+(8*i+4)>>2],u=mt.read(t,M,s,a,n);if(u<0)return-1;if(o+=u,u>2],a=I[e+(8*i+4)>>2],u=mt.write(t,M,s,a,n);if(u<0)return-1;o+=u}return o},varargs:void 0,get:function(){return yt.varargs+=4,I[yt.varargs-4>>2]},getStr:function(t){return H(t)},getStreamFromFD:function(t){var e=mt.getStream(t);if(!e)throw new mt.ErrnoError(8);return e},get64:function(t,e){return t}};function gt(t){return t%4==0&&(t%100!=0||t%400==0)}function wt(t,e){for(var r=0,n=0;n<=e;r+=t[n++]);return r}var Et=[31,29,31,30,31,30,31,31,30,31,30,31],vt=[31,28,31,30,31,30,31,31,30,31,30,31];function _t(t,e){for(var r=new Date(t.getTime());e>0;){var n=gt(r.getFullYear()),o=r.getMonth(),i=(n?Et:vt)[o];if(!(e>i-r.getDate()))return r.setDate(r.getDate()+e),r;e-=i-r.getDate()+1,r.setDate(1),o<11?r.setMonth(o+1):(r.setMonth(0),r.setFullYear(r.getFullYear()+1))}return r}var bt=function(t,e,r,n){t||(t=this),this.parent=t,this.mount=t.mount,this.mounted=null,this.id=mt.nextInode++,this.name=e,this.mode=r,this.node_ops={},this.stream_ops={},this.rdev=n};function At(t,e,r){var n=r>0?r:T(t)+1,o=new Array(n),i=S(t,o,0,o.length);return e&&(o.length=i),o}Object.defineProperties(bt.prototype,{read:{get:function(){return 365==(365&this.mode)},set:function(t){t?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146==(146&this.mode)},set:function(t){t?this.mode|=146:this.mode&=-147}},isFolder:{get:function(){return mt.isDir(this.mode)}},isDevice:{get:function(){return mt.isChrdev(this.mode)}}}),mt.FSNode=bt,mt.staticInit();var kt,Pt={d:function(t){return Bt(t+16)+16},c:function(t,e,r){throw new st(t).init(e,r),t},f:function(t,e){J("To use dlopen, you need to use Emscripten\'s linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},i:function(t,e){J("To use dlopen, you need to use Emscripten\'s linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},a:function(){J("")},b:function(t,e){var r;if(0===t)r=Date.now();else{if(1!==t&&4!==t)return 28,I[Ft()>>2]=28,-1;r=nt()}return I[e>>2]=r/1e3|0,I[e+4>>2]=r%1e3*1e3*1e3|0,0},o:function(){return 2147483648},g:nt,h:function(t,e,r){D.copyWithin(t,e,e+r)},n:function(t){var e,r=D.length,n=2147483648;if((t>>>=0)>n)return!1;for(var o=1;o<=4;o*=2){var i=r*(1+.2/o);if(i=Math.min(i,t+100663296),at(Math.min(n,((e=Math.max(t,i))%65536>0&&(e+=65536-e%65536),e))))return!0}return!1},p:function(t,e){var r=0;return ft().forEach((function(n,o){var i=e+r;I[t+4*o>>2]=i,function(t,e,r){for(var n=0;n>0]=t.charCodeAt(n);M[e>>0]=0}(n,i),r+=n.length+1})),0},q:function(t,e){var r=ft();I[t>>2]=r.length;var n=0;return r.forEach((function(t){n+=t.length+1})),I[e>>2]=n,0},s:function(t){!function(t,e){var r;j(),r=t,j()||(s.onExit&&s.onExit(r),x=!0),g(r,new Dt(r))}(t)},j:function(t){try{var e=yt.getStreamFromFD(t);return mt.close(e),0}catch(t){if(void 0===mt||!(t instanceof mt.ErrnoError))throw t;return t.errno}},r:function(t,e,r,n){try{var o=yt.getStreamFromFD(t),i=yt.doReadv(o,e,r);return I[n>>2]=i,0}catch(t){if(void 0===mt||!(t instanceof mt.ErrnoError))throw t;return t.errno}},k:function(t,e,r,n,o){try{var i=yt.getStreamFromFD(t),s=4294967296*r+(e>>>0),a=9007199254740992;return s<=-a||s>=a?-61:(mt.llseek(i,s,n),X=[i.position>>>0,(K=i.position,+Math.abs(K)>=1?K>0?(0|Math.min(+Math.floor(K/4294967296),4294967295))>>>0:~~+Math.ceil((K-+(~~K>>>0))/4294967296)>>>0:0)],I[o>>2]=X[0],I[o+4>>2]=X[1],i.getdents&&0===s&&0===n&&(i.getdents=null),0)}catch(t){if(void 0===mt||!(t instanceof mt.ErrnoError))throw t;return t.errno}},e:function(t,e,r,n){try{var o=yt.getStreamFromFD(t),i=yt.doWritev(o,e,r);return I[n>>2]=i,0}catch(t){if(void 0===mt||!(t instanceof mt.ErrnoError))throw t;return t.errno}},l:function t(e,r){t.randomDevice||(t.randomDevice=ct());for(var n=0;n>0]=t.randomDevice();return 0},m:function(t,e,r,n){return function(t,e,r,n){var o=I[n+40>>2],i={tm_sec:I[n>>2],tm_min:I[n+4>>2],tm_hour:I[n+8>>2],tm_mday:I[n+12>>2],tm_mon:I[n+16>>2],tm_year:I[n+20>>2],tm_wday:I[n+24>>2],tm_yday:I[n+28>>2],tm_isdst:I[n+32>>2],tm_gmtoff:I[n+36>>2],tm_zone:o?H(o):""},s=H(r),a={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var u in a)s=s.replace(new RegExp(u,"g"),a[u]);var f=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],l=["January","February","March","April","May","June","July","August","September","October","November","December"];function c(t,e,r){for(var n="number"==typeof t?t.toString():t||"";n.length0?1:0}var n;return 0===(n=r(t.getFullYear()-e.getFullYear()))&&0===(n=r(t.getMonth()-e.getMonth()))&&(n=r(t.getDate()-e.getDate())),n}function p(t){switch(t.getDay()){case 0:return new Date(t.getFullYear()-1,11,29);case 1:return t;case 2:return new Date(t.getFullYear(),0,3);case 3:return new Date(t.getFullYear(),0,2);case 4:return new Date(t.getFullYear(),0,1);case 5:return new Date(t.getFullYear()-1,11,31);case 6:return new Date(t.getFullYear()-1,11,30)}}function m(t){var e=_t(new Date(t.tm_year+1900,0,1),t.tm_yday),r=new Date(e.getFullYear(),0,4),n=new Date(e.getFullYear()+1,0,4),o=p(r),i=p(n);return h(o,e)<=0?h(i,e)<=0?e.getFullYear()+1:e.getFullYear():e.getFullYear()-1}var y={"%a":function(t){return f[t.tm_wday].substring(0,3)},"%A":function(t){return f[t.tm_wday]},"%b":function(t){return l[t.tm_mon].substring(0,3)},"%B":function(t){return l[t.tm_mon]},"%C":function(t){return d((t.tm_year+1900)/100|0,2)},"%d":function(t){return d(t.tm_mday,2)},"%e":function(t){return c(t.tm_mday,2," ")},"%g":function(t){return m(t).toString().substring(2)},"%G":function(t){return m(t)},"%H":function(t){return d(t.tm_hour,2)},"%I":function(t){var e=t.tm_hour;return 0==e?e=12:e>12&&(e-=12),d(e,2)},"%j":function(t){return d(t.tm_mday+wt(gt(t.tm_year+1900)?Et:vt,t.tm_mon-1),3)},"%m":function(t){return d(t.tm_mon+1,2)},"%M":function(t){return d(t.tm_min,2)},"%n":function(){return"\\n"},"%p":function(t){return t.tm_hour>=0&&t.tm_hour<12?"AM":"PM"},"%S":function(t){return d(t.tm_sec,2)},"%t":function(){return"\\t"},"%u":function(t){return t.tm_wday||7},"%U":function(t){var e=new Date(t.tm_year+1900,0,1),r=0===e.getDay()?e:_t(e,7-e.getDay()),n=new Date(t.tm_year+1900,t.tm_mon,t.tm_mday);if(h(r,n)<0){var o=wt(gt(n.getFullYear())?Et:vt,n.getMonth()-1)-31,i=31-r.getDate()+o+n.getDate();return d(Math.ceil(i/7),2)}return 0===h(r,e)?"01":"00"},"%V":function(t){var e,r=new Date(t.tm_year+1900,0,4),n=new Date(t.tm_year+1901,0,4),o=p(r),i=p(n),s=_t(new Date(t.tm_year+1900,0,1),t.tm_yday);return h(s,o)<0?"53":h(i,s)<=0?"01":(e=o.getFullYear()=0;return e=(e=Math.abs(e)/60)/60*100+e%60,(r?"+":"-")+String("0000"+e).slice(-4)},"%Z":function(t){return t.tm_zone},"%%":function(){return"%"}};for(var u in y)s.includes(u)&&(s=s.replace(new RegExp(u,"g"),y[u](i)));var g=At(s,!1);return g.length>e?0:(function(t,e){M.set(t,e)}(g,t),g.length-1)}(t,e,r,n)}},Bt=(function(){var t={a:Pt};function e(t,e){var r,n=t.exports;s.asm=n,L((P=s.asm.t).buffer),U=s.asm.H,r=s.asm.u,N.unshift(r),Z()}function r(t){e(t.instance)}function n(e){return function(){if(!b&&(w||E)){if("function"==typeof fetch&&!tt(W))return fetch(W,{credentials:"same-origin"}).then((function(t){if(!t.ok)throw"failed to load wasm binary file at \'"+W+"\'";return t.arrayBuffer()})).catch((function(){return et(W)}));if(f)return new Promise((function(t,e){f(W,(function(e){t(new Uint8Array(e))}),e)}))}return Promise.resolve().then((function(){return et(W)}))}().then((function(e){return WebAssembly.instantiate(e,t)})).then((function(t){return t})).then(e,(function(t){k("failed to asynchronously prepare wasm: "+t),J(t)}))}if(V(),s.instantiateWasm)try{return s.instantiateWasm(t,e)}catch(t){return k("Module.instantiateWasm callback failed with error: "+t),!1}(b||"function"!=typeof WebAssembly.instantiateStreaming||Q(W)||tt(W)||"function"!=typeof fetch?n(r):fetch(W,{credentials:"same-origin"}).then((function(e){return WebAssembly.instantiateStreaming(e,t).then(r,(function(t){return k("wasm streaming compile failed: "+t),k("falling back to ArrayBuffer instantiation"),n(r)}))}))).catch(i)}(),s.___wasm_call_ctors=function(){return(s.___wasm_call_ctors=s.asm.u).apply(null,arguments)},s._initPoseDetectorModelBuffer=function(){return(s._initPoseDetectorModelBuffer=s.asm.v).apply(null,arguments)},s._getPoseDetectorModelBufferAddress=function(){return(s._getPoseDetectorModelBufferAddress=s.asm.w).apply(null,arguments)},s._loadPoseDetectorModel=function(){return(s._loadPoseDetectorModel=s.asm.x).apply(null,arguments)},s._initPoseLandmarkModelBuffer=function(){return(s._initPoseLandmarkModelBuffer=s.asm.y).apply(null,arguments)},s._getPoseLandmarkModelBufferAddress=function(){return(s._getPoseLandmarkModelBufferAddress=s.asm.z).apply(null,arguments)},s._loadPoseLandmarkModel=function(){return(s._loadPoseLandmarkModel=s.asm.A).apply(null,arguments)},s._initPoseInputBuffer=function(){return(s._initPoseInputBuffer=s.asm.B).apply(null,arguments)},s._getPoseInputBufferAddress=function(){return(s._getPoseInputBufferAddress=s.asm.C).apply(null,arguments)},s._getPoseOutputBufferAddress=function(){return(s._getPoseOutputBufferAddress=s.asm.D).apply(null,arguments)},s._getPoseTemporaryBufferAddress=function(){return(s._getPoseTemporaryBufferAddress=s.asm.E).apply(null,arguments)},s._execPose=function(){return(s._execPose=s.asm.F).apply(null,arguments)},s._set_pose_calculate_mode=function(){return(s._set_pose_calculate_mode=s.asm.G).apply(null,arguments)},s._initPalmDetectorModelBuffer=function(){return(s._initPalmDetectorModelBuffer=s.asm.I).apply(null,arguments)},s._getPalmDetectorModelBufferAddress=function(){return(s._getPalmDetectorModelBufferAddress=s.asm.J).apply(null,arguments)},s._loadPalmDetectorModel=function(){return(s._loadPalmDetectorModel=s.asm.K).apply(null,arguments)},s._initHandLandmarkModelBuffer=function(){return(s._initHandLandmarkModelBuffer=s.asm.L).apply(null,arguments)},s._getHandLandmarkModelBufferAddress=function(){return(s._getHandLandmarkModelBufferAddress=s.asm.M).apply(null,arguments)},s._loadHandLandmarkModel=function(){return(s._loadHandLandmarkModel=s.asm.N).apply(null,arguments)},s._initHandInputBuffer=function(){return(s._initHandInputBuffer=s.asm.O).apply(null,arguments)},s._getHandInputBufferAddress=function(){return(s._getHandInputBufferAddress=s.asm.P).apply(null,arguments)},s._getHandOutputBufferAddress=function(){return(s._getHandOutputBufferAddress=s.asm.Q).apply(null,arguments)},s._getHandTemporaryBufferAddress=function(){return(s._getHandTemporaryBufferAddress=s.asm.R).apply(null,arguments)},s._execHand=function(){return(s._execHand=s.asm.S).apply(null,arguments)},s._initFaceDetectorModelBuffer=function(){return(s._initFaceDetectorModelBuffer=s.asm.T).apply(null,arguments)},s._getFaceDetectorModelBufferAddress=function(){return(s._getFaceDetectorModelBufferAddress=s.asm.U).apply(null,arguments)},s._loadFaceDetectorModel=function(){return(s._loadFaceDetectorModel=s.asm.V).apply(null,arguments)},s._initFaceLandmarkModelBuffer=function(){return(s._initFaceLandmarkModelBuffer=s.asm.W).apply(null,arguments)},s._getFaceLandmarkModelBufferAddress=function(){return(s._getFaceLandmarkModelBufferAddress=s.asm.X).apply(null,arguments)},s._loadFaceLandmarkModel=function(){return(s._loadFaceLandmarkModel=s.asm.Y).apply(null,arguments)},s._initFaceInputBuffer=function(){return(s._initFaceInputBuffer=s.asm.Z).apply(null,arguments)},s._getFaceInputBufferAddress=function(){return(s._getFaceInputBufferAddress=s.asm._).apply(null,arguments)},s._getFaceOutputBufferAddress=function(){return(s._getFaceOutputBufferAddress=s.asm.$).apply(null,arguments)},s._getFaceTemporaryBufferAddress=function(){return(s._getFaceTemporaryBufferAddress=s.asm.aa).apply(null,arguments)},s._execFace=function(){return(s._execFace=s.asm.ba).apply(null,arguments)},s._malloc=function(){return(Bt=s._malloc=s.asm.ca).apply(null,arguments)}),Ft=s.___errno_location=function(){return(Ft=s.___errno_location=s.asm.da).apply(null,arguments)},Mt=s._memalign=function(){return(Mt=s._memalign=s.asm.ea).apply(null,arguments)};function Dt(t){this.name="ExitStatus",this.message="Program terminated with exit("+t+")",this.status=t}function It(t){function r(){kt||(kt=!0,s.calledRun=!0,x||(s.noFSInit||mt.init.initialized||mt.init(),mt.ignorePermissions=!1,ht.init(),rt(N),e(s),s.onRuntimeInitialized&&s.onRuntimeInitialized(),function(){if(s.postRun)for("function"==typeof s.postRun&&(s.postRun=[s.postRun]);s.postRun.length;)t=s.postRun.shift(),z.unshift(t);var t;rt(z)}()))}t=t||m,$>0||(function(){if(s.preRun)for("function"==typeof s.preRun&&(s.preRun=[s.preRun]);s.preRun.length;)t=s.preRun.shift(),C.unshift(t);var t;rt(C)}(),$>0||(s.setStatus?(s.setStatus("Running..."),setTimeout((function(){setTimeout((function(){s.setStatus("")}),1),r()}),1)):r()))}if(G=function t(){kt||It(),kt||(G=t)},s.run=It,s.preInit)for("function"==typeof s.preInit&&(s.preInit=[s.preInit]);s.preInit.length>0;)s.preInit.pop()();return It(),t.ready});t.exports=i},782:()=>{},384:()=>{},375:()=>{}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var i=e[n]={exports:{}};return t[n].call(i.exports,i,i.exports,r),i.exports}(()=>{"use strict";var t=r(55);const e={lips:[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],leftEye:[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],rightEye:[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417],leftIris:[468,469,470,471,472],rightIris:[473,474,475,476,477]};class n extends t.ImageProcessor{constructor(){super(...arguments),this.tflite=null,this.tfliteHandInputAddress=0,this.tfliteHandOutputAddress=0,this.tfliteFaceInputAddress=0,this.tfliteFaceOutputAddress=0,this.tflitePoseInputAddress=0,this.tflitePoseOutputAddress=0,this.init=async e=>{if(e.browserType!==t.BrowserTypes.SAFARI){const t=r(503);this.tflite=await t({wasmBinary:e.wasmBin})}else console.error("This module use wasm-simd. Safari is not supported.");const n=e.palmDetectorModelTFLites[e.handModelKey];this.tflite._initPalmDetectorModelBuffer(n.byteLength);const o=this.tflite._getPalmDetectorModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(n),o),this.tflite._loadPalmDetectorModel(n.byteLength);const i=e.handLandmarkModelTFLites[e.handModelKey];this.tflite._initHandLandmarkModelBuffer(i.byteLength);const s=this.tflite._getHandLandmarkModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(i),s),this.tflite._loadHandLandmarkModel(i.byteLength),this.tflite._initHandInputBuffer(e.maxProcessWidth,e.maxProcessHeight,4),this.tfliteHandInputAddress=this.tflite._getHandInputBufferAddress(),this.tfliteHandOutputAddress=this.tflite._getHandOutputBufferAddress(),console.log("Hand model is loaded successfully.",e);const a=e.faceDetectorModelTFLites[e.faceModelKey];this.tflite._initFaceDetectorModelBuffer(a.byteLength);const u=this.tflite._getFaceDetectorModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(a),u),this.tflite._loadFaceDetectorModel(a.byteLength);const f=e.faceLandmarkModelTFLites[e.faceModelKey];this.tflite._initFaceLandmarkModelBuffer(f.byteLength);const l=this.tflite._getFaceLandmarkModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(f),l),this.tflite._loadFaceLandmarkModel(f.byteLength),this.tflite._initFaceInputBuffer(e.maxProcessWidth,e.maxProcessHeight,4),this.tfliteFaceInputAddress=this.tflite._getFaceInputBufferAddress(),this.tfliteFaceOutputAddress=this.tflite._getFaceOutputBufferAddress(),console.log("Face model is loaded successfully.",e);const c=e.poseDetectorModelTFLites[e.poseModelKey];this.tflite._initPoseDetectorModelBuffer(c.byteLength);const d=this.tflite._getPoseDetectorModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(c),d),this.tflite._loadPoseDetectorModel(c.byteLength);const h=e.poseLandmarkModelTFLites[e.poseModelKey];this.tflite._initPoseLandmarkModelBuffer(h.byteLength);const p=this.tflite._getPoseLandmarkModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(h),p),this.tflite._loadPoseLandmarkModel(h.byteLength),this.tflite._initPoseInputBuffer(e.maxProcessWidth,e.maxProcessHeight,4),this.tflitePoseInputAddress=this.tflite._getPoseInputBufferAddress(),this.tflitePoseOutputAddress=this.tflite._getPoseOutputBufferAddress(),console.log("Pose model is loaded successfully.",e)},this.predict=async(t,e,r)=>"hand"===e.operationType?this.predictHand(t,e,r):"face"===e.operationType?this.predictFace(t,e,r):"pose"===e.operationType?this.predictPose(t,e,r):null,this.predictHand=async(t,e,r)=>{const n=new ImageData(r,e.handProcessWidth,e.handProcessHeight);this.tflite.HEAPU8.set(n.data,this.tfliteHandInputAddress),this.tflite._execHand(e.handProcessWidth,e.handProcessHeight,e.handMaxHands,e.handAffineResizedFactor);const o=this.tflite.HEAPF32[this.tfliteHandOutputAddress/4],i=[];for(let t=0;t({keypoints:[...t.landmarkKeypoints],handedness:t.handedness<.5?"Left":"Right",score:t.score})))},this.predictFace=async(t,r,n)=>{const o=new ImageData(n,r.faceProcessWidth,r.faceProcessHeight);this.tflite.HEAPU8.set(o.data,this.tfliteFaceInputAddress),this.tflite._execFace(r.faceProcessWidth,r.faceProcessHeight,r.faceMaxFaces);const i=this.tflite.HEAPF32[this.tfliteFaceOutputAddress/4],s=[];for(let t=0;t.5&&r.landmarkScore>.5&&s.push(r)}return s.map((t=>{const r={keypoints:[...t.landmarkKeypoints],box:{xMin:t.face.minX,yMin:t.face.minY,xMax:t.face.maxX,yMax:t.face.maxY,width:t.face.maxX-t.face.minX,height:t.face.maxY-t.face.maxY}};return e.lips.forEach(((e,n)=>{r.keypoints[e].x=t.landmarkLipsKeypoints[n].x,r.keypoints[e].y=t.landmarkLipsKeypoints[n].y})),e.leftEye.forEach(((e,n)=>{r.keypoints[e].x=t.landmarkLeftEyeKeypoints[n].x,r.keypoints[e].y=t.landmarkLeftEyeKeypoints[n].y})),e.rightEye.forEach(((e,n)=>{r.keypoints[e].x=t.landmarkRightEyeKeypoints[n].x,r.keypoints[e].y=t.landmarkRightEyeKeypoints[n].y})),e.leftIris.forEach(((e,n)=>{r.keypoints[e]=t.landmarkLeftIrisKeypoints[n]})),e.rightIris.forEach(((e,n)=>{r.keypoints[e]=t.landmarkRightIrisKeypoints[n]})),r}))},this.predictPose=async(t,e,r)=>{const n=new ImageData(r,e.poseProcessWidth,e.poseProcessHeight);this.tflite.HEAPU8.set(n.data,this.tflitePoseInputAddress),this.tflite._set_pose_calculate_mode(e.poseCalculateMode),this.tflite._execPose(e.poseProcessWidth,e.poseProcessHeight,e.poseMaxPoses,e.poseAffineResizedFactor,e.poseCropExt);const o=this.tflite.HEAPF32[this.tflitePoseOutputAddress/4],i=[];for(let t=0;t.1&&r.landmarkScore>0&&i.push(r)}return i.map((t=>({keypoints:[...t.landmarkKeypoints],keypoints3D:[...t.landmarkKeypoints3D],box:{xMin:t.pose.minX,yMin:t.pose.minY,xMax:t.pose.maxX,yMax:t.pose.maxY,width:t.pose.maxX-t.pose.minX,height:t.pose.maxY-t.pose.maxY}})))}}}const o=self,i=new t.WorkerDispatcher(o),s={init:async t=>{const e=new n;return await e.init(t),e}};i.setCallback(s),onmessage=i.dispach})()})();',"Worker",void 0,void 0)}const l=468,u=[127,34,139,11,0,37,232,231,120,72,37,39,128,121,47,232,121,128,104,69,67,175,171,148,157,154,155,118,50,101,73,39,40,9,151,108,48,115,131,194,204,211,74,40,185,80,42,183,40,92,186,230,229,118,202,212,214,83,18,17,76,61,146,160,29,30,56,157,173,106,204,194,135,214,192,203,165,98,21,71,68,51,45,4,144,24,23,77,146,91,205,50,187,201,200,18,91,106,182,90,91,181,85,84,17,206,203,36,148,171,140,92,40,39,193,189,244,159,158,28,247,246,161,236,3,196,54,68,104,193,168,8,117,228,31,189,193,55,98,97,99,126,47,100,166,79,218,155,154,26,209,49,131,135,136,150,47,126,217,223,52,53,45,51,134,211,170,140,67,69,108,43,106,91,230,119,120,226,130,247,63,53,52,238,20,242,46,70,156,78,62,96,46,53,63,143,34,227,173,155,133,123,117,111,44,125,19,236,134,51,216,206,205,154,153,22,39,37,167,200,201,208,36,142,100,57,212,202,20,60,99,28,158,157,35,226,113,160,159,27,204,202,210,113,225,46,43,202,204,62,76,77,137,123,116,41,38,72,203,129,142,64,98,240,49,102,64,41,73,74,212,216,207,42,74,184,169,170,211,170,149,176,105,66,69,122,6,168,123,147,187,96,77,90,65,55,107,89,90,180,101,100,120,63,105,104,93,137,227,15,86,85,129,102,49,14,87,86,55,8,9,100,47,121,145,23,22,88,89,179,6,122,196,88,95,96,138,172,136,215,58,172,115,48,219,42,80,81,195,3,51,43,146,61,171,175,199,81,82,38,53,46,225,144,163,110,246,33,7,52,65,66,229,228,117,34,127,234,107,108,69,109,108,151,48,64,235,62,78,191,129,209,126,111,35,143,163,161,246,117,123,50,222,65,52,19,125,141,221,55,65,3,195,197,25,7,33,220,237,44,70,71,139,122,193,245,247,130,33,71,21,162,153,158,159,170,169,150,188,174,196,216,186,92,144,160,161,2,97,167,141,125,241,164,167,37,72,38,12,145,159,160,38,82,13,63,68,71,226,35,111,158,153,154,101,50,205,206,92,165,209,198,217,165,167,97,220,115,218,133,112,243,239,238,241,214,135,169,190,173,133,171,208,32,125,44,237,86,87,178,85,86,179,84,85,180,83,84,181,201,83,182,137,93,132,76,62,183,61,76,184,57,61,185,212,57,186,214,207,187,34,143,156,79,239,237,123,137,177,44,1,4,201,194,32,64,102,129,213,215,138,59,166,219,242,99,97,2,94,141,75,59,235,24,110,228,25,130,226,23,24,229,22,23,230,26,22,231,112,26,232,189,190,243,221,56,190,28,56,221,27,28,222,29,27,223,30,29,224,247,30,225,238,79,20,166,59,75,60,75,240,147,177,215,20,79,166,187,147,213,112,233,244,233,128,245,128,114,188,114,217,174,131,115,220,217,198,236,198,131,134,177,132,58,143,35,124,110,163,7,228,110,25,356,389,368,11,302,267,452,350,349,302,303,269,357,343,277,452,453,357,333,332,297,175,152,377,384,398,382,347,348,330,303,304,270,9,336,337,278,279,360,418,262,431,304,408,409,310,415,407,270,409,410,450,348,347,422,430,434,313,314,17,306,307,375,387,388,260,286,414,398,335,406,418,364,367,416,423,358,327,251,284,298,281,5,4,373,374,253,307,320,321,425,427,411,421,313,18,321,405,406,320,404,405,315,16,17,426,425,266,377,400,369,322,391,269,417,465,464,386,257,258,466,260,388,456,399,419,284,332,333,417,285,8,346,340,261,413,441,285,327,460,328,355,371,329,392,439,438,382,341,256,429,420,360,364,394,379,277,343,437,443,444,283,275,440,363,431,262,369,297,338,337,273,375,321,450,451,349,446,342,467,293,334,282,458,461,462,276,353,383,308,324,325,276,300,293,372,345,447,382,398,362,352,345,340,274,1,19,456,248,281,436,427,425,381,256,252,269,391,393,200,199,428,266,330,329,287,273,422,250,462,328,258,286,384,265,353,342,387,259,257,424,431,430,342,353,276,273,335,424,292,325,307,366,447,345,271,303,302,423,266,371,294,455,460,279,278,294,271,272,304,432,434,427,272,407,408,394,430,431,395,369,400,334,333,299,351,417,168,352,280,411,325,319,320,295,296,336,319,403,404,330,348,349,293,298,333,323,454,447,15,16,315,358,429,279,14,15,316,285,336,9,329,349,350,374,380,252,318,402,403,6,197,419,318,319,325,367,364,365,435,367,397,344,438,439,272,271,311,195,5,281,273,287,291,396,428,199,311,271,268,283,444,445,373,254,339,263,466,249,282,334,296,449,347,346,264,447,454,336,296,299,338,10,151,278,439,455,292,407,415,358,371,355,340,345,372,390,249,466,346,347,280,442,443,282,19,94,370,441,442,295,248,419,197,263,255,359,440,275,274,300,383,368,351,412,465,263,467,466,301,368,389,380,374,386,395,378,379,412,351,419,436,426,322,373,390,388,2,164,393,370,462,461,164,0,267,302,11,12,374,373,387,268,12,13,293,300,301,446,261,340,385,384,381,330,266,425,426,423,391,429,355,437,391,327,326,440,457,438,341,382,362,459,457,461,434,430,394,414,463,362,396,369,262,354,461,457,316,403,402,315,404,403,314,405,404,313,406,405,421,418,406,366,401,361,306,408,407,291,409,408,287,410,409,432,436,410,434,416,411,264,368,383,309,438,457,352,376,401,274,275,4,421,428,262,294,327,358,433,416,367,289,455,439,462,370,326,2,326,370,305,460,455,254,449,448,255,261,446,253,450,449,252,451,450,256,452,451,341,453,452,413,464,463,441,413,414,258,442,441,257,443,442,259,444,443,260,445,444,467,342,445,459,458,250,289,392,290,290,328,460,376,433,435,250,290,392,411,416,433,341,463,464,453,464,465,357,465,412,343,412,399,360,363,440,437,399,456,420,456,363,401,435,288,372,383,353,339,255,249,448,261,255,133,243,190,133,155,112,33,246,247,33,130,25,398,384,286,362,398,414,362,463,341,263,359,467,263,249,255,466,467,260,75,60,166,238,239,79,162,127,139,72,11,37,121,232,120,73,72,39,114,128,47,233,232,128,103,104,67,152,175,148,173,157,155,119,118,101,74,73,40,107,9,108,49,48,131,32,194,211,184,74,185,191,80,183,185,40,186,119,230,118,210,202,214,84,83,17,77,76,146,161,160,30,190,56,173,182,106,194,138,135,192,129,203,98,54,21,68,5,51,4,145,144,23,90,77,91,207,205,187,83,201,18,181,91,182,180,90,181,16,85,17,205,206,36,176,148,140,165,92,39,245,193,244,27,159,28,30,247,161,174,236,196,103,54,104,55,193,8,111,117,31,221,189,55,240,98,99,142,126,100,219,166,218,112,155,26,198,209,131,169,135,150,114,47,217,224,223,53,220,45,134,32,211,140,109,67,108,146,43,91,231,230,120,113,226,247,105,63,52,241,238,242,124,46,156,95,78,96,70,46,63,116,143,227,116,123,111,1,44,19,3,236,51,207,216,205,26,154,22,165,39,167,199,200,208,101,36,100,43,57,202,242,20,99,56,28,157,124,35,113,29,160,27,211,204,210,124,113,46,106,43,204,96,62,77,227,137,116,73,41,72,36,203,142,235,64,240,48,49,64,42,41,74,214,212,207,183,42,184,210,169,211,140,170,176,104,105,69,193,122,168,50,123,187,89,96,90,66,65,107,179,89,180,119,101,120,68,63,104,234,93,227,16,15,85,209,129,49,15,14,86,107,55,9,120,100,121,153,145,22,178,88,179,197,6,196,89,88,96,135,138,136,138,215,172,218,115,219,41,42,81,5,195,51,57,43,61,208,171,199,41,81,38,224,53,225,24,144,110,105,52,66,118,229,117,227,34,234,66,107,69,10,109,151,219,48,235,183,62,191,142,129,126,116,111,143,7,163,246,118,117,50,223,222,52,94,19,141,222,221,65,196,3,197,45,220,44,156,70,139,188,122,245,139,71,162,145,153,159,149,170,150,122,188,196,206,216,92,163,144,161,164,2,167,242,141,241,0,164,37,11,72,12,144,145,160,12,38,13,70,63,71,31,226,111,157,158,154,36,101,205,203,206,165,126,209,217,98,165,97,237,220,218,237,239,241,210,214,169,140,171,32,241,125,237,179,86,178,180,85,179,181,84,180,182,83,181,194,201,182,177,137,132,184,76,183,185,61,184,186,57,185,216,212,186,192,214,187,139,34,156,218,79,237,147,123,177,45,44,4,208,201,32,98,64,129,192,213,138,235,59,219,141,242,97,97,2,141,240,75,235,229,24,228,31,25,226,230,23,229,231,22,230,232,26,231,233,112,232,244,189,243,189,221,190,222,28,221,223,27,222,224,29,223,225,30,224,113,247,225,99,60,240,213,147,215,60,20,166,192,187,213,243,112,244,244,233,245,245,128,188,188,114,174,134,131,220,174,217,236,236,198,134,215,177,58,156,143,124,25,110,7,31,228,25,264,356,368,0,11,267,451,452,349,267,302,269,350,357,277,350,452,357,299,333,297,396,175,377,381,384,382,280,347,330,269,303,270,151,9,337,344,278,360,424,418,431,270,304,409,272,310,407,322,270,410,449,450,347,432,422,434,18,313,17,291,306,375,259,387,260,424,335,418,434,364,416,391,423,327,301,251,298,275,281,4,254,373,253,375,307,321,280,425,411,200,421,18,335,321,406,321,320,405,314,315,17,423,426,266,396,377,369,270,322,269,413,417,464,385,386,258,248,456,419,298,284,333,168,417,8,448,346,261,417,413,285,326,327,328,277,355,329,309,392,438,381,382,256,279,429,360,365,364,379,355,277,437,282,443,283,281,275,363,395,431,369,299,297,337,335,273,321,348,450,349,359,446,467,283,293,282,250,458,462,300,276,383,292,308,325,283,276,293,264,372,447,346,352,340,354,274,19,363,456,281,426,436,425,380,381,252,267,269,393,421,200,428,371,266,329,432,287,422,290,250,328,385,258,384,446,265,342,386,387,257,422,424,430,445,342,276,422,273,424,306,292,307,352,366,345,268,271,302,358,423,371,327,294,460,331,279,294,303,271,304,436,432,427,304,272,408,395,394,431,378,395,400,296,334,299,6,351,168,376,352,411,307,325,320,285,295,336,320,319,404,329,330,349,334,293,333,366,323,447,316,15,315,331,358,279,317,14,316,8,285,9,277,329,350,253,374,252,319,318,403,351,6,419,324,318,325,397,367,365,288,435,397,278,344,439,310,272,311,248,195,281,375,273,291,175,396,199,312,311,268,276,283,445,390,373,339,295,282,296,448,449,346,356,264,454,337,336,299,337,338,151,294,278,455,308,292,415,429,358,355,265,340,372,388,390,466,352,346,280,295,442,282,354,19,370,285,441,295,195,248,197,457,440,274,301,300,368,417,351,465,251,301,389,385,380,386,394,395,379,399,412,419,410,436,322,387,373,388,326,2,393,354,370,461,393,164,267,268,302,12,386,374,387,312,268,13,298,293,301,265,446,340,380,385,381,280,330,425,322,426,391,420,429,437,393,391,326,344,440,438,458,459,461,364,434,394,428,396,262,274,354,457,317,316,402,316,315,403,315,314,404,314,313,405,313,421,406,323,366,361,292,306,407,306,291,408,291,287,409,287,432,410,427,434,411,372,264,383,459,309,457,366,352,401,1,274,4,418,421,262,331,294,358,435,433,367,392,289,439,328,462,326,94,2,370,289,305,455,339,254,448,359,255,446,254,253,449,253,252,450,252,256,451,256,341,452,414,413,463,286,441,414,286,258,441,258,257,442,257,259,443,259,260,444,260,467,445,309,459,250,305,289,290,305,290,460,401,376,435,309,250,392,376,411,433,453,341,464,357,453,465,343,357,412,437,343,399,344,360,440,420,437,456,360,420,363,361,401,288,265,372,353,390,339,249,339,448,255],d=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],h=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],f=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417],p=[468,469,470,471,472],m=[473,474,475,476,477],g={lips:d,leftEye:h,rightEye:f,leftIris:p,rightIris:m};class C extends e.ImageProcessor{constructor(){super(...arguments),this.tflite=null,this.tfliteHandInputAddress=0,this.tfliteHandOutputAddress=0,this.tfliteFaceInputAddress=0,this.tfliteFaceOutputAddress=0,this.tflitePoseInputAddress=0,this.tflitePoseOutputAddress=0,this.init=async t=>{if(t.browserType!==e.BrowserTypes.SAFARI){const e=i(503);this.tflite=await e({wasmBinary:t.wasmBin})}else console.error("This module use wasm-simd. Safari is not supported.");const n=t.palmDetectorModelTFLites[t.handModelKey];this.tflite._initPalmDetectorModelBuffer(n.byteLength);const r=this.tflite._getPalmDetectorModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(n),r),this.tflite._loadPalmDetectorModel(n.byteLength);const a=t.handLandmarkModelTFLites[t.handModelKey];this.tflite._initHandLandmarkModelBuffer(a.byteLength);const o=this.tflite._getHandLandmarkModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(a),o),this.tflite._loadHandLandmarkModel(a.byteLength),this.tflite._initHandInputBuffer(t.maxProcessWidth,t.maxProcessHeight,4),this.tfliteHandInputAddress=this.tflite._getHandInputBufferAddress(),this.tfliteHandOutputAddress=this.tflite._getHandOutputBufferAddress(),console.log("Hand model is loaded successfully.",t);const s=t.faceDetectorModelTFLites[t.faceModelKey];this.tflite._initFaceDetectorModelBuffer(s.byteLength);const c=this.tflite._getFaceDetectorModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(s),c),this.tflite._loadFaceDetectorModel(s.byteLength);const l=t.faceLandmarkModelTFLites[t.faceModelKey];this.tflite._initFaceLandmarkModelBuffer(l.byteLength);const u=this.tflite._getFaceLandmarkModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(l),u),this.tflite._loadFaceLandmarkModel(l.byteLength),this.tflite._initFaceInputBuffer(t.maxProcessWidth,t.maxProcessHeight,4),this.tfliteFaceInputAddress=this.tflite._getFaceInputBufferAddress(),this.tfliteFaceOutputAddress=this.tflite._getFaceOutputBufferAddress(),console.log("Face model is loaded successfully.",t);const d=t.poseDetectorModelTFLites[t.poseModelKey];this.tflite._initPoseDetectorModelBuffer(d.byteLength);const h=this.tflite._getPoseDetectorModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(d),h),this.tflite._loadPoseDetectorModel(d.byteLength);const f=t.poseLandmarkModelTFLites[t.poseModelKey];this.tflite._initPoseLandmarkModelBuffer(f.byteLength);const p=this.tflite._getPoseLandmarkModelBufferAddress();this.tflite.HEAPU8.set(new Uint8Array(f),p),this.tflite._loadPoseLandmarkModel(f.byteLength),this.tflite._initPoseInputBuffer(t.maxProcessWidth,t.maxProcessHeight,4),this.tflitePoseInputAddress=this.tflite._getPoseInputBufferAddress(),this.tflitePoseOutputAddress=this.tflite._getPoseOutputBufferAddress(),console.log("Pose model is loaded successfully.",t)},this.predict=async(e,n,i)=>n.operationType===t.hand?this.predictHand(e,n,i):n.operationType===t.face?this.predictFace(e,n,i):n.operationType===t.pose?this.predictPose(e,n,i):null,this.predictHand=async(e,t,n)=>{const i=new ImageData(n,t.handProcessWidth,t.handProcessHeight);this.tflite.HEAPU8.set(i.data,this.tfliteHandInputAddress),this.tflite._execHand(t.handProcessWidth,t.handProcessHeight,t.handMaxHands,t.handAffineResizedFactor);const r=this.tflite.HEAPF32[this.tfliteHandOutputAddress/4],a=[];for(let e=0;e({keypoints:[...e.landmarkKeypoints],handedness:e.handedness<.5?"Left":"Right",score:e.score})))},this.predictFace=async(e,t,n)=>{const i=new ImageData(n,t.faceProcessWidth,t.faceProcessHeight);this.tflite.HEAPU8.set(i.data,this.tfliteFaceInputAddress),this.tflite._execFace(t.faceProcessWidth,t.faceProcessHeight,t.faceMaxFaces);const r=this.tflite.HEAPF32[this.tfliteFaceOutputAddress/4],a=[];for(let e=0;e.5&&n.landmarkScore>.5&&a.push(n)}return a.map((e=>{const t={keypoints:[...e.landmarkKeypoints],box:{xMin:e.face.minX,yMin:e.face.minY,xMax:e.face.maxX,yMax:e.face.maxY,width:e.face.maxX-e.face.minX,height:e.face.maxY-e.face.maxY}};return g.lips.forEach(((n,i)=>{t.keypoints[n].x=e.landmarkLipsKeypoints[i].x,t.keypoints[n].y=e.landmarkLipsKeypoints[i].y})),g.leftEye.forEach(((n,i)=>{t.keypoints[n].x=e.landmarkLeftEyeKeypoints[i].x,t.keypoints[n].y=e.landmarkLeftEyeKeypoints[i].y})),g.rightEye.forEach(((n,i)=>{t.keypoints[n].x=e.landmarkRightEyeKeypoints[i].x,t.keypoints[n].y=e.landmarkRightEyeKeypoints[i].y})),g.leftIris.forEach(((n,i)=>{t.keypoints[n]=e.landmarkLeftIrisKeypoints[i]})),g.rightIris.forEach(((n,i)=>{t.keypoints[n]=e.landmarkRightIrisKeypoints[i]})),t}))},this.predictPose=async(e,t,n)=>{const i=new ImageData(n,t.poseProcessWidth,t.poseProcessHeight);this.tflite.HEAPU8.set(i.data,this.tflitePoseInputAddress),this.tflite._set_pose_calculate_mode(t.poseCalculateMode),this.tflite._execPose(t.poseProcessWidth,t.poseProcessHeight,t.poseMaxPoses,t.poseAffineResizedFactor,t.poseCropExt);const r=this.tflite.HEAPF32[this.tflitePoseOutputAddress/4],a=[];for(let e=0;e.1&&n.landmarkScore>0&&a.push(n)}return a.map((e=>({keypoints:[...e.landmarkKeypoints],keypoints3D:[...e.landmarkKeypoints3D],box:{xMin:e.pose.minX,yMin:e.pose.minY,xMax:e.pose.maxX,yMax:e.pose.maxY,width:e.pose.maxX-e.pose.minX,height:e.pose.maxY-e.pose.maxY}})))}}}class v extends e.WorkerManagerBase{constructor(){super(...arguments),this.imageProcessor=new C,this.config=null,this.generateDefaultConfig=async t=>{const n=t?.wasmUrl||i(81),r=this.fetchData(n),a=t?.palmDetectorModelTFLiteUrl||i(102),o=this.fetchData(a),s=t?.handLandmarkLiteTFLiteUrl||i(583),c=this.fetchData(s),l=t?.faceDetectorModelTFLiteUrl||i(363),u=this.fetchData(l),d=t?.faceLandmarkModelTFLiteUrl||i(180),h=this.fetchData(d),f=t?.poseDetectorModelTFLiteUrl||i(914),p=this.fetchData(f),m=t?.poseLandmarkModelTFLiteUrl||i(747),g=this.fetchData(m),[C,v,y,b,M,x,_]=await Promise.all([r,o,c,u,h,p,g]);return{browserType:(0,e.getBrowserType)(),processOnLocal:!0,pageUrl:window.location.href,wasmBin:C,palmDetectorModelTFLites:{lite:v},handLandmarkModelTFLites:{lite:y},handModelKey:"lite",faceDetectorModelTFLites:{lite:b},faceLandmarkModelTFLites:{lite:M},faceModelKey:"lite",poseDetectorModelTFLites:{lite:x},poseLandmarkModelTFLites:{lite:_},poseModelKey:"lite",maxProcessWidth:1024,maxProcessHeight:1024}},this.generateDefaultMediapipeMixParams=()=>({operationType:t.face,handProcessWidth:512,handProcessHeight:512,handMaxHands:2,handAffineResizedFactor:2,faceProcessWidth:512,faceProcessHeight:512,faceMaxFaces:1,faceMovingAverageWindow:5,poseProcessWidth:512,poseProcessHeight:512,poseMaxPoses:1,poseMovingAverageWindow:5,poseAffineResizedFactor:2,poseCropExt:1.3,poseCalculateMode:0}),this.init=async e=>{this.config=e||await this.generateDefaultConfig(),await this.initCommon({useWorkerForSafari:!0,processOnLocal:this.config.processOnLocal,workerJs:()=>new c},this.config),console.log("[manager] tflite worker initilizied.")},this.predict=async(e,n)=>{if(!this.config)return console.warn("config is not initialized."),null;const i={...e},r=((n,i)=>e.operationType===t.hand?this.generateTargetCanvas(i,n.handProcessWidth,n.handProcessHeight):e.operationType===t.face?this.generateTargetCanvas(i,n.faceProcessWidth,n.faceProcessHeight):this.generateTargetCanvas(i,n.poseProcessWidth,n.poseProcessHeight))(i,n);if(!this.worker){const e=r.getContext("2d").getImageData(0,0,r.width,r.height),n=await this.imageProcessor.predict(this.config,i,e.data);return i.operationType===t.hand?this.generateHandPredictionEx(this.config,i,n):i.operationType===t.face?this.generateFacePredictionEx(this.config,i,n):this.generatePosePredictionEx(this.config,i,n)}const a=r.getContext("2d").getImageData(0,0,r.width,r.height),o=await this.sendToWorker(i,a.data);return i.operationType===t.hand?this.generateHandPredictionEx(this.config,i,o):i.operationType===t.face?this.generateFacePredictionEx(this.config,i,o):this.generatePosePredictionEx(this.config,i,o)},this.generateHandPredictionEx=(e,n,i)=>{const r=i;return{operationType:t.hand,rowPrediction:r}},this.facesMV=[],this.generateFacePredictionEx=(e,n,i)=>{const r=i,a={operationType:t.face,rowPrediction:r};if(n.faceMovingAverageWindow>0){if(r)for(;this.facesMV.length>n.faceMovingAverageWindow;)this.facesMV.shift();r&&r[0]&&r[0].keypoints&&this.facesMV.push(r);const e=this.facesMV.map((e=>e[0].keypoints)).reduce(((e,t)=>{for(let n=0;ne[0].box)).reduce(((e,t)=>e.width?(e.width=e.width+t.width,e.xMax=e.xMax+t.xMax,e.xMin=e.xMin+t.xMin,e.height=e.height+t.height,e.yMax=e.yMax+t.yMax,e.yMin=e.yMin+t.yMin,e):{width:t.width,xMax:t.xMax,xMin:t.xMin,height:t.height,yMax:t.yMax,yMin:t.yMin}),{});console.log(),t.width/=this.facesMV.length,t.xMax/=this.facesMV.length,t.xMin/=this.facesMV.length,t.height/=this.facesMV.length,t.yMax/=this.facesMV.length,t.yMin/=this.facesMV.length,a.singlePersonBoxMovingAverage=t}return a},this.posesMV=[],this.generatePosePredictionEx=(e,n,i)=>{const r=i,a={operationType:t.pose,rowPrediction:r};if(n.poseMovingAverageWindow>0){if(r)for(;this.posesMV.length>n.poseMovingAverageWindow;)this.posesMV.shift();r&&r[0]&&r[0].keypoints&&this.posesMV.push(r);const e=this.posesMV.map((e=>e[0].keypoints)).reduce(((e,t)=>{for(let n=0;ne[0].keypoints3D)).reduce(((e,t)=>{for(let n=0;ne[0].box)).reduce(((e,t)=>e.width?(e.width=e.width+t.width,e.xMax=e.xMax+t.xMax,e.xMin=e.xMin+t.xMin,e.height=e.height+t.height,e.yMax=e.yMax+t.yMax,e.yMin=e.yMin+t.yMin,e):{width:t.width,xMax:t.xMax,xMin:t.xMin,height:t.height,yMax:t.yMax,yMin:t.yMin}),{});console.log(),i.width/=this.posesMV.length,i.xMax/=this.posesMV.length,i.xMin/=this.posesMV.length,i.height/=this.posesMV.length,i.yMax/=this.posesMV.length,i.yMin/=this.posesMV.length,a.singlePersonBoxMovingAverage=i}return a},this.fitCroppedArea=(e,t,n,i,r,a,o,s,c,l,u)=>{if(!e.singlePersonBoxMovingAverage)return{xmin:0,ymin:0,width:0,height:0};const d=t/i,h=n/r,f=e.singlePersonBoxMovingAverage.xMin*d,p=e.singlePersonBoxMovingAverage.xMax*d,m=e.singlePersonBoxMovingAverage.yMin*h,g=e.singlePersonBoxMovingAverage.yMax*h,C=(p+f)/2,v=(g+m)/2,y=p-C,b=g-v;let M=C-y*(1+l);M=M<0?0:M;let x=C+y*(1+u);x=x>t?t:x;let _=v-b*(1+s);_=_<0?0:_;let S=v+b*(1+c);S=S>n?n:S;const w=x-M,L=S-_,E=(x+M)/2,T=(S+_)/2,z=o/a;let A,V,H,R;return w*z>L?(A=w,V=w*z):(A=L/z,V=L),H=E-A/2<0?0:E+A/2>t?t-A:E-A/2,R=T-V/2<0?0:T+V/2>n?n-V:T-V/2,{xmin:H,ymin:R,width:A,height:V}}}}})(),a})(),e.exports=i()},698:(e,t,n)=>{"use strict";n.r(t),n.d(t,{MToonMaterial:()=>El,MToonMaterialCullMode:()=>Ml,MToonMaterialDebugMode:()=>xl,MToonMaterialOutlineColorMode:()=>_l,MToonMaterialOutlineWidthMode:()=>Sl,MToonMaterialRenderMode:()=>wl,VRM:()=>Yl,VRMBlendShapeGroup:()=>Nc,VRMBlendShapeImporter:()=>qc,VRMBlendShapeProxy:()=>jc,VRMCurveMapper:()=>al,VRMDebug:()=>du,VRMFirstPerson:()=>Kc,VRMFirstPersonImporter:()=>Zc,VRMHumanBone:()=>Qc,VRMHumanoid:()=>il,VRMHumanoidImporter:()=>rl,VRMImporter:()=>Xl,VRMLookAtApplyer:()=>ol,VRMLookAtBlendShapeApplyer:()=>sl,VRMLookAtBoneApplyer:()=>ml,VRMLookAtHead:()=>fl,VRMLookAtImporter:()=>Cl,VRMMaterialImporter:()=>zl,VRMMetaImporter:()=>Al,VRMRendererFirstPersonFlags:()=>$c,VRMSchema:()=>Dc,VRMSpringBone:()=>Ul,VRMSpringBoneDebug:()=>su,VRMSpringBoneImporter:()=>ql,VRMSpringBoneImporterDebug:()=>cu,VRMSpringBoneManager:()=>Wl,VRMUnlitMaterial:()=>Tl,VRMUnlitMaterialRenderType:()=>Ll,VRMUtils:()=>eu,VRM_GIZMO_RENDER_ORDER:()=>uu});const i="137",r=100,a=301,o=302,s=306,c=1e3,l=1001,u=1002,d=1003,h=1006,f=1008,p=1009,m=1012,g=1014,C=1015,v=1016,y=1020,b=1023,M=1026,x=1027,_=33776,S=33777,w=33778,L=33779,E=2300,T=2301,z=2302,A=2400,V=2401,H=2402,R=3e3,P=3001,I=7680,k=35044,N=35048,D="300 es",O=1035;class B{addEventListener(e,t){void 0===this._listeners&&(this._listeners={});const n=this._listeners;void 0===n[e]&&(n[e]=[]),-1===n[e].indexOf(t)&&n[e].push(t)}hasEventListener(e,t){if(void 0===this._listeners)return!1;const n=this._listeners;return void 0!==n[e]&&-1!==n[e].indexOf(t)}removeEventListener(e,t){if(void 0===this._listeners)return;const n=this._listeners[e];if(void 0!==n){const e=n.indexOf(t);-1!==e&&n.splice(e,1)}}dispatchEvent(e){if(void 0===this._listeners)return;const t=this._listeners[e.type];if(void 0!==t){e.target=this;const n=t.slice(0);for(let t=0,i=n.length;t>8&255]+F[e>>16&255]+F[e>>24&255]+"-"+F[255&t]+F[t>>8&255]+"-"+F[t>>16&15|64]+F[t>>24&255]+"-"+F[63&n|128]+F[n>>8&255]+"-"+F[n>>16&255]+F[n>>24&255]+F[255&i]+F[i>>8&255]+F[i>>16&255]+F[i>>24&255]).toUpperCase()}function j(e,t,n){return Math.max(t,Math.min(n,e))}function q(e,t,n){return(1-n)*e+n*t}function X(e){return 0==(e&e-1)&&0!==e}function Y(e){return Math.pow(2,Math.floor(Math.log(e)/Math.LN2))}class J{constructor(e=0,t=0){this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e,t){return void 0!==t?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this)}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e,t){return void 0!==t?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this)}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,n=this.y,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6],this.y=i[1]*t+i[4]*n+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t,n){return void 0!==n&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){const n=Math.cos(t),i=Math.sin(t),r=this.x-e.x,a=this.y-e.y;return this.x=r*n-a*i+e.x,this.y=r*i+a*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}J.prototype.isVector2=!0;class ${constructor(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(e,t,n,i,r,a,o,s,c){const l=this.elements;return l[0]=e,l[1]=i,l[2]=o,l[3]=t,l[4]=r,l[5]=s,l[6]=n,l[7]=a,l[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,a=n[0],o=n[3],s=n[6],c=n[1],l=n[4],u=n[7],d=n[2],h=n[5],f=n[8],p=i[0],m=i[3],g=i[6],C=i[1],v=i[4],y=i[7],b=i[2],M=i[5],x=i[8];return r[0]=a*p+o*C+s*b,r[3]=a*m+o*v+s*M,r[6]=a*g+o*y+s*x,r[1]=c*p+l*C+u*b,r[4]=c*m+l*v+u*M,r[7]=c*g+l*y+u*x,r[2]=d*p+h*C+f*b,r[5]=d*m+h*v+f*M,r[8]=d*g+h*y+f*x,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8];return t*a*l-t*o*c-n*r*l+n*o*s+i*r*c-i*a*s}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8],u=l*a-o*c,d=o*s-l*r,h=c*r-a*s,f=t*u+n*d+i*h;if(0===f)return this.set(0,0,0,0,0,0,0,0,0);const p=1/f;return e[0]=u*p,e[1]=(i*c-l*n)*p,e[2]=(o*n-i*a)*p,e[3]=d*p,e[4]=(l*t-i*s)*p,e[5]=(i*r-o*t)*p,e[6]=h*p,e[7]=(n*s-c*t)*p,e[8]=(a*t-n*r)*p,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,i,r,a,o){const s=Math.cos(r),c=Math.sin(r);return this.set(n*s,n*c,-n*(s*a+c*o)+a+e,-i*c,i*s,-i*(-c*a+s*o)+o+t,0,0,1),this}scale(e,t){const n=this.elements;return n[0]*=e,n[3]*=e,n[6]*=e,n[1]*=t,n[4]*=t,n[7]*=t,this}rotate(e){const t=Math.cos(e),n=Math.sin(e),i=this.elements,r=i[0],a=i[3],o=i[6],s=i[1],c=i[4],l=i[7];return i[0]=t*r+n*s,i[3]=t*a+n*c,i[6]=t*o+n*l,i[1]=-n*r+t*s,i[4]=-n*a+t*c,i[7]=-n*o+t*l,this}translate(e,t){const n=this.elements;return n[0]+=e*n[2],n[3]+=e*n[5],n[6]+=e*n[8],n[1]+=t*n[2],n[4]+=t*n[5],n[7]+=t*n[8],this}equals(e){const t=this.elements,n=e.elements;for(let e=0;e<9;e++)if(t[e]!==n[e])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return(new this.constructor).fromArray(this.elements)}}function K(e){for(let t=e.length-1;t>=0;--t)if(e[t]>65535)return!0;return!1}function Z(e){return document.createElementNS("http://www.w3.org/1999/xhtml",e)}$.prototype.isMatrix3=!0,Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array;const Q={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},ee={h:0,s:0,l:0},te={h:0,s:0,l:0};function ne(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+6*(t-e)*(2/3-n):e}function ie(e){return e<.04045?.0773993808*e:Math.pow(.9478672986*e+.0521327014,2.4)}function re(e){return e<.0031308?12.92*e:1.055*Math.pow(e,.41666)-.055}class ae{constructor(e,t,n){return void 0===t&&void 0===n?this.set(e):this.setRGB(e,t,n)}set(e){return e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e),this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,this}setRGB(e,t,n){return this.r=e,this.g=t,this.b=n,this}setHSL(e,t,n){if(e=function(e,t){return(e%1+1)%1}(e),t=j(t,0,1),n=j(n,0,1),0===t)this.r=this.g=this.b=n;else{const i=n<=.5?n*(1+t):n+t-n*t,r=2*n-i;this.r=ne(r,i,e+1/3),this.g=ne(r,i,e),this.b=ne(r,i,e-1/3)}return this}setStyle(e){function t(t){void 0!==t&&parseFloat(t)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}let n;if(n=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(e)){let e;const i=n[1],r=n[2];switch(i){case"rgb":case"rgba":if(e=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(255,parseInt(e[1],10))/255,this.g=Math.min(255,parseInt(e[2],10))/255,this.b=Math.min(255,parseInt(e[3],10))/255,t(e[4]),this;if(e=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(100,parseInt(e[1],10))/100,this.g=Math.min(100,parseInt(e[2],10))/100,this.b=Math.min(100,parseInt(e[3],10))/100,t(e[4]),this;break;case"hsl":case"hsla":if(e=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r)){const n=parseFloat(e[1])/360,i=parseInt(e[2],10)/100,r=parseInt(e[3],10)/100;return t(e[4]),this.setHSL(n,i,r)}}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(e)){const e=n[1],t=e.length;if(3===t)return this.r=parseInt(e.charAt(0)+e.charAt(0),16)/255,this.g=parseInt(e.charAt(1)+e.charAt(1),16)/255,this.b=parseInt(e.charAt(2)+e.charAt(2),16)/255,this;if(6===t)return this.r=parseInt(e.charAt(0)+e.charAt(1),16)/255,this.g=parseInt(e.charAt(2)+e.charAt(3),16)/255,this.b=parseInt(e.charAt(4)+e.charAt(5),16)/255,this}return e&&e.length>0?this.setColorName(e):this}setColorName(e){const t=Q[e.toLowerCase()];return void 0!==t?this.setHex(t):console.warn("THREE.Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=ie(e.r),this.g=ie(e.g),this.b=ie(e.b),this}copyLinearToSRGB(e){return this.r=re(e.r),this.g=re(e.g),this.b=re(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}getHSL(e){const t=this.r,n=this.g,i=this.b,r=Math.max(t,n,i),a=Math.min(t,n,i);let o,s;const c=(a+r)/2;if(a===r)o=0,s=0;else{const e=r-a;switch(s=c<=.5?e/(r+a):e/(2-r-a),r){case t:o=(n-i)/e+(n2048||t.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",e),t.toDataURL("image/jpeg",.6)):t.toDataURL("image/png")}static sRGBToLinear(e){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap){const t=Z("canvas");t.width=e.width,t.height=e.height;const n=t.getContext("2d");n.drawImage(e,0,0,e.width,e.height);const i=n.getImageData(0,0,e.width,e.height),r=i.data;for(let e=0;e1)switch(this.wrapS){case c:e.x=e.x-Math.floor(e.x);break;case l:e.x=e.x<0?0:1;break;case u:1===Math.abs(Math.floor(e.x)%2)?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x)}if(e.y<0||e.y>1)switch(this.wrapT){case c:e.y=e.y-Math.floor(e.y);break;case l:e.y=e.y<0?0:1;break;case u:1===Math.abs(Math.floor(e.y)%2)?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y)}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){!0===e&&this.version++}}function ue(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap?se.getDataURL(e):e.data?{data:Array.prototype.slice.call(e.data),width:e.width,height:e.height,type:e.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}le.DEFAULT_IMAGE=void 0,le.DEFAULT_MAPPING=300,le.prototype.isTexture=!0;class de{constructor(e=0,t=0,n=0,i=1){this.x=e,this.y=t,this.z=n,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,i){return this.x=e,this.y=t,this.z=n,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=void 0!==e.w?e.w:1,this}add(e,t){return void 0!==t?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this)}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e,t){return void 0!==t?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this)}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=this.w,a=e.elements;return this.x=a[0]*t+a[4]*n+a[8]*i+a[12]*r,this.y=a[1]*t+a[5]*n+a[9]*i+a[13]*r,this.z=a[2]*t+a[6]*n+a[10]*i+a[14]*r,this.w=a[3]*t+a[7]*n+a[11]*i+a[15]*r,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,i,r;const a=.01,o=.1,s=e.elements,c=s[0],l=s[4],u=s[8],d=s[1],h=s[5],f=s[9],p=s[2],m=s[6],g=s[10];if(Math.abs(l-d)s&&e>C?eC?s=0?1:-1,i=1-t*t;if(i>Number.EPSILON){const r=Math.sqrt(i),a=Math.atan2(r,t*n);e=Math.sin(e*a)/r,o=Math.sin(o*a)/r}const r=o*n;if(s=s*e+d*r,c=c*e+h*r,l=l*e+f*r,u=u*e+p*r,e===1-o){const e=1/Math.sqrt(s*s+c*c+l*l+u*u);s*=e,c*=e,l*=e,u*=e}}e[t]=s,e[t+1]=c,e[t+2]=l,e[t+3]=u}static multiplyQuaternionsFlat(e,t,n,i,r,a){const o=n[i],s=n[i+1],c=n[i+2],l=n[i+3],u=r[a],d=r[a+1],h=r[a+2],f=r[a+3];return e[t]=o*f+l*u+s*h-c*d,e[t+1]=s*f+l*d+c*u-o*h,e[t+2]=c*f+l*h+o*d-s*u,e[t+3]=l*f-o*u-s*d-c*h,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,i){return this._x=e,this._y=t,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t){if(!e||!e.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const n=e._x,i=e._y,r=e._z,a=e._order,o=Math.cos,s=Math.sin,c=o(n/2),l=o(i/2),u=o(r/2),d=s(n/2),h=s(i/2),f=s(r/2);switch(a){case"XYZ":this._x=d*l*u+c*h*f,this._y=c*h*u-d*l*f,this._z=c*l*f+d*h*u,this._w=c*l*u-d*h*f;break;case"YXZ":this._x=d*l*u+c*h*f,this._y=c*h*u-d*l*f,this._z=c*l*f-d*h*u,this._w=c*l*u+d*h*f;break;case"ZXY":this._x=d*l*u-c*h*f,this._y=c*h*u+d*l*f,this._z=c*l*f+d*h*u,this._w=c*l*u-d*h*f;break;case"ZYX":this._x=d*l*u-c*h*f,this._y=c*h*u+d*l*f,this._z=c*l*f-d*h*u,this._w=c*l*u+d*h*f;break;case"YZX":this._x=d*l*u+c*h*f,this._y=c*h*u+d*l*f,this._z=c*l*f-d*h*u,this._w=c*l*u-d*h*f;break;case"XZY":this._x=d*l*u-c*h*f,this._y=c*h*u-d*l*f,this._z=c*l*f+d*h*u,this._w=c*l*u+d*h*f;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return!1!==t&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const n=t/2,i=Math.sin(n);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,n=t[0],i=t[4],r=t[8],a=t[1],o=t[5],s=t[9],c=t[2],l=t[6],u=t[10],d=n+o+u;if(d>0){const e=.5/Math.sqrt(d+1);this._w=.25/e,this._x=(l-s)*e,this._y=(r-c)*e,this._z=(a-i)*e}else if(n>o&&n>u){const e=2*Math.sqrt(1+n-o-u);this._w=(l-s)/e,this._x=.25*e,this._y=(i+a)/e,this._z=(r+c)/e}else if(o>u){const e=2*Math.sqrt(1+o-n-u);this._w=(r-c)/e,this._x=(i+a)/e,this._y=.25*e,this._z=(s+l)/e}else{const e=2*Math.sqrt(1+u-n-o);this._w=(a-i)/e,this._x=(r+c)/e,this._y=(s+l)/e,this._z=.25*e}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return nMath.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(j(this.dot(e),-1,1)))}rotateTowards(e,t){const n=this.angleTo(e);if(0===n)return this;const i=Math.min(1,t/n);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return 0===e?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e,t){return void 0!==t?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(e,t)):this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const n=e._x,i=e._y,r=e._z,a=e._w,o=t._x,s=t._y,c=t._z,l=t._w;return this._x=n*l+a*o+i*c-r*s,this._y=i*l+a*s+r*o-n*c,this._z=r*l+a*c+n*s-i*o,this._w=a*l-n*o-i*s-r*c,this._onChangeCallback(),this}slerp(e,t){if(0===t)return this;if(1===t)return this.copy(e);const n=this._x,i=this._y,r=this._z,a=this._w;let o=a*e._w+n*e._x+i*e._y+r*e._z;if(o<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,o=-o):this.copy(e),o>=1)return this._w=a,this._x=n,this._y=i,this._z=r,this;const s=1-o*o;if(s<=Number.EPSILON){const e=1-t;return this._w=e*a+t*this._w,this._x=e*n+t*this._x,this._y=e*i+t*this._y,this._z=e*r+t*this._z,this.normalize(),this._onChangeCallback(),this}const c=Math.sqrt(s),l=Math.atan2(c,o),u=Math.sin((1-t)*l)/c,d=Math.sin(t*l)/c;return this._w=a*u+this._w*d,this._x=n*u+this._x*d,this._y=i*u+this._y*d,this._z=r*u+this._z*d,this._onChangeCallback(),this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){const e=Math.random(),t=Math.sqrt(1-e),n=Math.sqrt(e),i=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(t*Math.cos(i),n*Math.sin(r),n*Math.cos(r),t*Math.sin(i))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}}pe.prototype.isQuaternion=!0;class me{constructor(e=0,t=0,n=0){this.x=e,this.y=t,this.z=n}set(e,t,n){return void 0===n&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e,t){return void 0!==t?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this)}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e,t){return void 0!==t?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this)}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e,t){return void 0!==t?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(e,t)):(this.x*=e.x,this.y*=e.y,this.z*=e.z,this)}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return e&&e.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(Ce.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(Ce.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6]*i,this.y=r[1]*t+r[4]*n+r[7]*i,this.z=r[2]*t+r[5]*n+r[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=e.elements,a=1/(r[3]*t+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*t+r[4]*n+r[8]*i+r[12])*a,this.y=(r[1]*t+r[5]*n+r[9]*i+r[13])*a,this.z=(r[2]*t+r[6]*n+r[10]*i+r[14])*a,this}applyQuaternion(e){const t=this.x,n=this.y,i=this.z,r=e.x,a=e.y,o=e.z,s=e.w,c=s*t+a*i-o*n,l=s*n+o*t-r*i,u=s*i+r*n-a*t,d=-r*t-a*n-o*i;return this.x=c*s+d*-r+l*-o-u*-a,this.y=l*s+d*-a+u*-r-c*-o,this.z=u*s+d*-o+c*-a-l*-r,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[4]*n+r[8]*i,this.y=r[1]*t+r[5]*n+r[9]*i,this.z=r[2]*t+r[6]*n+r[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e,t){return void 0!==t?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(e,t)):this.crossVectors(this,e)}crossVectors(e,t){const n=e.x,i=e.y,r=e.z,a=t.x,o=t.y,s=t.z;return this.x=i*s-r*o,this.y=r*a-n*s,this.z=n*o-i*a,this}projectOnVector(e){const t=e.lengthSq();if(0===t)return this.set(0,0,0);const n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return ge.copy(this).projectOnVector(e),this.sub(ge)}reflect(e){return this.sub(ge.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(0===t)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(j(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y,i=this.z-e.z;return t*t+n*n+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){const i=Math.sin(t)*e;return this.x=i*Math.sin(n),this.y=Math.cos(t)*e,this.z=i*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=i,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,4*t)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,3*t)}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t,n){return void 0!==n&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=2*(Math.random()-.5),t=Math.random()*Math.PI*2,n=Math.sqrt(1-e**2);return this.x=n*Math.cos(t),this.y=n*Math.sin(t),this.z=e,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}me.prototype.isVector3=!0;const ge=new me,Ce=new pe;class ve{constructor(e=new me(1/0,1/0,1/0),t=new me(-1/0,-1/0,-1/0)){this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromArray(e){let t=1/0,n=1/0,i=1/0,r=-1/0,a=-1/0,o=-1/0;for(let s=0,c=e.length;sr&&(r=c),l>a&&(a=l),u>o&&(o=u)}return this.min.set(t,n,i),this.max.set(r,a,o),this}setFromBufferAttribute(e){let t=1/0,n=1/0,i=1/0,r=-1/0,a=-1/0,o=-1/0;for(let s=0,c=e.count;sr&&(r=c),l>a&&(a=l),u>o&&(o=u)}return this.min.set(t,n,i),this.max.set(r,a,o),this}setFromPoints(e){this.makeEmpty();for(let t=0,n=e.length;tthis.max.x||e.ythis.max.y||e.zthis.max.z)}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return!(e.max.xthis.max.x||e.max.ythis.max.y||e.max.zthis.max.z)}intersectsSphere(e){return this.clampPoint(e.center,be),be.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(Te),ze.subVectors(this.max,Te),xe.subVectors(e.a,Te),_e.subVectors(e.b,Te),Se.subVectors(e.c,Te),we.subVectors(_e,xe),Le.subVectors(Se,_e),Ee.subVectors(xe,Se);let t=[0,-we.z,we.y,0,-Le.z,Le.y,0,-Ee.z,Ee.y,we.z,0,-we.x,Le.z,0,-Le.x,Ee.z,0,-Ee.x,-we.y,we.x,0,-Le.y,Le.x,0,-Ee.y,Ee.x,0];return!!He(t,xe,_e,Se,ze)&&(t=[1,0,0,0,1,0,0,0,1],!!He(t,xe,_e,Se,ze)&&(Ae.crossVectors(we,Le),t=[Ae.x,Ae.y,Ae.z],He(t,xe,_e,Se,ze)))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return be.copy(e).clamp(this.min,this.max).sub(e).length()}getBoundingSphere(e){return this.getCenter(e.center),e.radius=.5*this.getSize(be).length(),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()||(ye[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),ye[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),ye[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),ye[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),ye[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),ye[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),ye[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),ye[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(ye)),this}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}ve.prototype.isBox3=!0;const ye=[new me,new me,new me,new me,new me,new me,new me,new me],be=new me,Me=new ve,xe=new me,_e=new me,Se=new me,we=new me,Le=new me,Ee=new me,Te=new me,ze=new me,Ae=new me,Ve=new me;function He(e,t,n,i,r){for(let a=0,o=e.length-3;a<=o;a+=3){Ve.fromArray(e,a);const o=r.x*Math.abs(Ve.x)+r.y*Math.abs(Ve.y)+r.z*Math.abs(Ve.z),s=t.dot(Ve),c=n.dot(Ve),l=i.dot(Ve);if(Math.max(-Math.max(s,c,l),Math.min(s,c,l))>o)return!1}return!0}const Re=new ve,Pe=new me,Ie=new me,ke=new me;class Ne{constructor(e=new me,t=-1){this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){const n=this.center;void 0!==t?n.copy(t):Re.setFromPoints(e).getCenter(n);let i=0;for(let t=0,r=e.length;tthis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){ke.subVectors(e,this.center);const t=ke.lengthSq();if(t>this.radius*this.radius){const e=Math.sqrt(t),n=.5*(e-this.radius);this.center.add(ke.multiplyScalar(n/e)),this.radius+=n}return this}union(e){return!0===this.center.equals(e.center)?Ie.set(0,0,1).multiplyScalar(e.radius):Ie.subVectors(e.center,this.center).normalize().multiplyScalar(e.radius),this.expandByPoint(Pe.copy(e.center).add(Ie)),this.expandByPoint(Pe.copy(e.center).sub(Ie)),this}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const De=new me,Oe=new me,Be=new me,Fe=new me,Ue=new me,We=new me,Ge=new me;class je{constructor(e=new me,t=new me(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.direction).multiplyScalar(e).add(this.origin)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,De)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);const n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.direction).multiplyScalar(n).add(this.origin)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const t=De.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(De.copy(this.direction).multiplyScalar(t).add(this.origin),De.distanceToSquared(e))}distanceSqToSegment(e,t,n,i){Oe.copy(e).add(t).multiplyScalar(.5),Be.copy(t).sub(e).normalize(),Fe.copy(this.origin).sub(Oe);const r=.5*e.distanceTo(t),a=-this.direction.dot(Be),o=Fe.dot(this.direction),s=-Fe.dot(Be),c=Fe.lengthSq(),l=Math.abs(1-a*a);let u,d,h,f;if(l>0)if(u=a*s-o,d=a*o-s,f=r*l,u>=0)if(d>=-f)if(d<=f){const e=1/l;u*=e,d*=e,h=u*(u+a*d+2*o)+d*(a*u+d+2*s)+c}else d=r,u=Math.max(0,-(a*d+o)),h=-u*u+d*(d+2*s)+c;else d=-r,u=Math.max(0,-(a*d+o)),h=-u*u+d*(d+2*s)+c;else d<=-f?(u=Math.max(0,-(-a*r+o)),d=u>0?-r:Math.min(Math.max(-r,-s),r),h=-u*u+d*(d+2*s)+c):d<=f?(u=0,d=Math.min(Math.max(-r,-s),r),h=d*(d+2*s)+c):(u=Math.max(0,-(a*r+o)),d=u>0?r:Math.min(Math.max(-r,-s),r),h=-u*u+d*(d+2*s)+c);else d=a>0?-r:r,u=Math.max(0,-(a*d+o)),h=-u*u+d*(d+2*s)+c;return n&&n.copy(this.direction).multiplyScalar(u).add(this.origin),i&&i.copy(Be).multiplyScalar(d).add(Oe),h}intersectSphere(e,t){De.subVectors(e.center,this.origin);const n=De.dot(this.direction),i=De.dot(De)-n*n,r=e.radius*e.radius;if(i>r)return null;const a=Math.sqrt(r-i),o=n-a,s=n+a;return o<0&&s<0?null:o<0?this.at(s,t):this.at(o,t)}intersectsSphere(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const t=e.normal.dot(this.direction);if(0===t)return 0===e.distanceToPoint(this.origin)?0:null;const n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){const n=this.distanceToPlane(e);return null===n?null:this.at(n,t)}intersectsPlane(e){const t=e.distanceToPoint(this.origin);return 0===t||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,i,r,a,o,s;const c=1/this.direction.x,l=1/this.direction.y,u=1/this.direction.z,d=this.origin;return c>=0?(n=(e.min.x-d.x)*c,i=(e.max.x-d.x)*c):(n=(e.max.x-d.x)*c,i=(e.min.x-d.x)*c),l>=0?(r=(e.min.y-d.y)*l,a=(e.max.y-d.y)*l):(r=(e.max.y-d.y)*l,a=(e.min.y-d.y)*l),n>a||r>i?null:((r>n||n!=n)&&(n=r),(a=0?(o=(e.min.z-d.z)*u,s=(e.max.z-d.z)*u):(o=(e.max.z-d.z)*u,s=(e.min.z-d.z)*u),n>s||o>i?null:((o>n||n!=n)&&(n=o),(s=0?n:i,t)))}intersectsBox(e){return null!==this.intersectBox(e,De)}intersectTriangle(e,t,n,i,r){Ue.subVectors(t,e),We.subVectors(n,e),Ge.crossVectors(Ue,We);let a,o=this.direction.dot(Ge);if(o>0){if(i)return null;a=1}else{if(!(o<0))return null;a=-1,o=-o}Fe.subVectors(this.origin,e);const s=a*this.direction.dot(We.crossVectors(Fe,We));if(s<0)return null;const c=a*this.direction.dot(Ue.cross(Fe));if(c<0)return null;if(s+c>o)return null;const l=-a*Fe.dot(Ge);return l<0?null:this.at(l/o,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class qe{constructor(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(e,t,n,i,r,a,o,s,c,l,u,d,h,f,p,m){const g=this.elements;return g[0]=e,g[4]=t,g[8]=n,g[12]=i,g[1]=r,g[5]=a,g[9]=o,g[13]=s,g[2]=c,g[6]=l,g[10]=u,g[14]=d,g[3]=h,g[7]=f,g[11]=p,g[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new qe).fromArray(this.elements)}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],this}copyPosition(e){const t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,n){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,n=e.elements,i=1/Xe.setFromMatrixColumn(e,0).length(),r=1/Xe.setFromMatrixColumn(e,1).length(),a=1/Xe.setFromMatrixColumn(e,2).length();return t[0]=n[0]*i,t[1]=n[1]*i,t[2]=n[2]*i,t[3]=0,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=0,t[8]=n[8]*a,t[9]=n[9]*a,t[10]=n[10]*a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){e&&e.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const t=this.elements,n=e.x,i=e.y,r=e.z,a=Math.cos(n),o=Math.sin(n),s=Math.cos(i),c=Math.sin(i),l=Math.cos(r),u=Math.sin(r);if("XYZ"===e.order){const e=a*l,n=a*u,i=o*l,r=o*u;t[0]=s*l,t[4]=-s*u,t[8]=c,t[1]=n+i*c,t[5]=e-r*c,t[9]=-o*s,t[2]=r-e*c,t[6]=i+n*c,t[10]=a*s}else if("YXZ"===e.order){const e=s*l,n=s*u,i=c*l,r=c*u;t[0]=e+r*o,t[4]=i*o-n,t[8]=a*c,t[1]=a*u,t[5]=a*l,t[9]=-o,t[2]=n*o-i,t[6]=r+e*o,t[10]=a*s}else if("ZXY"===e.order){const e=s*l,n=s*u,i=c*l,r=c*u;t[0]=e-r*o,t[4]=-a*u,t[8]=i+n*o,t[1]=n+i*o,t[5]=a*l,t[9]=r-e*o,t[2]=-a*c,t[6]=o,t[10]=a*s}else if("ZYX"===e.order){const e=a*l,n=a*u,i=o*l,r=o*u;t[0]=s*l,t[4]=i*c-n,t[8]=e*c+r,t[1]=s*u,t[5]=r*c+e,t[9]=n*c-i,t[2]=-c,t[6]=o*s,t[10]=a*s}else if("YZX"===e.order){const e=a*s,n=a*c,i=o*s,r=o*c;t[0]=s*l,t[4]=r-e*u,t[8]=i*u+n,t[1]=u,t[5]=a*l,t[9]=-o*l,t[2]=-c*l,t[6]=n*u+i,t[10]=e-r*u}else if("XZY"===e.order){const e=a*s,n=a*c,i=o*s,r=o*c;t[0]=s*l,t[4]=-u,t[8]=c*l,t[1]=e*u+r,t[5]=a*l,t[9]=n*u-i,t[2]=i*u-n,t[6]=o*l,t[10]=r*u+e}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(Je,e,$e)}lookAt(e,t,n){const i=this.elements;return Qe.subVectors(e,t),0===Qe.lengthSq()&&(Qe.z=1),Qe.normalize(),Ke.crossVectors(n,Qe),0===Ke.lengthSq()&&(1===Math.abs(n.z)?Qe.x+=1e-4:Qe.z+=1e-4,Qe.normalize(),Ke.crossVectors(n,Qe)),Ke.normalize(),Ze.crossVectors(Qe,Ke),i[0]=Ke.x,i[4]=Ze.x,i[8]=Qe.x,i[1]=Ke.y,i[5]=Ze.y,i[9]=Qe.y,i[2]=Ke.z,i[6]=Ze.z,i[10]=Qe.z,this}multiply(e,t){return void 0!==t?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(e,t)):this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,a=n[0],o=n[4],s=n[8],c=n[12],l=n[1],u=n[5],d=n[9],h=n[13],f=n[2],p=n[6],m=n[10],g=n[14],C=n[3],v=n[7],y=n[11],b=n[15],M=i[0],x=i[4],_=i[8],S=i[12],w=i[1],L=i[5],E=i[9],T=i[13],z=i[2],A=i[6],V=i[10],H=i[14],R=i[3],P=i[7],I=i[11],k=i[15];return r[0]=a*M+o*w+s*z+c*R,r[4]=a*x+o*L+s*A+c*P,r[8]=a*_+o*E+s*V+c*I,r[12]=a*S+o*T+s*H+c*k,r[1]=l*M+u*w+d*z+h*R,r[5]=l*x+u*L+d*A+h*P,r[9]=l*_+u*E+d*V+h*I,r[13]=l*S+u*T+d*H+h*k,r[2]=f*M+p*w+m*z+g*R,r[6]=f*x+p*L+m*A+g*P,r[10]=f*_+p*E+m*V+g*I,r[14]=f*S+p*T+m*H+g*k,r[3]=C*M+v*w+y*z+b*R,r[7]=C*x+v*L+y*A+b*P,r[11]=C*_+v*E+y*V+b*I,r[15]=C*S+v*T+y*H+b*k,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[4],i=e[8],r=e[12],a=e[1],o=e[5],s=e[9],c=e[13],l=e[2],u=e[6],d=e[10],h=e[14];return e[3]*(+r*s*u-i*c*u-r*o*d+n*c*d+i*o*h-n*s*h)+e[7]*(+t*s*h-t*c*d+r*a*d-i*a*h+i*c*l-r*s*l)+e[11]*(+t*c*u-t*o*h-r*a*u+n*a*h+r*o*l-n*c*l)+e[15]*(-i*o*l-t*s*u+t*o*d+i*a*u-n*a*d+n*s*l)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,n){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=t,i[14]=n),this}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8],u=e[9],d=e[10],h=e[11],f=e[12],p=e[13],m=e[14],g=e[15],C=u*m*c-p*d*c+p*s*h-o*m*h-u*s*g+o*d*g,v=f*d*c-l*m*c-f*s*h+a*m*h+l*s*g-a*d*g,y=l*p*c-f*u*c+f*o*h-a*p*h-l*o*g+a*u*g,b=f*u*s-l*p*s-f*o*d+a*p*d+l*o*m-a*u*m,M=t*C+n*v+i*y+r*b;if(0===M)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const x=1/M;return e[0]=C*x,e[1]=(p*d*r-u*m*r-p*i*h+n*m*h+u*i*g-n*d*g)*x,e[2]=(o*m*r-p*s*r+p*i*c-n*m*c-o*i*g+n*s*g)*x,e[3]=(u*s*r-o*d*r-u*i*c+n*d*c+o*i*h-n*s*h)*x,e[4]=v*x,e[5]=(l*m*r-f*d*r+f*i*h-t*m*h-l*i*g+t*d*g)*x,e[6]=(f*s*r-a*m*r-f*i*c+t*m*c+a*i*g-t*s*g)*x,e[7]=(a*d*r-l*s*r+l*i*c-t*d*c-a*i*h+t*s*h)*x,e[8]=y*x,e[9]=(f*u*r-l*p*r-f*n*h+t*p*h+l*n*g-t*u*g)*x,e[10]=(a*p*r-f*o*r+f*n*c-t*p*c-a*n*g+t*o*g)*x,e[11]=(l*o*r-a*u*r-l*n*c+t*u*c+a*n*h-t*o*h)*x,e[12]=b*x,e[13]=(l*p*i-f*u*i+f*n*d-t*p*d-l*n*m+t*u*m)*x,e[14]=(f*o*i-a*p*i-f*n*s+t*p*s+a*n*m-t*o*m)*x,e[15]=(a*u*i-l*o*i+l*n*s-t*u*s-a*n*d+t*o*d)*x,this}scale(e){const t=this.elements,n=e.x,i=e.y,r=e.z;return t[0]*=n,t[4]*=i,t[8]*=r,t[1]*=n,t[5]*=i,t[9]*=r,t[2]*=n,t[6]*=i,t[10]*=r,t[3]*=n,t[7]*=i,t[11]*=r,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],n=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,n,i))}makeTranslation(e,t,n){return this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),n=Math.sin(e);return this.set(1,0,0,0,0,t,-n,0,0,n,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,0,n,0,0,1,0,0,-n,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,0,n,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const n=Math.cos(t),i=Math.sin(t),r=1-n,a=e.x,o=e.y,s=e.z,c=r*a,l=r*o;return this.set(c*a+n,c*o-i*s,c*s+i*o,0,c*o+i*s,l*o+n,l*s-i*a,0,c*s-i*o,l*s+i*a,r*s*s+n,0,0,0,0,1),this}makeScale(e,t,n){return this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1),this}makeShear(e,t,n,i,r,a){return this.set(1,n,r,0,e,1,a,0,t,i,1,0,0,0,0,1),this}compose(e,t,n){const i=this.elements,r=t._x,a=t._y,o=t._z,s=t._w,c=r+r,l=a+a,u=o+o,d=r*c,h=r*l,f=r*u,p=a*l,m=a*u,g=o*u,C=s*c,v=s*l,y=s*u,b=n.x,M=n.y,x=n.z;return i[0]=(1-(p+g))*b,i[1]=(h+y)*b,i[2]=(f-v)*b,i[3]=0,i[4]=(h-y)*M,i[5]=(1-(d+g))*M,i[6]=(m+C)*M,i[7]=0,i[8]=(f+v)*x,i[9]=(m-C)*x,i[10]=(1-(d+p))*x,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,t,n){const i=this.elements;let r=Xe.set(i[0],i[1],i[2]).length();const a=Xe.set(i[4],i[5],i[6]).length(),o=Xe.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),e.x=i[12],e.y=i[13],e.z=i[14],Ye.copy(this);const s=1/r,c=1/a,l=1/o;return Ye.elements[0]*=s,Ye.elements[1]*=s,Ye.elements[2]*=s,Ye.elements[4]*=c,Ye.elements[5]*=c,Ye.elements[6]*=c,Ye.elements[8]*=l,Ye.elements[9]*=l,Ye.elements[10]*=l,t.setFromRotationMatrix(Ye),n.x=r,n.y=a,n.z=o,this}makePerspective(e,t,n,i,r,a){void 0===a&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");const o=this.elements,s=2*r/(t-e),c=2*r/(n-i),l=(t+e)/(t-e),u=(n+i)/(n-i),d=-(a+r)/(a-r),h=-2*a*r/(a-r);return o[0]=s,o[4]=0,o[8]=l,o[12]=0,o[1]=0,o[5]=c,o[9]=u,o[13]=0,o[2]=0,o[6]=0,o[10]=d,o[14]=h,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makeOrthographic(e,t,n,i,r,a){const o=this.elements,s=1/(t-e),c=1/(n-i),l=1/(a-r),u=(t+e)*s,d=(n+i)*c,h=(a+r)*l;return o[0]=2*s,o[4]=0,o[8]=0,o[12]=-u,o[1]=0,o[5]=2*c,o[9]=0,o[13]=-d,o[2]=0,o[6]=0,o[10]=-2*l,o[14]=-h,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}equals(e){const t=this.elements,n=e.elements;for(let e=0;e<16;e++)if(t[e]!==n[e])return!1;return!0}fromArray(e,t=0){for(let n=0;n<16;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e[t+9]=n[9],e[t+10]=n[10],e[t+11]=n[11],e[t+12]=n[12],e[t+13]=n[13],e[t+14]=n[14],e[t+15]=n[15],e}}qe.prototype.isMatrix4=!0;const Xe=new me,Ye=new qe,Je=new me(0,0,0),$e=new me(1,1,1),Ke=new me,Ze=new me,Qe=new me,et=new qe,tt=new pe;class nt{constructor(e=0,t=0,n=0,i=nt.DefaultOrder){this._x=e,this._y=t,this._z=n,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,n,i=this._order){return this._x=e,this._y=t,this._z=n,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,n=!0){const i=e.elements,r=i[0],a=i[4],o=i[8],s=i[1],c=i[5],l=i[9],u=i[2],d=i[6],h=i[10];switch(t){case"XYZ":this._y=Math.asin(j(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._z=Math.atan2(-a,r)):(this._x=Math.atan2(d,c),this._z=0);break;case"YXZ":this._x=Math.asin(-j(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(o,h),this._z=Math.atan2(s,c)):(this._y=Math.atan2(-u,r),this._z=0);break;case"ZXY":this._x=Math.asin(j(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-u,h),this._z=Math.atan2(-a,c)):(this._y=0,this._z=Math.atan2(s,r));break;case"ZYX":this._y=Math.asin(-j(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(d,h),this._z=Math.atan2(s,r)):(this._x=0,this._z=Math.atan2(-a,c));break;case"YZX":this._z=Math.asin(j(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(-l,c),this._y=Math.atan2(-u,r)):(this._x=0,this._y=Math.atan2(o,h));break;case"XZY":this._z=Math.asin(-j(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(d,c),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-l,h),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,!0===n&&this._onChangeCallback(),this}setFromQuaternion(e,t,n){return et.makeRotationFromQuaternion(e),this.setFromRotationMatrix(et,t,n)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return tt.setFromEuler(this),this.setFromQuaternion(tt,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],void 0!==e[3]&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}toVector3(e){return e?e.set(this._x,this._y,this._z):new me(this._x,this._y,this._z)}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}}nt.prototype.isEuler=!0,nt.DefaultOrder="XYZ",nt.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class it{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let e=0;e1){for(let e=0;e0){i.children=[];for(let t=0;t0){i.animations=[];for(let t=0;t0&&(n.geometries=t),i.length>0&&(n.materials=i),r.length>0&&(n.textures=r),o.length>0&&(n.images=o),s.length>0&&(n.shapes=s),c.length>0&&(n.skeletons=c),l.length>0&&(n.animations=l)}return n.object=i,n;function a(e){const t=[];for(const n in e){const i=e[n];delete i.metadata,t.push(i)}return t}}clone(e){return(new this.constructor).copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(let t=0;t0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(e,t,n,i,r){vt.subVectors(i,t),yt.subVectors(n,t),bt.subVectors(e,t);const a=vt.dot(vt),o=vt.dot(yt),s=vt.dot(bt),c=yt.dot(yt),l=yt.dot(bt),u=a*c-o*o;if(0===u)return r.set(-2,-1,-1);const d=1/u,h=(c*s-o*l)*d,f=(a*l-o*s)*d;return r.set(1-h-f,f,h)}static containsPoint(e,t,n,i){return this.getBarycoord(e,t,n,i,Mt),Mt.x>=0&&Mt.y>=0&&Mt.x+Mt.y<=1}static getUV(e,t,n,i,r,a,o,s){return this.getBarycoord(e,t,n,i,Mt),s.set(0,0),s.addScaledVector(r,Mt.x),s.addScaledVector(a,Mt.y),s.addScaledVector(o,Mt.z),s}static isFrontFacing(e,t,n,i){return vt.subVectors(n,t),yt.subVectors(e,t),vt.cross(yt).dot(i)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,i){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,t,n,i){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,i),this}clone(){return(new this.constructor).copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return vt.subVectors(this.c,this.b),yt.subVectors(this.a,this.b),.5*vt.cross(yt).length()}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return Tt.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return Tt.getBarycoord(e,this.a,this.b,this.c,t)}getUV(e,t,n,i,r){return Tt.getUV(e,this.a,this.b,this.c,t,n,i,r)}containsPoint(e){return Tt.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return Tt.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){const n=this.a,i=this.b,r=this.c;let a,o;xt.subVectors(i,n),_t.subVectors(r,n),wt.subVectors(e,n);const s=xt.dot(wt),c=_t.dot(wt);if(s<=0&&c<=0)return t.copy(n);Lt.subVectors(e,i);const l=xt.dot(Lt),u=_t.dot(Lt);if(l>=0&&u<=l)return t.copy(i);const d=s*u-l*c;if(d<=0&&s>=0&&l<=0)return a=s/(s-l),t.copy(n).addScaledVector(xt,a);Et.subVectors(e,r);const h=xt.dot(Et),f=_t.dot(Et);if(f>=0&&h<=f)return t.copy(r);const p=h*c-s*f;if(p<=0&&c>=0&&f<=0)return o=c/(c-f),t.copy(n).addScaledVector(_t,o);const m=l*f-h*u;if(m<=0&&u-l>=0&&h-f>=0)return St.subVectors(r,i),o=(u-l)/(u-l+(h-f)),t.copy(i).addScaledVector(St,o);const g=1/(m+p+d);return a=p*g,o=d*g,t.copy(n).addScaledVector(xt,a).addScaledVector(_t,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}let zt=0;class At extends B{constructor(){super(),Object.defineProperty(this,"id",{value:zt++}),this.uuid=G(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=r,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=I,this.stencilZFail=I,this.stencilZPass=I,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(e){this._alphaTest>0!=e>0&&this.version++,this._alphaTest=e}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(void 0!==e)for(const t in e){const n=e[t];if(void 0===n){console.warn("THREE.Material: '"+t+"' parameter is undefined.");continue}if("shading"===t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===n;continue}const i=this[t];void 0!==i?i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[t]=n:console.warn("THREE."+this.type+": '"+t+"' is not a property of this material.")}}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{}});const n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function i(e){const t=[];for(const n in e){const i=e[n];delete i.metadata,t.push(i)}return t}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),void 0!==this.sheen&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearcoat&&(n.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,void 0!==this.combine&&(n.combine=this.combine)),void 0!==this.envMapIntensity&&(n.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(n.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),void 0!==this.transmission&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),void 0!==this.thickness&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),void 0!==this.attenuationDistance&&(n.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(n.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(n.size=this.size),null!==this.shadowSide&&(n.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(n.blending=this.blending),0!==this.side&&(n.side=this.side),this.vertexColors&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,n.colorWrite=this.colorWrite,n.stencilWrite=this.stencilWrite,n.stencilWriteMask=this.stencilWriteMask,n.stencilFunc=this.stencilFunc,n.stencilRef=this.stencilRef,n.stencilFuncMask=this.stencilFuncMask,n.stencilFail=this.stencilFail,n.stencilZFail=this.stencilZFail,n.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(n.rotation=this.rotation),!0===this.polygonOffset&&(n.polygonOffset=!0),0!==this.polygonOffsetFactor&&(n.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(n.linewidth=this.linewidth),void 0!==this.dashSize&&(n.dashSize=this.dashSize),void 0!==this.gapSize&&(n.gapSize=this.gapSize),void 0!==this.scale&&(n.scale=this.scale),!0===this.dithering&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(n.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(n.flatShading=this.flatShading),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),t){const t=i(e.textures),r=i(e.images);t.length>0&&(n.textures=t),r.length>0&&(n.images=r)}return n}clone(){return(new this.constructor).copy(this)}copy(e){this.name=e.name,this.fog=e.fog,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const t=e.clippingPlanes;let n=null;if(null!==t){const e=t.length;n=new Array(e);for(let i=0;i!==e;++i)n[i]=t[i].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){!0===e&&this.version++}}At.prototype.isMaterial=!0;class Vt extends At{constructor(e){super(),this.type="MeshBasicMaterial",this.color=new ae(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this}}Vt.prototype.isMeshBasicMaterial=!0;const Ht=new me,Rt=new J;class Pt{constructor(e,t,n){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=e,this.itemSize=t,this.count=void 0!==e?e.length/t:0,this.normalized=!0===n,this.usage=k,this.updateRange={offset:0,count:-1},this.version=0}onUploadCallback(){}set needsUpdate(e){!0===e&&this.version++}setUsage(e){return this.usage=e,this}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this}copyAt(e,t,n){e*=this.itemSize,n*=t.itemSize;for(let i=0,r=this.itemSize;i0&&(e.userData=this.userData),void 0!==this.parameters){const t=this.parameters;for(const n in t)void 0!==t[n]&&(e[n]=t[n]);return e}e.data={attributes:{}};const t=this.index;null!==t&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const n=this.attributes;for(const t in n){const i=n[t];e.data.attributes[t]=i.toJSON(e.data)}const i={};let r=!1;for(const t in this.morphAttributes){const n=this.morphAttributes[t],a=[];for(let t=0,i=n.length;t0&&(i[t]=a,r=!0)}r&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(e.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return null!==o&&(e.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),e}clone(){return(new this.constructor).copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=e.name;const n=e.index;null!==n&&this.setIndex(n.clone(t));const i=e.attributes;for(const e in i){const n=i[e];this.setAttribute(e,n.clone(t))}const r=e.morphAttributes;for(const e in r){const n=[],i=r[e];for(let e=0,r=i.length;e0){const e=t[n[0]];if(void 0!==e){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,n=e.length;t0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(e,t){const n=this.geometry,i=this.material,r=this.matrixWorld;if(void 0===i)return;if(null===n.boundingSphere&&n.computeBoundingSphere(),Yt.copy(n.boundingSphere),Yt.applyMatrix4(r),!1===e.ray.intersectsSphere(Yt))return;if(qt.copy(r).invert(),Xt.copy(e.ray).applyMatrix4(qt),null!==n.boundingBox&&!1===Xt.intersectsBox(n.boundingBox))return;let a;if(n.isBufferGeometry){const r=n.index,o=n.attributes.position,s=n.morphAttributes.position,c=n.morphTargetsRelative,l=n.attributes.uv,u=n.attributes.uv2,d=n.groups,h=n.drawRange;if(null!==r)if(Array.isArray(i))for(let n=0,f=d.length;nn.far?null:{distance:l,point:ln.clone(),object:e}}(e,t,n,i,Jt,$t,Kt,cn);if(f){s&&(an.fromBufferAttribute(s,l),on.fromBufferAttribute(s,u),sn.fromBufferAttribute(s,d),f.uv=Tt.getUV(cn,Jt,$t,Kt,an,on,sn,new J)),c&&(an.fromBufferAttribute(c,l),on.fromBufferAttribute(c,u),sn.fromBufferAttribute(c,d),f.uv2=Tt.getUV(cn,Jt,$t,Kt,an,on,sn,new J));const e={a:l,b:u,c:d,normal:new me,materialIndex:0};Tt.getNormal(Jt,$t,Kt,e.normal),f.face=e}return f}un.prototype.isMesh=!0;class hn extends jt{constructor(e=1,t=1,n=1,i=1,r=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:n,widthSegments:i,heightSegments:r,depthSegments:a};const o=this;i=Math.floor(i),r=Math.floor(r),a=Math.floor(a);const s=[],c=[],l=[],u=[];let d=0,h=0;function f(e,t,n,i,r,a,f,p,m,g,C){const v=a/m,y=f/g,b=a/2,M=f/2,x=p/2,_=m+1,S=g+1;let w=0,L=0;const E=new me;for(let a=0;a0?1:-1,l.push(E.x,E.y,E.z),u.push(s/m),u.push(1-a/g),w+=1}}for(let e=0;e0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader;const n={};for(const e in this.extensions)!0===this.extensions[e]&&(n[e]=!0);return Object.keys(n).length>0&&(t.extensions=n),t}}gn.prototype.isShaderMaterial=!0;class Cn extends Ct{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new qe,this.projectionMatrix=new qe,this.projectionMatrixInverse=new qe}copy(e,t){return super.copy(e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return e.set(-t[8],-t[9],-t[10]).normalize()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,t){super.updateWorldMatrix(e,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}Cn.prototype.isCamera=!0;class vn extends Cn{constructor(e=50,t=1,n=.1,i=2e3){super(),this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=t,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=null===e.view?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const t=.5*this.getFilmHeight()/e;this.fov=2*W*Math.atan(t),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(.5*U*this.fov);return.5*this.getFilmHeight()/e}getEffectiveFOV(){return 2*W*Math.atan(Math.tan(.5*U*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(e,t,n,i,r,a){this.aspect=e/t,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let t=e*Math.tan(.5*U*this.fov)/this.zoom,n=2*t,i=this.aspect*n,r=-.5*i;const a=this.view;if(null!==this.view&&this.view.enabled){const e=a.fullWidth,o=a.fullHeight;r+=a.offsetX*i/e,t-=a.offsetY*n/o,i*=a.width/e,n*=a.height/o}const o=this.filmOffset;0!==o&&(r+=e*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,t,t-n,e,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,null!==this.view&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}}vn.prototype.isPerspectiveCamera=!0;const yn=90;class bn extends Ct{constructor(e,t,n){if(super(),this.type="CubeCamera",!0!==n.isWebGLCubeRenderTarget)return void console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");this.renderTarget=n;const i=new vn(yn,1,e,t);i.layers=this.layers,i.up.set(0,-1,0),i.lookAt(new me(1,0,0)),this.add(i);const r=new vn(yn,1,e,t);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new me(-1,0,0)),this.add(r);const a=new vn(yn,1,e,t);a.layers=this.layers,a.up.set(0,0,1),a.lookAt(new me(0,1,0)),this.add(a);const o=new vn(yn,1,e,t);o.layers=this.layers,o.up.set(0,0,-1),o.lookAt(new me(0,-1,0)),this.add(o);const s=new vn(yn,1,e,t);s.layers=this.layers,s.up.set(0,-1,0),s.lookAt(new me(0,0,1)),this.add(s);const c=new vn(yn,1,e,t);c.layers=this.layers,c.up.set(0,-1,0),c.lookAt(new me(0,0,-1)),this.add(c)}update(e,t){null===this.parent&&this.updateMatrixWorld();const n=this.renderTarget,[i,r,a,o,s,c]=this.children,l=e.xr.enabled,u=e.getRenderTarget();e.xr.enabled=!1;const d=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,e.setRenderTarget(n,0),e.render(t,i),e.setRenderTarget(n,1),e.render(t,r),e.setRenderTarget(n,2),e.render(t,a),e.setRenderTarget(n,3),e.render(t,o),e.setRenderTarget(n,4),e.render(t,s),n.texture.generateMipmaps=d,e.setRenderTarget(n,5),e.render(t,c),e.setRenderTarget(u),e.xr.enabled=l,n.texture.needsPMREMUpdate=!0}}class Mn extends le{constructor(e,t,n,i,r,o,s,c,l,u){super(e=void 0!==e?e:[],t=void 0!==t?t:a,n,i,r,o,s,c,l,u),this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}Mn.prototype.isCubeTexture=!0;class xn extends he{constructor(e,t,n){Number.isInteger(t)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),t=n),super(e,e,t),t=t||{},this.texture=new Mn(void 0,t.mapping,t.wrapS,t.wrapT,t.magFilter,t.minFilter,t.format,t.type,t.anisotropy,t.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==t.generateMipmaps&&t.generateMipmaps,this.texture.minFilter=void 0!==t.minFilter?t.minFilter:h}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.format=b,this.texture.encoding=t.encoding,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const n=new hn(5,5,5),i=new gn({name:"CubemapFromEquirect",uniforms:fn({tEquirect:{value:null}}),vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t",side:1,blending:0});i.uniforms.tEquirect.value=t;const r=new un(n,i),a=t.minFilter;return t.minFilter===f&&(t.minFilter=h),new bn(1,10,this).update(e,r),t.minFilter=a,r.geometry.dispose(),r.material.dispose(),this}clear(e,t,n,i){const r=e.getRenderTarget();for(let r=0;r<6;r++)e.setRenderTarget(this,r),e.clear(t,n,i);e.setRenderTarget(r)}}xn.prototype.isWebGLCubeRenderTarget=!0;const _n=new me,Sn=new me,wn=new $;class Ln{constructor(e=new me(1,0,0),t=0){this.normal=e,this.constant=t}set(e,t){return this.normal.copy(e),this.constant=t,this}setComponents(e,t,n,i){return this.normal.set(e,t,n),this.constant=i,this}setFromNormalAndCoplanarPoint(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this}setFromCoplanarPoints(e,t,n){const i=_n.subVectors(n,t).cross(Sn.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(i,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){const e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,t){return t.copy(this.normal).multiplyScalar(-this.distanceToPoint(e)).add(e)}intersectLine(e,t){const n=e.delta(_n),i=this.normal.dot(n);if(0===i)return 0===this.distanceToPoint(e.start)?t.copy(e.start):null;const r=-(e.start.dot(this.normal)+this.constant)/i;return r<0||r>1?null:t.copy(n).multiplyScalar(r).add(e.start)}intersectsLine(e){const t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){const n=t||wn.getNormalMatrix(e),i=this.coplanarPoint(_n).applyMatrix4(e),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return(new this.constructor).copy(this)}}Ln.prototype.isPlane=!0;const En=new Ne,Tn=new me;class zn{constructor(e=new Ln,t=new Ln,n=new Ln,i=new Ln,r=new Ln,a=new Ln){this.planes=[e,t,n,i,r,a]}set(e,t,n,i,r,a){const o=this.planes;return o[0].copy(e),o[1].copy(t),o[2].copy(n),o[3].copy(i),o[4].copy(r),o[5].copy(a),this}copy(e){const t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e){const t=this.planes,n=e.elements,i=n[0],r=n[1],a=n[2],o=n[3],s=n[4],c=n[5],l=n[6],u=n[7],d=n[8],h=n[9],f=n[10],p=n[11],m=n[12],g=n[13],C=n[14],v=n[15];return t[0].setComponents(o-i,u-s,p-d,v-m).normalize(),t[1].setComponents(o+i,u+s,p+d,v+m).normalize(),t[2].setComponents(o+r,u+c,p+h,v+g).normalize(),t[3].setComponents(o-r,u-c,p-h,v-g).normalize(),t[4].setComponents(o-a,u-l,p-f,v-C).normalize(),t[5].setComponents(o+a,u+l,p+f,v+C).normalize(),this}intersectsObject(e){const t=e.geometry;return null===t.boundingSphere&&t.computeBoundingSphere(),En.copy(t.boundingSphere).applyMatrix4(e.matrixWorld),this.intersectsSphere(En)}intersectsSprite(e){return En.center.set(0,0,0),En.radius=.7071067811865476,En.applyMatrix4(e.matrixWorld),this.intersectsSphere(En)}intersectsSphere(e){const t=this.planes,n=e.center,i=-e.radius;for(let e=0;e<6;e++)if(t[e].distanceToPoint(n)0?e.max.x:e.min.x,Tn.y=i.normal.y>0?e.max.y:e.min.y,Tn.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(Tn)<0)return!1}return!0}containsPoint(e){const t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function An(){let e=null,t=!1,n=null,i=null;function r(t,a){n(t,a),i=e.requestAnimationFrame(r)}return{start:function(){!0!==t&&null!==n&&(i=e.requestAnimationFrame(r),t=!0)},stop:function(){e.cancelAnimationFrame(i),t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function Vn(e,t){const n=t.isWebGL2,i=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),i.get(e)},remove:function(t){t.isInterleavedBufferAttribute&&(t=t.data);const n=i.get(t);n&&(e.deleteBuffer(n.buffer),i.delete(t))},update:function(t,r){if(t.isGLBufferAttribute){const e=i.get(t);return void((!e||e.version 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 ) + 0.5;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\treturn texture2D( envMap, uv ).rgb;\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"vec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec;\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\t#else\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\t\t\t#endif\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tlightMapIrradiance *= PI;\n\t#endif\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#else\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARCOLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\t#endif\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef USE_CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1, 2 ) * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform vec2 morphTargetsTextureSize;\n\t\tvec3 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset, const in int stride ) {\n\t\t\tfloat texelIndex = float( vertexIndex * stride + offset );\n\t\t\tfloat y = floor( texelIndex / morphTargetsTextureSize.x );\n\t\t\tfloat x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tvec3 morphUV = vec3( ( x + 0.5 ) / morphTargetsTextureSize.x, y / morphTargetsTextureSize.y, morphTargetIndex );\n\t\t\treturn texture( morphTargetsTexture, morphUV ).xyz;\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\t#ifndef USE_MORPHNORMALS\n\t\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 1 ) * morphTargetInfluences[ i ];\n\t\t\t#else\n\t\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 2 ) * morphTargetInfluences[ i ];\n\t\t\t#endif\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",output_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#else\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#endif\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( attenuationDistance == 0.0 ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tgl_FragColor = texture2D( t2D, vUv );\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include