From 73fedc7593c3c7d08fbd14de4a7c0b753608e067 Mon Sep 17 00:00:00 2001 From: Ethan Weber Date: Tue, 2 Aug 2022 16:02:07 -0500 Subject: [PATCH] Viewer refactor with state sync (#212) * initial commit for viewer refactor * updating name change to nerfactory * adding headers * making the rendering fix which broke from a merge * things are starting to work. removing old commands now * removed prints * cleanup * updating state works now even for nested dictionaries * updating state in redux. listening for state changes. trying to draw three.js now * added drawing functionality. need to fix translation of frustums and image planes * images and frustums drawn correctly * fixing lint * github actions * back to npm * fixing eslint * remove package.json from root * new favicon * some viewer cleanup * notebook * fixed camera drawings speed to avoid redraw * trying to get Leva to update * quick fix * synced config panel * adding notebook * fixing output print error --- .github/workflows/viewer_client_app.yml | 4 +- .gitignore | 1 + .prettierrc.js | 6 + .vscode/launch.json | 21 +- .vscode/settings.json | 37 +- docs/notebooks/imgs/nerfviewer.png | Bin 0 -> 293284 bytes docs/notebooks/index.rst | 1 + docs/notebooks/visualize_viewer.ipynb | 521 + nerfactory/cameras/cameras.py | 36 +- nerfactory/data/image_dataset.py | 2 +- nerfactory/graphs/base.py | 3 - nerfactory/viewer/app/.env.development | 3 +- nerfactory/viewer/app/.eslintrc.json | 33 + nerfactory/viewer/app/package.json | 29 +- nerfactory/viewer/app/public/favicon.ico | Bin 3150 -> 0 bytes nerfactory/viewer/app/public/favicon.png | Bin 0 -> 6819 bytes nerfactory/viewer/app/public/index.html | 4 +- nerfactory/viewer/app/public/logo192.png | Bin 5347 -> 0 bytes nerfactory/viewer/app/public/logo512.png | Bin 9664 -> 0 bytes nerfactory/viewer/app/public/manifest.json | 17 - nerfactory/viewer/app/src/App.css | 13 + nerfactory/viewer/app/src/App.jsx | 18 + .../viewer/app/src/ExtensibleObjectLoader.js | 282 - nerfactory/viewer/app/src/SceneNode.js | 67 +- nerfactory/viewer/app/src/Viewer.jsx | 461 - nerfactory/viewer/app/src/controlPanel.js | 68 - nerfactory/viewer/app/src/index.css | 43 - nerfactory/viewer/app/src/index.js | 32 - nerfactory/viewer/app/src/index.jsx | 15 + nerfactory/viewer/app/src/logo.svg | 7 - .../src/modules/ConfigPanel/ConfigPanel.css | 0 .../src/modules/ConfigPanel/ConfigPanel.jsx | 252 + .../modules/ConfigPanel/ConfigPanelSlice.js | 6 + .../viewer/app/src/modules/Scene/Scene.css | 5 + .../viewer/app/src/modules/Scene/Scene.jsx | 127 + .../viewer/app/src/modules/Scene/drawing.js | 164 + .../src/modules/ViewerWindow/ViewerWindow.css | 27 + .../src/modules/ViewerWindow/ViewerWindow.jsx | 116 + .../modules/ViewerWindow/ViewerWindowSlice.js | 0 .../src/modules/WebRtcWindow/WebRtcWindow.jsx | 147 + .../app/src/modules/WebSocket/WebSocket.jsx | 86 + nerfactory/viewer/app/src/reducer.js | 59 + nerfactory/viewer/app/src/serviceWorker.js | 141 - nerfactory/viewer/app/src/store.js | 4 + nerfactory/viewer/app/src/subscriber.js | 19 + nerfactory/viewer/app/yarn.lock | 809 +- nerfactory/viewer/server/README.md | 20 + nerfactory/viewer/server/cameras.py | 137 - nerfactory/viewer/server/commands.py | 144 - nerfactory/viewer/server/geometry.py | 914 -- nerfactory/viewer/server/path.py | 1 - nerfactory/viewer/server/server.py | 153 +- .../viewer/server/{tree.py => state/node.py} | 64 +- nerfactory/viewer/server/state/state_node.py | 28 + nerfactory/viewer/server/transformations.py | 89 - nerfactory/viewer/server/utils.py | 29 - nerfactory/viewer/server/video_stream.py | 2 +- nerfactory/viewer/server/viewer_utils.py | 303 +- nerfactory/viewer/server/visualizer.py | 91 +- notebooks/README.md | 1 + notebooks/notebook_imports.py | 29 - notebooks/visualize_dataset.ipynb | 10543 ---------------- notebooks/visualize_viewer.ipynb | 129 - package.json | 6 - pyproject.toml | 4 +- scripts/debugging/run_actions.py | 2 +- tests/viewer/test_viewer.py | 192 - 67 files changed, 2510 insertions(+), 14057 deletions(-) create mode 100644 .prettierrc.js create mode 100644 docs/notebooks/imgs/nerfviewer.png create mode 100644 docs/notebooks/visualize_viewer.ipynb create mode 100644 nerfactory/viewer/app/.eslintrc.json delete mode 100644 nerfactory/viewer/app/public/favicon.ico create mode 100644 nerfactory/viewer/app/public/favicon.png delete mode 100644 nerfactory/viewer/app/public/logo192.png delete mode 100644 nerfactory/viewer/app/public/logo512.png create mode 100644 nerfactory/viewer/app/src/App.css create mode 100644 nerfactory/viewer/app/src/App.jsx delete mode 100644 nerfactory/viewer/app/src/ExtensibleObjectLoader.js delete mode 100644 nerfactory/viewer/app/src/Viewer.jsx delete mode 100644 nerfactory/viewer/app/src/controlPanel.js delete mode 100644 nerfactory/viewer/app/src/index.css delete mode 100644 nerfactory/viewer/app/src/index.js create mode 100644 nerfactory/viewer/app/src/index.jsx delete mode 100644 nerfactory/viewer/app/src/logo.svg create mode 100644 nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanel.css create mode 100644 nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanel.jsx create mode 100644 nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanelSlice.js create mode 100644 nerfactory/viewer/app/src/modules/Scene/Scene.css create mode 100644 nerfactory/viewer/app/src/modules/Scene/Scene.jsx create mode 100644 nerfactory/viewer/app/src/modules/Scene/drawing.js create mode 100644 nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindow.css create mode 100644 nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindow.jsx create mode 100644 nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindowSlice.js create mode 100644 nerfactory/viewer/app/src/modules/WebRtcWindow/WebRtcWindow.jsx create mode 100644 nerfactory/viewer/app/src/modules/WebSocket/WebSocket.jsx create mode 100644 nerfactory/viewer/app/src/reducer.js delete mode 100644 nerfactory/viewer/app/src/serviceWorker.js create mode 100644 nerfactory/viewer/app/src/store.js create mode 100644 nerfactory/viewer/app/src/subscriber.js create mode 100644 nerfactory/viewer/server/README.md delete mode 100644 nerfactory/viewer/server/cameras.py delete mode 100644 nerfactory/viewer/server/commands.py delete mode 100644 nerfactory/viewer/server/geometry.py rename nerfactory/viewer/server/{tree.py => state/node.py} (56%) create mode 100644 nerfactory/viewer/server/state/state_node.py delete mode 100644 nerfactory/viewer/server/transformations.py delete mode 100644 notebooks/notebook_imports.py delete mode 100644 notebooks/visualize_dataset.ipynb delete mode 100644 notebooks/visualize_viewer.ipynb delete mode 100644 package.json delete mode 100644 tests/viewer/test_viewer.py diff --git a/.github/workflows/viewer_client_app.yml b/.github/workflows/viewer_client_app.yml index 49d096997..10b889676 100644 --- a/.github/workflows/viewer_client_app.yml +++ b/.github/workflows/viewer_client_app.yml @@ -18,7 +18,7 @@ jobs: uses: actions/checkout@master - name: Install Node.js - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: 17.8.0 @@ -54,4 +54,4 @@ jobs: uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./nerfactory/viewer/app/build + publish_dir: ./nerfactory/viewer/app/build \ No newline at end of file diff --git a/.gitignore b/.gitignore index 76b54487c..afd28f97a 100644 --- a/.gitignore +++ b/.gitignore @@ -121,6 +121,7 @@ celerybeat.pid # Environments .env +.envrc .venv env/ venv/ diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 000000000..3b519289b --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,6 @@ +module.exports = { + trailingComma: 'all', + arrowParens: 'always', + singleQuote: true, + jsxSingleQuote: false, + }; \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 962180731..953a075df 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,13 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "Launch Chrome against localhost", + "request": "launch", + "type": "chrome", + "url": "http://localhost:4000", + "webRoot": "${workspaceFolder}/nerfactory/viewer/app" + }, { "name": "Python: Current File", "type": "python", @@ -25,7 +32,9 @@ "request": "launch", "program": "scripts/run_train.py", "console": "integratedTerminal", - "args": ["machine.num_gpus=0"] + "args": [ + "machine.num_gpus=0" + ] }, { "name": "Python: run_train ngp (gpu)", @@ -33,7 +42,9 @@ "request": "launch", "program": "scripts/run_train.py", "console": "integratedTerminal", - "args": ["--config-name=graph_instant_ngp.yaml"] + "args": [ + "--config-name=graph_instant_ngp.yaml" + ] }, { "name": "Python: run_train mipnerf 360 (gpu)", @@ -41,7 +52,9 @@ "request": "launch", "program": "scripts/run_train.py", "console": "integratedTerminal", - "args": ["--config-name=graph_mipnerf_360.yaml"] + "args": [ + "--config-name=graph_mipnerf_360.yaml" + ] }, { "name": "Python: run_train nerfw (gpu)", @@ -66,4 +79,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 6a295ac34..aadaeb8e8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,6 +8,21 @@ "**/temp*": true }, "editor.defaultFormatter": "esbenp.prettier-vscode", + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "prettier.configPath": ".prettierrc.js", + "typescript.suggestionActions.enabled": false, + "javascript.suggestionActions.enabled": false, "[python]": { "editor.defaultFormatter": "ms-python.python", "editor.codeActionsOnSave": { @@ -17,11 +32,17 @@ "editor.formatOnSave": true, "python.envFile": "${workspaceFolder}/.env", "python.formatting.provider": "black", - "python.formatting.blackArgs": ["--line-length=120"], + "python.formatting.blackArgs": [ + "--line-length=120" + ], "python.linting.pylintEnabled": true, "python.linting.flake8Enabled": false, "python.linting.enabled": true, - "python.sortImports.args": ["--src=${workspaceFolder}", "--profile", "black"], + "python.sortImports.args": [ + "--src=${workspaceFolder}", + "--profile", + "black" + ], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, "python.linting.ignorePatterns": [ @@ -29,6 +50,16 @@ ".vscode/*.py", "external/**/*.py" ], + "esbonio.sphinx.confDir": "", + // eslint extension options + "javascript.validate.enable": false, + "eslint.enable": true, + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ], "C_Cpp.errorSquiggles": "Disabled", "files.associations": { "array": "cpp", @@ -96,4 +127,4 @@ "__node_handle": "cpp" }, "python.analysis.typeCheckingMode": "basic" -} +} \ No newline at end of file diff --git a/docs/notebooks/imgs/nerfviewer.png b/docs/notebooks/imgs/nerfviewer.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7bcc941d12d3554e58d18d07a2cad54329a968 GIT binary patch literal 293284 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ⓈiFzi`aVi*$U!L2#L(K>lkDbbC{0}=UbKM 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%0DvXUn{fc04vd7 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\n", + "# \n", + "# \n", + "# \"\"\".format(url=url, height=height))" + ] + }, + { + "cell_type": "markdown", + "id": "46c89306", + "metadata": {}, + "source": [ + "## Communicate with the Client Viewer App from Python\n", + "\n", + "Run the following code in the repository home directory\n", + "\n", + "```\n", + "python scripts/run_viewer_bridge_server.py\n", + "```\n", + "\n", + "This will start the bridge server that both the Python code and Client Viewer App will connect to.\n", + "\n", + "Verify that the Client Viewer App is connected." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "8919ad68", + "metadata": {}, + "outputs": [], + "source": [ + "# connect to the viewer from Python\n", + "from nerfactory.viewer.server.visualizer import Viewer\n", + "\n", + "vis = Viewer(zmq_url=\"tcp://127.0.0.1:6000\")" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "605e0131-bfbe-4309-b338-c49a46923d8f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/sceneState/sceneBounds\n" + ] + } + ], + "source": [ + "# draw scene bounds in the viewer\n", + "s = 1\n", + "scene_bounds = SceneBounds(aabb=torch.tensor([[-s, -s, -s], [s, s, s]]))\n", + "scene_bounds_json = scene_bounds.to_json()\n", + "\n", + "# draw scene bounds in the viewer\n", + "vis[\"sceneState/sceneBounds\"].write(scene_bounds_json)\n", + "\n", + "# draw scene bounds in plotly\n", + "import plotly.graph_objects as go\n", + "\n", + "# TODO:" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "fa0acb3c", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# HIDDEN\n", + "def get_random_rotation_matrix():\n", + " roll = torch.randn(1)\n", + " yaw = torch.randn(1)\n", + " pitch = torch.randn(1)\n", + "\n", + " tensor_0 = torch.zeros(1)\n", + " tensor_1 = torch.ones(1)\n", + "\n", + " RX = torch.stack(\n", + " [\n", + " torch.stack([tensor_1, tensor_0, tensor_0]),\n", + " torch.stack([tensor_0, torch.cos(roll), -torch.sin(roll)]),\n", + " torch.stack([tensor_0, torch.sin(roll), torch.cos(roll)]),\n", + " ]\n", + " ).reshape(3, 3)\n", + "\n", + " RY = torch.stack(\n", + " [\n", + " torch.stack([torch.cos(pitch), tensor_0, torch.sin(pitch)]),\n", + " torch.stack([tensor_0, tensor_1, tensor_0]),\n", + " torch.stack([-torch.sin(pitch), tensor_0, torch.cos(pitch)]),\n", + " ]\n", + " ).reshape(3, 3)\n", + "\n", + " RZ = torch.stack(\n", + " [\n", + " torch.stack([torch.cos(yaw), -torch.sin(yaw), tensor_0]),\n", + " torch.stack([torch.sin(yaw), torch.cos(yaw), tensor_0]),\n", + " torch.stack([tensor_0, tensor_0, tensor_1]),\n", + " ]\n", + " ).reshape(3, 3)\n", + "\n", + " R = torch.mm(RZ, RY)\n", + " R = torch.mm(R, RX)\n", + " return R" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "88b145d3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/sceneState/cameras\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/sceneState/cameras/000000\n", + "/sceneState/cameras/000001\n" + ] + }, + { + "data": { + "text/plain": [ + "b'ok'" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# delete any current cameras\n", + "vis[f\"sceneState/cameras\"].delete()\n", + "\n", + "# draw a camera with with an image\n", + "image = torch.rand(256, 256, 3)\n", + "media.show_image(image)\n", + "camera = PinholeCamera(cx=100, cy=100, fx=50, fy=50)\n", + "camera_json = camera.to_json(image=image)\n", + "vis[f\"sceneState/cameras/000000\"].write(camera_json)\n", + "\n", + "# draw a camera with rotation and translation (with a black image)\n", + "image = torch.zeros(256, 256, 3)\n", + "c2w = torch.eye(4)\n", + "c2w[:3, :3] = get_random_rotation_matrix()\n", + "random_translation = torch.rand(1) * 5\n", + "c2w[:3, 3] = random_translation\n", + "camera = PinholeCamera(cx=100, cy=100, fx=50, fy=50, camera_to_world=c2w)\n", + "camera_json = camera.to_json(image=image)\n", + "vis[f\"sceneState/cameras/000001\"].write(camera_json)" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "18991f81", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/sceneState/cameras/000000\n" + ] + }, + { + "data": { + "text/plain": [ + "b'ok'" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# delete a camera from the Nerfviewer\n", + "vis[\"sceneState/cameras/000000\"].delete()" + ] + }, + { + "cell_type": "markdown", + "id": "6b798e26", + "metadata": {}, + "source": [ + "## Read from the GUI sliders" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "31cd0de1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "80\n" + ] + } + ], + "source": [ + "# read the field of view\n", + "camera = vis[f\"renderingState/camera\"].read()\n", + "fov = camera[\"object\"][\"fov\"]\n", + "print(fov)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "feb83aaa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/renderingState/field_of_view\n" + ] + }, + { + "data": { + "text/plain": [ + "b'ok'" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vis[f\"renderingState/field_of_view\"].write(40)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "1abb93e5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "source": [ + "fov = vis[f\"renderingState/camera/object/fov\"].read()\n", + "print(fov)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "a0304523", + "metadata": {}, + "outputs": [], + "source": [ + "# set the field of view\n", + "camera = vis[f\"renderingState/camera\"].read()\n", + "fov = camera[\"object\"][\"fov\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "b3ba0ee7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/renderingState/minResolution\n" + ] + }, + { + "data": { + "text/plain": [ + "b'ok'" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vis[f\"renderingState/minResolution\"].write(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "bba59227", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "20" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# read from a slider\n", + "vis[f\"renderingState/minResolution\"].read()" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "fe922185", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'depth'" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# read from output choice\n", + "vis[\"renderingState/output_choice\"].read()" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "75c37760", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['rgb', 'accumulation', 'depth', 'alive_ray_mask']\n", + "None\n" + ] + } + ], + "source": [ + "# read from a dropdown\n", + "output_options = vis[f\"renderingState/output_options\"].read()\n", + "print(output_options)\n", + "output_choice = vis[f\"renderingState/output_choice\"].read()\n", + "print(output_choice)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98aaa12c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8.13 ('nerfactory')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + }, + "vscode": { + "interpreter": { + "hash": "e691f033e0f2f1b9c0a11e7e81375a1e27aec87a71fd1b1eaa545f7a5e61b3f6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/nerfactory/cameras/cameras.py b/nerfactory/cameras/cameras.py index 10e0b9a25..d46e3ba78 100644 --- a/nerfactory/cameras/cameras.py +++ b/nerfactory/cameras/cameras.py @@ -17,14 +17,16 @@ Camera Models """ import base64 from abc import abstractmethod -from typing import Dict, Optional, Type +from typing import Dict, Optional, Tuple, Type import cv2 +import numpy as np import torch from torch.nn.functional import normalize from torchtyping import TensorType from nerfactory.cameras.rays import RayBundle +from nerfactory.utils.misc import is_not_none class Camera: @@ -161,11 +163,15 @@ class Camera: return ray_bundle @abstractmethod - def to_json(self, image: Optional[TensorType["image_height", "image_width", 2]] = None) -> Dict: + def to_json( + self, + image: Optional[TensorType["image_height", "image_width", 2]] = None, + resize_shape: Optional[Tuple[int, int]] = None, + ) -> Dict: """Converts the camera to a json dictionary. Args: - image: An image that is encoded to a base64 string. Defaults to None. + image: An image in range [0, 1] that is encoded to a base64 string. Defaults to None. Returns: A JSON representation of the camera @@ -295,7 +301,11 @@ class PinholeCamera(Camera): return RayBundle(origins=origins, directions=directions, pixel_area=pixel_area[..., None]) - def to_json(self, image: Optional[TensorType["image_height", "image_width", 2]] = None) -> Dict: + def to_json( + self, + image: Optional[TensorType["image_height", "image_width", 2]] = None, + resize_shape: Optional[Tuple[int, int]] = None, + ) -> Dict: json_ = { "type": "PinholeCamera", "cx": self.cx, @@ -305,10 +315,11 @@ class PinholeCamera(Camera): "camera_to_world": self.camera_to_world.tolist(), "camera_index": self.camera_index, } - if image: - # move image to cpu if not already - # TODO: move to numpy - data = cv2.imencode(".png", image[:, :, ::-1])[1].tobytes() + if is_not_none(image): + image_uint8 = (image * 255).detach().cpu().numpy().astype(np.uint8) + if resize_shape: + image_uint8 = cv2.resize(image_uint8, resize_shape) + data = cv2.imencode(".png", image_uint8)[1].tobytes() json_["image"] = str("data:image/png;base64," + base64.b64encode(data).decode("ascii")) return json_ @@ -346,9 +357,6 @@ class SimplePinholeCamera(PinholeCamera): def fy_index(cls): return 2 - def to_json(self, image: Optional[TensorType["image_height", "image_width", 2]] = None) -> Dict: - raise NotImplementedError - @staticmethod def from_json(json_: Dict) -> "SimplePinholeCamera": # pylint:disable=no-self-use raise NotImplementedError @@ -441,7 +449,11 @@ class EquirectangularCamera(Camera): pixel_area = dx * dy return RayBundle(origins=origins, directions=directions, pixel_area=pixel_area[..., None]) - def to_json(self, image: Optional[TensorType["image_height", "image_width", 2]] = None) -> Dict: + def to_json( + self, + image: Optional[TensorType["image_height", "image_width", 2]] = None, + resize_shape: Optional[Tuple[int, int]] = None, + ) -> Dict: raise NotImplementedError @staticmethod diff --git a/nerfactory/data/image_dataset.py b/nerfactory/data/image_dataset.py index da2792229..deb511fb7 100644 --- a/nerfactory/data/image_dataset.py +++ b/nerfactory/data/image_dataset.py @@ -87,7 +87,7 @@ class ImageDataset(Dataset): assert image.shape[2] in [3, 4], f"Image shape of {image.shape} is in correct." return image - def get_image(self, image_idx: int): + def get_image(self, image_idx: int) -> TensorType["image_height", "image_width", "num_channels"]: """Returns a 3 channel image.""" image = torch.from_numpy(self.get_numpy_image(image_idx).astype("float32") / 255.0) if self.alpha_color is not None and image.shape[-1] == 4: diff --git a/nerfactory/graphs/base.py b/nerfactory/graphs/base.py index e9512dd68..6c497c455 100644 --- a/nerfactory/graphs/base.py +++ b/nerfactory/graphs/base.py @@ -86,9 +86,6 @@ class Graph(nn.Module): self.populate_fields() self.populate_misc_modules() # populate the modules self.callbacks = None - # variable for visualizer to fetch TODO(figure out if there is cleaner way to do this) - self.vis_outputs = None - self.default_output_name = None # to keep track of which device the nn.Module is on self.device_indicator_param = nn.Parameter(torch.empty(0)) diff --git a/nerfactory/viewer/app/.env.development b/nerfactory/viewer/app/.env.development index fd2617ea9..358cb9e29 100644 --- a/nerfactory/viewer/app/.env.development +++ b/nerfactory/viewer/app/.env.development @@ -1,4 +1,5 @@ BROWSER=none FAST_REFRESH=false HOST=localhost -PORT=4000 \ No newline at end of file +PORT=4000 +ESLINT_NO_DEV_ERRORS=true \ No newline at end of file diff --git a/nerfactory/viewer/app/.eslintrc.json b/nerfactory/viewer/app/.eslintrc.json new file mode 100644 index 000000000..8c21d1348 --- /dev/null +++ b/nerfactory/viewer/app/.eslintrc.json @@ -0,0 +1,33 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "airbnb", + "prettier" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "react", + "@typescript-eslint" + ], + "rules": { + "arrow-body-style": "off", + "camelcase": "off", + "import/prefer-default-export": "off", + "no-alert": "off", + "no-console": "off", + "prefer-destructuring": "off", + "react/destructuring-assignment": "off" + } +} \ No newline at end of file diff --git a/nerfactory/viewer/app/package.json b/nerfactory/viewer/app/package.json index ad5827f0a..03739ef83 100644 --- a/nerfactory/viewer/app/package.json +++ b/nerfactory/viewer/app/package.json @@ -4,28 +4,37 @@ "version": "0.0.0", "private": true, "dependencies": { + "@reduxjs/toolkit": "^1.8.3", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.3.0", "@testing-library/user-event": "^14.2.0", "ccapture.js": "github:aceslowman/ccapture.js#npm-fix", + "classnames": "^2.3.1", "dat.gui": "^0.7.9", + "eslint-config-prettier": "^8.5.0", "leva": "^0.9.29", "msgpack-lite": "^0.1.26", + "prop-types": "^15.8.1", "react": "^18.1.0", "react-dom": "^18.1.0", - "react-scripts": "^5.0.1", + "react-redux": "^8.0.2", + "redux": "^4.2.0", "socket.io-client": "^4.5.1", "three": "^0.142.0", "three-wtm": "^1.0", "websocket": "^1.0.34", - "wwobjloader2": "^4.0" + "wwobjloader2": "^4.0", + "electron": "^19.0.4", + "electron-is-dev": "^2.0.0" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", - "electron": "electron ." + "electron": "electron .", + "lint": "eslint --ext .js,.jsx .", + "lint:fix": "eslint --fix --ext .js,.jsx ." }, "eslintConfig": { "extends": "react-app" @@ -47,10 +56,20 @@ "license": "ISC", "description": "", "devDependencies": { + "@svgr/webpack": "^6.2.1", + "prettier": "2.7.1", "concurrently": "^7.2.1", - "electron": "^19.0.4", - "electron-is-dev": "^2.0.0", + "eslint": "^8.2.0", + "eslint-config-airbnb": "19.0.4", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0", + "react-scripts": "^5.0.1", "typescript": "^4.7.3", "wait-on": "^6.0.1" + }, + "resolutions": { + "@svgr/webpack": "$@svgr/webpack" } } diff --git a/nerfactory/viewer/app/public/favicon.ico b/nerfactory/viewer/app/public/favicon.ico deleted file mode 100644 index bcd5dfd67cd0361b78123e95c2dd96031f27f743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3150 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 MDeX2GIKR{Qf5okjU;qFB diff --git a/nerfactory/viewer/app/public/favicon.png b/nerfactory/viewer/app/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..559199e181a36b8349eaca1e4a60d26d642aac03 GIT binary patch literal 6819 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 literal 0 HcmV?d00001 diff --git a/nerfactory/viewer/app/public/index.html b/nerfactory/viewer/app/public/index.html index 9c12b199a..b7227e088 100644 --- a/nerfactory/viewer/app/public/index.html +++ b/nerfactory/viewer/app/public/index.html @@ -2,7 +2,7 @@ - + - nerfactory Viewer + Nerfviewer diff --git a/nerfactory/viewer/app/public/logo192.png b/nerfactory/viewer/app/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/nerfactory/viewer/app/public/manifest.json b/nerfactory/viewer/app/public/manifest.json index 080d6c77a..f9051fe71 100644 --- a/nerfactory/viewer/app/public/manifest.json +++ b/nerfactory/viewer/app/public/manifest.json @@ -1,23 +1,6 @@ { "short_name": "React App", "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], "start_url": ".", "display": "standalone", "theme_color": "#000000", diff --git a/nerfactory/viewer/app/src/App.css b/nerfactory/viewer/app/src/App.css new file mode 100644 index 000000000..ec2585e8c --- /dev/null +++ b/nerfactory/viewer/app/src/App.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/nerfactory/viewer/app/src/App.jsx b/nerfactory/viewer/app/src/App.jsx new file mode 100644 index 000000000..8c59f9410 --- /dev/null +++ b/nerfactory/viewer/app/src/App.jsx @@ -0,0 +1,18 @@ +import './App.css'; + +import React from 'react'; +import { RenderControls } from './modules/ConfigPanel/ConfigPanel'; + +import SetupScene from './modules/Scene/Scene'; +import ViewerWindow from './modules/ViewerWindow/ViewerWindow'; + +export default function App() { + const scene = SetupScene(); + + return ( +
+ + +
+ ); +} diff --git a/nerfactory/viewer/app/src/ExtensibleObjectLoader.js b/nerfactory/viewer/app/src/ExtensibleObjectLoader.js deleted file mode 100644 index 01346a452..000000000 --- a/nerfactory/viewer/app/src/ExtensibleObjectLoader.js +++ /dev/null @@ -1,282 +0,0 @@ -import * as THREE from "three"; -import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader.js"; -import { ColladaLoader } from "three/examples/jsm/loaders/ColladaLoader.js"; -import { MTLLoader } from "three/examples/jsm/loaders/MTLLoader.js"; -import { MtlObjBridge } from "wwobjloader2"; -import { STLLoader } from "three/examples/jsm/loaders/STLLoader.js"; -import { PLYLoader } from "three/examples/jsm/loaders/PLYLoader.js"; -import * as BufferGeometryUtils from "three/examples/jsm/utils/BufferGeometryUtils.js"; - -// Merges a hierarchy of collada mesh geometries into a single -// `BufferGeometry` object: -// * A new merged `BufferGeometry` if the input contains meshes -// * empty `BufferGeometry` otherwise -function merge_geometries(object, preserve_materials = false) { - let materials = []; - let geometries = []; - let root_transform = object.matrix.clone(); - - function collectGeometries(node, parent_transform) { - let transform = parent_transform.clone().multiply(node.matrix); - if (node.type === "Mesh") { - node.geometry.applyMatrix(transform); - geometries.push(node.geometry); - materials.push(node.material); - } - for (let child of node.children) { - collectGeometries(child, transform); - } - } - - collectGeometries(object, root_transform); - let result = null; - if (geometries.length === 1) { - result = geometries[0]; - if (preserve_materials) { - result.material = materials[0]; - } - } else if (geometries.length > 1) { - result = BufferGeometryUtils.mergeBufferGeometries(geometries, true); - if (preserve_materials) { - result.material = materials; - } - } else { - result = new THREE.BufferGeometry(); - } - return result; -} - -// Handler for special texture types that we want to support -// in addition to whatever three.js supports. This function -// takes a json object representing a single texture, and should -// return either: -// * A new `THREE.Texture` if that json represents a special texture -// * `null` otherwise -function handle_special_texture(json) { - if (json.type === "_text") { - let canvas = document.createElement("canvas"); - // canvas width and height should be in the power of 2; otherwise although - // the page usually loads successfully, WebGL does complain/warn - canvas.width = 256; - canvas.height = 256; - let ctx = canvas.getContext("2d"); - ctx.textAlign = "center"; - let font_size = json.font_size; - // auto-resing the font_size to fit in the canvas - ctx.font = font_size + "px " + json.font_face; - while (ctx.measureText(json.text).width > canvas.width) { - font_size--; - ctx.font = font_size + "px " + json.font_face; - } - ctx.fillText(json.text, canvas.width / 2, canvas.height / 2); - let canvas_texture = new THREE.CanvasTexture(canvas); - canvas_texture.uuid = json.uuid; - return canvas_texture; - } else { - return null; - } -} - -// Handler for special geometry types that we want to support -// in addition to whatever three.js supports. This function -// takes a json object representing a single geometry, and should -// return either: -// * A new `THREE.Mesh` if that json represents a special geometry -// * `null` otherwise -function handle_special_geometry(geom) { - if (geom.type === "_meshfile") { - console.warn( - "_meshfile is deprecated. Please use _meshfile_geometry for geometries and _meshfile_object for objects with geometry and material" - ); - geom.type = "_meshfile_geometry"; - } - if (geom.type === "_meshfile_geometry") { - if (geom.format === "obj") { - let loader = new OBJLoader(); - let obj = loader.parse(geom.data + "\n"); - let loaded_geom = merge_geometries(obj); - loaded_geom.uuid = geom.uuid; - return loaded_geom; - } else if (geom.format === "dae") { - let loader = new ColladaLoader(); - let obj = loader.parse(geom.data); - let result = merge_geometries(obj.scene); - result.uuid = geom.uuid; - return result; - } else if (geom.format === "stl") { - let loader = new STLLoader(); - let loaded_geom = loader.parse(geom.data.buffer); - loaded_geom.uuid = geom.uuid; - return loaded_geom; - } else if (geom.format === "ply") { - let loader = new PLYLoader(); - let loaded_geom = loader.parse(geom.data.buffer); - loaded_geom.uuid = geom.uuid; - return loaded_geom; - } else { - console.error("Unsupported mesh type:", geom); - return null; - } - } - return null; -} - -// The ExtensibleObjectLoader extends the THREE.ObjectLoader -// interface, while providing some hooks for us to perform some -// custom loading for things other than three.js native JSON. -// -// We currently use this class to support some extensions to -// three.js JSON for objects which are easy to construct in -// javascript but hard to construct in Python and/or Julia. -// For example, we perform the following transformations: -// -// * Converting "_meshfile" geometries into actual meshes -// using the THREE.js native mesh loaders -// * Converting "_text" textures into text by drawing the -// requested text onto a canvas. -export class ExtensibleObjectLoader extends THREE.ObjectLoader { - delegate(special_handler, base_handler, json, additional_objects) { - let result = {}; - if (json === undefined) { - return result; - } - let remaining_json = []; - for (let data of json) { - let x = special_handler(data); - if (x !== null) { - result[x.uuid] = x; - } else { - remaining_json.push(data); - } - } - return Object.assign( - result, - base_handler(remaining_json, additional_objects) - ); - } - - parseTextures(json, images) { - return this.delegate( - handle_special_texture, - super.parseTextures, - json, - images - ); - } - - parseGeometries(json, shapes) { - return this.delegate( - handle_special_geometry, - super.parseGeometries, - json, - shapes - ); - } - - parseObject(json, geometries, materials) { - if (json.type === "_meshfile_object") { - let geometry; - let material; - let manager = new THREE.LoadingManager(); - let path = - json.url === undefined - ? undefined - : THREE.LoaderUtils.extractUrlBase(json.url); - manager.setURLModifier((url) => { - if (json.resources[url] !== undefined) { - return json.resources[url]; - } - return url; - }); - if (json.format === "obj") { - let loader = new OBJLoader(manager); - if (json.mtl_library) { - let mtl_loader = new MTLLoader(manager); - let mtl_parse_result = mtl_loader.parse(json.mtl_library + "\n", ""); - let materials = - MtlObjBridge.addMaterialsFromMtlLoader(mtl_parse_result); - loader.setMaterials(materials); - this.onTextureLoad(); - } - let obj = loader.parse(json.data + "\n", path); - geometry = merge_geometries(obj, true); - geometry.uuid = json.uuid; - material = geometry.material; - } else if (json.format === "dae") { - let loader = new ColladaLoader(manager); - loader.onTextureLoad = this.onTextureLoad; - let obj = loader.parse(json.data, path); - geometry = merge_geometries(obj.scene, true); - geometry.uuid = json.uuid; - material = geometry.material; - } else if (json.format === "stl") { - let loader = new STLLoader(); - geometry = loader.parse(json.data.buffer, path); - geometry.uuid = json.uuid; - material = geometry.material; - } else { - console.error("Unsupported mesh type:", json); - return null; - } - let object = new THREE.Mesh(geometry, material); - - // Copied from ObjectLoader - object.uuid = json.uuid; - - if (json.name !== undefined) object.name = json.name; - - if (json.matrix !== undefined) { - object.matrix.fromArray(json.matrix); - - if (json.matrixAutoUpdate !== undefined) - object.matrixAutoUpdate = json.matrixAutoUpdate; - if (object.matrixAutoUpdate) - object.matrix.decompose( - object.position, - object.quaternion, - object.scale - ); - } else { - if (json.position !== undefined) - object.position.fromArray(json.position); - if (json.rotation !== undefined) - object.rotation.fromArray(json.rotation); - if (json.quaternion !== undefined) - object.quaternion.fromArray(json.quaternion); - if (json.scale !== undefined) object.scale.fromArray(json.scale); - } - - if (json.castShadow !== undefined) object.castShadow = json.castShadow; - if (json.receiveShadow !== undefined) - object.receiveShadow = json.receiveShadow; - - if (json.shadow) { - if (json.shadow.bias !== undefined) - object.shadow.bias = json.shadow.bias; - if (json.shadow.radius !== undefined) - object.shadow.radius = json.shadow.radius; - if (json.shadow.mapSize !== undefined) - object.shadow.mapSize.fromArray(json.shadow.mapSize); - if (json.shadow.camera !== undefined) - object.shadow.camera = this.parseObject(json.shadow.camera); - } - - if (json.visible !== undefined) object.visible = json.visible; - if (json.frustumCulled !== undefined) - object.frustumCulled = json.frustumCulled; - if (json.renderOrder !== undefined) object.renderOrder = json.renderOrder; - if (json.userjson !== undefined) object.userjson = json.userData; - if (json.layers !== undefined) object.layers.mask = json.layers; - - return object; - } else if (json.type === "CameraHelper") { - console.log("processing CameraHelper"); - console.log(json); - console.log(geometries); - console.log(materials); - return super.parseObject(json, geometries, materials); - } else { - return super.parseObject(json, geometries, materials); - } - } -} diff --git a/nerfactory/viewer/app/src/SceneNode.js b/nerfactory/viewer/app/src/SceneNode.js index 293def860..edfa23d58 100644 --- a/nerfactory/viewer/app/src/SceneNode.js +++ b/nerfactory/viewer/app/src/SceneNode.js @@ -1,12 +1,14 @@ -import * as THREE from "three"; +/* eslint-disable no-underscore-dangle */ +/* eslint-disable no-restricted-syntax */ +import * as THREE from 'three'; -const dat = require("dat.gui"); +const dat = require('dat.gui'); function remove_folders(gui) { - for (let name of Object.keys(gui.__folders)) { - let folder = gui.__folders[name]; + for (const name of Object.keys(gui.__folders)) { + const folder = gui.__folders[name]; remove_folders(folder); - dat.dom.dom.unbind(window, "resize", folder.__resizeHandler); + dat.dom.dom.unbind(window, 'resize', folder.__resizeHandler); gui.removeFolder(folder); } } @@ -20,7 +22,7 @@ function dispose(object) { } if (object.material) { if (Array.isArray(object.material)) { - for (let material of object.material) { + for (const material of object.material) { if (material.map) { material.map.dispose(); } @@ -35,42 +37,41 @@ function dispose(object) { } } -export class SceneNode { +export default class SceneNode { constructor(object, folder) { this.object = object; this.folder = folder; this.children = {}; this.create_controls(); - for (let c of this.object.children) { + for (const c of this.object.children) { this.add_child(c); } } add_child(object) { - let f = this.folder.addFolder(object.name); - let node = new SceneNode(object, f); + const f = this.folder.addFolder(object.name); + const node = new SceneNode(object, f); this.children[object.name] = node; return node; } create_child(name) { - let obj = new THREE.Group(); + const obj = new THREE.Group(); obj.name = name; this.object.add(obj); return this.add_child(obj); } find(path) { - if (path.length == 0) { + if (path.length === 0) { return this; - } else { - let name = path[0]; - let child = this.children[name]; - if (child === undefined) { - child = this.create_child(name); - } - return child.find(path.slice(1)); } + const name = path[0]; + let child = this.children[name]; + if (child === undefined) { + child = this.create_child(name); + } + return child.find(path.slice(1)); } create_controls() { @@ -79,19 +80,19 @@ export class SceneNode { } this.vis_controller = new dat.controllers.BooleanController( this.object, - "visible" + 'visible', ); this.folder.domElement.prepend(this.vis_controller.domElement); - this.vis_controller.domElement.style.height = "0"; - this.vis_controller.domElement.style.float = "right"; + this.vis_controller.domElement.style.height = '0'; + this.vis_controller.domElement.style.float = 'right'; } set_property(property, value) { - if (property === "position") { + if (property === 'position') { this.object.position.set(value[0], value[1], value[2]); - } else if (property === "quaternion") { + } else if (property === 'quaternion') { this.object.quaternion.set(value[0], value[1], value[2], value[3]); - } else if (property === "scale") { + } else if (property === 'scale') { this.object.scale.set(value[0], value[1], value[2]); } else { this.object[property] = value; @@ -100,17 +101,17 @@ export class SceneNode { } set_transform(matrix) { - let mat = new THREE.Matrix4(); + const mat = new THREE.Matrix4(); mat.fromArray(matrix); mat.decompose( this.object.position, this.object.quaternion, - this.object.scale + this.object.scale, ); } set_object(object) { - let parent = this.object.parent; + const parent = this.object.parent; this.dispose_recursive(); this.object.parent.remove(this.object); this.object = object; @@ -119,19 +120,19 @@ export class SceneNode { } dispose_recursive() { - for (let name of Object.keys(this.children)) { + for (const name of Object.keys(this.children)) { this.children[name].dispose_recursive(); } dispose(this.object); } delete(path) { - if (path.length == 0) { + if (path.length === 0) { console.error("Can't delete an empty path"); } else { - let parent = this.find(path.slice(0, path.length - 1)); - let name = path[path.length - 1]; - let child = parent.children[name]; + const parent = this.find(path.slice(0, path.length - 1)); + const name = path[path.length - 1]; + const child = parent.children[name]; if (child !== undefined) { child.dispose_recursive(); parent.object.remove(child.object); diff --git a/nerfactory/viewer/app/src/Viewer.jsx b/nerfactory/viewer/app/src/Viewer.jsx deleted file mode 100644 index 0e25cfbee..000000000 --- a/nerfactory/viewer/app/src/Viewer.jsx +++ /dev/null @@ -1,461 +0,0 @@ -import React, { Component } from "react"; -import * as THREE from "three"; -import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; -import Stats from "three/examples/jsm/libs/stats.module.js"; -import { GUI } from "dat.gui"; -import { split_path } from "./utils"; -import { SceneNode } from "./SceneNode"; -import { ExtensibleObjectLoader } from "./ExtensibleObjectLoader"; - -function websocket_endpoint_from_url(url) { - let endpoint = url.split("?").pop(); - if (endpoint == "") { - let message = - "Please set the websocket endpoint. E.g., a correct URL may be: http://localhost:4000?localhost:8051"; - window.alert(message); - return null; - } - return endpoint; -} - -function findCameraObjectUnderObject3D(object) { - // seach the tree for the camera - if (object instanceof THREE.Camera) { - return object; - } - for (let name of Object.keys(object.children)) { - return findCameraObjectUnderObject3D(object.children[name]); - } - return null; -} - -var msgpack = require("msgpack-lite"); - -export class ViewerState extends Component { - constructor(props) { - super(props); - this.state = { - scene: null, - controls: null, - renderer: null, - gui: null, - scene_tree: null, - viewport_width: null, - viewport_height: null, - }; - this.update = this.update.bind(this); - this.set_object = this.set_object.bind(this); - this.handle_command = this.handle_command.bind(this); - this.threejs_ref = React.createRef(); - this.props = props; - } - - handleResize() { - this.state.viewport_width = this.getViewportWidth(); - this.state.viewport_height = this.getViewportHeight(); - this.state.camera_main.aspect = - this.state.viewport_width / this.state.viewport_height; - this.state.camera_main.updateProjectionMatrix(); - this.state.renderer_main.setSize( - this.state.viewport_width, - this.state.viewport_height - ); - } - - update() { - requestAnimationFrame(this.update); - this.handleResize(); - let camera_main = findCameraObjectUnderObject3D( - this.state.scene_tree.find(["Cameras", "Main Camera"]).object - ); - camera_main.updateProjectionMatrix(); - if (this.state.controls_main != null) { - this.state.controls_main.update(); - } - this.state.renderer_main.render(this.state.scene, camera_main); - this.send_camera_over_websocket(); - } - - send_camera_over_websocket() { - /* update the camera information in the python server - if the websocket is connected */ - // console.log("send_camera_over_websocket"); - if (this.state.websocket.readyState === WebSocket.OPEN) { - // update the camera information in the python server - let camera_main = findCameraObjectUnderObject3D( - this.state.scene_tree.find(["Cameras", "Main Camera"]).object - ); - // console.log(camera_main.toJSON()); - let cmd = "set_object"; - let path = "Cameras/Main Camera"; - let data = { - type: cmd, - path: path, - object: camera_main.toJSON(), - }; - let message = msgpack.encode(data); - this.state.websocket.send(message); - } - } - - send_training_state_over_websocket(value) { - if (this.state.websocket.readyState === WebSocket.OPEN) { - let cmd = "set_training_state"; - let path = "Training State"; - let data = { - type: cmd, - path: path, - training_state: value, - }; - let message = msgpack.encode(data); - this.state.websocket.send(message); - } - } - - send_output_type_over_websocket(value) { - /* update the output option in the python server - if the user changes selection */ - if (this.state.websocket.readyState === WebSocket.OPEN) { - let cmd = "set_output_type"; - let path = "Output Type"; - let data = { - type: cmd, - path: path, - output_type: value, - }; - let message = msgpack.encode(data); - this.state.websocket.send(message); - } - } - - send_min_resolution_over_websocket(value) { - if (this.state.websocket.readyState === WebSocket.OPEN) { - let cmd = "set_min_resolution"; - let path = "Min Resolution"; - let data = { - type: cmd, - path: path, - min_resolution: value, - }; - let message = msgpack.encode(data); - this.state.websocket.send(message); - } - } - - send_max_resolution_over_websocket(value) { - if (this.state.websocket.readyState === WebSocket.OPEN) { - let cmd = "set_max_resolution"; - let path = "Max Resolution"; - let data = { - type: cmd, - path: path, - max_resolution: value, - }; - let message = msgpack.encode(data); - this.state.websocket.send(message); - } - } - - set_object(path, object) { - if (!(object instanceof THREE.Camera)) { - this.state.scene_tree.find(path.concat([""])).set_object(object); - } - } - - set_object_from_json(path, object_json) { - let loader = new ExtensibleObjectLoader(); - loader.parse(object_json, (obj) => { - if ( - obj.geometry !== undefined && - obj.geometry.type === "BufferGeometry" - ) { - if ( - obj.geometry.attributes.normal === undefined || - obj.geometry.attributes.normal.count === 0 - ) { - obj.geometry.computeVertexNormals(); - } - } - obj.castShadow = true; - obj.receiveShadow = true; - this.set_object(path, obj); - }); - } - - set_transform(path, matrix) { - this.state.scene_tree.find(path).set_transform(matrix); - } - - delete_path(path) { - if (path.length === 0) { - console.error("Deleting the entire scene is not implemented."); - } else { - this.state.scene_tree.delete(path); - } - } - - set_property(path, property, value) { - this.state.scene_tree.find(path).set_property(property, value); - // TODO(ethan): handle this issue - if (path[0] === "Background") { - // The background is not an Object3d, so needs a little help. - this.state.scene_tree.find(path).on_update(); - } - } - - handle_command(cmd) { - // convert binary serialization format back to JSON - cmd = msgpack.decode(new Uint8Array(cmd)); - // console.log(cmd); - - // three js scene commands - if (cmd.type === "set_object") { - let path = split_path(cmd.path); - this.set_object_from_json(path, cmd.object); - } else if (cmd.type === "set_transform") { - let path = split_path(cmd.path); - this.set_transform(path, cmd.matrix); - } else if (cmd.type === "delete") { - let path = split_path(cmd.path); - this.delete_path(path); - } else if (cmd.type === "set_property") { - let path = split_path(cmd.path); - this.set_property(path, cmd.property, cmd.value); - } else if (cmd.type == "set_output_options") { - this.props.setOutputOptions(cmd.output_options); - this.props.setControls({ output_options: 1 }); - } - // web rtc commands - else if (cmd.type === "answer") { - let answer = cmd.data; - this.state.pc.setRemoteDescription(answer); - } - - // possibly update the camera information in the python server - // this.send_camera_over_websocket(); - } - - getViewportWidth() { - return window.innerWidth - (window.innerWidth % 2); - } - - getViewportHeight() { - return window.innerHeight; - } - - setupWebRTC() { - console.log("setting up WebRTC"); - // The iceServers config comes from the following URL: - // https://www.metered.ca/tools/openrelay/ - this.state.pc = new RTCPeerConnection({ - iceServers: [ - { - urls: "stun:openrelay.metered.ca:80", - }, - { - urls: "turn:openrelay.metered.ca:80", - username: "openrelayproject", - credential: "openrelayproject", - }, - { - urls: "turn:openrelay.metered.ca:443", - username: "openrelayproject", - credential: "openrelayproject", - }, - { - urls: "turn:openrelay.metered.ca:443?transport=tcp", - username: "openrelayproject", - credential: "openrelayproject", - }, - ], - }); - - // connect video - this.state.pc.addEventListener("track", function (evt) { - if (evt.track.kind == "video") { - console.log("setting event stream"); - document.getElementById("WebRTCVideo-video").srcObject = evt.streams[0]; - } - }); - this.state.pc.addTransceiver("video", { direction: "recvonly" }); - - this.state.pc - .createOffer() - .then((offer) => { - return this.state.pc.setLocalDescription(offer); - }) - .then(() => { - // wait for ICE gathering to complete - return new Promise((resolve) => { - if (this.state.pc.iceGatheringState === "complete") { - resolve(); - } else { - var checkState = () => { - if (this.state.pc.iceGatheringState === "complete") { - this.state.pc.removeEventListener( - "icegatheringstatechange", - checkState - ); - resolve(); - } - }; - this.state.pc.addEventListener( - "icegatheringstatechange", - checkState - ); - } - }); - }) - .then(() => { - var offer = this.state.pc.localDescription; - console.log("sending the offer"); - let cmd = "offer"; - let path = ""; - let data = { - type: cmd, - path: path, - data: { - sdp: offer.sdp, - type: offer.type, - }, - }; - let message = msgpack.encode(data); - this.state.websocket.send(message); - }); - } - - componentDidMount() { - // Open the websocket - let endpoint = websocket_endpoint_from_url(window.location.href); - this.state.websocket = new WebSocket("ws://" + endpoint + "/"); - this.state.websocket.onopen = () => { - console.log("websocket connected"); - this.setupWebRTC(); - }; - this.state.websocket.binaryType = "arraybuffer"; - // 'command' for updates to Viewer - this.state.websocket.onmessage = (cmd) => this.handle_command(cmd.data); - this.state.websocket.onclose = function (evt) { - console.log("onclose:", evt); - }; - - // Get size of screen - this.state.viewport_width = this.getViewportWidth(); - this.state.viewport_height = this.getViewportHeight(); - - // Scene - this.state.scene = new THREE.Scene(); - - // GUI - this.state.gui = new GUI(); - let scene_folder = this.state.gui.addFolder("Scene"); - scene_folder.open(); - this.state.scene_tree = new SceneNode(this.state.scene, scene_folder); - - // Renderer main - this.state.renderer_main = new THREE.WebGLRenderer({ - antialias: true, - alpha: true, - }); - this.state.renderer_main.setPixelRatio(window.devicePixelRatio); - this.state.renderer_main.setSize( - this.state.viewport_width, - this.state.viewport_height - ); - this.state.renderer_main.domElement.style.border = "1px solid black"; - - let domElement = document.getElementById("canvas-container-main"); - domElement.append(this.state.renderer_main.domElement); - - // Camera main - this.state.camera_main = new THREE.PerspectiveCamera( - 120, - this.state.viewport_width / this.state.viewport_height, - 0.01, - 100 - ); - this.state.camera_main.position.x = 5; - this.state.camera_main.position.y = -5; - this.state.camera_main.position.z = 5; - this.state.camera_main.up = new THREE.Vector3(0, 0, 1); - - this.state.controls_main = new OrbitControls( - this.state.camera_main, - this.state.renderer_main.domElement - ); - this.state.controls_main.rotateSpeed = 2.0; - this.state.controls_main.zoomSpeed = 0.3; - this.state.controls_main.panSpeed = 0.2; - this.state.controls_main.target.set(0, 0, 0); // focus point of the controls - this.state.controls_main.autoRotate = false; - this.state.controls_main.enableDamping = true; - this.state.controls_main.dampingFactor = 1.0; - this.state.controls_main.update(); - - let path = ["Cameras", "Main Camera"]; - this.state.scene_tree - .find(path.concat([""])) - .set_object(this.state.camera_main); - - // Axes display - let axes = new THREE.AxesHelper(5); - this.set_object(["Axes"], axes); - - // Grid - let grid = new THREE.GridHelper(20, 20); - grid.rotateX(Math.PI / 2); // now on xy plane - this.set_object(["Grid"], grid); - - // Lights - let color = 0xffffff; - let intensity = 1; - let light = new THREE.AmbientLight(color, intensity); - this.set_object(["Light"], light); - - // Stats - var stats = new Stats(); - let domElement_stats = document.getElementById("canvas-container-main"); - domElement_stats.append(stats.dom); - - this.update(); - } - - componentDidUpdate(prevProps, prevState) { - // Pause training - if (prevProps.paused !== this.props.paused) { - this.send_training_state_over_websocket(this.props.paused); - } - - // Choose render type - if (prevProps.output_options !== this.props.output_options) { - console.log(this.props.output_options); - this.send_output_type_over_websocket(this.props.output_options); - } - - // Set minimum render resolution - if (prevProps.min_resolution !== this.props.min_resolution) { - this.send_min_resolution_over_websocket( - this.props.min_resolution.slice(0, -2) - ); - } - - // Set maximum render resolution - if (prevProps.max_resolution !== this.props.max_resolution) { - this.send_max_resolution_over_websocket( - this.props.max_resolution.slice(0, -2) - ); - } - } - - render() { - return ( -
-
- -
-
-
-
- ); - } -} diff --git a/nerfactory/viewer/app/src/controlPanel.js b/nerfactory/viewer/app/src/controlPanel.js deleted file mode 100644 index b6f33a214..000000000 --- a/nerfactory/viewer/app/src/controlPanel.js +++ /dev/null @@ -1,68 +0,0 @@ -import React from "react"; -import { Leva, button, buttonGroup, useControls } from "leva"; - -export function PanelConfig() { - let params = { titleBar: false }; - let panel = ( -
- -
- ); - return panel; -} - -export function RenderControls() { - const [outputOptions, setOutputOptions] = React.useState([]); - const [paused, setPaused] = React.useState(false); - - const toggle = () => { - setPaused((current) => !current); - }; - - const [controls, setControls] = useControls( - "Render Options", - () => ({ - "Resume Training": button(toggle, { - disabled: !paused, - }), - "Pause Training": button(toggle, { - disabled: paused, - }), - output_options: { - label: "Output Render", - options: outputOptions, - }, - min_resolution: { - label: "Min Res.", - value: 50, - min: 10, - max: 100, - step: 1, - suffix: "px", - }, - " ": buttonGroup({ - "25px": () => setControls({ min_resolution: 25 }), - "50px": () => setControls({ min_resolution: 50 }), - "75px": () => setControls({ min_resolution: 75 }), - "100px": () => setControls({ min_resolution: 100 }), - }), - max_resolution: { - label: "Max Res.", - min: 10, - max: 2048, - step: 1, - value: 512, - suffix: "px", - }, - " ": buttonGroup({ - "128px": () => setControls({ max_resolution: 128 }), - "256px": () => setControls({ max_resolution: 256 }), - "512px": () => setControls({ max_resolution: 512 }), - "1024px": () => setControls({ max_resolution: 1024 }), - }), - }), - [outputOptions, paused] - ); - - return [controls, paused, setControls, setOutputOptions]; -} diff --git a/nerfactory/viewer/app/src/index.css b/nerfactory/viewer/app/src/index.css deleted file mode 100644 index 80277e1f3..000000000 --- a/nerfactory/viewer/app/src/index.css +++ /dev/null @@ -1,43 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", - "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", - monospace; -} - -.BackgroundDiv, -.WebRTCVideo { - position: absolute; - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; -} - -#BackgroundDiv-video, -#WebRTCVideo-video { - width: 100%; - height: 100%; - object-fit: fill; -} - -#canvas-container-main { - position: absolute; - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; -} - -#canvas-container-main canvas { - position: relative; - height: 100%; - width: 100%; -} diff --git a/nerfactory/viewer/app/src/index.js b/nerfactory/viewer/app/src/index.js deleted file mode 100644 index 760af9fc2..000000000 --- a/nerfactory/viewer/app/src/index.js +++ /dev/null @@ -1,32 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import "./index.css"; -import * as serviceWorker from "./serviceWorker"; -import { ViewerState } from "./Viewer"; -import { PanelConfig, RenderControls } from "./controlPanel"; - -function App() { - let [controls, paused, setControls, setOutputOptions] = RenderControls(); - - console.log(controls); - return ( -
- - - -
- ); -} - -const root = ReactDOM.createRoot(document.getElementById("root")); -root.render(); - -// If you want your app to work offline and load faster, you can change -// unregister() to register() below. Note this comes with some pitfalls. -// Learn more about service workers: https://bit.ly/CRA-PWA -serviceWorker.unregister(); diff --git a/nerfactory/viewer/app/src/index.jsx b/nerfactory/viewer/app/src/index.jsx new file mode 100644 index 000000000..924676521 --- /dev/null +++ b/nerfactory/viewer/app/src/index.jsx @@ -0,0 +1,15 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { Provider } from 'react-redux'; +import App from './App'; +import WebSocketProvider from './modules/WebSocket/WebSocket'; +import store from './store'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + + + , +); \ No newline at end of file diff --git a/nerfactory/viewer/app/src/logo.svg b/nerfactory/viewer/app/src/logo.svg deleted file mode 100644 index 6b60c1042..000000000 --- a/nerfactory/viewer/app/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanel.css b/nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanel.css new file mode 100644 index 000000000..e69de29bb diff --git a/nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanel.jsx b/nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanel.jsx new file mode 100644 index 000000000..ccf97f1d7 --- /dev/null +++ b/nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanel.jsx @@ -0,0 +1,252 @@ +import { button, buttonGroup, useControls } from 'leva'; +import { useContext, useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; + +import { WebSocketContext } from '../WebSocket/WebSocket'; + +const msgpack = require('msgpack-lite'); + +export function RenderControls() { + // connection status indicators + const websocket = useContext(WebSocketContext).socket; + const isWebsocketConnected = useSelector( + (state) => state.websocketState.isConnected, + ); + const isWebrtcConnected = useSelector( + (state) => state.webrtcState.isConnected, + ); + const isTraining = useSelector((state) => state.renderingState.isTraining); + const outputOptions = useSelector( + (state) => state.renderingState.output_options, + ); + const outputChoice = useSelector( + (state) => state.renderingState.output_choice, + ); + const min_resolution = useSelector( + (state) => state.renderingState.minResolution, + ); + const max_resolution = useSelector( + (state) => state.renderingState.maxResolution, + ); + const field_of_view = useSelector( + (state) => state.renderingState.field_of_view, + ); + + const dispatch = useDispatch(); + + const set_min_resolution = (value) => { + if (websocket.readyState === WebSocket.OPEN) { + dispatch({ + type: 'write', + path: 'renderingState/minResolution', + data: value, + }); + const cmd = 'write'; + const path = 'renderingState/minResolution'; + const data = { + type: cmd, + path, + data: value, + }; + const message = msgpack.encode(data); + websocket.send(message); + } + }; + + const set_max_resolution = (value) => { + if (websocket.readyState === WebSocket.OPEN) { + dispatch({ + type: 'write', + path: 'renderingState/maxResolution', + data: value, + }); + const cmd = 'write'; + const path = 'renderingState/maxResolution'; + const data = { + type: cmd, + path, + data: value, + }; + const message = msgpack.encode(data); + websocket.send(message); + } + }; + + const set_output_choice = (value) => { + if (websocket.readyState === WebSocket.OPEN) { + dispatch({ + type: 'write', + path: 'renderingState/output_choice', + data: value, + }); + const cmd = 'write'; + const path = 'renderingState/output_choice'; + const data = { + type: cmd, + path, + data: value, + }; + const message = msgpack.encode(data); + websocket.send(message); + } + }; + + const set_fov = (value) => { + if (websocket.readyState === WebSocket.OPEN) { + dispatch({ + type: 'write', + path: 'renderingState/field_of_view', + data: value, + }); + const cmd = 'write'; + const path = 'renderingState/field_of_view'; + const data = { + type: cmd, + path, + data: value, + }; + const message = msgpack.encode(data); + websocket.send(message); + } + }; + + const [, setControls] = useControls( + 'Rendering State', + () => ({ + // WebSocket isConnected + // button does nothing except be an indicator + 'WebSocket Connected': button(() => {}, { + disabled: !isWebsocketConnected, + }), + // webRTC isConnected + // button does nothing except be an indicator + 'WebRTC Connected': button(() => {}, { + disabled: !isWebrtcConnected, + }), + // isTraining + 'Pause Training': button( + () => { + // write locally to store + dispatch({ + type: 'write', + path: 'renderingState/isTraining', + data: false, + }); + // write to server + const cmd = 'write'; + const path = 'renderingState/isTraining'; + const data = { + type: cmd, + path, + data: false, + }; + const message = msgpack.encode(data); + websocket.send(message); + }, + { + disabled: !isTraining, + }, + ), + 'Resume Training': button( + () => { + // write locally to store + dispatch({ + type: 'write', + path: 'renderingState/isTraining', + data: true, + }); + // write to server + const cmd = 'write'; + const path = 'renderingState/isTraining'; + const data = { + type: cmd, + path, + data: true, + }; + const message = msgpack.encode(data); + websocket.send(message); + }, + { + disabled: isTraining, + }, + ), + // output_options + output_options: { + label: 'Output Render', + options: outputOptions, + value: outputChoice, + onChange: (v) => { + set_output_choice(v); + }, + }, + // resolution + min_resolution: { + label: 'Min Res.', + value: min_resolution, + min: 10, + max: 100, + step: 1, + onChange: (v) => { + set_min_resolution(v); + }, + }, + ' ': buttonGroup({ + '25px': () => setControls({ min_resolution: 25 }), + '50px': () => setControls({ min_resolution: 50 }), + '75px': () => setControls({ min_resolution: 75 }), + '100px': () => setControls({ min_resolution: 100 }), + }), + max_resolution: { + label: 'Max Res.', + value: max_resolution, + min: 10, + max: 2048, + step: 1, + onChange: (v) => { + set_max_resolution(v); + }, + }, + ' ': buttonGroup({ + '128px': () => setControls({ max_resolution: 128 }), + '256px': () => setControls({ max_resolution: 256 }), + '512px': () => setControls({ max_resolution: 512 }), + '1024px': () => setControls({ max_resolution: 1024 }), + }), + 'Camera FoV': { + value: field_of_view, + onChange: (v) => { + set_fov(v); + }, + }, + }), + [ + isWebsocketConnected, + isWebrtcConnected, + isTraining, + outputOptions, + outputChoice, + min_resolution, + max_resolution, + field_of_view, + ], + ); + + useEffect(() => { + setControls({ min_resolution }); + setControls({ max_resolution }); + setControls({ output_options: outputChoice }); + setControls({ 'Camera FoV': field_of_view }); + }, [ + setControls, + isWebsocketConnected, + isWebrtcConnected, + isTraining, + outputOptions, + outputChoice, + min_resolution, + max_resolution, + field_of_view, + ]); + + return null; +} diff --git a/nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanelSlice.js b/nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanelSlice.js new file mode 100644 index 000000000..30db097df --- /dev/null +++ b/nerfactory/viewer/app/src/modules/ConfigPanel/ConfigPanelSlice.js @@ -0,0 +1,6 @@ +// The function below is called a selector and allows us to select a value from +// the state. Selectors can also be defined inline where they're used instead of +// in the slice file. For example: `useSelector((state) => state.counter.value)` +export const selectTrainingState = (state) => + state.shared.rendering.training_state; +export const selectOutputOptions = (state) => state.shared.output_options; diff --git a/nerfactory/viewer/app/src/modules/Scene/Scene.css b/nerfactory/viewer/app/src/modules/Scene/Scene.css new file mode 100644 index 000000000..43ff9bf1a --- /dev/null +++ b/nerfactory/viewer/app/src/modules/Scene/Scene.css @@ -0,0 +1,5 @@ +#datgui { + position: absolute; + top: 2px; + left: 2px; +} diff --git a/nerfactory/viewer/app/src/modules/Scene/Scene.jsx b/nerfactory/viewer/app/src/modules/Scene/Scene.jsx new file mode 100644 index 000000000..4e5a1b891 --- /dev/null +++ b/nerfactory/viewer/app/src/modules/Scene/Scene.jsx @@ -0,0 +1,127 @@ +import './Scene.css'; + +/* eslint-disable no-restricted-syntax */ +import * as THREE from 'three'; + +import { useContext, useEffect } from 'react'; +import { useDispatch } from 'react-redux'; + +import { GUI } from 'dat.gui'; +import SceneNode from '../../SceneNode'; +import { subscribe_to_changes } from '../../subscriber'; +import { WebSocketContext } from '../WebSocket/WebSocket'; +import { drawCamera, drawSceneBounds } from './drawing'; + +const msgpack = require('msgpack-lite'); + +// manages setting up the scene and other logic for keeping state in sync with the server +export default function SetupScene() { + let scene = null; + let gui = null; + let sceneTree = null; + + // the websocket context + const socket = useContext(WebSocketContext).socket; + const dispatch = useDispatch(); + + // Scene + scene = new THREE.Scene(); + + // GUI + gui = new GUI(); + gui.domElement.id = 'datgui'; + const sceneFolder = gui.addFolder('Scene'); + sceneFolder.open(); + sceneTree = new SceneNode(scene, sceneFolder); + + // add objects to the the scene tree + const setObject = (path, object) => { + sceneTree.find(path.concat([''])).set_object(object); + }; + const deleteObject = (path) => { + sceneTree.delete(path); + }; + + // Axes + const axes = new THREE.AxesHelper(5); + setObject(['Axes'], axes); + + // Grid + const grid = new THREE.GridHelper(20, 20); + grid.rotateX(Math.PI / 2); // rotated to xy plane + setObject(['Grid'], grid); + + // Lights + const color = 0xffffff; + const intensity = 1; + const light = new THREE.AmbientLight(color, intensity); + setObject(['Light'], light); + + // draw scene bounds + const selector_fn_scene_bounds = (state) => { + return state.sceneState.sceneBounds; + }; + const fn_value_scene_bounds = (previous, current) => { + if (current !== null) { + const line = drawSceneBounds(current); + setObject(['Scene Bounds'], line); + } else { + deleteObject(['Scene Bounds']); + } + }; + subscribe_to_changes(selector_fn_scene_bounds, fn_value_scene_bounds); + + // draw camera + // NOTE: this has some issues right now! it won't + // update the camera on an individual change w/o deleting first + const selector_fn_cameras = (state) => { + return state.sceneState.cameras; + }; + const fn_value_cameras = (previous, current) => { + if (current !== null) { + let prev = new Set(); + if (previous !== null) { + prev = new Set(Object.keys(previous)); + } + const curr = new Set(Object.keys(current)); + // valid if in current but not previous + // invalid if in previous but not current + for (const key of curr) { + // valid so draw + if (!prev.has(key)) { + // keys_valid.push(key); + const json = current[key]; + const camera = drawCamera(json); + setObject(['Cameras', key], camera); + } + } + for (const key of prev) { + // invalid so delete + if (!curr.has(key) || current[key] === null) { + // keys_invalid.push(key); + deleteObject(['Cameras', key]); + } + } + } else { + deleteObject(['Cameras']); + } + }; + subscribe_to_changes(selector_fn_cameras, fn_value_cameras); + + useEffect(() => { + socket.addEventListener('message', (originalCmd) => { + // set the remote description when the offer is received + const cmd = msgpack.decode(new Uint8Array(originalCmd.data)); + if (cmd.type === 'write') { + // write to the store + dispatch({ + type: 'write', + path: cmd.path, + data: cmd.data, + }); + } + }); + }, []); // empty dependency array means only run once + + return scene; +} diff --git a/nerfactory/viewer/app/src/modules/Scene/drawing.js b/nerfactory/viewer/app/src/modules/Scene/drawing.js new file mode 100644 index 000000000..c91ade755 --- /dev/null +++ b/nerfactory/viewer/app/src/modules/Scene/drawing.js @@ -0,0 +1,164 @@ +/* eslint-disable no-restricted-syntax */ +// ---- code for drawing with three.js ---- +import * as THREE from 'three'; + +export function drawSceneBounds(sceneBounds): THREE.Object3D { + console.assert( + sceneBounds.type === 'aabb', + 'The scene bounds must be an AABB', + ); + + const box = sceneBounds; + + const w = 1.0; + const aaa = new THREE.Vector3(w, w, w); + const aab = new THREE.Vector3(w, w, -w); + const aba = new THREE.Vector3(w, -w, w); + const baa = new THREE.Vector3(-w, w, w); + const abb = new THREE.Vector3(w, -w, -w); + const bba = new THREE.Vector3(-w, -w, w); + const bab = new THREE.Vector3(-w, w, -w); + const bbb = new THREE.Vector3(-w, -w, -w); + let points = [aaa, aab, aaa, aba, aab, abb, aba, abb]; + points = points.concat([baa, bab, baa, bba, bab, bbb, bba, bbb]); + points = points.concat([aaa, baa, aab, bab, aba, bba, abb, bbb]); + + const maxPoint = new THREE.Vector3(...box.max_point); + const minPoint = new THREE.Vector3(...box.min_point); + + const lengths = maxPoint.clone(); + lengths.sub(minPoint); + + const scalar = lengths.clone(); + scalar.divide(new THREE.Vector3(2.0, 2.0, 2.0)); + + const offset = minPoint.clone(); + offset.add(scalar); + for (let i = 0; i < points.length; i += 1) { + points[i] = points[i].clone(); + points[i].multiply(scalar).add(offset); + } + + const geometry = new THREE.BufferGeometry().setFromPoints(points); + const material = new THREE.LineBasicMaterial({ + color: 0x000000, + linewidth: 1, + }); + const lines = new THREE.LineSegments(geometry, material); + return lines; +} + +export function getCameraWireframe( + scale = 0.3, + focalLength = 4, + w = 1.5, + h = 2, +) { + // Returns a wireframe of a 3D line-plot of a camera symbol. + // A wireframe is a frustum. + // https://github.com/hangg7/mvs_visual/blob/275d382a824733a3187a8e3147be184dd6f14795/mvs_visual.py#L54. + // scale: scale of rendering + // focalLength: this is the focal length + // w: width + // h: height + const f = focalLength; + + const ul = new THREE.Vector3(-w, h, -f); + const ur = new THREE.Vector3(w, h, -f); + const ll = new THREE.Vector3(-w, -h, -f); + const lr = new THREE.Vector3(w, -h, -f); + const C = new THREE.Vector3(0, 0, 0); + const points = [ + C, + ul, + C, + ur, + C, + ll, + C, + lr, + C, + ul, + ur, + ul, + lr, + ur, + lr, + ll, + ll, + ul, + ]; + + const scalar = new THREE.Vector3(scale, scale, scale); + for (let i = 0; i < points.length; i += 1) { + points[i].multiply(scalar); + } + + const geometry = new THREE.BufferGeometry().setFromPoints(points); + const material = new THREE.LineBasicMaterial({ + color: 0x000000, + linewidth: 1, + }); + const lines = new THREE.LineSegments(geometry, material); + return lines; +} + +export function drawCameraImagePlane(width, height, imageString) { + // imageString is the texture as a base64 string + const geometry = new THREE.PlaneGeometry(width, height); + const material = new THREE.MeshBasicMaterial({ + side: THREE.DoubleSide, + }); + const texture = new THREE.TextureLoader().load(imageString); + material.map = texture; + const plane = new THREE.Mesh(geometry, material); + return plane; +} + +function transpose(matrix) { + return matrix[0].map((col, i) => matrix.map((row) => row[i])); +} + +export function drawCamera(camera): THREE.Object3D { + const group = new THREE.Group(); + + // console.log(camera); + console.assert( + camera.type === 'PinholeCamera', + 'The camera should be a PinholeCamera', + ); + + const height = 0.25; + const f = camera.fx; + const displayedFocalLength = height / (2.0 * (camera.cy / f)); + const width = 2.0 * (camera.cx / f) * displayedFocalLength; + const cameraWireframeObject = getCameraWireframe(1.0, displayedFocalLength, width, height); + cameraWireframeObject.translateZ(displayedFocalLength); // move the wireframe frustum back + group.add(cameraWireframeObject); + const cameraImagePlaneObject = drawCameraImagePlane( + width*2, + height*2, + camera.image, + ); + group.add(cameraImagePlaneObject); + + // make homogeneous coordinates and then + // transpose and flatten the matrix into an array + let c2w = JSON.parse(JSON.stringify(camera.camera_to_world)); + c2w.push([0, 0, 0, 1]); + c2w = transpose(c2w).flat(); + + const mat = new THREE.Matrix4(); + mat.fromArray(c2w); + mat.decompose(group.position, group.quaternion, group.scale); + + return group; +} + +export function drawCameras(cameras): Record { + const cameraObjects = {}; + for (const [key, camera] of Object.entries(cameras)) { + cameraObjects[key] = drawCamera(camera); + } + return cameraObjects; +} diff --git a/nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindow.css b/nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindow.css new file mode 100644 index 000000000..2390151aa --- /dev/null +++ b/nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindow.css @@ -0,0 +1,27 @@ +.WebRTCVideo { + position: absolute; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; +} + +.WebRTCVideo-video { + width: 100%; + height: 100%; + object-fit: fill; +} + +.canvas-container-main { + position: absolute; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; +} + +.canvas-container-main canvas { + position: relative; + height: 100%; + width: 100%; +} diff --git a/nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindow.jsx b/nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindow.jsx new file mode 100644 index 000000000..f5611b586 --- /dev/null +++ b/nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindow.jsx @@ -0,0 +1,116 @@ +import './ViewerWindow.css'; + +import * as THREE from 'three'; + +import React, { useContext, useEffect, useRef } from 'react'; +import { useSelector } from 'react-redux'; + +import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'; +import WebRtcWindow from '../WebRtcWindow/WebRtcWindow'; +import { WebSocketContext } from '../WebSocket/WebSocket'; + +const msgpack = require('msgpack-lite'); + +// manages a camera and the web rtc stream... +export default function ViewerWindow(props) { + // eslint-disable-next-line react/prop-types + const scene = props.scene; + let cameraControls = null; + const myRef = useRef(null); + const websocket = useContext(WebSocketContext).socket; + const field_of_view = useSelector( + (state) => state.renderingState.field_of_view, + ); + + const getViewportWidth = () => { + return window.innerWidth - (window.innerWidth % 2); + }; + + const getViewportHeight = () => { + return window.innerHeight; + }; + + let viewportWidth = getViewportWidth(); + let viewportHeight = getViewportHeight(); + + const camera = new THREE.PerspectiveCamera( + field_of_view, + viewportWidth / viewportHeight, + 0.01, + 100, + ); + camera.position.x = 5; + camera.position.y = -5; + camera.position.z = 5; + camera.up = new THREE.Vector3(0, 0, 1); + + const renderer = new THREE.WebGLRenderer({ + antialias: true, + alpha: true, + }); + renderer.setPixelRatio(window.devicePixelRatio); + renderer.setSize(viewportWidth, viewportHeight); + renderer.domElement.style.border = '1px solid black'; + + const handleResize = () => { + viewportWidth = getViewportWidth(); + viewportHeight = getViewportHeight(); + camera.aspect = viewportWidth / viewportHeight; + camera.updateProjectionMatrix(); + renderer.setSize(viewportWidth, viewportHeight); + }; + + const sendCamera = () => { + // update the camera information in the python server + if (websocket.readyState === WebSocket.OPEN) { + const cmd = 'write'; + const path = 'renderingState/camera'; + const data = { + type: cmd, + path, + data: camera.toJSON(), + }; + const message = msgpack.encode(data); + websocket.send(message); + } + }; + + const update = () => { + handleResize(); + camera.updateProjectionMatrix(); + cameraControls.update(); + requestAnimationFrame(update); + renderer.render(scene, camera); + sendCamera(); + }; + + // similar to componentDidMount + useEffect(() => { + myRef.current.append(renderer.domElement); + // add camera controls + cameraControls = new OrbitControls(camera, renderer.domElement); + cameraControls.rotateSpeed = 2.0; + cameraControls.zoomSpeed = 0.3; + cameraControls.panSpeed = 0.2; + cameraControls.target.set(0, 0, 0); // focus point of the controls + cameraControls.autoRotate = false; + cameraControls.enableDamping = true; + cameraControls.dampingFactor = 1.0; + cameraControls.update(); + update(); + }, []); + + // useEffect(() => { + // camera.fov = field_of_view; + // console.log(field_of_view); + // camera.updateProjectionMatrix(); + // }, [field_of_view]); + + return ( +
+ {/* the webrtc viewer needs to know the camera pose */} + +
+
+ ); +} diff --git a/nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindowSlice.js b/nerfactory/viewer/app/src/modules/ViewerWindow/ViewerWindowSlice.js new file mode 100644 index 000000000..e69de29bb diff --git a/nerfactory/viewer/app/src/modules/WebRtcWindow/WebRtcWindow.jsx b/nerfactory/viewer/app/src/modules/WebRtcWindow/WebRtcWindow.jsx new file mode 100644 index 000000000..78bab30b7 --- /dev/null +++ b/nerfactory/viewer/app/src/modules/WebRtcWindow/WebRtcWindow.jsx @@ -0,0 +1,147 @@ +import React, { createContext, useContext, useEffect, useRef } from 'react'; +import { useDispatch } from 'react-redux'; + +import { WebSocketContext } from '../WebSocket/WebSocket'; + +const WebRtcContext = createContext(null); +const msgpack = require('msgpack-lite'); + +export { WebRtcContext }; + +export default function WebRtcWindow() { + const websocket = useContext(WebSocketContext).socket; + const pcRef = useRef(null); + const localVideoRef = useRef(null); + + const dispatch = useDispatch(); + + const getRTCPeerConnection = () => { + const pc = new RTCPeerConnection({ + iceServers: [ + { + urls: 'stun:openrelay.metered.ca:80', + }, + { + urls: 'turn:openrelay.metered.ca:80', + username: 'openrelayproject', + credential: 'openrelayproject', + }, + { + urls: 'turn:openrelay.metered.ca:443', + username: 'openrelayproject', + credential: 'openrelayproject', + }, + { + urls: 'turn:openrelay.metered.ca:443?transport=tcp', + username: 'openrelayproject', + credential: 'openrelayproject', + }, + ], + }); + // connect video + pc.addEventListener('track', (evt) => { + dispatch({ + type: "write", + path: 'webrtcState/isConnected', + data: true, + }); + if (evt.track.kind === 'video') { + [localVideoRef.current.srcObject] = evt.streams; // uses array destructuring + } + }); + pc.addTransceiver('video', { direction: 'recvonly' }); + + // for updating the status of the peer connection + pc.oniceconnectionstatechange = () => { + if (pc.iceConnectionState === 'connected') { + dispatch({ + type: "write", + path: 'webrtcState/isConnected', + data: true, + }); + } else if (pc.iceConnectionState === 'disconnected') { + dispatch({ + type: "write", + path: 'webrtcState/isConnected', + data: false, + }); + } + }; + return pc; + }; + + const sendOffer = () => { + pcRef.current + .createOffer() + .then((offer) => { + return pcRef.current.setLocalDescription(offer); + }) + .then(() => { + // wait for ICE gathering to complete + return new Promise((resolve) => { + if (pcRef.current.iceGatheringState === 'complete') { + resolve(); + } else { + const checkState = () => { + if (pcRef.current.iceGatheringState === 'complete') { + pcRef.current.removeEventListener( + 'icegatheringstatechange', + checkState, + ); + resolve(); + } + }; + pcRef.current.addEventListener( + 'icegatheringstatechange', + checkState, + ); + } + }); + }) + .then(() => { + // send the offer + const offer = pcRef.current.localDescription; + const cmd = 'offer'; + const path = ''; + const data = { + type: cmd, + path, + data: { + sdp: offer.sdp, + type: offer.type, + }, + }; + const message = msgpack.encode(data); + websocket.send(message); + }); + }; + + useEffect(() => { + websocket.addEventListener('message', (originalCmd) => { + // set the remote description when the offer is received + const cmd = msgpack.decode(new Uint8Array(originalCmd.data)); + if (cmd.type === 'answer') { + const answer = cmd.data; + pcRef.current.setRemoteDescription(answer); + } + }); + + websocket.addEventListener('open', () => { + // connect webrtc when the websocket is connected + pcRef.current = getRTCPeerConnection(); + sendOffer(); + }); + }, []); // empty dependency array means only run once + + return ( +
+
+ ); +} diff --git a/nerfactory/viewer/app/src/modules/WebSocket/WebSocket.jsx b/nerfactory/viewer/app/src/modules/WebSocket/WebSocket.jsx new file mode 100644 index 000000000..ab3668eac --- /dev/null +++ b/nerfactory/viewer/app/src/modules/WebSocket/WebSocket.jsx @@ -0,0 +1,86 @@ +// Much of this code comes from or is inspired by: +// https://www.pluralsight.com/guides/using-web-sockets-in-your-reactredux-app + +import React, { createContext } from 'react'; + +import PropTypes from 'prop-types'; +import { useDispatch } from 'react-redux'; + +const WebSocketContext = createContext(null); + +export { WebSocketContext }; + +function getWebsocketEndpointFromUrl(url: string) { + const splitUrl = url.split('?'); + if (splitUrl.length !== 2) { + window.alert("There should be exactly one '?' in the url."); + return ''; + } + const endpoint = splitUrl.pop(); + if (endpoint === '') { + const message = + 'Please set the websocket endpoint. E.g., a correct URL may be: http://localhost:4000?localhost:8051'; + window.alert(message); + return ''; + } + return endpoint; +} + +export default function WebSocketContextFunction({ children }) { + + const dispatch = useDispatch(); + + let socket; + let ws; + + // should look like ws://localhost:8051 + const websocketEndpoint = getWebsocketEndpointFromUrl(window.location.href); + + const connect = () => { + socket = new WebSocket(`ws://${websocketEndpoint}/`); + socket.binaryType = 'arraybuffer'; + socket.onopen = () => { + dispatch({ + type: 'write', + path: 'websocketState/isConnected', + data: true, + }); + }; + + socket.onclose = () => { + // when closed, the websocket will try to reconnect every second + dispatch({ + type: 'write', + path: 'websocketState/isConnected', + data: false, + }); + setTimeout(() => { + connect(); + }, 1000); + }; + + socket.onerror = (err) => { + console.error( + 'Socket encountered error: ', + err.message, + 'Closing socket', + ); + socket.close(); + }; + }; + + if (!socket) { + connect(); + ws = { + socket, + }; + } + + return ( + {children} + ); +} + +WebSocketContextFunction.propTypes = { + children: PropTypes.node.isRequired, +}; diff --git a/nerfactory/viewer/app/src/reducer.js b/nerfactory/viewer/app/src/reducer.js new file mode 100644 index 000000000..6475e9488 --- /dev/null +++ b/nerfactory/viewer/app/src/reducer.js @@ -0,0 +1,59 @@ +import { split_path } from './utils'; + +const initialState = { + // the websocket connection state + websocketState: { + isConnected: false, + }, + // the webrtc connection state + webrtcState: { + isConnected: false, + }, + // the rendering state + renderingState: { + camera: null, // the camera object used to render the three.js scene + isTraining: true, + output_options: ['rgb'], // populated by the possible Graph outputs + output_choice: 'rgb', // the selected output + minResolution: 50, + maxResolution: 512, + field_of_view: 80 + }, + // the scene state + sceneState: { + sceneBounds: null, + cameras: null, + }, + // ------------------------------------------------------------------------ + // which of the state keys to synchronize with the bridge server + sync_keys: ['renderingState', 'sceneState'], +}; + +function setData(newState, state, path, data) { + if (path.length === 1) { + newState[path[0]] = data; // eslint-disable-line no-param-reassign + } else { + newState[path[0]] = { ...state[path[0]] }; // eslint-disable-line no-param-reassign + setData(newState[path[0]], state[path[0]], path.slice(1), data); + } +} + +// Use the initialState as a default value +// eslint-disable-next-line default-param-last +export default function rootReducer(state = initialState, action) { + // The reducer normally looks at the action type field to decide what happens + + switch (action.type) { + case 'write': { + const path = split_path(action.path); // convert string with "/"s to a list + const data = action.data; + const newState = { ...state }; + setData(newState, state, path, data); + return newState; + } + default: + // If this reducer doesn't recognize the action type, or doesn't + // care about this specific action, return the existing state unchanged + return state; + } +} diff --git a/nerfactory/viewer/app/src/serviceWorker.js b/nerfactory/viewer/app/src/serviceWorker.js deleted file mode 100644 index c7cd6663d..000000000 --- a/nerfactory/viewer/app/src/serviceWorker.js +++ /dev/null @@ -1,141 +0,0 @@ -// This optional code is used to register a service worker. -// register() is not called by default. - -// This lets the app load faster on subsequent visits in production, and gives -// it offline capabilities. However, it also means that developers (and users) -// will only see deployed updates on subsequent visits to a page, after all the -// existing tabs open on the page have been closed, since previously cached -// resources are updated in the background. - -// To learn more about the benefits of this model and instructions on how to -// opt-in, read https://bit.ly/CRA-PWA - -const isLocalhost = Boolean( - window.location.hostname === "localhost" || - // [::1] is the IPv6 localhost address. - window.location.hostname === "[::1]" || - // 127.0.0.0/8 are considered localhost for IPv4. - window.location.hostname.match( - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ - ) -); - -export function register(config) { - if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { - // The URL constructor is available in all browsers that support SW. - const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); - if (publicUrl.origin !== window.location.origin) { - // Our service worker won't work if PUBLIC_URL is on a different origin - // from what our page is served on. This might happen if a CDN is used to - // serve assets; see https://github.com/facebook/create-react-app/issues/2374 - return; - } - - window.addEventListener("load", () => { - const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; - - if (isLocalhost) { - // This is running on localhost. Let's check if a service worker still exists or not. - checkValidServiceWorker(swUrl, config); - - // Add some additional logging to localhost, pointing developers to the - // service worker/PWA documentation. - navigator.serviceWorker.ready.then(() => { - console.log( - "This web app is being served cache-first by a service " + - "worker. To learn more, visit https://bit.ly/CRA-PWA" - ); - }); - } else { - // Is not localhost. Just register service worker - registerValidSW(swUrl, config); - } - }); - } -} - -function registerValidSW(swUrl, config) { - navigator.serviceWorker - .register(swUrl) - .then((registration) => { - registration.onupdatefound = () => { - const installingWorker = registration.installing; - if (installingWorker == null) { - return; - } - installingWorker.onstatechange = () => { - if (installingWorker.state === "installed") { - if (navigator.serviceWorker.controller) { - // At this point, the updated precached content has been fetched, - // but the previous service worker will still serve the older - // content until all client tabs are closed. - console.log( - "New content is available and will be used when all " + - "tabs for this page are closed. See https://bit.ly/CRA-PWA." - ); - - // Execute callback - if (config && config.onUpdate) { - config.onUpdate(registration); - } - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // "Content is cached for offline use." message. - console.log("Content is cached for offline use."); - - // Execute callback - if (config && config.onSuccess) { - config.onSuccess(registration); - } - } - } - }; - }; - }) - .catch((error) => { - console.error("Error during service worker registration:", error); - }); -} - -function checkValidServiceWorker(swUrl, config) { - // Check if the service worker can be found. If it can't reload the page. - fetch(swUrl, { - headers: { "Service-Worker": "script" }, - }) - .then((response) => { - // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get("content-type"); - if ( - response.status === 404 || - (contentType != null && contentType.indexOf("javascript") === -1) - ) { - // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then((registration) => { - registration.unregister().then(() => { - window.location.reload(); - }); - }); - } else { - // Service worker found. Proceed as normal. - registerValidSW(swUrl, config); - } - }) - .catch(() => { - console.log( - "No internet connection found. App is running in offline mode." - ); - }); -} - -export function unregister() { - if ("serviceWorker" in navigator) { - navigator.serviceWorker.ready - .then((registration) => { - registration.unregister(); - }) - .catch((error) => { - console.error(error.message); - }); - } -} diff --git a/nerfactory/viewer/app/src/store.js b/nerfactory/viewer/app/src/store.js new file mode 100644 index 000000000..9021d23a1 --- /dev/null +++ b/nerfactory/viewer/app/src/store.js @@ -0,0 +1,4 @@ +import { configureStore } from '@reduxjs/toolkit'; +import rootReducer from './reducer'; + +export default configureStore({ reducer: rootReducer }); diff --git a/nerfactory/viewer/app/src/subscriber.js b/nerfactory/viewer/app/src/subscriber.js new file mode 100644 index 000000000..3bc35562e --- /dev/null +++ b/nerfactory/viewer/app/src/subscriber.js @@ -0,0 +1,19 @@ +import { useContext } from 'react'; +import { ReactReduxContext } from 'react-redux'; + +export function subscribe_to_changes(selector_fn, fn) { + // selector_fn: returns a value from the redux state + // fn_valid: function to run on a valid input + // fn_null: function to run on a null input + const { store } = useContext(ReactReduxContext); + + let current; + const handleChange = () => { + const previous = current; + current = selector_fn(store.getState()); + if (previous !== current) { + fn(previous, current); + } + }; + store.subscribe(handleChange); +} diff --git a/nerfactory/viewer/app/yarn.lock b/nerfactory/viewer/app/yarn.lock index 29a7a064b..6954d36b9 100644 --- a/nerfactory/viewer/app/yarn.lock +++ b/nerfactory/viewer/app/yarn.lock @@ -26,12 +26,12 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.18.8": +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== -"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": +"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.18.5", "@babel/core@^7.7.2", "@babel/core@^7.8.0": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== @@ -85,7 +85,7 @@ "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.18.9": +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== @@ -116,15 +116,13 @@ "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.1.0" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== +"@babel/helper-define-polyfill-provider@^0.3.1", "@babel/helper-define-polyfill-provider@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073" + integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg== dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" @@ -164,7 +162,7 @@ dependencies: "@babel/types" "^7.18.9" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.18.6": +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== @@ -192,7 +190,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== @@ -779,7 +777,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-constant-elements@^7.12.1": +"@babel/plugin-transform-react-constant-elements@^7.12.1", "@babel/plugin-transform-react-constant-elements@^7.17.12": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.9.tgz#ff6aeedd38f57ba6b41dcf824fcc8bcedb3e783f" integrity sha512-IrTYh1I3YCEL1trjknnlLKTp5JggjzhKl/d3ibzPc97JhpFcDTr38Jdek/oX4cFbS6By0bXJcOkpRvJ5ZHK2wQ== @@ -906,7 +904,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.18.2": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.9.tgz#9b3425140d724fbe590322017466580844c7eaff" integrity sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg== @@ -998,7 +996,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0", "@babel/preset-react@^7.17.12": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== @@ -1010,7 +1008,7 @@ "@babel/plugin-transform-react-jsx-development" "^7.18.6" "@babel/plugin-transform-react-pure-annotations" "^7.18.6" -"@babel/preset-typescript@^7.16.0": +"@babel/preset-typescript@^7.16.0", "@babel/preset-typescript@^7.17.12": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== @@ -1027,7 +1025,7 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== @@ -1043,7 +1041,7 @@ "@babel/parser" "^7.18.6" "@babel/types" "^7.18.6" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== @@ -1059,7 +1057,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.4", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== @@ -1212,15 +1210,20 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@humanwhocodes/config-array@^0.9.2": - version "0.9.5" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" - integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== +"@humanwhocodes/config-array@^0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" + integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" minimatch "^3.0.4" +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" @@ -1740,6 +1743,16 @@ dependencies: "@babel/runtime" "^7.13.10" +"@reduxjs/toolkit@^1.8.3": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.8.3.tgz#9c6a9c497bde43a67618d37a4175a00ae12efeb2" + integrity sha512-lU/LDIfORmjBbyDLaqFN2JB9YmAT1BElET9y0ZszwhSBa5Ef3t6o5CrHupw5J1iOXwd+o92QfQZ8OJpwXvsssg== + dependencies: + immer "^9.0.7" + redux "^4.1.2" + redux-thunk "^2.4.1" + reselect "^4.1.5" + "@rollup/plugin-babel@^5.2.0": version "5.3.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" @@ -1800,9 +1813,9 @@ integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== "@sinclair/typebox@^0.24.1": - version "0.24.20" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.20.tgz#11a657875de6008622d53f56e063a6347c51a6dd" - integrity sha512-kVaO5aEFZb33nPMTZBxiPEkY+slxiPtqC7QX8f9B3eGOMBvEfuMfxp9DSTTCsRJPumPKjrge4yagyssO4q6qzQ== + version "0.24.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.24.tgz#1c201951882b0954b0689b0047584776e0053c1f" + integrity sha512-YaQ015FMwcveHbmI7w7X19f979CUCut2sf1gryWVV5nkAFr598jUhSpByKaC2BSBtJLT9lrDBfEo0Y2IFNipMQ== "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -1848,41 +1861,81 @@ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== +"@svgr/babel-plugin-add-jsx-attribute@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.3.1.tgz#b9a5d84902be75a05ede92e70b338d28ab63fa74" + integrity sha512-jDBKArXYO1u0B1dmd2Nf8Oy6aTF5vLDfLoO9Oon/GLkqZ/NiggYWZA+a2HpUMH4ITwNqS3z43k8LWApB8S583w== + "@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== +"@svgr/babel-plugin-remove-jsx-attribute@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.3.1.tgz#4877995452efc997b36777abe1fde9705ef78e8b" + integrity sha512-dQzyJ4prwjcFd929T43Z8vSYiTlTu8eafV40Z2gO7zy/SV5GT+ogxRJRBIKWomPBOiaVXFg3jY4S5hyEN3IBjQ== + "@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== +"@svgr/babel-plugin-remove-jsx-empty-expression@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.3.1.tgz#2d67a0e92904c9be149a5b22d3a3797ce4d7b514" + integrity sha512-HBOUc1XwSU67fU26V5Sfb8MQsT0HvUyxru7d0oBJ4rA2s4HW3PhyAPC7fV/mdsSGpAvOdd8Wpvkjsr0fWPUO7A== + "@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.3.1.tgz#306f5247139c53af70d1778f2719647c747998ee" + integrity sha512-C12e6aN4BXAolRrI601gPn5MDFCRHO7C4TM8Kks+rDtl8eEq+NN1sak0eAzJu363x3TmHXdZn7+Efd2nr9I5dA== + "@svgr/babel-plugin-svg-dynamic-title@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== +"@svgr/babel-plugin-svg-dynamic-title@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.3.1.tgz#6ce26d34cbc93eb81737ef528528907c292e7aa2" + integrity sha512-6NU55Mmh3M5u2CfCCt6TX29/pPneutrkJnnDCHbKZnjukZmmgUAZLtZ2g6ZoSPdarowaQmAiBRgAHqHmG0vuqA== + "@svgr/babel-plugin-svg-em-dimensions@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== +"@svgr/babel-plugin-svg-em-dimensions@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.3.1.tgz#5ade2a724b290873c30529d1d8cd23523856287a" + integrity sha512-HV1NGHYTTe1vCNKlBgq/gKuCSfaRlKcHIADn7P8w8U3Zvujdw1rmusutghJ1pZJV7pDt3Gt8ws+SVrqHnBO/Qw== + "@svgr/babel-plugin-transform-react-native-svg@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== +"@svgr/babel-plugin-transform-react-native-svg@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.3.1.tgz#d654f509d692c3a09dfb475757a44bd9f6ad7ddf" + integrity sha512-2wZhSHvTolFNeKDAN/ZmIeSz2O9JSw72XD+o2bNp2QAaWqa8KGpn5Yk5WHso6xqfSAiRzAE+GXlsrBO4UP9LLw== + "@svgr/babel-plugin-transform-svg-component@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== +"@svgr/babel-plugin-transform-svg-component@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.3.1.tgz#21a285dbffdce9567c437ebf0d081bf9210807e6" + integrity sha512-cZ8Tr6ZAWNUFfDeCKn/pGi976iWSkS8ijmEYKosP+6ktdZ7lW9HVLHojyusPw3w0j8PI4VBeWAXAmi/2G7owxw== + "@svgr/babel-preset@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" @@ -1897,6 +1950,20 @@ "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" "@svgr/babel-plugin-transform-svg-component" "^5.5.0" +"@svgr/babel-preset@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.3.1.tgz#8bd1ead79637d395e9362b01dd37cfd59702e152" + integrity sha512-tQtWtzuMMQ3opH7je+MpwfuRA1Hf3cKdSgTtAYwOBDfmhabP7rcTfBi3E7V3MuwJNy/Y02/7/RutvwS1W4Qv9g== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.3.1" + "@svgr/babel-plugin-remove-jsx-attribute" "^6.3.1" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.3.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.3.1" + "@svgr/babel-plugin-svg-dynamic-title" "^6.3.1" + "@svgr/babel-plugin-svg-em-dimensions" "^6.3.1" + "@svgr/babel-plugin-transform-react-native-svg" "^6.3.1" + "@svgr/babel-plugin-transform-svg-component" "^6.3.1" + "@svgr/core@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" @@ -1906,6 +1973,15 @@ camelcase "^6.2.0" cosmiconfig "^7.0.0" +"@svgr/core@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.3.1.tgz#752adf49d8d5473b15d76ca741961de093f715bd" + integrity sha512-Sm3/7OdXbQreemf9aO25keerZSbnKMpGEfmH90EyYpj1e8wMD4TuwJIb3THDSgRMWk1kYJfSRulELBy4gVgZUA== + dependencies: + "@svgr/plugin-jsx" "^6.3.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + "@svgr/hast-util-to-babel-ast@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" @@ -1913,6 +1989,14 @@ dependencies: "@babel/types" "^7.12.6" +"@svgr/hast-util-to-babel-ast@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.3.1.tgz#59614e24d2a4a28010e02089213b3448d905769d" + integrity sha512-NgyCbiTQIwe3wHe/VWOUjyxmpUmsrBjdoIxKpXt3Nqc3TN30BpJG22OxBvVzsAh9jqep0w0/h8Ywvdk3D9niNQ== + dependencies: + "@babel/types" "^7.18.4" + entities "^4.3.0" + "@svgr/plugin-jsx@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" @@ -1923,6 +2007,16 @@ "@svgr/hast-util-to-babel-ast" "^5.5.0" svg-parser "^2.0.2" +"@svgr/plugin-jsx@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.3.1.tgz#de7b2de824296b836d6b874d498377896e367f50" + integrity sha512-r9+0mYG3hD4nNtUgsTXWGYJomv/bNd7kC16zvsM70I/bGeoCi/3lhTmYqeN6ChWX317OtQCSZZbH4wq9WwoXbw== + dependencies: + "@babel/core" "^7.18.5" + "@svgr/babel-preset" "^6.3.1" + "@svgr/hast-util-to-babel-ast" "^6.3.1" + svg-parser "^2.0.4" + "@svgr/plugin-svgo@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" @@ -1932,6 +2026,15 @@ deepmerge "^4.2.2" svgo "^1.2.2" +"@svgr/plugin-svgo@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.3.1.tgz#3c1ff2efaed10e5c5d35a6cae7bacaedc18b5d4a" + integrity sha512-yJIjTDKPYqzFVjmsbH5EdIwEsmKxjxdXSGJVLeUgwZOZPAkNQmD1v7LDbOdOKbR44FG8465Du+zWPdbYGnbMbw== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.8.0" + "@svgr/webpack@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" @@ -1946,6 +2049,20 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" +"@svgr/webpack@^6.2.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.3.1.tgz#001d03236ebb03bf47c0a4b92d5423e05095ebe6" + integrity sha512-eODxwIUShLxSMaRjzJtrj9wg89D75JLczvWg9SaB5W+OtVTkiC1vdGd8+t+pf5fTlBOy4RRXAq7x1E3DUl3D0A== + dependencies: + "@babel/core" "^7.18.5" + "@babel/plugin-transform-react-constant-elements" "^7.17.12" + "@babel/preset-env" "^7.18.2" + "@babel/preset-react" "^7.17.12" + "@babel/preset-typescript" "^7.17.12" + "@svgr/core" "^6.3.1" + "@svgr/plugin-jsx" "^6.3.1" + "@svgr/plugin-svgo" "^6.3.1" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -2106,9 +2223,9 @@ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.29" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" - integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== + version "4.17.30" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz#0f2f99617fa8f9696170c46152ccf7500b34ac04" + integrity sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2131,6 +2248,14 @@ dependencies: "@types/node" "*" +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/html-minifier-terser@^6.0.0": version "6.1.0" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" @@ -2180,20 +2305,20 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@types/mime@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.0.tgz#e9a9903894405c6a6551f1774df4e64d9804d69c" + integrity sha512-fccbsHKqFDXClBZTDLA43zl0+TbxyIwyzIzwwhvoJvhNjOErCdeX2xJbURimv2EbSVUGav001PaCJg4mZxMl4w== "@types/node@*": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.6.tgz#0ba49ac517ad69abe7a1508bc9b3a5483df9d5d7" - integrity sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw== + version "18.6.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.6.3.tgz#4e4a95b6fe44014563ceb514b2598b3e623d1c98" + integrity sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg== "@types/node@^16.11.26": - version "16.11.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.45.tgz#155b13a33c665ef2b136f7f245fa525da419e810" - integrity sha512-3rKg/L5x0rofKuuUt5zlXzOnKyIHXmIu5R8A0TuNDMF2062/AOIDBciFIjToLEJ/9F9DzkHNot+BpNsMI1OLdQ== + version "16.11.47" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.47.tgz#efa9e3e0f72e7aa6a138055dace7437a83d9f91c" + integrity sha512-fpP+jk2zJ4VW66+wAMFoBJlx1bxmBKx4DUFf68UHgdGCOuyUTDlLWqsaNPJh7xhNDykyJ9eIzAygilP/4WoN8g== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2201,9 +2326,9 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.1.5": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" - integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.4.tgz#ad899dad022bab6b5a9f0a0fe67c2f7a4a8950ed" + integrity sha512-fOwvpvQYStpb/zHMx0Cauwywu9yLDmzWiiQBC7gJyq5tYLUXFZvDG7VK1B7WBxxjBJNKFOZ0zLoOQn8vmATbhw== "@types/prop-types@*": version "15.7.5" @@ -2266,11 +2391,11 @@ "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + version "1.15.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== dependencies: - "@types/mime" "^1" + "@types/mime" "*" "@types/node" "*" "@types/sockjs@^0.3.33": @@ -2297,6 +2422,11 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + "@types/ws@^8.5.1": version "8.5.3" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" @@ -2324,13 +2454,13 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.5.0": - version "5.30.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.7.tgz#1621dabc1ae4084310e19e9efc80dfdbb97e7493" - integrity sha512-l4L6Do+tfeM2OK0GJsU7TUcM/1oN/N25xHm3Jb4z3OiDU4Lj8dIuxX9LpVMS9riSXQs42D1ieX7b85/r16H9Fw== + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.31.0.tgz#cae1967b1e569e6171bbc6bec2afa4e0c8efccfe" + integrity sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ== dependencies: - "@typescript-eslint/scope-manager" "5.30.7" - "@typescript-eslint/type-utils" "5.30.7" - "@typescript-eslint/utils" "5.30.7" + "@typescript-eslint/scope-manager" "5.31.0" + "@typescript-eslint/type-utils" "5.31.0" + "@typescript-eslint/utils" "5.31.0" debug "^4.3.4" functional-red-black-tree "^1.0.1" ignore "^5.2.0" @@ -2339,75 +2469,75 @@ tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.0.0": - version "5.30.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.30.7.tgz#a815318385b7c81e57ddb5f640895cc08879035f" - integrity sha512-r218ZVL0zFBYzEq8/9K2ZhRgsmKUhm8xd3sWChgvTbmP98kHGuY83IUl64SS9fx9OSBM9vMLdzBfox4eDdm/ZQ== + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.31.0.tgz#f2b23ebeebd31358ce44cf5be7c3411127627b84" + integrity sha512-Yiar0ggNPyOsvrslJBdOo3jc3wjI6NnmWOQBA8WhR54YPbVqTNLuuHC6zxEt8FIgMozerxRlAncwznEjK+cJVA== dependencies: - "@typescript-eslint/utils" "5.30.7" + "@typescript-eslint/utils" "5.31.0" "@typescript-eslint/parser@^5.5.0": - version "5.30.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.7.tgz#99d09729392aec9e64b1de45cd63cb81a4ddd980" - integrity sha512-Rg5xwznHWWSy7v2o0cdho6n+xLhK2gntImp0rJroVVFkcYFYQ8C8UJTSuTw/3CnExBmPjycjmUJkxVmjXsld6A== + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.31.0.tgz#7f42d7dcc68a0a6d80a0f3d9a65063aee7bb8d2c" + integrity sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw== dependencies: - "@typescript-eslint/scope-manager" "5.30.7" - "@typescript-eslint/types" "5.30.7" - "@typescript-eslint/typescript-estree" "5.30.7" + "@typescript-eslint/scope-manager" "5.31.0" + "@typescript-eslint/types" "5.31.0" + "@typescript-eslint/typescript-estree" "5.31.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.30.7": - version "5.30.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz#8269a931ef1e5ae68b5eb80743cc515c4ffe3dd7" - integrity sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw== +"@typescript-eslint/scope-manager@5.31.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.31.0.tgz#f47a794ba84d9b818ab7f8f44fff55a61016c606" + integrity sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg== dependencies: - "@typescript-eslint/types" "5.30.7" - "@typescript-eslint/visitor-keys" "5.30.7" + "@typescript-eslint/types" "5.31.0" + "@typescript-eslint/visitor-keys" "5.31.0" -"@typescript-eslint/type-utils@5.30.7": - version "5.30.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.30.7.tgz#5693dc3db6f313f302764282d614cfdbc8a9fcfd" - integrity sha512-nD5qAE2aJX/YLyKMvOU5jvJyku4QN5XBVsoTynFrjQZaDgDV6i7QHFiYCx10wvn7hFvfuqIRNBtsgaLe0DbWhw== +"@typescript-eslint/type-utils@5.31.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.31.0.tgz#70a0b7201360b5adbddb0c36080495aa08f6f3d9" + integrity sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w== dependencies: - "@typescript-eslint/utils" "5.30.7" + "@typescript-eslint/utils" "5.31.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.30.7": - version "5.30.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.7.tgz#18331487cc92d0f1fb1a6f580c8ec832528079d0" - integrity sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg== +"@typescript-eslint/types@5.31.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.31.0.tgz#7aa389122b64b18e473c1672fb3b8310e5f07a9a" + integrity sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g== -"@typescript-eslint/typescript-estree@5.30.7": - version "5.30.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz#05da9f1b281985bfedcf62349847f8d168eecc07" - integrity sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA== +"@typescript-eslint/typescript-estree@5.31.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.31.0.tgz#eb92970c9d6e3946690d50c346fb9b1d745ee882" + integrity sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw== dependencies: - "@typescript-eslint/types" "5.30.7" - "@typescript-eslint/visitor-keys" "5.30.7" + "@typescript-eslint/types" "5.31.0" + "@typescript-eslint/visitor-keys" "5.31.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.30.7", "@typescript-eslint/utils@^5.13.0": - version "5.30.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.7.tgz#7135be070349e9f7caa262b0ca59dc96123351bb" - integrity sha512-Z3pHdbFw+ftZiGUnm1GZhkJgVqsDL5CYW2yj+TB2mfXDFOMqtbzQi2dNJIyPqPbx9mv2kUxS1gU+r2gKlKi1rQ== +"@typescript-eslint/utils@5.31.0", "@typescript-eslint/utils@^5.13.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.31.0.tgz#e146fa00dca948bfe547d665b2138a2dc1b79acd" + integrity sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.30.7" - "@typescript-eslint/types" "5.30.7" - "@typescript-eslint/typescript-estree" "5.30.7" + "@typescript-eslint/scope-manager" "5.31.0" + "@typescript-eslint/types" "5.31.0" + "@typescript-eslint/typescript-estree" "5.31.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.30.7": - version "5.30.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz#c093abae75b4fd822bfbad9fc337f38a7a14909a" - integrity sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw== +"@typescript-eslint/visitor-keys@5.31.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.31.0.tgz#b0eca264df01ce85dceb76aebff3784629258f54" + integrity sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg== dependencies: - "@typescript-eslint/types" "5.30.7" + "@typescript-eslint/types" "5.31.0" eslint-visitor-keys "^3.3.0" "@use-gesture/core@10.2.17": @@ -2610,7 +2740,7 @@ acorn@^7.0.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1: +acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: version "8.8.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== @@ -2851,12 +2981,12 @@ attr-accept@^2.2.2: integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== autoprefixer@^10.4.7: - version "10.4.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" - integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== + version "10.4.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.8.tgz#92c7a0199e1cfb2ad5d9427bd585a3d75895b9e5" + integrity sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw== dependencies: - browserslist "^4.20.3" - caniuse-lite "^1.0.30001335" + browserslist "^4.21.3" + caniuse-lite "^1.0.30001373" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -2946,20 +3076,20 @@ babel-plugin-named-asset-import@^0.3.8: integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== babel-plugin-polyfill-corejs2@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d" + integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q== dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.2" semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" - integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" + integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.3.2" core-js-compat "^3.21.0" babel-plugin-polyfill-regenerator@^0.3.1: @@ -3122,15 +3252,15 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3, browserslist@^4.21.0, browserslist@^4.21.2: - version "4.21.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf" - integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA== +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3, browserslist@^4.21.0, browserslist@^4.21.3: + version "4.21.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" + integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== dependencies: - caniuse-lite "^1.0.30001366" - electron-to-chromium "^1.4.188" + caniuse-lite "^1.0.30001370" + electron-to-chromium "^1.4.202" node-releases "^2.0.6" - update-browserslist-db "^1.0.4" + update-browserslist-db "^1.0.5" bser@2.1.1: version "2.1.1" @@ -3230,10 +3360,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001335, caniuse-lite@^1.0.30001366: - version "1.0.30001368" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001368.tgz#c5c06381c6051cd863c45021475434e81936f713" - integrity sha512-wgfRYa9DenEomLG/SdWgQxpIyvdtH3NW8Vq+tB6AwR9e56iOIcu1im5F/wNdDf04XlKHXqIx4N8Jo0PemeBenQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373: + version "1.0.30001373" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz#2dc3bc3bfcb5d5a929bec11300883040d7b4b4be" + integrity sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -3314,6 +3444,11 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +classnames@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + clean-css@^5.2.2: version "5.3.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.1.tgz#d0610b0b90d125196a2894d35366f734e5d7aa32" @@ -3485,7 +3620,7 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" -confusing-browser-globals@^1.0.11: +confusing-browser-globals@^1.0.10, confusing-browser-globals@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== @@ -3525,22 +3660,22 @@ cookie@0.5.0: integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== core-js-compat@^3.21.0, core-js-compat@^3.22.1: - version "3.23.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.5.tgz#11edce2f1c4f69a96d30ce77c805ce118909cd5b" - integrity sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg== + version "3.24.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.24.1.tgz#d1af84a17e18dfdd401ee39da9996f9a7ba887de" + integrity sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw== dependencies: - browserslist "^4.21.2" + browserslist "^4.21.3" semver "7.0.0" core-js-pure@^3.20.2, core-js-pure@^3.8.1: - version "3.23.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.23.5.tgz#23daaa9af9230e50f10b0fa4b8e6b87402be4c33" - integrity sha512-8t78LdpKSuCq4pJYCYk8hl7XEkAX+BP16yRIwL3AanTksxuEf7CM83vRyctmiEL8NDZ3jpUcv56fk9/zG3aIuw== + version "3.24.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.24.1.tgz#8839dde5da545521bf282feb7dc6d0b425f39fd3" + integrity sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg== core-js@^3.19.2: - version "3.23.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.23.5.tgz#1f82b0de5eece800827a2f59d597509c67650475" - integrity sha512-7Vh11tujtAZy82da4duVreQysIoO2EvVrur7y6IzZkH1IHPSekuDi8Vuw1+YKjkbfWLRD7Nc9ICQ/sIUDutcyg== + version "3.24.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.24.1.tgz#cf7724d41724154010a6576b7b57d94c5d66e64f" + integrity sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg== core-util-is@~1.0.0: version "1.0.3" @@ -3558,7 +3693,7 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -cosmiconfig@^7.0.0: +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== @@ -3815,9 +3950,9 @@ data-urls@^2.0.0: whatwg-url "^8.0.0" date-fns@^2.16.1: - version "2.28.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" - integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + version "2.29.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.1.tgz#9667c2615525e552b5135a3116b95b1961456e60" + integrity sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw== debug@2.6.9, debug@^2.2.0, debug@^2.6.0, debug@^2.6.9: version "2.6.9" @@ -4122,15 +4257,15 @@ electron-is-dev@^2.0.0: resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-2.0.0.tgz#833487a069b8dad21425c67a19847d9064ab19bd" integrity sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA== -electron-to-chromium@^1.4.188: - version "1.4.197" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.197.tgz#172054244cca16320ebc19459bd03d8a9018ff73" - integrity sha512-7EZCIDDraA2NUaHewLaAh6T63cZzgBmgDx/iiaeZ/pjSs36bOFEJ3hLIrn1TKCFhV0PEZZKu6qFPrxa/LGAzLg== +electron-to-chromium@^1.4.202: + version "1.4.206" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz#580ff85b54d7ec0c05f20b1e37ea0becdd7b0ee4" + integrity sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA== electron@^19.0.4: - version "19.0.9" - resolved "https://registry.yarnpkg.com/electron/-/electron-19.0.9.tgz#e95bc18e14aac0af1290fcc7045001ef5ad96a64" - integrity sha512-ooEwrv8Y7NSzdhKcl6kPCYecnzcg5nFWuS5ryG+VFH3MMBR8zXh9nW2wLsZrBz6OGUxXrcc5BKBC7dA8C6RhGQ== + version "19.0.10" + resolved "https://registry.yarnpkg.com/electron/-/electron-19.0.10.tgz#4d2f03f307fbb70a295ff419112130b75661eda9" + integrity sha512-EiWtPWdD7CzkRkp1cw7t0N9W2qhI5XZOudHX7daOh5wI076nsdV2dtlAf/XyTHhPNoKR5qhTWrSnYL9PY6D1vg== dependencies: "@electron/get" "^1.14.1" "@types/node" "^16.11.26" @@ -4189,7 +4324,7 @@ engine.io-parser@~5.0.3: resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== -enhanced-resolve@^5.9.3: +enhanced-resolve@^5.10.0: version "5.10.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== @@ -4202,6 +4337,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.1.tgz#c34062a94c865c322f9d67b4384e4169bcede6a4" + integrity sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -4344,6 +4484,30 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb@19.0.4: + version "19.0.4" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz#84d4c3490ad70a0ffa571138ebcdea6ab085fdc3" + integrity sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew== + dependencies: + eslint-config-airbnb-base "^15.0.0" + object.assign "^4.1.2" + object.entries "^1.1.5" + +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + eslint-config-react-app@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" @@ -4438,7 +4602,7 @@ eslint-plugin-react-hooks@^4.3.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@^7.27.1: +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.28.0: version "7.30.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz#2be4ab23ce09b5949c6631413ba64b2810fd3e22" integrity sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg== @@ -4459,9 +4623,9 @@ eslint-plugin-react@^7.27.1: string.prototype.matchall "^4.0.7" eslint-plugin-testing-library@^5.0.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.1.tgz#6fe602f9082a421b471bbae8aed692e26fe981b3" - integrity sha512-plLEkkbAKBjPxsLj7x4jNapcHAg2ernkQlKKrN2I8NrQwPISZHyCUNvg5Hv3EDqOQReToQb5bnqXYbkijJPE/g== + version "5.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.6.0.tgz#91e810ecb838f86decc9b5202876c87e42d73ea7" + integrity sha512-y63TRzPhGCMNsnUwMGJU1MFWc/3GvYw+nzobp9QiyNTTKsgAt5RKAOT1I34+XqVBpX1lC8bScoOjCkP7iRv0Mw== dependencies: "@typescript-eslint/utils" "^5.13.0" @@ -4509,13 +4673,14 @@ eslint-webpack-plugin@^3.1.1: normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@^8.3.0: - version "8.20.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.20.0.tgz#048ac56aa18529967da8354a478be4ec0a2bc81b" - integrity sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA== +eslint@^8.2.0, eslint@^8.3.0: + version "8.21.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.21.0.tgz#1940a68d7e0573cef6f50037addee295ff9be9ef" + integrity sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA== dependencies: "@eslint/eslintrc" "^1.3.0" - "@humanwhocodes/config-array" "^0.9.2" + "@humanwhocodes/config-array" "^0.10.4" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -4525,14 +4690,17 @@ eslint@^8.3.0: eslint-scope "^7.1.1" eslint-utils "^3.0.0" eslint-visitor-keys "^3.3.0" - espree "^9.3.2" + espree "^9.3.3" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" + find-up "^5.0.0" functional-red-black-tree "^1.0.1" glob-parent "^6.0.1" globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -4550,12 +4718,12 @@ eslint@^8.3.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^9.3.2: - version "9.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" - integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== +espree@^9.3.2, espree@^9.3.3: + version "9.3.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d" + integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== dependencies: - acorn "^8.7.1" + acorn "^8.8.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" @@ -5181,6 +5349,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -5244,6 +5417,13 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + hoopy@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" @@ -5407,10 +5587,10 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -idb@^6.1.4: - version "6.1.5" - resolved "https://registry.yarnpkg.com/idb/-/idb-6.1.5.tgz#dbc53e7adf1ac7c59f9b2bf56e00b4ea4fce8c7b" - integrity sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw== +idb@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.0.2.tgz#7a067e20dd16539938e456814b7d714ba8db3892" + integrity sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg== identity-obj-proxy@^3.0.0: version "3.0.0" @@ -6496,7 +6676,7 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lilconfig@^2.0.3, lilconfig@^2.0.5: +lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== @@ -7842,6 +8022,11 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== +prettier@2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -8059,7 +8244,7 @@ react-error-overlay@^6.0.11: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== -react-is@^16.13.1: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -8074,6 +8259,18 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +react-redux@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.0.2.tgz#bc2a304bb21e79c6808e3e47c50fe1caf62f7aad" + integrity sha512-nBwiscMw3NoP59NFCXFf02f8xdo+vSHT/uZ1ldDwF7XaTpzm+Phk97VT4urYBl5TYAPNVaFm12UHAEyzkpNzRA== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/use-sync-external-store" "^0.0.3" + hoist-non-react-statics "^3.3.2" + react-is "^18.0.0" + use-sync-external-store "^1.0.0" + react-refresh@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" @@ -8192,6 +8389,18 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redux-thunk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.1.tgz#0dd8042cf47868f4b29699941de03c9301a75714" + integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q== + +redux@^4.1.2, redux@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" + integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== + dependencies: + "@babel/runtime" "^7.9.2" + regenerate-unicode-properties@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" @@ -8290,6 +8499,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +reselect@^4.1.5: + version "4.1.6" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.6.tgz#19ca2d3d0b35373a74dc1c98692cdaffb6602656" + integrity sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -8388,9 +8602,9 @@ rollup-plugin-terser@^7.0.0: terser "^5.0.0" rollup@^2.43.1: - version "2.77.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.0.tgz#749eaa5ac09b6baa52acc076bc46613eddfd53f4" - integrity sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g== + version "2.77.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.2.tgz#6b6075c55f9cc2040a5912e6e062151e42e2c4e3" + integrity sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g== optionalDependencies: fsevents "~2.3.2" @@ -8996,7 +9210,7 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svg-parser@^2.0.2: +svg-parser@^2.0.2, svg-parser@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== @@ -9020,7 +9234,7 @@ svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" -svgo@^2.7.0: +svgo@^2.7.0, svgo@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== @@ -9039,9 +9253,9 @@ symbol-tree@^3.2.4: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tailwindcss@^3.0.2: - version "3.1.6" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.1.6.tgz#bcb719357776c39e6376a8d84e9834b2b19a49f1" - integrity sha512-7skAOY56erZAFQssT1xkpk+kWt2NrO45kORlxFPXUt3CiGsVPhH1smuH5XoDH6sGPXLyBv+zgCKA2HWBsgCytg== + version "3.1.7" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.1.7.tgz#ce99425f30a74e01457a2e6a724463b0df3159ac" + integrity sha512-r7mgumZ3k0InfVPpGWcX8X/Ut4xBfv+1O/+C73ar/m01LxGVzWvPxF/w6xIUPEztrCoz7axfx0SMdh8FH8ZvRQ== dependencies: arg "^5.0.2" chokidar "^3.5.3" @@ -9052,7 +9266,7 @@ tailwindcss@^3.0.2: fast-glob "^3.2.11" glob-parent "^6.0.2" is-glob "^4.0.3" - lilconfig "^2.0.5" + lilconfig "^2.0.6" normalize-path "^3.0.0" object-hash "^3.0.0" picocolors "^1.0.0" @@ -9306,9 +9520,9 @@ type@^1.0.1: integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" - integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== + version "2.6.1" + resolved "https://registry.yarnpkg.com/type/-/type-2.6.1.tgz#808f389ec777205cc3cd97c1c88ec1a913105aae" + integrity sha512-OvgH5rB0XM+iDZGQ1Eg/o7IZn0XYJFVrN/9FQ4OWIYILyJJgVP2s1hLTOFn6UOZoDUI/HctGa0PFlE2n2HW3NQ== typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -9392,7 +9606,7 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.4: +update-browserslist-db@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== @@ -9414,6 +9628,11 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +use-sync-external-store@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + utf-8-validate@^5.0.2: version "5.0.9" resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" @@ -9507,7 +9726,7 @@ walker@^1.0.7: dependencies: makeerror "1.0.12" -watchpack@^2.3.1: +watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== @@ -9613,20 +9832,20 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.64.4: - version "5.73.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" - integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== + version "5.74.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" + integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" + acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" + enhanced-resolve "^5.10.0" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" @@ -9639,7 +9858,7 @@ webpack@^5.64.4: schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + watchpack "^2.4.0" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -9733,25 +9952,25 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -workbox-background-sync@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz#7c66c1836aeca6f3762dc48d17a1852a33b3168c" - integrity sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw== +workbox-background-sync@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9" + integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== dependencies: - idb "^6.1.4" - workbox-core "6.5.3" + idb "^7.0.1" + workbox-core "6.5.4" -workbox-broadcast-update@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz#fc2ad79cf507e22950cda9baf1e9a0ccc43f31bc" - integrity sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg== +workbox-broadcast-update@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66" + integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-build@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.3.tgz#38e3f286d63d2745bff4d1478bb3a6ab5c8b1170" - integrity sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w== +workbox-build@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389" + integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== dependencies: "@apideck/better-ajv-errors" "^0.3.1" "@babel/core" "^7.11.1" @@ -9775,132 +9994,132 @@ workbox-build@6.5.3: strip-comments "^2.0.1" tempy "^0.6.0" upath "^1.2.0" - workbox-background-sync "6.5.3" - workbox-broadcast-update "6.5.3" - workbox-cacheable-response "6.5.3" - workbox-core "6.5.3" - workbox-expiration "6.5.3" - workbox-google-analytics "6.5.3" - workbox-navigation-preload "6.5.3" - workbox-precaching "6.5.3" - workbox-range-requests "6.5.3" - workbox-recipes "6.5.3" - workbox-routing "6.5.3" - workbox-strategies "6.5.3" - workbox-streams "6.5.3" - workbox-sw "6.5.3" - workbox-window "6.5.3" + workbox-background-sync "6.5.4" + workbox-broadcast-update "6.5.4" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-google-analytics "6.5.4" + workbox-navigation-preload "6.5.4" + workbox-precaching "6.5.4" + workbox-range-requests "6.5.4" + workbox-recipes "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + workbox-streams "6.5.4" + workbox-sw "6.5.4" + workbox-window "6.5.4" -workbox-cacheable-response@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz#b1f8c2bc599a7be8f7e3c262535629c558738e47" - integrity sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ== +workbox-cacheable-response@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137" + integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-core@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.3.tgz#bca038a9ef0d7a634a6db2a60f45313ed22ac249" - integrity sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q== +workbox-core@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba" + integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== -workbox-expiration@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.3.tgz#efc0811f371a2ede1052b9de1c4f072b71d50503" - integrity sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw== +workbox-expiration@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539" + integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== dependencies: - idb "^6.1.4" - workbox-core "6.5.3" + idb "^7.0.1" + workbox-core "6.5.4" -workbox-google-analytics@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz#cc8c3a61f449131660a4ed2f5362d9a3599b18fe" - integrity sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw== +workbox-google-analytics@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d" + integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== dependencies: - workbox-background-sync "6.5.3" - workbox-core "6.5.3" - workbox-routing "6.5.3" - workbox-strategies "6.5.3" + workbox-background-sync "6.5.4" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -workbox-navigation-preload@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz#81b74f598b11aa07e2cf1c21af7a826a4f0f70b3" - integrity sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg== +workbox-navigation-preload@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212" + integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-precaching@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.3.tgz#c870312b2ef901d790ab9e48da084e776c62af47" - integrity sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ== +workbox-precaching@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72" + integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== dependencies: - workbox-core "6.5.3" - workbox-routing "6.5.3" - workbox-strategies "6.5.3" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -workbox-range-requests@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz#e624ac82ff266a5e4f236d055797def07949d941" - integrity sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA== +workbox-range-requests@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399" + integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-recipes@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.3.tgz#15beac9d8ae7a3a1c100218094a824b4dd3fd59a" - integrity sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig== +workbox-recipes@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb" + integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== dependencies: - workbox-cacheable-response "6.5.3" - workbox-core "6.5.3" - workbox-expiration "6.5.3" - workbox-precaching "6.5.3" - workbox-routing "6.5.3" - workbox-strategies "6.5.3" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-precaching "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -workbox-routing@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.3.tgz#a0a699d8cc90b5692bd3df24679acbbda3913777" - integrity sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg== +workbox-routing@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da" + integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-strategies@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.3.tgz#4bea9a48fee16cf43766e0d8138296773c8a9783" - integrity sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w== +workbox-strategies@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d" + integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-streams@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.3.tgz#b6860290031caa7d0e46ad7142315c94359c780b" - integrity sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w== +workbox-streams@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69" + integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== dependencies: - workbox-core "6.5.3" - workbox-routing "6.5.3" + workbox-core "6.5.4" + workbox-routing "6.5.4" -workbox-sw@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.3.tgz#cd2f0c086f4496acd25774ed02c48504189bebdd" - integrity sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A== +workbox-sw@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736" + integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== workbox-webpack-plugin@^6.4.1: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz#c37bb323be4952311565c07db51054fe59c87d73" - integrity sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA== + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz#baf2d3f4b8f435f3469887cf4fba2b7fac3d0fd7" + integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== dependencies: fast-json-stable-stringify "^2.1.0" pretty-bytes "^5.4.1" upath "^1.2.0" webpack-sources "^1.4.3" - workbox-build "6.5.3" + workbox-build "6.5.4" -workbox-window@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.3.tgz#4ade70056cb73477ef1cd8fea7cfd0ecbd825c7f" - integrity sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw== +workbox-window@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91" + integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== dependencies: "@types/trusted-types" "^2.0.2" - workbox-core "6.5.3" + workbox-core "6.5.4" wrap-ansi@^7.0.0: version "7.0.0" diff --git a/nerfactory/viewer/server/README.md b/nerfactory/viewer/server/README.md new file mode 100644 index 000000000..3554ebee7 --- /dev/null +++ b/nerfactory/viewer/server/README.md @@ -0,0 +1,20 @@ +# Python Kernel and Client Viewer App communication + +> The purpose of this document is to explain how to communicate from Python with the Client Viewer app. We will eventually move this into the read the docs. + +- Python Kernel (nerfactory code) +- Bridge Server +- Client Viewer App + +We have two types of components that we want to keep state updated in both locations. + +- Widgets + - The widgets are used to keep track of the +- SceneNode + - The scene nodes are used to represent the three.js objects. The properties relevant to these objects are the following: `"object", "transform", "properties"`. + +# Checklist + +- [ ] Currently using request-reply (REQ, REP with zmq). I.e., Python Kernel -> Bridge Server <-> Client Viewer App. We want a way to update the Python Kernel when the Bridge Server is updated. This requries some form of binding with callbacks. When the Bridge Server is updated, we want to update the binded Python variable. We can take inspiration from [ipywidgets](https://ipywidgets.readthedocs.io/en/stable/examples/Widget%20Basics.html). + +- [ ] \ No newline at end of file diff --git a/nerfactory/viewer/server/cameras.py b/nerfactory/viewer/server/cameras.py deleted file mode 100644 index 026592def..000000000 --- a/nerfactory/viewer/server/cameras.py +++ /dev/null @@ -1,137 +0,0 @@ -# Copyright 2022 The Plenoptix Team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Logic to render Camera objects in the Viewer""" - -from typing import List, Optional, Tuple - -import cv2 -import numpy as np - -from . import geometry as g -from .geometry import LineBasicMaterial, LineSegments, PointsGeometry - - -class ImagePlane(g.Mesh): - """Returns an image rendered within a specified plane - - Args: - image: image to be displayed - height: height of image. Defaults to 1. - width: width of image. Defaults to 1. - """ - - def __init__(self, image: np.ndarray, height: int = 1, width: int = 1): - # TODO(ethan): decide how to deal with the height and width - self.image = image - geometry = g.PlaneGeometry([width, height]) - material = g.MeshBasicMaterial( - map=g.ImageTexture(image=g.PngImage(cv2.imencode(".png", self.image[:, :, ::-1])[1].tobytes())) - ) - super().__init__(geometry, material) - - -def get_camera_wireframe(scale: float = 0.3, f: int = 4, w: int = 1.5, h: int = 2) -> np.ndarray: - """Returns a wireframe of a 3D line-plot of a camera symbol. - At https://github.com/hangg7/mvs_visual/blob/275d382a824733a3187a8e3147be184dd6f14795/mvs_visual.py#L54. - - Args: - scale: scale of rendering - f: this is the focal length - w: width - h: height - - Returns: - np.ndarray: stack of points corresponding to wireframe of camera - """ - ul = np.array([-w, h, -f]) - ur = np.array([w, h, -f]) - ll = np.array([-w, -h, -f]) - lr = np.array([w, -h, -f]) - C = np.zeros(3) - camera_points = [C, ul, C, ur, C, ll, C, lr, C, ul, ur, ul, lr, ur, lr, ll, ll, ul] - lines = np.stack(camera_points) * scale - return lines - - -def get_plane_pts( - focal_length: Tuple[float, float] = (1.0, 1.0), - image_size: Tuple[int, int] = (10, 10), - camera_scale: int = 1, - scale_factor: float = 1 / 4, -) -> np.ndarray: - """Returns points on the image plane given camera intrinsics - - Args: - focal_length: focal length of camera. Defaults to (1.0, 1.0). - image_size: height and width of image. Defaults to (10, 10). - camera_scale: camera intrinsics scale. Defaults to 1. - scale_factor: image scale. Defaults to 1/4. - """ - Z = -(focal_length[0] + focal_length[1]) / 2 * camera_scale - X0, Y0, X1, Y1 = ( - -image_size[0] / 2 * camera_scale, - image_size[1] / 2 * camera_scale, - image_size[0] / 2 * camera_scale, - -image_size[1] / 2 * camera_scale, - ) - - # scale image to plane such that it can go outside of the x0x1 range. - W, H = X1 - X0, Y0 - Y1 - w, h = image_size - ratio = min(w / W, h / H) - oW, oH = w / ratio, h / ratio # pylint: disable=invalid-name - - X0, Y0, X1, Y1 = -oW / 2, oH / 2, oW / 2, -oH / 2 - wsteps, hsteps = int(w * scale_factor), int(h * scale_factor) - Ys, Xs = np.meshgrid( - np.linspace(Y0, Y1, num=hsteps), - np.linspace(X0, X1, num=wsteps), - indexing="ij", - ) - Zs = np.ones_like(Xs) * Z - plane_pts = np.stack([Xs, Ys, Zs], axis=-1) - return plane_pts - - -def frustum( - scale: float = 1.0, - color: Optional[List[float]] = None, - focal_length: int = 4, - width: float = 1.5, - height: int = 2, -) -> LineSegments: - """Draws the camera frustums, returning line segments representing the frustums - - Args: - scale: scale of the rendering. Defaults to 1.0. - color: color of lines. Defaults to [0, 0, 0]. - focal_length: focal length of camera. Defaults to 4. - width: width of wireframe. Defaults to 1.5. - height: height of wireframe. Defaults to 2. - """ - # color - color of lines using R, G, B. default is black - if color is None: - color = [0, 0, 0] - - # TODO(ethan): make the scale adjustable depending on the camera size - # print("linewidth") - camera_wireframe_lines = get_camera_wireframe(scale=scale, f=focal_length, w=width / 2.0, h=height / 2.0) - N = len(camera_wireframe_lines) - colors = np.array([color for _ in range(N)]) - line_segments = LineSegments( - PointsGeometry(position=camera_wireframe_lines.astype(np.float32).T, color=colors.astype(np.float32).T), - LineBasicMaterial(vertexColors=True), - ) - return line_segments diff --git a/nerfactory/viewer/server/commands.py b/nerfactory/viewer/server/commands.py deleted file mode 100644 index fb71748f9..000000000 --- a/nerfactory/viewer/server/commands.py +++ /dev/null @@ -1,144 +0,0 @@ -# Copyright 2022 The Plenoptix Team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Commands callable from WebSocket Server bridge -""" - - -from dataclasses import dataclass -from typing import Any, Dict, List - -import numpy as np - -from nerfactory.viewer.server.geometry import ( - Mesh, - MeshPhongMaterial, - Object, - OrthographicCamera, - PerspectiveCamera, - Points, - PointsMaterial, -) -from nerfactory.viewer.server.path import Path - - -class SetObject: # pylint: disable=too-few-public-methods - """Set object command class: Instantiates and sets the object according to object type - - Args: - geometry_or_object: object to be set - material: material to be set. Defaults to None. - path: path of object in tree. Defaults to None. - - Raises: - ValueError: error if material is not set for object - """ - - __slots__ = ["object", "path"] - - def __init__(self, geometry_or_object, material=None, path=None): - if isinstance(geometry_or_object, Object): - if material is not None: - raise ValueError("Please supply either an Object OR a Geometry and a Material") - self.object = geometry_or_object - elif isinstance(geometry_or_object, (OrthographicCamera, PerspectiveCamera)): - self.object = geometry_or_object - else: - if material is None: - material = MeshPhongMaterial() - if isinstance(material, PointsMaterial): - self.object = Points(geometry_or_object, material) - else: - self.object = Mesh(geometry_or_object, material) - if path is not None: - self.path = path - else: - self.path = Path() - - def lower(self) -> Dict[str, Any]: - """creates properly formatted json""" - return {"type": "set_object", "object": self.object.lower(), "path": self.path.lower()} - - -@dataclass -class GetObject: - """Get object command class - - Args: - path: path of object in tree. Defaults to None. - """ - - __slots__ = ["path"] - - path: str - - def lower(self) -> Dict[str, Any]: - """creates properly formatted json with object""" - return {"type": "get_object", "path": self.path.lower()} - - -@dataclass -class SetTransform: - """Set transform command class""" - - __slots__ = ["matrix", "path"] - - matrix: np.ndarray - path: str - - def lower(self) -> Dict[str, Any]: - """creates properly formatted json with transform matrix""" - return {"type": "set_transform", "path": self.path.lower(), "matrix": list(self.matrix.T.flatten())} - - -@dataclass -class SetOutputOptions: - """Set output options command class""" - - __slots__ = ["output_options", "path"] - - output_options: List[str] - path: str - - def lower(self) -> Dict[str, Any]: - """creates properly formatted json with list of possible output options""" - return {"type": "set_output_options", "path": self.path.lower(), "output_options": list(self.output_options)} - - -@dataclass -class Delete: - """Delete current state command class""" - - __slots__ = ["path"] - - path: str - - def lower(self) -> Dict[str, Any]: - """creates properly formatted json updating tree""" - return {"type": "delete", "path": self.path.lower()} - - -@dataclass -class SetProperty: - """Set property command class""" - - __slots__ = ["path", "key", "value"] - - key: str - value: list - path: str - - def lower(self) -> Dict[str, Any]: - """creates properly formatted json setting property""" - return {"type": "set_property", "path": self.path.lower(), "property": self.key.lower(), "value": self.value} diff --git a/nerfactory/viewer/server/geometry.py b/nerfactory/viewer/server/geometry.py deleted file mode 100644 index a0a822f74..000000000 --- a/nerfactory/viewer/server/geometry.py +++ /dev/null @@ -1,914 +0,0 @@ -# Copyright 2022 The Plenoptix Team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Geometry to render meshes, textures, etc. -""" - - -import base64 -import sys -import uuid -from typing import Any, BinaryIO, Dict, Iterable, List, Optional, Tuple - -import numpy as np -import umsgpack - -UNICODE = str -from io import BytesIO, StringIO - - -class SceneElement: - """Base class for objects in the scene""" - - def __init__(self): - self.uuid = UNICODE(uuid.uuid1()) - - def intrinsic_transform(self): # pylint: disable=no-self-use - """function for intrinsic transformation""" - return np.identity(4) - - def lower(self, object_data: Dict[str, Any]) -> Dict[str, Any]: # pylint: disable=no-self-use - """Formatting contents of object dictionary, returns a dictionary of formatted content - - Args: - object_data: object being sent via websocket - """ - return object_data - - -class ReferenceSceneElement(SceneElement): - """Generic scene element class""" - - field = None - - def lower_in_object(self, object_data: Dict[str, Any]) -> str: - """formatting contents of object dictionary, returns a dictionary of formatted content - - Args: - object_data: object being sent via websocket - """ - object_data.setdefault(self.field, []).append(self.lower(object_data)) - return self.uuid - - -class Geometry(ReferenceSceneElement): - """Geometry class""" - - field = "geometries" - - -class Material(ReferenceSceneElement): - """Material class""" - - field = "materials" - - -class Texture(ReferenceSceneElement): - """Texture class""" - - field = "textures" - - -class Image(ReferenceSceneElement): - """Image class""" - - field = "images" - - -class Box(Geometry): - """Box object - - Args: - lengths: length of side of box - """ - - def __init__(self, lengths: List[float]): - super().__init__() - self.lengths = lengths - - def lower(self, object_data): - return { - "uuid": self.uuid, - "type": "BoxGeometry", - "width": self.lengths[0], - "height": self.lengths[1], - "depth": self.lengths[2], - } - - -class Sphere(Geometry): - """Sphere object - - Args: - radius: radius of sphere - """ - - def __init__(self, radius: float): - super().__init__() - self.radius = radius - - def lower(self, object_data): - return { - "uuid": self.uuid, - "type": "SphereGeometry", - "radius": self.radius, - "widthSegments": 20, - "heightSegments": 20, - } - - -class Ellipsoid(Sphere): - """ - An Ellipsoid is treated as a Sphere of unit radius, with an affine - transformation applied to distort it into the ellipsoidal shape - - Args: - radii: the radii of epllipsoid - """ - - def __init__(self, radii: List[float]): - super().__init__(1.0) - self.radii = radii - - def intrinsic_transform(self): - return np.diag(np.hstack((self.radii, 1.0))) - - -class PlaneGeometry(Geometry): - """Plane Class - - Args: - lengths: the height and width of plane - """ - - def __init__(self, lengths: List[float]): - super().__init__() - self.lengths = lengths - - def lower(self, object_data): - return {"uuid": self.uuid, "type": "PlaneGeometry", "width": self.lengths[0], "height": self.lengths[1]} - - -class Cylinder(Geometry): - """A cylinder of the given height and radius. By Three.js convention, the axis of - rotational symmetry is aligned with the y-axis. - - Args: - height: height of cylinder - radius: radius for both top and bottom if top/bottom not given. Defaults to 1.0. - radius_top: radius of top. Defaults to None. - radius_bottom: radius of bottom. Defaults to None. - """ - - def __init__( - self, - height: int, - radius: float = 1.0, - radius_top: Optional[float] = None, - radius_bottom: Optional[float] = None, - ): - super().__init__() - if radius_top is not None and radius_bottom is not None: - self.radius_top = radius_top - self.radius_bottom = radius_bottom - else: - self.radius_top = radius - self.radius_bottom = radius - self.height = height - self.radial_segments = 50 - - def lower(self, object_data): - return { - "uuid": self.uuid, - "type": "CylinderGeometry", - "radiusTop": self.radius_top, - "radiusBottom": self.radius_bottom, - "height": self.height, - "radialSegments": self.radial_segments, - } - - -class GenericMaterial(Material): - """Generic Material base class - - Args: - color: color of material. Defaults to 0xFFFFFF. - reflectivity: reflectivity index. Defaults to 0.5. - map: texture map of object. Defaults to None. - transparent: transparency value. Defaults to None. - opacity: opacity value. Defaults to 1.0. - linewidth: width of lines. Defaults to 1.0. - wireframe: whether to render wireframe around object. Defaults to False. - wireframe_linewidth: width of wireframe lines. Defaults to 1.0. - vertex_colors: whether to render vertex colors. Defaults to False. - """ - - def __init__( - self, - color: int = 0xFFFFFF, - reflectivity: float = 0.5, - map: Optional[Texture] = None, # pylint: disable=redefined-builtin - side: int = 2, - transparent: Optional[bool] = None, - opacity: float = 1.0, - linewidth: float = 1.0, - wireframe: bool = False, - wireframe_linewidth: float = 1.0, - vertex_colors: bool = False, - **kwargs, - ): - super().__init__() - self.color = color - self.reflectivity = reflectivity - self.map = map - self.side = side - self.transparent = transparent - self.opacity = opacity - self.linewidth = linewidth - self.wireframe = wireframe - self.wireframe_linewidth = wireframe_linewidth - self.vertex_colors = vertex_colors - self.properties = kwargs - self._type = self._type - - def lower(self, object_data): - # Three.js allows a material to have an opacity which is != 1, - # but to still be non-transparent, in which case the opacity only - # serves to desaturate the material's color. That's a pretty odd - # combination of things to want, so by default we just use the - # opacity value to decide whether to set transparent to True or - # False. - if self.transparent is None: - transparent = bool(self.opacity != 1) - else: - transparent = self.transparent - data = { - "uuid": self.uuid, - "type": self._type, - "color": self.color, - "reflectivity": self.reflectivity, - "side": self.side, - "transparent": transparent, - "opacity": self.opacity, - "linewidth": self.linewidth, - "wireframe": bool(self.wireframe), - "wireframeLinewidth": self.wireframe_linewidth, - "vertexColors": (2 if self.vertex_colors else 0), # three.js wants an enum - } - data.update(self.properties) - if self.map is not None: - data["map"] = self.map.lower_in_object(object_data) - return data - - -class MeshBasicMaterial(GenericMaterial): - """Basic material mesh class""" - - _type = "MeshBasicMaterial" - - -class MeshPhongMaterial(GenericMaterial): - """Phong material mesh class""" - - _type = "MeshPhongMaterial" - - -class MeshLambertMaterial(GenericMaterial): - """Lambert material mesh class""" - - _type = "MeshLambertMaterial" - - -class MeshToonMaterial(GenericMaterial): - """Toon material mesh class""" - - _type = "MeshToonMaterial" - - -class LineBasicMaterial(GenericMaterial): - """Basic Line Material class""" - - _type = "LineBasicMaterial" - - -class PngImage(Image): - """Png Image""" - - def __init__(self, data): - super().__init__() - self.data = data - - @staticmethod - def from_file(fname: str): - """Read in png image from file - - Args: - fname: file name to read image from - """ - with open(fname, "rb") as f: - return PngImage(f.read()) - - def lower(self, object_data): - return { - "uuid": self.uuid, - "url": UNICODE("data:image/png;base64," + base64.b64encode(self.data).decode("ascii")), - } - - -class GenericTexture(Texture): - """Generic texture class""" - - def __init__(self, properties: Iterable): - super().__init__() - self.properties = properties - - def lower(self, object_data): - data = {"uuid": self.uuid} - data.update(self.properties) - if "image" in data: - image = data["image"] - data["image"] = image.lower_in_object(object_data) - return data - - -class ImageTexture(Texture): - """Image Texture class - - Args: - image: image represented as byte array - wrap: wrap format. Defaults to None. - repeat: repeat format. Defaults to None. - """ - - def __init__(self, image: bytearray, wrap: List[int] = None, repeat: List[int] = None, **kwargs): - super().__init__() - if wrap is None: - wrap = [1001, 1001] - if repeat is None: - repeat = [1, 1] - self.image = image - self.wrap = wrap - self.repeat = repeat - self.properties = kwargs - - def lower(self, object_data): - data = { - "uuid": self.uuid, - "wrap": self.wrap, - "repeat": self.repeat, - "image": self.image.lower_in_object(object_data), - } - data.update(self.properties) - return data - - -class Object(SceneElement): - """Object element within scene - - Args: - geometry: geometry of the object - material: material composition of object. Defaults to MeshPhongMaterial(). - """ - - def __init__(self, geometry: Geometry, material: GenericMaterial = MeshPhongMaterial()): - super().__init__() - self.geometry = geometry - self.material = material - self._type = self._type - - # pylint: arguments-differ - def lower(self): - data = { - "metadata": { - "version": 4.5, - "type": "Object", - }, - "geometries": [], - "materials": [], - "object": { - "uuid": self.uuid, - "type": self._type, - "geometry": self.geometry.uuid, - "material": self.material.uuid, - "matrix": list(self.geometry.intrinsic_transform().flatten()), - }, - } - self.geometry.lower_in_object(data) - self.material.lower_in_object(data) - return data - - -class Mesh(Object): - """Mesh class""" - - _type = "Mesh" - - -class OrthographicCamera(SceneElement): - """Orthographic camera class - Args: - left: left bounds - right: right bounds - top: top bounds - bottom: bottom bounds - near: near plane - far: far plane - zoom: zoom param. Defaults to 1. - """ - - def __init__(self, left: float, right: float, top: float, bottom: float, near: float, far: float, zoom: int = 1): - super().__init__() - self.left = left - self.right = right - self.top = top - self.bottom = bottom - self.near = near - self.far = far - self.zoom = zoom - - def lower(self, object_data): - data = { - "object": { - "uuid": self.uuid, - "type": "OrthographicCamera", - "left": self.left, - "right": self.right, - "top": self.top, - "bottom": self.bottom, - "near": self.near, - "far": self.far, - "zoom": self.zoom, - } - } - return data - - -class PerspectiveCamera(SceneElement): - """ - The PerspectiveCamera is the default camera used by the nerfactory viewer. See - https://threejs.org/docs/#api/en/cameras/PerspectiveCamera for more - information. - - Args: - fov : Camera frustum vertical field of view, from bottom to top of view, in degrees. Default is 50. - aspect: Camera frustum aspect ratio, usually the canvas width / canvas height. Default is 1 (square canvas). - near : Camera frustum near plane. Default is 0.1. The valid range is greater than 0 and less than the current - value of the far plane. Note that, unlike for the OrthographicCamera, 0 is not a valid value for a - PerspectiveCamera's near plane. - far : Camera frustum far plane. Default is 2000. - zoom : Gets or sets the zoom factor of the camera. Default is 1. - film_gauge: Film size used for the larger axis. Default is 35 (millimeters). This parameter does not influence - the projection matrix unless .filmOffset is set to a nonzero value. - film_offset: Horizontal off-center offset in the same unit as .filmGauge. Default is 0. - focus: Object distance used for stereoscopy and depth-of-field effects. This parameter does not influence - the projection matrix unless a StereoCamera is being used. Default is 10. - """ - - def __init__( - self, - fov: float = 50, - aspect: float = 1, - near: float = 0.1, - far: float = 2000, - zoom: int = 1, - film_gauge: float = 35, - film_offset: float = 0, - focus: float = 10, - ): - super().__init__() - self.fov = fov - self.aspect = aspect - self.far = far - self.near = near - self.zoom = zoom - self.film_gauge = film_gauge - self.film_offset = film_offset - self.focus = focus - - def lower(self, object_data): - data = { - "object": { - "uuid": self.uuid, - "type": "PerspectiveCamera", - "aspect": self.aspect, - "far": self.far, - "filmGauge": self.film_gauge, - "filmOffset": self.film_offset, - "focus": self.focus, - "fov": self.fov, - "near": self.near, - "zoom": self.zoom, - } - } - return data - - -def item_size(array: np.ndarray) -> int: - """Returns the size of the 1 or 2d numpy array - - Args: - array: np array for which to get the size of - - Raises: - ValueError: if n dimensions is not == 1 or 2 - """ - if array.ndim == 1: - return 1 - if array.ndim == 2: - return array.shape[0] - raise ValueError(f"I can only pack 1- or 2-dimensional numpy arrays, but this one has {array.ndim:d} dimensions") - - -def threejs_type(dtype: type) -> Tuple[str, int]: - """Converts the np type to 3js type, returns str name and hex of equivalent 3js type - - Args: - dtype: np type - - Raises: - ValueError: if unsupported datatype - """ - if dtype == np.uint8: - return "Uint8Array", 0x12 - if dtype == np.int32: - return "Int32Array", 0x15 - if dtype == np.uint32: - return "Uint32Array", 0x16 - if dtype == np.float32: - return "Float32Array", 0x17 - - raise ValueError("Unsupported datatype: " + str(dtype)) - - -def pack_numpy_array(x: np.ndarray) -> Dict[str, Any]: - """convert numpy array to byte-based message with context, returns serialized message - - Args: - x: array to pack into message format - """ - if x.dtype == np.float64: - x = x.astype(np.float32) - typename, extcode = threejs_type(x.dtype) - return { - "itemSize": item_size(x), - "type": typename, - "array": umsgpack.Ext(extcode, x.tobytes("F")), - "normalized": False, - } - - -def data_from_stream(stream: BinaryIO) -> str: - """Read in data from some binary io stream and returns the serialized stream - - Args: - stream: the stream in which data is being sent over - - Raises: - ValueError: invalid stream type - """ - if isinstance(stream, BytesIO): - data = stream.read().decode(encoding="utf-8") - elif isinstance(stream, StringIO): - data = stream.read() - else: - raise ValueError(f"Stream must be instance of StringIO or BytesIO, not {type(stream)}") - return data - - -class MeshGeometry(Geometry): - """Basic mesh geometry class - - Args: - contents: the stream of contents representing the mesh - mesh_format: specification of mesh format - """ - - def __init__(self, contents: bytearray, mesh_format: str): - super().__init__() - self.contents = contents - self.mesh_format = mesh_format - - def lower(self, object_data): - return {"type": "_meshfile", "uuid": self.uuid, "format": self.mesh_format, "data": self.contents} - - -class ObjMeshGeometry(MeshGeometry): - """Basic mesh geometry class - - Args: - contents: the stream of contents representing the mesh - """ - - def __init__(self, contents: bytearray): - super().__init__(contents, "obj") - - @staticmethod - def from_file(fname: str) -> MeshGeometry: - """Reading mesh geometry from file. Returns mesh geometry object - - Args: - fname: file name to read from - """ - with open(fname, encoding="utf8") as f: - return MeshGeometry(f.read(), "obj") - - @staticmethod - def from_stream(f: BinaryIO) -> MeshGeometry: - """Reads mesh geometry from io stream. Returns mesh geometry object - - Args: - f: binary io stream to read from - """ - return MeshGeometry(data_from_stream(f), "obj") - - -class DaeMeshGeometry(MeshGeometry): - """Basic DAE mesh geometry class - - Args: - contents: the stream of contents representing the mesh - """ - - def __init__(self, contents: bytearray): - super().__init__(contents, "dae") - - @staticmethod - def from_file(fname: str) -> MeshGeometry: - """Reading mesh geometry from file. Returns mesh geometry object - - Args: - fname: file name to read from - """ - with open(fname, encoding="utf8") as f: - return MeshGeometry(f.read(), "dae") - - @staticmethod - def from_stream(f: BinaryIO) -> MeshGeometry: - """Reads mesh geometry from io stream. Returns mesh geometry object - - Args: - f: binary io stream to read from - """ - return MeshGeometry(data_from_stream(f), "dae") - - -class StlMeshGeometry(MeshGeometry): - """Basic STL mesh geometry class - - Args: - contents: the stream of contents representing the mesh - """ - - def __init__(self, contents: bytearray): - super().__init__(contents, "stl") - - @staticmethod - def from_file(fname: str) -> MeshGeometry: - """Reading mesh geometry from file. Returns mesh geometry object - - Args: - fname: file name to read from - """ - with open(fname, "rb") as f: - arr = np.frombuffer(f.read(), dtype=np.uint8) - _, extcode = threejs_type(np.uint8) - encoded = umsgpack.Ext(extcode, arr.tobytes()) - return MeshGeometry(encoded, "stl") - - @staticmethod - def from_stream(f: BinaryIO) -> MeshGeometry: - """Reads mesh geometry from io stream. Returns mesh geometry object - - Args: - f: binary io stream to read from - """ - if isinstance(f, BytesIO): - arr = np.frombuffer(f.read(), dtype=np.uint8) - elif isinstance(f, StringIO): - arr = np.frombuffer(bytes(f.read(), "utf-8"), dtype=np.uint8) - else: - raise ValueError(f"Stream must be instance of StringIO or BytesIO, not {type(f)}") - _, extcode = threejs_type(np.uint8) - encoded = umsgpack.Ext(extcode, arr.tobytes()) - return MeshGeometry(encoded, "stl") - - -class PlyMeshGeometry(MeshGeometry): - """Basic PLY mesh geometry class - - Args: - contents: the stream of contents representing the mesh - """ - - def __init__(self, contents: bytearray): - super().__init__(contents, "ply") - - @staticmethod - def from_file(fname: str) -> MeshGeometry: - """Reading mesh geometry from file. Returns mesh geometry object - - Args: - fname: file name to read from - """ - with open(fname, "rb") as f: - arr = np.frombuffer(f.read(), dtype=np.uint8) - _, extcode = threejs_type(np.uint8) - encoded = umsgpack.Ext(extcode, arr.tobytes()) - return MeshGeometry(encoded, "ply") - - @staticmethod - def from_stream(f: BinaryIO) -> MeshGeometry: - """Reads mesh geometry from io stream. Returns mesh geometry object - - Args: - f: binary io stream to read from - """ - if isinstance(f, BytesIO): - arr = np.frombuffer(f.read(), dtype=np.uint8) - elif isinstance(f, StringIO): - arr = np.frombuffer(bytes(f.read(), "utf-8"), dtype=np.uint8) - else: - raise ValueError(f"Stream must be instance of StringIO or BytesIO, not {type(f)}") - _, extcode = threejs_type(np.uint8) - encoded = umsgpack.Ext(extcode, arr.tobytes()) - return MeshGeometry(encoded, "stl") - - -class TriangularMeshGeometry(Geometry): - """ - A mesh consisting of an arbitrary collection of triangular faces. - To construct one, you need to pass in a collection of vertices as an Nx3 array - and a collection of faces as an Mx3 array. Each element of `faces` - should be a collection of 3 indices into the `vertices` array. - For example, to create a square made out of two adjacent triangles, we could do: - vertices = np.array([ - [0, 0, 0], # the first vertex is at [0, 0, 0] - [1, 0, 0], - [1, 0, 1], - [0, 0, 1] - ]) - faces = np.array([ - [0, 1, 2], # The first face consists of vertices 0, 1, and 2 - [3, 0, 2] - ]) - mesh = TriangularMeshGeometry(vertices, faces) - """ - - __slots__ = ["vertices", "faces"] - - def __init__(self, vertices: np.ndarray, faces: np.ndarray): - super().__init__() - - vertices = np.asarray(vertices, dtype=np.float32) - faces = np.asarray(faces, dtype=np.uint32) - assert vertices.shape[1] == 3, "`vertices` must be an Nx3 array" - assert faces.shape[1] == 3, "`faces` must be an Mx3 array" - self.vertices = vertices - self.faces = faces - - def lower(self, object_data) -> Dict[str, Any]: - return { - "uuid": self.uuid, - "type": "BufferGeometry", - "data": { - "attributes": {"position": pack_numpy_array(self.vertices.T)}, - "index": pack_numpy_array(self.faces.T), - }, - } - - -class PointsGeometry(Geometry): - """Points Geometry class - - Args: - position: position of the point to draw - color: color to render the point - """ - - def __init__(self, position: np.ndarray, color: Optional[np.ndarray] = None): - super().__init__() - self.position = position - self.color = color - - def lower(self, object_data) -> Dict[str, Any]: - attrs = {"position": pack_numpy_array(self.position)} - if self.color is not None: - attrs["color"] = pack_numpy_array(self.color) - return {"uuid": self.uuid, "type": "BufferGeometry", "data": {"attributes": attrs}} - - -class PointsMaterial(Material): - """Points Material class - - Args: - size: size of point to render - color: color to render the point - sizeAttenuation: whether to attenuate size - """ - - def __init__(self, size: float = 0.001, color: int = 0xFFFFFF, size_attenuation: bool = True): - super().__init__() - self.size = size - self.color = color - self.size_attenuation = size_attenuation - - def lower(self, object_data) -> Dict[str, Any]: - return { - "uuid": self.uuid, - "type": "PointsMaterial", - "color": self.color, - "size": self.size, - "sizeAttenuation": bool(self.size_attenuation), - "vertexColors": 2, - } - - -class Points(Object): - """Points object class""" - - _type = "Points" - - -def PointCloud(position: np.ndarray, color: np.ndarray, **kwargs) -> Points: # pylint: disable=invalid-name - """Creates a point cloud with the specified position of points - - Args: - position: position of points - color: color to render point cloud - """ - return Points(PointsGeometry(position, color), PointsMaterial(**kwargs)) - - -class Line(Object): - """Line class""" - - _type = "Line" - - -class LineSegments(Object): - """Line Segment class""" - - _type = "LineSegments" - - -class LineLoop(Object): - """Line Loop class""" - - _type = "LineLoop" - - -def triad(scale: float = 1.0) -> LineSegments: - """ - A visual representation of the origin of a coordinate system, drawn as three - lines in red, green, and blue along the x, y, and z axes. The `scale` parameter - controls the length of the three lines. - Returns an `Object` which can be passed to `set_object()` - - Args: - scale: scale size of triad - """ - return LineSegments( - PointsGeometry( - position=np.array([[0, 0, 0], [scale, 0, 0], [0, 0, 0], [0, scale, 0], [0, 0, 0], [0, 0, scale]]) - .astype(np.float32) - .T, - color=np.array([[1, 0, 0], [1, 0.6, 0], [0, 1, 0], [0.6, 1, 0], [0, 0, 1], [0, 0.6, 1]]) - .astype(np.float32) - .T, - ), - LineBasicMaterial(vertexColors=True), - ) - - -def camera(scale: float = 1.0) -> LineSegments: - """ - A visual representation of the origin of a coordinate system, drawn as three - lines in red, green, and blue along the x, y, and z axes. The `scale` parameter - controls the length of the three lines. - Returns an `Object` which can be passed to `set_object()` - - Args: - scale: scale size of camera - """ - return LineSegments( - PointsGeometry( - position=np.array([[0, 0, 0], [scale, 0, 0], [0, 0, 0], [0, scale, 0], [0, 0, 0], [0, 0, scale]]) - .astype(np.float32) - .T, - color=np.array([[1, 0, 0], [1, 0.6, 0], [0, 1, 0], [0.6, 1, 0], [0, 0, 1], [0, 0.6, 1]]) - .astype(np.float32) - .T, - ), - LineBasicMaterial(vertexColors=True), - ) diff --git a/nerfactory/viewer/server/path.py b/nerfactory/viewer/server/path.py index ca80c5d29..394f019c6 100644 --- a/nerfactory/viewer/server/path.py +++ b/nerfactory/viewer/server/path.py @@ -16,7 +16,6 @@ """ -import sys from typing import Tuple UNICODE = str diff --git a/nerfactory/viewer/server/server.py b/nerfactory/viewer/server/server.py index e37ccba24..312e1939d 100644 --- a/nerfactory/viewer/server/server.py +++ b/nerfactory/viewer/server/server.py @@ -16,7 +16,7 @@ import sys -from typing import Callable, List, Optional +from typing import Callable, List, Optional, Tuple import msgpack import msgpack_numpy @@ -31,24 +31,14 @@ from aiortc import RTCPeerConnection, RTCSessionDescription from aiortc.rtcrtpsender import RTCRtpSender from zmq.eventloop.zmqstream import ZMQStream -from nerfactory.viewer.server.tree import SceneTree, find_node, walk +from nerfactory.viewer.server.state.node import find_node, get_tree, walk +from nerfactory.viewer.server.state.state_node import StateNode from nerfactory.viewer.server.video_stream import SingleFrameStreamTrack MAX_ATTEMPTS = 1000 DEFAULT_ZMQ_METHOD = "tcp" DEFAULT_ZMQ_PORT = 6000 DEFAULT_WEBSOCKET_PORT = 8051 -WEBSOCKET_COMMANDS = [ - "set_transform", - "set_object", - "set_output_options", - "set_output_type", - "set_training_state", - "get_object", - "set_property", - "delete", -] -WEBRTC_COMMANDS = ["set_image"] def find_available_port(func: Callable, default_port: int, max_attempts: int = MAX_ATTEMPTS, **kwargs) -> None: @@ -105,7 +95,8 @@ class WebSocketHandler(tornado.websocket.WebSocketHandler): # pylint: disable=a self.bridge.send_scene(self) async def on_message(self, message: bytearray): # pylint: disable=invalid-overridden-method - """On reception of message, parses the message and calls the appropriate function based on the type of command + """On reception of message from the websocket, + parses the message and calls the appropriate function based on the type of command Args: message: byte message to parse @@ -115,22 +106,23 @@ class WebSocketHandler(tornado.websocket.WebSocketHandler): # pylint: disable=a type_ = m["type"] path = list(filter(lambda x: len(x) > 0, m["path"].split("/"))) - if type_ == "set_transform": - find_node(self.bridge.tree, path).transform = data - elif type_ == "set_object": - find_node(self.bridge.tree, path).object = data - find_node(self.bridge.tree, path).properties = [] - elif type_ == "set_output_options": - find_node(self.bridge.tree, path).object = data - elif type_ == "set_output_type": - find_node(self.bridge.tree, path).object = data - elif type_ == "set_max_resolution": - find_node(self.bridge.tree, path).object = data - elif type_ == "set_min_resolution": - find_node(self.bridge.tree, path).object = data - elif type_ == "set_training_state": - find_node(self.bridge.tree, path).object = data + if type_ == "write": + # writes the data coming from the websocket + find_node(self.bridge.state_tree, path).data = m["data"] + if m["path"] != "renderingState/camera": + # dispatch to the websockets if not a camera update! + # TODO(ethan): handle the camera properly! + # TODO: but don't update the current websocket + command = {"type": "write", "path": m["path"], "data": m["data"]} + packed_data = umsgpack.packb(command) + frames = ["write".encode("utf-8"), m["path"].encode("utf-8"), packed_data] + self.bridge.forward_to_websockets(frames, websocket_to_skip=self) + elif type_ == "read": + # reads and returns the data + data = find_node(self.bridge.state_tree, path).data + self.write_message(data, binary=True) elif type_ == "offer": + # returns the description to for WebRTC to the specific websocket connection offer = RTCSessionDescription(m["data"]["sdp"], m["data"]["type"]) pc = RTCPeerConnection() @@ -139,7 +131,7 @@ class WebSocketHandler(tornado.websocket.WebSocketHandler): # pylint: disable=a video = SingleFrameStreamTrack() self.bridge.video_tracks.add(video) _ = pc.addTrack(video) - # TODO(eventually do something with the codec) + # TODO: do something with the codec # video_sender = pc.addTrack(video) # force_codec(pc, video_sender, video_codec) @@ -154,6 +146,14 @@ class WebSocketHandler(tornado.websocket.WebSocketHandler): # pylint: disable=a } data = umsgpack.packb(cmd_data) self.write_message(data, binary=True) + else: + cmd_data = { + "type": "error", + "path": "", + "data": {"error": "Unknown command type: " + type_}, + } + data = umsgpack.packb(cmd_data) + self.write_message(data, binary=True) def on_close(self): self.bridge.websocket_pool.remove(self) @@ -196,7 +196,7 @@ class ZMQWebSocketBridge: self.app.listen(websocket_port, **listen_kwargs) self.websocket_port = websocket_port - self.tree = SceneTree() + self.state_tree = get_tree(StateNode) def __str__(self) -> str: class_name = self.__class__.__name__ @@ -212,61 +212,37 @@ class ZMQWebSocketBridge: Args: frames: the list containing command + object to be placed in tree """ - cmd = frames[0].decode("utf-8") - print(cmd) if len(frames) != 3: self.zmq_socket.send(b"error: expected 3 frames") return + type_ = frames[0].decode("utf-8") path = list(filter(lambda x: len(x) > 0, frames[1].decode("utf-8").split("/"))) data = frames[2] - if cmd in WEBSOCKET_COMMANDS: - if cmd != "get_object": - self.forward_to_websockets(frames) - if cmd == "set_transform": - find_node(self.tree, path).transform = data - elif cmd == "set_object": - find_node(self.tree, path).object = data - find_node(self.tree, path).properties = [] - elif cmd == "set_output_options": - find_node(self.tree, path).object = data - elif cmd == "set_output_type": - find_node(self.tree, path).object = data - elif cmd == "set_max_resolution": - find_node(self.tree, path).object = data - elif cmd == "set_min_resolution": - find_node(self.tree, path).object = data - elif cmd == "set_training_state": - find_node(self.tree, path).object = data - elif cmd == "get_object": - data = find_node(self.tree, path).object - if isinstance(data, type(None)): - data = umsgpack.packb("error: object not found") - self.zmq_socket.send(data) - return - elif cmd == "set_property": - find_node(self.tree, path).properties.append(data) - elif cmd == "delete": - if len(path) > 0: - parent = find_node(self.tree, path[:-1]) - child = path[-1] - if child in parent: - del parent[child] - else: - self.tree = SceneTree() - elif cmd in WEBRTC_COMMANDS: - if cmd == "set_image": - image = msgpack.unpackb( - data, object_hook=msgpack_numpy.decode, use_list=False, max_bin_len=50000000, raw=False - ) - for video_track in self.video_tracks: - video_track.put_frame(image) - else: - self.zmq_socket.send(b"error: unknown command") - return - self.zmq_socket.send(b"ok") - return - def forward_to_websockets(self, frames: List[bytes]): + if type_ == "write": + # TODO: use state_tree name + unpacked_data = umsgpack.unpackb(data) + find_node(self.state_tree, path).data = unpacked_data["data"] + self.forward_to_websockets(frames) + self.zmq_socket.send(umsgpack.packb(b"ok")) + elif type_ == "read": + # walk the node from the specified to get the full state dictionary + # TODO(ethan): handle the "data" key... + read_data = find_node(self.state_tree, path).data + self.zmq_socket.send(umsgpack.packb(read_data)) + elif type_ == "set_image": + image = msgpack.unpackb( + data, object_hook=msgpack_numpy.decode, use_list=False, max_bin_len=50000000, raw=False + ) + for video_track in self.video_tracks: + video_track.put_frame(image) + self.zmq_socket.send(umsgpack.packb(b"ok")) + else: + self.zmq_socket.send(umsgpack.packb(b"error: unknown command")) + + def forward_to_websockets( + self, frames: Tuple[str, str, bytes], websocket_to_skip: Optional[WebSocketHandler] = None + ): """Forward a zmq message to all websockets. Args: @@ -274,7 +250,10 @@ class ZMQWebSocketBridge: """ _, _, data = frames # cmd, path, data for websocket in self.websocket_pool: - websocket.write_message(data, binary=True) + if websocket_to_skip and websocket == websocket_to_skip: + pass + else: + websocket.write_message(data, binary=True) def setup_zmq(self, url: str): """Setup a zmq socket and connect it to the given url. @@ -294,13 +273,11 @@ class ZMQWebSocketBridge: Args: websocket: websocket to send information over """ - for node in walk(self.tree): - if node.object is not None: - websocket.write_message(node.object, binary=True) - for p in node.properties: - websocket.write_message(p, binary=True) - if node.transform is not None: - websocket.write_message(node.transform, binary=True) + print("Sending entire scene state on websocket connect (i.e,. a page refresh).") + for path, node in walk("", self.state_tree): + if node.data is not None: + command = {"type": "write", "path": path, "data": node.data} + websocket.write_message(umsgpack.packb(command), binary=True) def run(self): """starts and runs the websocket bridge""" diff --git a/nerfactory/viewer/server/tree.py b/nerfactory/viewer/server/state/node.py similarity index 56% rename from nerfactory/viewer/server/tree.py rename to nerfactory/viewer/server/state/node.py index 1eacaa766..e63afa689 100644 --- a/nerfactory/viewer/server/tree.py +++ b/nerfactory/viewer/server/state/node.py @@ -13,49 +13,53 @@ # limitations under the License. """ -Functions for traversing server bridge tree nodes (storage) +For tree logic code. """ - from collections import defaultdict -from typing import List +from typing import Callable -class TreeNode(defaultdict): - """Tree Node object""" - - __slots__ = ["object", "transform", "properties", "animation"] +class Node(defaultdict): + """ + The base class Node. + """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.object = None - self.properties = [] - self.transform = None - self.animation = None -SceneTree = lambda: TreeNode(SceneTree) - - -def walk(tree: TreeNode) -> None: - """Walk the entire tree and return the values - - Args: - tree: the root of the tree to start search +def get_tree(node_class: Callable) -> Callable: """ - yield tree - for v in tree.values(): - yield from walk(v) - - -def find_node(tree: TreeNode, path: List[str]) -> TreeNode: - """Find the node associated with the path - - Args: - tree: the root of the tree to start search - path: the path we are searching for + Get a tree from a node class. + This allows one to do tree["path"]["to"]["node"] + and it will return a new node if it doesn't exist + or the current node if it does. """ + assert isinstance(node_class(), Node) + tree = lambda: node_class(tree) + return tree() + + +def find_node(tree, path): if len(path) == 0: return tree else: return find_node(tree[path[0]], path[1:]) + + +def set_node_value(tree, path, value): + if len(path) == 0: + tree.data = value + else: + set_node_value(tree[path[0]], path[1:], value) + + +def walk(path, tree): + """Walk the entire tree and return the values + Args: + tree: the root of the tree to start search + """ + yield path, tree + for k, v in tree.items(): + yield from walk(path + "/" + k, v) diff --git a/nerfactory/viewer/server/state/state_node.py b/nerfactory/viewer/server/state/state_node.py new file mode 100644 index 000000000..5ef246510 --- /dev/null +++ b/nerfactory/viewer/server/state/state_node.py @@ -0,0 +1,28 @@ +# Copyright 2022 The Plenoptix Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import List + +from nerfactory.viewer.server.state.node import Node + + +class StateNode(Node): + """Node that holds a hierarchy of state nodes""" + + __slots__ = ["data"] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.path = None + self.data = None diff --git a/nerfactory/viewer/server/transformations.py b/nerfactory/viewer/server/transformations.py deleted file mode 100644 index e2a0c6442..000000000 --- a/nerfactory/viewer/server/transformations.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright 2022 The Plenoptix Team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Some helpful functions for creating geometric transformations. -""" - -import math -from typing import List, Optional - -import numpy as np - - -def get_unit_vector( - data: List[float], axis: Optional[List[float]] = None, out: Optional[List[float]] = None -) -> Optional[np.ndarray]: - """Return ndarray normalized by length, i.e. Euclidean norm, along axis. - - Args: - data: direction in which we want to calculate the unit vector for - axis: the axis along which to get the unit vector - out: buffer in which we write the unit vector out to (if not returning) - """ - if out is None: - data = np.array(data, dtype=np.float64, copy=True) - if data.ndim == 1: - data /= math.sqrt(np.dot(data, data)) - return data - else: - if out is not data: - out[:] = np.array(data, copy=False) - data = out - length = np.atleast_1d(np.sum(data * data, axis)) - np.sqrt(length, length) - if axis is not None: - length = np.expand_dims(length, axis) - data /= length - if out is None: - return data - return None - - -def get_translation_matrix(direction: List[float]) -> np.ndarray: - """Return matrix to translate by direction vector. - - Args: - direction: specifying direction of translation - """ - M = np.identity(4) - M[:3, 3] = direction[:3] - return M - - -def get_rotation_matrix(angle: float, direction: List[float], point: Optional[List[float]] = None) -> np.ndarray: - """Return matrix to rotate about axis defined by point and direction. - - Args: - angle: angle of rotation - direction: specifying axis of rotation - point: if specified, rotation not around origin - """ - sina = math.sin(angle) - cosa = math.cos(angle) - direction = get_unit_vector(direction[:3]) - # rotation matrix around unit vector - R = np.diag([cosa, cosa, cosa]) - R += np.outer(direction, direction) * (1.0 - cosa) - direction *= sina - R += np.array( - [[0.0, -direction[2], direction[1]], [direction[2], 0.0, -direction[0]], [-direction[1], direction[0], 0.0]] - ) - M = np.identity(4) - M[:3, :3] = R - if point is not None: - # rotation not around origin - point = np.array(point[:3], dtype=np.float64, copy=False) - M[:3, 3] = point - np.dot(R, point) - return M diff --git a/nerfactory/viewer/server/utils.py b/nerfactory/viewer/server/utils.py index b769190bd..e13fc91c1 100644 --- a/nerfactory/viewer/server/utils.py +++ b/nerfactory/viewer/server/utils.py @@ -20,13 +20,6 @@ from typing import Any, Dict, List, Optional, Tuple import numpy as np import torch -from nerfactory.cameras.cameras import ( - Camera, - get_camera, - get_intrinsics_from_intrinsics_matrix, -) -from nerfactory.viewer.server.visualizer import Viewer - def get_chunks( lst: List[float], num_chunks: Optional[int] = None, size_of_chunk: Optional[int] = None @@ -80,25 +73,3 @@ def get_intrinsics_matrix_and_camera_to_world_h( ) return intrinsics_matrix, camera_to_world_h - - -def get_camera_from_vis(vis: Viewer, name: str = "/Cameras/Main Camera", image_height: int = 100) -> Camera: - """Caculates the specified camera object's parameters (extrinsics/intrinsics); returns associated Camera Object. - - Args: - vis: viewer object - name: name of camera to calculate for. Defaults to "/Cameras/Main Camera". - image_height: height of image. Defaults to 100. - """ - data = vis[name].get_object() - if data is None: - return None - camera_object = data["object"]["object"] - intrinsics_matrix, camera_to_world_h = get_intrinsics_matrix_and_camera_to_world_h( - camera_object, image_height=image_height - ) - - camera_to_world = camera_to_world_h[:3, :] - intrinsics = get_intrinsics_from_intrinsics_matrix(intrinsics_matrix) - camera = get_camera(intrinsics, camera_to_world) - return camera diff --git a/nerfactory/viewer/server/video_stream.py b/nerfactory/viewer/server/video_stream.py index c64c6518c..fb177e7b0 100644 --- a/nerfactory/viewer/server/video_stream.py +++ b/nerfactory/viewer/server/video_stream.py @@ -79,7 +79,7 @@ class SingleFrameStreamTrack(VideoStreamTrack): def __init__(self): super().__init__() - self.background_frame = np.zeros((480, 640, 3), dtype="uint8") * 255 + self.background_frame = np.ones((480, 640, 3), dtype="uint8") * 255 # white background self.frame = None self.put_frame(self.background_frame) diff --git a/nerfactory/viewer/server/viewer_utils.py b/nerfactory/viewer/server/viewer_utils.py index 1cd02c356..add27f881 100644 --- a/nerfactory/viewer/server/viewer_utils.py +++ b/nerfactory/viewer/server/viewer_utils.py @@ -15,24 +15,16 @@ """Code to interface with the `vis/` (the JS visualizer). """ -import copy import logging -import random import sys import threading import time -from typing import Any, Dict, List, Optional +from typing import Any, Dict import numpy as np import torch -import nerfactory.viewer.server.cameras as c -import nerfactory.viewer.server.geometry as g -from nerfactory.cameras.cameras import ( - Camera, - get_camera, - get_intrinsics_from_intrinsics_matrix, -) +from nerfactory.cameras.cameras import get_camera, get_intrinsics_from_intrinsics_matrix from nerfactory.cameras.rays import RayBundle from nerfactory.data.image_dataset import ImageDataset from nerfactory.data.structs import DatasetInputs @@ -40,7 +32,6 @@ from nerfactory.graphs.base import Graph from nerfactory.utils import profiler from nerfactory.utils.config import ViewerConfig from nerfactory.utils.decorators import check_visualizer_enabled, decorate_all -from nerfactory.viewer.server.transformations import get_translation_matrix from nerfactory.viewer.server.utils import get_intrinsics_matrix_and_camera_to_world_h from nerfactory.viewer.server.visualizer import Viewer @@ -117,15 +108,17 @@ class CheckThread(threading.Thread): self.state = state def run(self): - """Run function that checks to see if any of the existing state has changed (e.g. camera pose/output type/resolutions). - Sets the visualizer state flag to true to signal to render thread that an interrupt was registered. + """Run function that checks to see if any of the existing state has changed + (e.g. camera pose/output type/resolutions). + Sets the visualizer state flag to true to signal + to render thread that an interrupt was registered. """ self.state.check_done_render = False while not self.state.check_done_render: # check camera - data = self.state.vis["/Cameras/Main Camera"].get_object() + data = self.state.vis["renderingState/camera"].read() if data is not None: - camera_object = data["object"]["object"] + camera_object = data["object"] if self.state.prev_camera_matrix is None or not np.allclose( camera_object["matrix"], self.state.prev_camera_matrix ): @@ -133,27 +126,23 @@ class CheckThread(threading.Thread): return # check output type - data = self.state.vis["/Output Type"].get_object() - if data is None: + output_type = self.state.vis["renderingState/output_choice"].read() + if output_type is None: output_type = "default" - else: - output_type = data["output_type"] if self.state.prev_output_type != output_type: self.state.check_interrupt_vis = True return # check max render - data = self.state.vis["/Max Resolution"].get_object() - if data is not None: - max_resolution = int(data["max_resolution"]) + max_resolution = self.state.vis["renderingState/maxResolution"].read() + if max_resolution is not None: if self.state.max_resolution != max_resolution: self.state.check_interrupt_vis = True return # check min render - data = self.state.vis["/Min Resolution"].get_object() - if data is not None: - min_resolution = int(data["min_resolution"]) + min_resolution = self.state.vis["renderingState/minResolution"].read() + if min_resolution is not None: if self.state.min_resolution != min_resolution: self.state.check_interrupt_vis = True return @@ -174,7 +163,6 @@ class VisualizerState: if self.config.enable: zmq_url = self.config.zmq_url self.vis = Viewer(zmq_url=zmq_url) - self.vis.delete() else: logging.info("Continuing without viewer.") @@ -198,28 +186,29 @@ class VisualizerState: image_dataset: dataset to render in the scene dataset_inputs: inputs to the image dataset and ray generator """ - indices = random.sample(range(len(image_dataset)), k=10) - for idx in indices: + + # clear the current scene + self.vis["sceneState/sceneBounds"].delete() + self.vis["sceneState/cameras"].delete() + + # draw the training cameras and images + image_indices = range(len(image_dataset)) + for idx in image_indices: image = image_dataset[idx]["image"] camera = get_camera(dataset_inputs.intrinsics[idx], dataset_inputs.camera_to_world[idx], None) - pose = camera.get_camera_to_world().double().numpy() - K = camera.get_intrinsics_matrix().double().numpy() - draw_camera_frustum( - self.vis, - image=(image.double().numpy() * 255.0), - pose=pose, - K=K, - height=1.0, - name=f"image_dataset/{idx:06d}", - displayed_focal_length=0.5, - realistic=False, - ) - aabb = dataset_inputs.scene_bounds.aabb - draw_aabb(self.vis, aabb, name="dataset_inputs_train/scene_bounds/aabb") + bgr = image[..., [2, 1, 0]] + self.vis[f"sceneState/cameras/{idx:06d}"].write(camera.to_json(image=bgr, resize_shape=(100, 100))) + + # draw the scene bounds (i.e., the bounding box) + json_ = dataset_inputs.scene_bounds.to_json() + self.vis["sceneState/sceneBounds"].write(json_) + + # set the properties of the camera + # self.vis["renderingState/camera"].write(json_) # set the main camera intrinsics to one from the dataset - K = camera.get_intrinsics_matrix() - set_persp_intrinsics_matrix(self.vis, K.double().numpy()) + # K = camera.get_intrinsics_matrix() + # set_persp_intrinsics_matrix(self.vis, K.double().numpy()) def update_scene(self, step: int, graph: Graph) -> None: """updates the scene based on the graph weights @@ -228,21 +217,22 @@ class VisualizerState: step: iteration step of training graph: the current checkpoint of the model """ - data = self.vis["/Training State"].get_object() - if data is None or not data["training_state"]: + is_training = self.vis["renderingState/isTraining"].read() + + if is_training is None or is_training: # in training mode, render every few steps if self._is_render_step(step): self._render_image_in_viewer(graph) else: # in pause training mode, enter render loop with set graph local_step = step - run_loop = data["training_state"] + run_loop = not is_training while run_loop: if self._is_render_step(local_step): self._render_image_in_viewer(graph) - data = self.vis["/Training State"].get_object() - run_loop = data["training_state"] + is_training = self.vis["renderingState/isTraining"].read() + run_loop = not is_training local_step += 1 def check_interrupt(self, frame, event, arg): # pylint: disable=unused-argument @@ -279,14 +269,15 @@ class VisualizerState: outputs: the dictionary of outputs to choose from, from the graph """ if not self.outputs_set: - set_output_options(self.vis, list(outputs.keys())) + # set_output_options(self.vis, list(outputs.keys())) + self.vis["renderingState/output_options"].write(list(outputs.keys())) self.outputs_set = True # gross hack to get the image key, depending on which keys the graph uses if self.prev_output_type == "default": self.prev_output_type = "rgb" if "rgb" in outputs else "rgb_fine" image_output = outputs[self.prev_output_type].cpu().numpy() * 255 image = (image_output).astype("uint8") - self.vis["/Cameras/Main Camera"].set_image(image) + self.vis.set_image(image) @profiler.time_function def _render_image_in_viewer(self, graph: Graph) -> None: @@ -295,10 +286,10 @@ class VisualizerState: The image is sent of a TCP connection and then uses WebRTC to send it to the viewer. """ # check and perform camera updates - data = self.vis["/Cameras/Main Camera"].get_object() + data = self.vis["renderingState/camera"].read() if data is None: return - camera_object = data["object"]["object"] + camera_object = data["object"] # hacky way to prevent overflow check to see if < 100; TODO(make less hacky) if self.prev_camera_matrix is not None and np.allclose(camera_object["matrix"], self.prev_camera_matrix): self.res_upscale_factor = min(self.res_upscale_factor * 2, 100) @@ -307,21 +298,19 @@ class VisualizerState: self.res_upscale_factor = 1 # check and perform output type updates - data = self.vis["/Output Type"].get_object() - if data is None: + output_type = self.vis["renderingState/output_choice"].read() + if output_type is None: output_type = "default" - else: - output_type = data["output_type"] self.prev_output_type = output_type # check and perform min/max update - data = self.vis["/Max Resolution"].get_object() - if data is not None: - self.max_resolution = int(data["max_resolution"]) + max_resolution = self.vis["renderingState/maxResolution"].read() + if max_resolution: + self.max_resolution = max_resolution - data = self.vis["/Min Resolution"].get_object() - if data is not None: - self.min_resolution = int(data["min_resolution"]) + min_resolution = self.vis["renderingState/minResolution"].read() + if min_resolution: + self.min_resolution = min_resolution image_height = min( self.min_resolution * self.res_upscale_factor, @@ -368,191 +357,3 @@ def get_default_vis() -> Viewer: zmq_url = "tcp://0.0.0.0:6000" viewer = Viewer(zmq_url=zmq_url) return viewer - - -def set_output_options(vis: Viewer, output_options: List[str]): - """Sets the possible list of output options for user to toggle - - Args: - vis: current Viewer - output_options: list of possible output types to select from - """ - vis["output_options"].set_output_options(output_options) - - -def show_box_test(vis: Viewer): - """Simple test to draw a box and make sure everything is working. - - Args: - vis: current Viewer - """ - vis["box"].set_object(g.Box([1.0, 1.0, 1.0]), material=g.MeshPhongMaterial(color=0xFF0000)) - - -def show_ply(vis: Viewer, ply_path: str, name: str = "ply", color: Optional[int] = None): - """Show the PLY file in the 3D viewer. Specify the full filename as input. - - Args: - vis: current Viewer - ply_path: path to ply to load in - name: reference name within viewer storage - color: color to render the ply in - """ - assert ply_path.endswith(".ply") - if color: - material = g.MeshPhongMaterial(color=color) - else: - material = g.MeshPhongMaterial(vertexColors=True) - vis[name].set_object(g.PlyMeshGeometry.from_file(ply_path), material) - - -def show_obj(vis: Viewer, obj_path: str, name: str = "obj", color: Optional[int] = None): - """Show the PLY file in the 3D viewer. Specify the full filename as input. - - Args: - vis: current Viewer - obj_path: path to obj to load in - name: reference name within viewer storage - color: color to render the obj in - """ - assert obj_path.endswith(".obj") - if color: - material = g.MeshPhongMaterial(color=color) - else: - material = g.MeshPhongMaterial(vertexColors=True) - vis[name].set_object(g.ObjMeshGeometry.from_file(obj_path), material) - - -def draw_camera_frustum( - vis: Viewer, - image: np.ndarray = np.random.rand(100, 100, 3) * 255.0, - pose: np.ndarray = get_translation_matrix([0, 0, 0]), - K: Optional[np.ndarray] = None, - name: str = "0000000", - displayed_focal_length: Optional[float] = None, - shift_forward: Optional[float] = None, - height: Optional[float] = None, - realistic: bool = True, -): - """Draw the camera in the scene. - - Args: - vis: current Viewer - image: image associated with the current camera - pose: pose of the camera - K: camera matrix - name: reference name within viewer storage - displayed_focal_length: the focal length to be displayed - shift_forward: how much to shift the drawn camera forward - height: height of the associated image plane - realistic: whether to render the image plane at the "realistic" focal length - """ - - assert K[0, 0] == K[1, 1] - focal_length = K[0, 0] - pp_w = K[0, 2] - pp_h = K[1, 2] - - if displayed_focal_length: - assert height is None or not realistic - if height: - assert displayed_focal_length is None or not realistic - - if height: - dfl = height / (2.0 * (pp_h / focal_length)) - width = 2.0 * (pp_w / focal_length) * dfl - if displayed_focal_length is None: - displayed_focal_length = dfl - elif displayed_focal_length: - width = 2.0 * (pp_w / focal_length) * displayed_focal_length - height = 2.0 * (pp_h / focal_length) * displayed_focal_length - else: - assert not realistic - - if pose.shape == (3, 4): - pose = np.concatenate([pose, np.zeros_like(pose[:1])], axis=0) - pose[3, 3] = 1.0 - - # draw the frustum - g_frustum = c.frustum(scale=1.0, focal_length=displayed_focal_length, width=width, height=height) - vis[name + "/frustum"].set_object(g_frustum) - if not realistic: - vis[name + "/frustum"].set_transform(get_translation_matrix([0, 0, displayed_focal_length])) - - # draw the image plane - g_image_plane = c.ImagePlane(image, width=width, height=height) - vis[name + "/image_plane"].set_object(g_image_plane) - if realistic: - assert displayed_focal_length is not None, "Need to set displayed focal length" - vis[name + "/image_plane"].set_transform(get_translation_matrix([0, 0, -1.0 * displayed_focal_length])) - - if shift_forward: - matrix = get_translation_matrix([0, 0, displayed_focal_length]) - matrix2 = get_translation_matrix([0, 0, -1.0 * shift_forward]) - vis[name + "/frustum"].set_transform(matrix2 @ matrix) - vis[name + "/image_plane"].set_transform(matrix2) - - # set the transform of the camera - vis[name].set_transform(pose) - - -def set_persp_intrinsics_matrix(vis, K): - pp_w = K[0, 2] - pp_h = K[1, 2] - assert K[0, 0] == K[1, 1] - focal_length = K[0, 0] - x = pp_h / (focal_length) - fov = 2.0 * np.arctan(x) * (180.0 / np.pi) - vis["/Cameras/Main Camera/"].set_property("fov", fov) - vis["/Cameras/Main Camera/"].set_property("aspect", float(pp_w / pp_h)) # three.js expects width/height - - -def set_persp_pose(vis, pose, colmap=True): - pose_processed = copy.deepcopy(pose) - if colmap: - pose_processed[:, 1:3] *= -1 - vis["/Cameras/Main Camera/"].set_transform(pose_processed) - - -def set_persp_camera(vis, pose, K, colmap=True): - """Assumes simple pinhole model for intrinsics. - Args: - colmap: whether to use the colmap camera coordinate convention or not - """ - set_persp_intrinsics_matrix(vis, K) - set_persp_pose(vis, pose, colmap=colmap) - - -def set_camera(vis, camera: Camera): - pose = camera.get_camera_to_world_h() - K = camera.get_intrinsics_matrix() - set_persp_camera(vis, pose=pose.double().numpy(), K=K.double().numpy()) - - -def draw_aabb(vis, aabb, name="aabb"): - """Draw the axis-aligned bounding box.""" - lengths = aabb[1] - aabb[0] - - w = 1 - aaa = np.array([w, w, w]) - aab = np.array([w, w, -w]) - aba = np.array([w, -w, w]) - baa = np.array([-w, w, w]) - abb = np.array([w, -w, -w]) - bba = np.array([-w, -w, w]) - bab = np.array([-w, w, -w]) - bbb = np.array([-w, -w, -w]) - camera_points = [aaa, aab, aaa, aba, aab, abb, aba, abb] - camera_points.extend([baa, bab, baa, bba, bab, bbb, bba, bbb]) - camera_points.extend([aaa, baa, aab, bab, aba, bba, abb, bbb]) - lines = np.stack(camera_points) - - lines = lines * np.array(lengths) / 2.0 - - line_segments = g.LineSegments( - g.PointsGeometry(position=lines.astype(np.float32).T), - g.LineBasicMaterial(vertexColors=True), - ) - vis[name].set_object(line_segments) - center = aabb[0] + lengths / 2.0 - vis[name].set_transform(get_translation_matrix(center.tolist())) diff --git a/nerfactory/viewer/server/visualizer.py b/nerfactory/viewer/server/visualizer.py index 96d0b27c9..41b667de4 100644 --- a/nerfactory/viewer/server/visualizer.py +++ b/nerfactory/viewer/server/visualizer.py @@ -12,28 +12,25 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""Code to connect and send commands to the viewer. +""" + import logging import signal import sys +from typing import Dict, Optional import msgpack import msgpack_numpy -import numpy as np import umsgpack import zmq -from nerfactory.viewer.server.commands import ( - Delete, - GetObject, - SetObject, - SetOutputOptions, - SetProperty, - SetTransform, -) from nerfactory.viewer.server.path import Path class ViewerWindow: + """The viewer window has the ZMQ connection to the viewer bridge server.""" + context = zmq.Context() def __init__(self, zmq_url): @@ -43,15 +40,15 @@ class ViewerWindow: self.assert_connected() def send(self, command): - cmd_data = command.lower() + """Sends a command to the viewer bridge server.""" self.client.send_multipart( [ - cmd_data["type"].encode("utf-8"), - cmd_data["path"].encode("utf-8"), - umsgpack.packb(cmd_data), + command["type"].encode("utf-8"), + command["path"].encode("utf-8"), + umsgpack.packb(command), ] ) - return self.client.recv() + return umsgpack.unpackb(self.client.recv()) def send_ping(self): """Tries to contact the viewer bridge server.""" @@ -65,7 +62,7 @@ class ViewerWindow: data, ] ) - return self.client.recv() + return umsgpack.unpackb(self.client.recv()) def assert_connected(self, timeout_in_sec: int = 5): """Check if the connection was established properly within some time. @@ -84,7 +81,7 @@ class ViewerWindow: _ = self.send_ping() logging.info("Successfully connected.") signal.alarm(0) # cancel the alarm - except Exception as e: + except Exception as e: # pylint: disable=broad-except logging.info(e) sys.exit() @@ -93,19 +90,18 @@ class Viewer: """Visualizer class for connecting to the bridge server. Args: - zmq_url (str, optional): _description_. Defaults to None. - window (ViewerWindow, optional): _description_. Defaults to None. - timeout (str, optional): _description_. Defaults to None. + zmq_url: Where to connect with ZMQ. Defaults to None. + window: An already existing ViewerWindow. Defaults to None. """ - def __init__(self, zmq_url: str = None, window: ViewerWindow = None): + def __init__(self, zmq_url: Optional[str] = None, window: Optional[ViewerWindow] = None): if zmq_url is None and window is None: raise ValueError("Must specify either zmq_url or window.") if window is None: self.window = ViewerWindow(zmq_url=zmq_url) else: self.window = window - self.path = Path(("nerfactory",)) + self.path = Path(()) @staticmethod def view_into(window: ViewerWindow, path: Path): @@ -117,28 +113,25 @@ class Viewer: def __getitem__(self, path): return Viewer.view_into(self.window, self.path.append(path)) - def set_object(self, geometry, material=None): - """Set the object at the current path - Args: - geometry (_type_): _description_ - material (_type_, optional): _description_. Defaults to None. + def __repr__(self): + return f"" - Returns: - _type_: _description_ - """ - return self.window.send(SetObject(geometry, material, self.path)) + def write(self, data: Optional[Dict] = None): + """Write data.""" + path = self.path.lower() + return self.window.send({"type": "write", "path": path, "data": data}) - def get_object(self): - """Get the object at the current path.""" - data = self.window.send(GetObject(self.path)) - data = umsgpack.unpackb(data) - if isinstance(data, str) and data.find("error") == 0: - # some error meaning that the object does not exist - return None - return data + def read(self): + """Read data.""" + path = self.path.lower() + return self.window.send({"type": "read", "path": path}) + + def delete(self): + """Delete data.""" + return self.write(data=None) def set_image(self, image): - """Set the image""" + """Sends an image to the viewer with WebRTC.""" type_ = "set_image" path = self.path.lower() data = msgpack.packb(image, default=msgpack_numpy.encode, use_bin_type=True) @@ -150,23 +143,3 @@ class Viewer: ] ) return self.window.client.recv() - - def set_transform(self, matrix=np.eye(4)): - """Set the transform""" - assert matrix.shape == (4, 4) - return self.window.send(SetTransform(matrix, self.path)) - - def set_property(self, key, value): - """Set the property""" - return self.window.send(SetProperty(key, value, self.path)) - - def set_output_options(self, options): - """Set the output options""" - return self.window.send(SetOutputOptions(options, self.path)) - - def delete(self): - """Delete the contents of the window""" - return self.window.send(Delete(self.path)) - - def __repr__(self): - return f"" diff --git a/notebooks/README.md b/notebooks/README.md index e69de29bb..923ecd7ca 100644 --- a/notebooks/README.md +++ b/notebooks/README.md @@ -0,0 +1 @@ +# Notebooks diff --git a/notebooks/notebook_imports.py b/notebooks/notebook_imports.py deleted file mode 100644 index 9165b4d67..000000000 --- a/notebooks/notebook_imports.py +++ /dev/null @@ -1,29 +0,0 @@ -# image stuff -import imageio -import mediapy as media - -# plotly stuff -import plotly.graph_objects as go - -# ipython stuff -from IPython import get_ipython - - -def setup_ipynb(): - """ - https://stackoverflow.com/questions/15411967/how-can-i-check-if-code-is-executed-in-the-ipython-notebook - https://stackoverflow.com/questions/35595766/matplotlib-line-magic-causes-syntaxerror-in-python-script - This gets reference to the InteractiveShell instance - """ - try: - from IPython import get_ipython - - get_ipython().run_line_magic("load_ext", "autoreload") - get_ipython().run_line_magic("autoreload", "2") - get_ipython().run_line_magic("matplotlib", "inline") - return True - except: - return False - - -setup_ipynb() diff --git a/notebooks/visualize_dataset.ipynb b/notebooks/visualize_dataset.ipynb deleted file mode 100644 index 4c69537fa..000000000 --- a/notebooks/visualize_dataset.ipynb +++ /dev/null @@ -1,10543 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3c00934d-0f14-4c1a-a563-94d627b377e5", - "metadata": {}, - "source": [ - "# Notebook to visualize a dataset\n", - "\n", - "Sanity check to ensure data is properly read\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "b15dfdc1-5054-40bc-9631-4c7426eecfd9", - "metadata": {}, - "outputs": [], - "source": [ - "from notebook_imports import *\n", - "\n", - "import torch\n", - "\n", - "from nerfactoryctory.data.dataloader import TrainDataloader\n", - "from nerfactoryctory.data.utils import get_dataset_inputs_from_dataset_config\n", - "from nerfactoryctory.graphs.modules.ray_generator import RayGenerator\n", - "from nerfactoryctory.graphs.modules.scene_colliders import AABBBoxCollider\n", - "from nerfactoryctory.utils.plotly import get_line_segments_from_lines\n", - "from nerfactoryctory.utils.misc import instantiate_from_dict_config\n", - "\n", - "\n", - "from hydra import compose, initialize\n", - "from tqdm import tqdm\n", - "import random" - ] - }, - { - "cell_type": "markdown", - "id": "2cb2fd5f", - "metadata": {}, - "source": [ - "## Load dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "7fe7478d", - "metadata": {}, - "outputs": [], - "source": [ - "CONFIG_NAME = \"graph_default.yaml\"\n", - "DEVICE = \"cpu\"\n", - "\n", - "with initialize(version_base=\"1.2\", config_path=\"../configs\"):\n", - " config = compose(config_name=CONFIG_NAME)\n", - "\n", - "dataset_inputs = get_dataset_inputs_from_dataset_config(**config.data.dataset_inputs_train, split=\"train\")\n", - "\n", - "# ImageDataset\n", - "image_dataset_train = instantiate_from_dict_config(config.data.image_dataset_train, **dataset_inputs.as_dict())\n", - "# ImageSampler\n", - "image_sampler_train = instantiate_from_dict_config(\n", - " config.data.dataloader_train.image_sampler, dataset=image_dataset_train, device=DEVICE\n", - ")\n", - "# PixelSampler\n", - "pixel_sampler_train = instantiate_from_dict_config(config.data.dataloader_train.pixel_sampler, keep_full_image=True)\n", - "\n", - "ray_generator = RayGenerator(dataset_inputs.intrinsics, dataset_inputs.camera_to_world)\n", - "\n", - "dataloader_train = TrainDataloader(image_sampler_train, pixel_sampler_train)\n", - "iter_dataloader_train = iter(dataloader_train)\n", - "\n", - "\n", - "def show_batch(batch):\n", - " # set the color of the sampled rays\n", - " c, y, x = [i.flatten() for i in torch.split(batch[\"local_indices\"], 1, dim=-1)]\n", - " batch[\"full_image\"][c, y, x] = 0.0\n", - " batch[\"full_image\"][c, y, x, 0] = 1.0\n", - "\n", - " # batch[\"image\"] is num_images, h, w, 3\n", - " images = torch.split(batch[\"full_image\"], 1, dim=0)\n", - " image_list = [image[0] for image in images]\n", - " image = torch.cat(image_list, dim=1) # cat along the width dimension\n", - "\n", - " # the pink pixels are rays\n", - " media.show_image((image * 255).to(torch.uint8))\n", - "\n", - "\n", - "def sample_and_show_batch():\n", - " ray_indices, batch = next(iter_dataloader_train)\n", - " show_batch(batch)\n", - " return batch" - ] - }, - { - "cell_type": "markdown", - "id": "39349ea0", - "metadata": {}, - "source": [ - "## Visualize Image\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "19b85061-a1b0-458b-9d00-96cde6f37dca", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Example image:\n" - ] - }, - { - "data": { - "text/html": [ - "
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Example Batch. Pink pixels denote the batch of rays:\n" - ] - }, - { - "data": { - "text/html": [ - "
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "print(\"Example image:\")\n", - "media.show_image(image_dataset_train.get_image(10), height=200)\n", - "print(\"Example Batch. Pink pixels denote the batch of rays:\")\n", - "batch = sample_and_show_batch()" - ] - }, - { - "cell_type": "markdown", - "id": "6eaab4db", - "metadata": {}, - "source": [ - "## Visualize cameras and ray\n", - "Camera origins denoted with black dots. A subset of camera rays are rendered for some cameras." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "fd8cf48a-823e-4395-99ca-eda4c2026440", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "marker": { - "color": "rgba(0, 0, 0, 1)", - "size": 8 - }, - "mode": "markers", - "name": "origins", - "type": "scatter3d", - "x": [ - -0.05379832163453102, - -1.398659110069275, - -3.385493516921997, - -1.2464345693588257, - 2.8865230083465576, - -2.8906705379486084, - 2.232801914215088, - -0.12979382276535034, - -3.7495899200439453, - -3.4902923107147217, - -3.3551595211029053, - 0.52907395362854, - -0.48754292726516724, - 2.1348819732666016, - -1.9585098028182983, - 2.6538169384002686, - -3.1899499893188477, - 3.7242627143859863, - 0.9608983993530273, - 3.1680095195770264, - 1.9119539260864258, - -0.7987216114997864, - 2.8507351875305176, - -2.8561718463897705, - -2.1008365154266357, - 3.637409210205078, - 0.8770476579666138, - -0.42073559761047363, - 2.111776828765869, - -1.6116830110549927, - 1.7322875261306763, - -1.2971957921981812, - -3.9398677349090576, - 1.6561487913131714, - -2.247554063796997, - -3.3836936950683594, - 1.7566769123077393, - 0.8783321380615234, - -2.10075044631958, - -0.13960279524326324, - -3.3427348136901855, - -0.41710659861564636, - 0.47436219453811646, - 1.9496005773544312, - -1.8393374681472778, - -2.589273452758789, - 0.007521961349993944, - 0.42152610421180725, - 0.014908524230122566, - 1.434301733970642, - 1.1368069648742676, - -2.0656259059906006, - -3.002284049987793, - -3.886370897293091, - -3.3270153999328613, - 1.413723111152649, - -0.6229158639907837, - 0.339978963136673, - -2.315235137939453, - 3.168043851852417, - -2.7338404655456543, - -0.020868491381406784, - -1.1724741458892822, - 2.3183114528656006, - -0.8277195692062378, - 0.7858693599700928, - -1.683483362197876, - -0.019819926470518112, - 2.9369475841522217, - -3.872175693511963, - 1.0423099994659424, - -0.9127683639526367, - 3.5749754905700684, - 2.5896217823028564, - 2.546081066131592, - -0.7928509712219238, - -0.246016725897789, - 1.649032473564148, - -2.904823064804077, - 0.07294226437807083, - 2.52870512008667, - -1.7133750915527344, - -0.4118720591068268, - -3.530200481414795, - 0.692101001739502, - -3.933959484100342, - 1.1644508838653564, - -2.0406837463378906, - -0.00454852357506752, - -0.359662264585495, - -3.4366254806518555, - 0.21033930778503418, - -1.3956377506256104, - -1.8584816455841064, - -2.961758852005005, - 3.5639960765838623, - -3.008035659790039, - -3.4969570636749268, - -0.31046348810195923, - 2.1031012535095215 - ], - "y": [ - 3.845470428466797, - 3.5542497634887695, - -1.6727094650268555, - -1.6370664834976196, - 2.513216972351074, - 0.35454243421554565, - -1.9462224245071411, - -0.2752881646156311, - -0.607723593711853, - 0.8376882672309875, - -2.052626848220825, - 2.357914447784424, - 1.9911646842956543, - -3.3444597721099854, - 0.12458765506744385, - 2.5058655738830566, - -0.41941213607788086, - -1.1142032146453857, - 0.09413626790046692, - -2.1722869873046875, - -2.9874486923217773, - -1.6971794366836548, - 1.4779094457626343, - 1.5105533599853516, - -2.5676472187042236, - 0.5946717858314514, - 3.8690884113311768, - 2.9980766773223877, - -2.678037405014038, - -3.2011020183563232, - 0.5184860825538635, - 0.20353946089744568, - -0.0002467483573127538, - -1.8396297693252563, - 2.600733995437622, - 1.4670655727386475, - -2.0910537242889404, - 0.4593953788280487, - 3.081249952316284, - 1.6944570541381836, - 1.6285674571990967, - 3.9297399520874023, - 3.9500086307525635, - -1.4704318046569824, - -1.0502654314041138, - 1.7476580142974854, - -2.830711603164673, - 0.9678280353546143, - -1.1474518775939941, - -0.5783282518386841, - 2.938887357711792, - 3.2936851978302, - -2.0935845375061035, - -0.8260704278945923, - 1.048954725265503, - -3.6711270809173584, - 0.43254923820495605, - 1.7784502506256104, - 0.8177154660224915, - 0.929991602897644, - 2.8357691764831543, - 2.721303939819336, - 0.31767338514328003, - -3.021360397338867, - 3.885237693786621, - -3.873871326446533, - 1.7009721994400024, - 3.505112648010254, - -1.7953004837036133, - -0.925791323184967, - -3.6946234703063965, - -2.8198866844177246, - -1.238826036453247, - -2.1953184604644775, - 2.666229724884033, - 3.892266273498535, - -3.701932668685913, - 0.5256894826889038, - 2.6168203353881836, - 1.9539530277252197, - -1.077824592590332, - 3.422126293182373, - 1.2020422220230103, - 0.1713196337223053, - -2.587653875350952, - 0.5637863874435425, - -1.5312353372573853, - -1.0129939317703247, - 0.0694514811038971, - -3.9271185398101807, - -0.2910483777523041, - -1.1386629343032837, - -2.2291290760040283, - -1.0084656476974487, - 1.6074209213256836, - -1.813332438468933, - 1.805651307106018, - 0.29924672842025757, - -3.731215476989746, - -1.032314419746399 - ], - "z": [ - 1.2080823183059692, - 1.2888214588165283, - 1.4108426570892334, - 3.4664700031280518, - 1.26559317111969, - 2.7871713638305664, - 2.7343761920928955, - 4.019623279571533, - 1.3495359420776367, - 1.834703803062439, - 0.882965087890625, - 3.2265028953552246, - 3.4709601402282715, - 0.7119466662406921, - 3.521181106567383, - 1.7111091613769531, - 2.4286444187164307, - 1.066967248916626, - 3.913797616958618, - 1.2226545810699463, - 1.915615439414978, - 3.5681405067443848, - 2.437025308609009, - 2.4105000495910645, - 2.2899067401885986, - 1.6326723098754883, - 0.7148017883300781, - 2.6616756916046143, - 2.1490728855133057, - 1.8453792333602905, - 3.60282564163208, - 3.8112800121307373, - 0.8529018759727478, - 3.1816558837890625, - 2.1058690547943115, - 1.6273707151412964, - 2.965060234069824, - 3.9073634147644043, - 1.5306031703948975, - 3.655041217803955, - 1.5568854808807373, - 0.7957176566123962, - 0.6499325037002563, - 3.207318067550659, - 3.4298367500305176, - 2.5478134155273438, - 2.8700201511383057, - 3.8904531002044678, - 3.8643410205841064, - 3.7226758003234863, - 2.514082431793213, - 1.0652819871902466, - 1.6891403198242188, - 0.6809762716293335, - 2.0200648307800293, - 0.8798936009407043, - 3.959151029586792, - 3.6016008853912354, - 3.1970341205596924, - 2.31270694732666, - 0.8570468425750732, - 2.973897933959961, - 3.8437466621398926, - 1.3216705322265625, - 0.6854256391525269, - 0.7909042835235596, - 3.243852376937866, - 1.990927815437317, - 2.097911834716797, - 0.6317951679229736, - 1.2301819324493408, - 2.7322323322296143, - 1.3909926414489746, - 2.173576593399048, - 1.6305487155914307, - 0.6867690086364746, - 1.576442003250122, - 3.640651226043701, - 0.9819653034210205, - 3.5251591205596924, - 2.948549509048462, - 1.2662529945373535, - 3.8256313800811768, - 1.9386422634124756, - 3.012481451034546, - 0.6753571033477783, - 3.5425093173980713, - 3.325575590133667, - 4.0305280685424805, - 0.8356927633285522, - 2.086838722229004, - 3.861243963241577, - 3.055025339126587, - 3.432060956954956, - 2.212280035018921, - 0.5096641182899475, - 1.9852819442749023, - 1.982862114906311, - 1.4938690662384033, - 3.2804408073425293 - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8914490938186646, - -0.16922688484191895, - 0.8226028680801392 - ], - [ - 0.325228214263916, - 1.3703604936599731, - 1.1156476736068726 - ] - ], - "y": [ - [ - 0.5180797576904297, - -0.6653734445571899, - 1.7256240844726562 - ], - [ - -1.0876350402832031, - 0.5340501070022583, - 0.7809998989105225 - ] - ], - "z": [ - [ - 1.573108196258545, - -0.6112486124038696, - 0.07401898503303528 - ], - [ - -0.2912161350250244, - 0.5144170522689819, - -0.333931565284729 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7626197338104248, - -0.04258835315704346, - 0.8467072248458862 - ], - [ - -0.4419839382171631, - 2.1245265007019043, - 1.2591955661773682 - ] - ], - "y": [ - [ - 0.3860018253326416, - -0.5667150020599365, - 1.6479241847991943 - ], - [ - -1.8741936683654785, - 1.1215869188308716, - 0.31827640533447266 - ] - ], - "z": [ - [ - 1.4197585582733154, - -0.5186570882797241, - 0.04046306014060974 - ], - [ - -1.2044541835784912, - 1.0658236742019653, - -0.5337658524513245 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.1664161682128906, - -0.43951845169067383, - 0.7711556553840637 - ], - [ - -0.7262804508209229, - 2.4039883613586426, - 1.3123881816864014 - ] - ], - "y": [ - [ - 0.799980640411377, - -0.8759454488754272, - 1.891463279724121 - ], - [ - -2.165658950805664, - 1.3393033742904663, - 0.14681029319763184 - ] - ], - "z": [ - [ - 1.900410771369934, - -0.8088716268539429, - 0.14563918113708496 - ], - [ - -1.5428617000579834, - 1.2701517343521118, - -0.6078160405158997 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.0288596153259277, - -0.3043009042739868, - 0.7968928813934326 - ], - [ - -0.16124510765075684, - 1.848561406135559, - 1.2066683769226074 - ] - ], - "y": [ - [ - 0.6589553356170654, - -0.7706035375595093, - 1.8084996938705444 - ], - [ - -1.5863754749298096, - 0.9065951108932495, - 0.4875965118408203 - ] - ], - "z": [ - [ - 1.7366726398468018, - -0.7100076675415039, - 0.10981008410453796 - ], - [ - -0.870281457901001, - 0.864052414894104, - -0.46064233779907227 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.2506983280181885, - -0.5223672389984131, - 0.755386233329773 - ], - [ - -0.39108729362487793, - 2.074495315551758, - 1.2496726512908936 - ] - ], - "y": [ - [ - 0.8863879442214966, - -0.9404892921447754, - 1.942295789718628 - ], - [ - -1.8220133781433105, - 1.08260977268219, - 0.34897327423095703 - ] - ], - "z": [ - [ - 2.000734329223633, - -0.8694462776184082, - 0.16759195923805237 - ], - [ - -1.1438701152801514, - 1.0292433500289917, - -0.5205089449882507 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.5242877006530762, - 0.19169080257415771, - 0.8912999033927917 - ], - [ - 0.09078383445739746, - 1.6008182764053345, - 1.159512996673584 - ] - ], - "y": [ - [ - 0.14165997505187988, - -0.38419854640960693, - 1.5041805505752563 - ], - [ - -1.327991247177124, - 0.7135893106460571, - 0.6396009922027588 - ] - ], - "z": [ - [ - 1.136064052581787, - -0.3473644256591797, - -0.021614789962768555 - ], - [ - -0.5702831745147705, - 0.6829158067703247, - -0.39499688148498535 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.015348434448242, - -0.2910195589065552, - 0.7994208931922913 - ], - [ - -0.15828394889831543, - 1.845650553703308, - 1.2061142921447754 - ] - ], - "y": [ - [ - 0.6451035737991333, - -0.7602566480636597, - 1.8003507852554321 - ], - [ - -1.5833396911621094, - 0.9043272733688354, - 0.489382266998291 - ] - ], - "z": [ - [ - 1.7205898761749268, - -0.7002969980239868, - 0.10629087686538696 - ], - [ - -0.8667566776275635, - 0.8619242906570435, - -0.4598710536956787 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.0105090141296387, - -0.28626227378845215, - 0.800326406955719 - ], - [ - -0.20577621459960938, - 1.892335295677185, - 1.2150002717971802 - ] - ], - "y": [ - [ - 0.6401418447494507, - -0.7565504312515259, - 1.7974319458007812 - ], - [ - -1.6320295333862305, - 0.9406973123550415, - 0.4607386589050293 - ] - ], - "z": [ - [ - 1.7148292064666748, - -0.6968187093734741, - 0.10503029823303223 - ], - [ - -0.923288106918335, - 0.8960577249526978, - -0.47224128246307373 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8462870121002197, - -0.1248328685760498, - 0.831052839756012 - ], - [ - -0.22632932662963867, - 1.9125388860702515, - 1.2188458442687988 - ] - ], - "y": [ - [ - 0.47177886962890625, - -0.6307880878448486, - 1.6983858346939087 - ], - [ - -1.6531007289886475, - 0.9564369916915894, - 0.44834256172180176 - ] - ], - "z": [ - [ - 1.519350290298462, - -0.5787899494171143, - 0.06225574016571045 - ], - [ - -0.9477531909942627, - 0.9108294248580933, - -0.47759467363357544 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8648284673690796, - -0.1430588960647583, - 0.8275836706161499 - ], - [ - -0.29064393043518066, - 1.9757596254348755, - 1.230879306793213 - ] - ], - "y": [ - [ - 0.4907877445220947, - -0.6449871063232422, - 1.7095686197280884 - ], - [ - -1.7190370559692383, - 1.0056895017623901, - 0.40955305099487305 - ] - ], - "z": [ - [ - 1.5414206981658936, - -0.5921159982681274, - 0.0670851469039917 - ], - [ - -1.0243089199066162, - 0.9570533037185669, - -0.494346559047699 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 3.5639960765838623, - -1.813332438468933, - 0.5096641182899475 - ], - [ - 3.5639960765838623, - -1.813332438468933, - 0.5096641182899475 - ] - ], - "y": [ - [ - 2.232801914215088, - -1.9462224245071411, - 2.7343761920928955 - ], - [ - 2.232801914215088, - -1.9462224245071411, - 2.7343761920928955 - ] - ], - "z": [ - [ - 3.5639960765838623, - -1.813332438468933, - 0.5096641182899475 - ], - [ - 3.5639960765838623, - -1.813332438468933, - 0.5096641182899475 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.731647253036499, - -0.012142539024353027, - 0.8525023460388184 - ], - [ - -0.30777835845947266, - 1.9926027059555054, - 1.234085202217102 - ] - ], - "y": [ - [ - 0.3542482852935791, - -0.5429960489273071, - 1.6292439699172974 - ], - [ - -1.7366037368774414, - 1.0188113451004028, - 0.3992187976837158 - ] - ], - "z": [ - [ - 1.3828909397125244, - -0.49639666080474854, - 0.03239572048187256 - ], - [ - -1.0447046756744385, - 0.9693681001663208, - -0.4988095164299011 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.9034056663513184, - -0.18098020553588867, - 0.8203657865524292 - ], - [ - -0.37729597091674805, - 2.0609383583068848, - 1.2470921277999878 - ] - ], - "y": [ - [ - 0.5303378105163574, - -0.6745299100875854, - 1.7328354120254517 - ], - [ - -1.8078742027282715, - 1.072048306465149, - 0.35729122161865234 - ] - ], - "z": [ - [ - 1.5873404741287231, - -0.6198419332504272, - 0.07713329792022705 - ], - [ - -1.1274535655975342, - 1.0193313360214233, - -0.5169166922569275 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.853432536125183, - -0.1318567991256714, - 0.8297159075737 - ], - [ - 0.12034153938293457, - 1.5717631578445435, - 1.1539826393127441 - ] - ], - "y": [ - [ - 0.47910451889038086, - -0.6362601518630981, - 1.7026954889297485 - ], - [ - -1.2976882457733154, - 0.6909538507461548, - 0.6574277877807617 - ] - ], - "z": [ - [ - 1.5278558731079102, - -0.5839256048202515, - 0.06411689519882202 - ], - [ - -0.5350997447967529, - 0.6616722345352173, - -0.387298047542572 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.9850397109985352, - -0.2612260580062866, - 0.8050917387008667 - ], - [ - -0.23113346099853516, - 1.9172612428665161, - 1.2197446823120117 - ] - ], - "y": [ - [ - 0.6140303611755371, - -0.7370458841323853, - 1.7820708751678467 - ], - [ - -1.6580262184143066, - 0.9601160287857056, - 0.44544506072998047 - ] - ], - "z": [ - [ - 1.6845122575759888, - -0.6785135269165039, - 0.09839639067649841 - ], - [ - -0.9534718990325928, - 0.9142822027206421, - -0.47884601354599 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.9763017892837524, - -0.25263679027557373, - 0.8067266941070557 - ], - [ - -0.2521357536315918, - 1.9379063844680786, - 1.2236742973327637 - ] - ], - "y": [ - [ - 0.6050721406936646, - -0.7303543090820312, - 1.7768008708953857 - ], - [ - -1.6795580387115479, - 0.976199746131897, - 0.43277812004089355 - ] - ], - "z": [ - [ - 1.674111247062683, - -0.6722334623336792, - 0.09612041711807251 - ], - [ - -0.9784715175628662, - 0.9293769598007202, - -0.48431646823883057 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.4682552814483643, - 0.24677050113677979, - 0.90178382396698 - ], - [ - 0.08259201049804688, - 1.6088706254959106, - 1.1610456705093384 - ] - ], - "y": [ - [ - 0.08421444892883301, - -0.3412884473800659, - 1.470386028289795 - ], - [ - -1.3363895416259766, - 0.7198628187179565, - 0.6346602439880371 - ] - ], - "z": [ - [ - 1.069366455078125, - -0.3070930242538452, - -0.03620952367782593 - ], - [ - -0.5800340175628662, - 0.6888033151626587, - -0.39713054895401 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7357730865478516, - -0.016198277473449707, - 0.8517303466796875 - ], - [ - -0.5793235301971436, - 2.259530544281006, - 1.284892201423645 - ] - ], - "y": [ - [ - 0.3584781885147095, - -0.5461556911468506, - 1.6317323446273804 - ], - [ - -2.0149965286254883, - 1.2267626523971558, - 0.2354435920715332 - ] - ], - "z": [ - [ - 1.3878018856048584, - -0.4993619918823242, - 0.033470362424850464 - ], - [ - -1.367933988571167, - 1.1645315885543823, - -0.569538414478302 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.5100915431976318, - 0.20564568042755127, - 0.8939560651779175 - ], - [ - -0.08186936378479004, - 1.7705353498458862, - 1.1918169260025024 - ] - ], - "y": [ - [ - 0.127105712890625, - -0.37332701683044434, - 1.495618462562561 - ], - [ - -1.5049982070922852, - 0.8458083868026733, - 0.5354697704315186 - ] - ], - "z": [ - [ - 1.1191656589508057, - -0.33716142177581787, - -0.025312483310699463 - ], - [ - -0.7757976055145264, - 0.8070040941238403, - -0.4399675130844116 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8520190715789795, - -0.13046741485595703, - 0.8299803733825684 - ], - [ - -0.3158743381500244, - 2.000561237335205, - 1.2355999946594238 - ] - ], - "y": [ - [ - 0.47765541076660156, - -0.6351776123046875, - 1.7018429040908813 - ], - [ - -1.744903802871704, - 1.0250111818313599, - 0.3943359851837158 - ] - ], - "z": [ - [ - 1.5261733531951904, - -0.5829097032546997, - 0.06374871730804443 - ], - [ - -1.0543415546417236, - 0.9751867055892944, - -0.5009183287620544 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.9472709894180298, - -0.2240995168685913, - 0.812158465385437 - ], - [ - -0.321913480758667, - 2.006497859954834, - 1.2367298603057861 - ] - ], - "y": [ - [ - 0.5753092765808105, - -0.7081222534179688, - 1.759291648864746 - ], - [ - -1.7510952949523926, - 1.029636025428772, - 0.39069366455078125 - ] - ], - "z": [ - [ - 1.6395548582077026, - -0.6513686180114746, - 0.08855882287025452 - ], - [ - -1.061530351638794, - 0.9795273542404175, - -0.502491295337677 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.6329998970031738, - 0.08482730388641357, - 0.8709595203399658 - ], - [ - 0.24136757850646973, - 1.452795147895813, - 1.131338357925415 - ] - ], - "y": [ - [ - 0.2531135082244873, - -0.46745121479034424, - 1.5697474479675293 - ], - [ - -1.1736104488372803, - 0.5982712507247925, - 0.7304215431213379 - ] - ], - "z": [ - [ - 1.265467643737793, - -0.4254974126815796, - 0.006701231002807617 - ], - [ - -0.391038179397583, - 0.5746890306472778, - -0.35577458143234253 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8247497081756592, - -0.10366177558898926, - 0.8350825309753418 - ], - [ - -0.7032296657562256, - 2.3813295364379883, - 1.3080754280090332 - ] - ], - "y": [ - [ - 0.44969844818115234, - -0.6142945289611816, - 1.6853961944580078 - ], - [ - -2.142026901245117, - 1.3216508626937866, - 0.16071295738220215 - ] - ], - "z": [ - [ - 1.4937138557434082, - -0.5633107423782349, - 0.05664592981338501 - ], - [ - -1.5154235363006592, - 1.2535847425460815, - -0.6018120646476746 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8011661767959595, - -0.08047926425933838, - 0.839495062828064 - ], - [ - -0.40949487686157227, - 2.092589855194092, - 1.2531166076660156 - ] - ], - "y": [ - [ - 0.42552030086517334, - -0.5962342023849487, - 1.6711723804473877 - ], - [ - -1.8408851623535156, - 1.096706509590149, - 0.3378713130950928 - ] - ], - "z": [ - [ - 1.4656414985656738, - -0.546360969543457, - 0.050503164529800415 - ], - [ - -1.1657812595367432, - 1.0424731969833374, - -0.5253034234046936 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.068432331085205, - -0.3432004451751709, - 0.7894887924194336 - ], - [ - 0.1305065155029297, - 1.561771035194397, - 1.152080774307251 - ] - ], - "y": [ - [ - 0.6995255947113037, - -0.8009084463119507, - 1.832366704940796 - ], - [ - -1.2872672080993652, - 0.6831694841384888, - 0.6635584831237793 - ] - ], - "z": [ - [ - 1.7837769985198975, - -0.7384488582611084, - 0.1201174259185791 - ], - [ - -0.5230000019073486, - 0.6543663740158081, - -0.38465040922164917 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8136311769485474, - -0.09273231029510498, - 0.8371628522872925 - ], - [ - -0.73050856590271, - 2.408144474029541, - 1.31317937374115 - ] - ], - "y": [ - [ - 0.43829965591430664, - -0.6057800054550171, - 1.6786903142929077 - ], - [ - -2.1699938774108887, - 1.3425413370132446, - 0.14426040649414062 - ] - ], - "z": [ - [ - 1.4804790019989014, - -0.5553197860717773, - 0.053749918937683105 - ], - [ - -1.5478947162628174, - 1.2731906175613403, - -0.6089172959327698 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.538773775100708, - 0.1774512529373169, - 0.8885895609855652 - ], - [ - 0.07942509651184082, - 1.6119838953018188, - 1.1616382598876953 - ] - ], - "y": [ - [ - 0.1565113067626953, - -0.3952920436859131, - 1.512917399406433 - ], - [ - -1.3396365642547607, - 0.7222880125045776, - 0.6327502727508545 - ] - ], - "z": [ - [ - 1.1533069610595703, - -0.3577756881713867, - -0.017841696739196777 - ], - [ - -0.5838038921356201, - 0.6910794973373413, - -0.3979554772377014 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.6909633874893188, - 0.027849555015563965, - 0.8601143956184387 - ], - [ - 0.11019349098205566, - 1.5817385911941528, - 1.155881404876709 - ] - ], - "y": [ - [ - 0.3125385046005249, - -0.5118399858474731, - 1.6047065258026123 - ], - [ - -1.3080923557281494, - 0.6987253427505493, - 0.6513073444366455 - ] - ], - "z": [ - [ - 1.334463357925415, - -0.46715664863586426, - 0.02179884910583496 - ], - [ - -0.5471789836883545, - 0.6689656972885132, - -0.3899412751197815 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.5645673274993896, - 0.15209627151489258, - 0.8837634921073914 - ], - [ - 0.17816853523254395, - 1.514919400215149, - 1.1431629657745361 - ] - ], - "y": [ - [ - 0.18295526504516602, - -0.41504502296447754, - 1.5284740924835205 - ], - [ - -1.238403081893921, - 0.6466695070266724, - 0.6923048496246338 - ] - ], - "z": [ - [ - 1.1840100288391113, - -0.3763139247894287, - -0.011123239994049072 - ], - [ - -0.4662659168243408, - 0.6201108694076538, - -0.37223589420318604 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.788474440574646, - -0.06800341606140137, - 0.8418697714805603 - ], - [ - -0.7922303676605225, - 2.4688167572021484, - 1.3247277736663818 - ] - ], - "y": [ - [ - 0.412508487701416, - -0.5865147113800049, - 1.663517713546753 - ], - [ - -2.233272075653076, - 1.3898085355758667, - 0.10703444480895996 - ] - ], - "z": [ - [ - 1.4505341053009033, - -0.5372391939163208, - 0.04719740152359009 - ], - [ - -1.6213643550872803, - 1.3175510168075562, - -0.6249939799308777 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8873653411865234, - -0.16521263122558594, - 0.8233669996261597 - ], - [ - -0.4659006595611572, - 2.148036479949951, - 1.2636704444885254 - ] - ], - "y": [ - [ - 0.5138930082321167, - -0.6622461080551147, - 1.7231611013412476 - ], - [ - -1.8987135887145996, - 1.1399027109146118, - 0.3038513660430908 - ] - ], - "z": [ - [ - 1.5682471990585327, - -0.6083135604858398, - 0.07295531034469604 - ], - [ - -1.2329232692718506, - 1.0830129384994507, - -0.5399954915046692 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.094330310821533, - -0.36865806579589844, - 0.7846431732177734 - ], - [ - -0.8405330181121826, - 2.5162978172302246, - 1.3337652683258057 - ] - ], - "y": [ - [ - 0.7260767221450806, - -0.8207412958145142, - 1.8479864597320557 - ], - [ - -2.282792091369629, - 1.426798701286316, - 0.07790207862854004 - ] - ], - "z": [ - [ - 1.8146042823791504, - -0.7570621967315674, - 0.126863032579422 - ], - [ - -1.6788599491119385, - 1.3522664308547974, - -0.637575089931488 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8441582918167114, - -0.12274038791656494, - 0.8314511775970459 - ], - [ - -0.33368897438049316, - 2.0180726051330566, - 1.2389330863952637 - ] - ], - "y": [ - [ - 0.4695965051651001, - -0.6291579008102417, - 1.6971019506454468 - ], - [ - -1.7631676197052002, - 1.0386537313461304, - 0.3835916519165039 - ] - ], - "z": [ - [ - 1.5168163776397705, - -0.5772600173950195, - 0.06170126795768738 - ], - [ - -1.0755469799041748, - 0.9879904985427856, - -0.505558431148529 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.6674540042877197, - 0.050959110260009766, - 0.8645130395889282 - ], - [ - 0.06827926635742188, - 1.622940182685852, - 1.1637237071990967 - ] - ], - "y": [ - [ - 0.28843629360198975, - -0.4938364028930664, - 1.5905274152755737 - ], - [ - -1.3510634899139404, - 0.7308236360549927, - 0.6260278224945068 - ] - ], - "z": [ - [ - 1.3064794540405273, - -0.4502600431442261, - 0.01567542552947998 - ], - [ - -0.5970709323883057, - 0.6990901231765747, - -0.4008585810661316 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.5758793354034424, - 0.1409766674041748, - 0.881646990776062 - ], - [ - 0.15319037437438965, - 1.5394729375839233, - 1.147836446762085 - ] - ], - "y": [ - [ - 0.19455242156982422, - -0.4237077236175537, - 1.5352966785430908 - ], - [ - -1.2640111446380615, - 0.6657980680465698, - 0.6772396564483643 - ] - ], - "z": [ - [ - 1.1974751949310303, - -0.384443998336792, - -0.008176863193511963 - ], - [ - -0.4959986209869385, - 0.6380633115768433, - -0.378741979598999 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.1714982986450195, - -0.4445139169692993, - 0.7702047824859619 - ], - [ - -0.6092627048492432, - 2.2889604568481445, - 1.2904939651489258 - ] - ], - "y": [ - [ - 0.8051906824111938, - -0.8798372745513916, - 1.8945283889770508 - ], - [ - -2.0456905364990234, - 1.2496904134750366, - 0.21738648414611816 - ] - ], - "z": [ - [ - 1.9064600467681885, - -0.8125240802764893, - 0.14696288108825684 - ], - [ - -1.4035718441009521, - 1.1860493421554565, - -0.5773367285728455 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.609310507774353, - 0.10811388492584229, - 0.8753919005393982 - ], - [ - 0.0680534839630127, - 1.6231621503829956, - 1.1637659072875977 - ] - ], - "y": [ - [ - 0.22882676124572754, - -0.44930970668792725, - 1.5554598569869995 - ], - [ - -1.351294994354248, - 0.7309964895248413, - 0.6258916854858398 - ] - ], - "z": [ - [ - 1.237269401550293, - -0.40847158432006836, - 0.0005308985710144043 - ], - [ - -0.5973398685455322, - 0.6992522478103638, - -0.4009174108505249 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.9631211757659912, - -0.23968029022216797, - 0.8091927766799927 - ], - [ - -0.2838163375854492, - 1.9690481424331665, - 1.2296018600463867 - ] - ], - "y": [ - [ - 0.5915591716766357, - -0.720260500907898, - 1.7688512802124023 - ], - [ - -1.7120373249053955, - 1.0004609823226929, - 0.41367101669311523 - ] - ], - "z": [ - [ - 1.6584218740463257, - -0.6627603769302368, - 0.09268727898597717 - ], - [ - -1.0161817073822021, - 0.9521461725234985, - -0.4925681948661804 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7490936517715454, - -0.02929222583770752, - 0.8492380380630493 - ], - [ - -0.5497772693634033, - 2.2304863929748535, - 1.2793638706207275 - ] - ], - "y": [ - [ - 0.3721346855163574, - -0.55635666847229, - 1.6397662162780762 - ], - [ - -1.9847044944763184, - 1.204135775566101, - 0.2532637119293213 - ] - ], - "z": [ - [ - 1.4036579132080078, - -0.5089356899261475, - 0.03693994879722595 - ], - [ - -1.332763910293579, - 1.1432961225509644, - -0.5618425011634827 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.1078786849975586, - -0.38197600841522217, - 0.7821082472801208 - ], - [ - -0.8969829082489014, - 2.5717883110046387, - 1.3443272113800049 - ] - ], - "y": [ - [ - 0.7399667501449585, - -0.831116795539856, - 1.8561577796936035 - ], - [ - -2.340665817260742, - 1.4700287580490112, - 0.04385566711425781 - ] - ], - "z": [ - [ - 1.8307312726974487, - -0.7667995691299438, - 0.1303919553756714 - ], - [ - -1.7460544109344482, - 1.3928381204605103, - -0.6522786021232605 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.550339698791504, - 0.16608202457427979, - 0.8864254951477051 - ], - [ - 0.2329573631286621, - 1.4610623121261597, - 1.1329119205474854 - ] - ], - "y": [ - [ - 0.16836881637573242, - -0.40414929389953613, - 1.5198930501937866 - ], - [ - -1.1822326183319092, - 0.6047118902206421, - 0.7253491878509521 - ] - ], - "z": [ - [ - 1.16707444190979, - -0.36608827114105225, - -0.014829158782958984 - ], - [ - -0.4010491371154785, - 0.5807334184646606, - -0.3579651713371277 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.1631622314453125, - -0.43631982803344727, - 0.7717645168304443 - ], - [ - -0.062081098556518555, - 1.7510837316513062, - 1.1881145238876343 - ] - ], - "y": [ - [ - 0.7966445684432983, - -0.8734534978866577, - 1.8895007371902466 - ], - [ - -1.484710931777954, - 0.830654501914978, - 0.5474045276641846 - ] - ], - "z": [ - [ - 1.8965375423431396, - -0.8065328598022461, - 0.1447916328907013 - ], - [ - -0.7522432804107666, - 0.7927819490432739, - -0.43481332063674927 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.933075189590454, - -0.2101452350616455, - 0.8148145079612732 - ], - [ - -0.1412220001220703, - 1.8288787603378296, - 1.202921986579895 - ] - ], - "y": [ - [ - 0.5607556104660034, - -0.6972510814666748, - 1.7507297992706299 - ], - [ - -1.565847396850586, - 0.8912612199783325, - 0.49967288970947266 - ] - ], - "z": [ - [ - 1.6226571798324585, - -0.6411659717559814, - 0.08486127853393555 - ], - [ - -0.846447229385376, - 0.8496617078781128, - -0.45542699098587036 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 0.6749060153961182, - 1.026629090309143, - 1.0502219200134277 - ], - [ - -0.11934733390808105, - 1.8073762655258179, - 1.198829174041748 - ] - ], - "y": [ - [ - -0.7291398048400879, - 0.26626431941986084, - 0.9918986558914185 - ], - [ - -1.5434212684631348, - 0.8745094537734985, - 0.5128660202026367 - ] - ], - "z": [ - [ - 0.1250169277191162, - 0.2630985975265503, - -0.24285167455673218 - ], - [ - -0.8204090595245361, - 0.8339401483535767, - -0.449729323387146 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.810802936553955, - -0.08995211124420166, - 0.8376920223236084 - ], - [ - -0.3877732753753662, - 2.071237564086914, - 1.2490525245666504 - ] - ], - "y": [ - [ - 0.43540000915527344, - -0.6036139726638794, - 1.6769845485687256 - ], - [ - -1.8186159133911133, - 1.080072045326233, - 0.35097193717956543 - ] - ], - "z": [ - [ - 1.4771122932434082, - -0.5532870292663574, - 0.053013235330581665 - ], - [ - -1.139925241470337, - 1.026861548423767, - -0.519645631313324 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8490314483642578, - -0.12753057479858398, - 0.830539345741272 - ], - [ - -0.4222686290740967, - 2.1051464080810547, - 1.2555067539215088 - ] - ], - "y": [ - [ - 0.47459256649017334, - -0.6328897476196289, - 1.7000410556793213 - ], - [ - -1.8539810180664062, - 1.106488823890686, - 0.3301670551300049 - ] - ], - "z": [ - [ - 1.5226171016693115, - -0.5807623863220215, - 0.06297054886817932 - ], - [ - -1.1809861660003662, - 1.0516539812088013, - -0.5286306738853455 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.696293592453003, - 0.022609949111938477, - 0.8591170907020569 - ], - [ - 0.02638721466064453, - 1.6641196012496948, - 1.1715617179870605 - ] - ], - "y": [ - [ - 0.31800317764282227, - -0.515921950340271, - 1.6079212427139282 - ], - [ - -1.3940117359161377, - 0.7629047632217407, - 0.600761890411377 - ] - ], - "z": [ - [ - 1.3408081531524658, - -0.4709874391555786, - 0.023187190294265747 - ], - [ - -0.6469361782073975, - 0.7291983366012573, - -0.4117701053619385 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.958202838897705, - -0.23484551906585693, - 0.8101130723953247 - ], - [ - -0.37580370903015137, - 2.059471607208252, - 1.2468129396438599 - ] - ], - "y": [ - [ - 0.5865168571472168, - -0.7164939641952515, - 1.7658848762512207 - ], - [ - -1.8063445091247559, - 1.0709055662155151, - 0.35819125175476074 - ] - ], - "z": [ - [ - 1.6525673866271973, - -0.6592254638671875, - 0.09140622615814209 - ], - [ - -1.1256773471832275, - 1.0182589292526245, - -0.5165279507637024 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.2353618144989014, - 0.4757035970687866, - 0.9453588724136353 - ], - [ - -0.11093592643737793, - 1.7991076707839966, - 1.1972553730010986 - ] - ], - "y": [ - [ - -0.15455150604248047, - -0.16293704509735107, - 1.3299226760864258 - ], - [ - -1.5347976684570312, - 0.8680678606033325, - 0.5179390907287598 - ] - ], - "z": [ - [ - 0.7921459674835205, - -0.1397092342376709, - -0.0968707799911499 - ], - [ - -0.8103969097137451, - 0.8278945684432983, - -0.4475383758544922 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.6495087146759033, - 0.06859922409057617, - 0.8678706884384155 - ], - [ - 0.15092682838439941, - 1.5416978597640991, - 1.1482599973678589 - ] - ], - "y": [ - [ - 0.2700386047363281, - -0.48009371757507324, - 1.5797042846679688 - ], - [ - -1.266331672668457, - 0.6675313711166382, - 0.6758747100830078 - ] - ], - "z": [ - [ - 1.285118579864502, - -0.43736255168914795, - 0.011001259088516235 - ], - [ - -0.49869275093078613, - 0.6396900415420532, - -0.37933146953582764 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8308876752853394, - -0.10969531536102295, - 0.8339340686798096 - ], - [ - -0.6416547298431396, - 2.3208017349243164, - 1.2965545654296875 - ] - ], - "y": [ - [ - 0.455991268157959, - -0.6189950704574585, - 1.6890981197357178 - ], - [ - -2.0788989067077637, - 1.2744961977005005, - 0.19785022735595703 - ] - ], - "z": [ - [ - 1.5010199546813965, - -0.5677222013473511, - 0.058244675397872925 - ], - [ - -1.4421288967132568, - 1.2093299627304077, - -0.5857736468315125 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.6496641635894775, - 0.06844651699066162, - 0.8678416013717651 - ], - [ - -0.37554407119750977, - 2.0592164993286133, - 1.2467644214630127 - ] - ], - "y": [ - [ - 0.27019786834716797, - -0.4802126884460449, - 1.5797979831695557 - ], - [ - -1.8060784339904785, - 1.0707067251205444, - 0.35834765434265137 - ] - ], - "z": [ - [ - 1.2853035926818848, - -0.43747425079345703, - 0.011041730642318726 - ], - [ - -1.125368356704712, - 1.018072247505188, - -0.5164603590965271 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7954237461090088, - -0.07483446598052979, - 0.8405694961547852 - ], - [ - -0.422438383102417, - 2.105313301086426, - 1.2555384635925293 - ] - ], - "y": [ - [ - 0.41963303089141846, - -0.5918365716934204, - 1.6677089929580688 - ], - [ - -1.8541550636291504, - 1.1066187620162964, - 0.3300645351409912 - ] - ], - "z": [ - [ - 1.458806037902832, - -0.5422338247299194, - 0.04900744557380676 - ], - [ - -1.1811883449554443, - 1.0517760515213013, - -0.5286749005317688 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7135498523712158, - 0.005647182464599609, - 0.8558883666992188 - ], - [ - -0.18227505683898926, - 1.8692337274551392, - 1.21060311794281 - ] - ], - "y": [ - [ - 0.3356945514678955, - -0.5291368961334229, - 1.6183289289474487 - ], - [ - -1.6079356670379639, - 0.9226998090744019, - 0.4749128818511963 - ] - ], - "z": [ - [ - 1.3613488674163818, - -0.48338985443115234, - 0.02768191695213318 - ], - [ - -0.8953139781951904, - 0.8791669607162476, - -0.4661199450492859 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.049428939819336, - -0.324520468711853, - 0.7930443286895752 - ], - [ - -0.3144099712371826, - 1.9991217851638794, - 1.2353260517120361 - ] - ], - "y": [ - [ - 0.6800433397293091, - -0.78635573387146, - 1.8209054470062256 - ], - [ - -1.7434027194976807, - 1.0238898992538452, - 0.395219087600708 - ] - ], - "z": [ - [ - 1.7611569166183472, - -0.7247910499572754, - 0.11516773700714111 - ], - [ - -1.0525987148284912, - 0.9741343259811401, - -0.5005369782447815 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7694603204727173, - -0.049312591552734375, - 0.845427393913269 - ], - [ - -0.5029776096343994, - 2.184483051300049, - 1.2706077098846436 - ] - ], - "y": [ - [ - 0.39301490783691406, - -0.5719536542892456, - 1.6520498991012573 - ], - [ - -1.93672513961792, - 1.168296456336975, - 0.28148937225341797 - ] - ], - "z": [ - [ - 1.427901029586792, - -0.5235735177993774, - 0.04224482178688049 - ], - [ - -1.2770569324493408, - 1.1096607446670532, - -0.5496527552604675 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.5347464084625244, - 0.1814100742340088, - 0.8893430829048157 - ], - [ - 0.11934757232666016, - 1.5727401971817017, - 1.1541686058044434 - ] - ], - "y": [ - [ - 0.15238237380981445, - -0.3922078609466553, - 1.5104883909225464 - ], - [ - -1.2987074851989746, - 0.6917151212692261, - 0.6568284034729004 - ] - ], - "z": [ - [ - 1.1485133171081543, - -0.3548811674118042, - -0.018890678882598877 - ], - [ - -0.5362827777862549, - 0.6623865365982056, - -0.38755691051483154 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.4473490715026855, - 0.26732122898101807, - 0.9056954383850098 - ], - [ - -0.33344411849975586, - 2.0178322792053223, - 1.2388873100280762 - ] - ], - "y": [ - [ - 0.06278109550476074, - -0.32527828216552734, - 1.4577770233154297 - ], - [ - -1.7629168033599854, - 1.0384663343429565, - 0.3837392330169678 - ] - ], - "z": [ - [ - 1.0444812774658203, - -0.29206740856170654, - -0.041654884815216064 - ], - [ - -1.0752556324005127, - 0.9878145456314087, - -0.5054946541786194 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.0014400482177734, - -0.2773476839065552, - 0.80202317237854 - ], - [ - -0.19171380996704102, - 1.8785120248794556, - 1.2123692035675049 - ] - ], - "y": [ - [ - 0.6308444738388062, - -0.7496055364608765, - 1.7919623851776123 - ], - [ - -1.617612600326538, - 0.929928183555603, - 0.4692199230194092 - ] - ], - "z": [ - [ - 1.7040343284606934, - -0.6903008222579956, - 0.1026681661605835 - ], - [ - -0.9065492153167725, - 0.8859509229660034, - -0.4685784578323364 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.015618085861206, - -0.291284441947937, - 0.7993704676628113 - ], - [ - -0.3905315399169922, - 2.073948860168457, - 1.2495685815811157 - ] - ], - "y": [ - [ - 0.6453797817230225, - -0.7604629993438721, - 1.8005132675170898 - ], - [ - -1.8214435577392578, - 1.0821841955184937, - 0.34930849075317383 - ] - ], - "z": [ - [ - 1.720910668373108, - -0.7004907131195068, - 0.10636106133460999 - ], - [ - -1.1432082653045654, - 1.0288439989089966, - -0.5203641057014465 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8531972169876099, - -0.13162553310394287, - 0.829759955406189 - ], - [ - 0.29412150382995605, - 1.4009383916854858, - 1.1214678287506104 - ] - ], - "y": [ - [ - 0.47886335849761963, - -0.6360799074172974, - 1.7025535106658936 - ], - [ - -1.1195263862609863, - 0.55787193775177, - 0.762238621711731 - ] - ], - "z": [ - [ - 1.5275757312774658, - -0.5837564468383789, - 0.06405562162399292 - ], - [ - -0.3282434940338135, - 0.5367740392684937, - -0.34203386306762695 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7194703817367554, - -0.00017273426055908203, - 0.8547806739807129 - ], - [ - -0.34438562393188477, - 2.028587818145752, - 1.2409346103668213 - ] - ], - "y": [ - [ - 0.3417644500732422, - -0.5336709022521973, - 1.6218997240066528 - ], - [ - -1.7741341590881348, - 1.046845555305481, - 0.3771400451660156 - ] - ], - "z": [ - [ - 1.368396282196045, - -0.4876450300216675, - 0.029224038124084473 - ], - [ - -1.0882794857025146, - 0.9956783056259155, - -0.5083445906639099 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7092114686965942, - 0.009911775588989258, - 0.8567001223564148 - ], - [ - 0.45377063751220703, - 1.2440041303634644, - 1.091597080230713 - ] - ], - "y": [ - [ - 0.3312467336654663, - -0.5258145332336426, - 1.6157124042510986 - ], - [ - -0.9558515548706055, - 0.435611367225647, - 0.8585267066955566 - ] - ], - "z": [ - [ - 1.356184720993042, - -0.4802718162536621, - 0.026551902294158936 - ], - [ - -0.13820791244506836, - 0.4220317602157593, - -0.3004503846168518 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.9878884553909302, - -0.264026403427124, - 0.8045587539672852 - ], - [ - -0.22428655624389648, - 1.910530924797058, - 1.218463659286499 - ] - ], - "y": [ - [ - 0.6169509887695312, - -0.7392274141311646, - 1.7837889194488525 - ], - [ - -1.6510066986083984, - 0.954872727394104, - 0.44957470893859863 - ] - ], - "z": [ - [ - 1.6879031658172607, - -0.6805609464645386, - 0.09913837909698486 - ], - [ - -0.945321798324585, - 0.9093614816665649, - -0.4770626425743103 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8734091520309448, - -0.15149366855621338, - 0.8259782195091248 - ], - [ - -0.2673976421356201, - 1.9529088735580444, - 1.226529836654663 - ] - ], - "y": [ - [ - 0.4995849132537842, - -0.6515582799911499, - 1.7147438526153564 - ], - [ - -1.695204734802246, - 0.9878875017166138, - 0.42357325553894043 - ] - ], - "z": [ - [ - 1.5516345500946045, - -0.598283052444458, - 0.06932014226913452 - ], - [ - -0.9966385364532471, - 0.9403458833694458, - -0.48829174041748047 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.6583393812179565, - 0.059918761253356934, - 0.8662184476852417 - ], - [ - -0.4613974094390869, - 2.1436100006103516, - 1.2628278732299805 - ] - ], - "y": [ - [ - 0.2790919542312622, - -0.4868563413619995, - 1.585030198097229 - ], - [ - -1.894096851348877, - 1.1364539861679077, - 0.3065674304962158 - ] - ], - "z": [ - [ - 1.2956299781799316, - -0.44370925426483154, - 0.013301342725753784 - ], - [ - -1.227562665939331, - 1.079776406288147, - -0.5388224720954895 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8804038763046265, - -0.1583695411682129, - 0.8246694803237915 - ], - [ - -0.25154542922973633, - 1.9373263120651245, - 1.2235639095306396 - ] - ], - "y": [ - [ - 0.506756067276001, - -0.6569149494171143, - 1.718962550163269 - ], - [ - -1.678952932357788, - 0.9757477045059204, - 0.4331340789794922 - ] - ], - "z": [ - [ - 1.5599608421325684, - -0.603310227394104, - 0.07114207744598389 - ], - [ - -0.977769136428833, - 0.9289528131484985, - -0.48416268825531006 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.0717787742614746, - -0.3464900255203247, - 0.7888626456260681 - ], - [ - -0.09714627265930176, - 1.7855523824691772, - 1.1946752071380615 - ] - ], - "y": [ - [ - 0.7029565572738647, - -0.8034712076187134, - 1.8343851566314697 - ], - [ - -1.520660161972046, - 0.857507586479187, - 0.5262560844421387 - ] - ], - "z": [ - [ - 1.7877604961395264, - -0.7408541440963745, - 0.1209891140460968 - ], - [ - -0.7939822673797607, - 0.8179837465286255, - -0.44394659996032715 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.6802705526351929, - 0.03836047649383545, - 0.8621150255203247 - ], - [ - 0.013767242431640625, - 1.6765252351760864, - 1.1739230155944824 - ] - ], - "y": [ - [ - 0.3015761375427246, - -0.5036513805389404, - 1.5982574224472046 - ], - [ - -1.4069499969482422, - 0.7725692987442017, - 0.5931503772735596 - ] - ], - "z": [ - [ - 1.3217353820800781, - -0.45947158336639404, - 0.01901373267173767 - ], - [ - -0.6619584560394287, - 0.7382687330245972, - -0.4150572419166565 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.007600784301758, - -0.2834036350250244, - 0.8008705377578735 - ], - [ - -0.5622079372406006, - 2.242705821990967, - 1.2816898822784424 - ] - ], - "y": [ - [ - 0.6371605396270752, - -0.7543234825134277, - 1.7956780195236206 - ], - [ - -1.9974493980407715, - 1.2136555910110474, - 0.24576640129089355 - ] - ], - "z": [ - [ - 1.7113676071166992, - -0.6947286128997803, - 0.10427284240722656 - ], - [ - -1.3475606441497803, - 1.1522303819656372, - -0.565080463886261 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 0.9930779933929443, - 0.7138673067092896, - 0.9906909465789795 - ], - [ - -0.12218379974365234, - 1.8101643323898315, - 1.1993598937988281 - ] - ], - "y": [ - [ - -0.40294480323791504, - 0.0226057767868042, - 1.183795690536499 - ], - [ - -1.5463292598724365, - 0.8766816854476929, - 0.5111551284790039 - ] - ], - "z": [ - [ - 0.5037474632263184, - 0.03442370891571045, - -0.1599779725074768 - ], - [ - -0.8237855434417725, - 0.835978627204895, - -0.45046812295913696 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8697110414505005, - -0.14785850048065186, - 0.8266701698303223 - ], - [ - -0.2549920082092285, - 1.9407142400741577, - 1.2242087125778198 - ] - ], - "y": [ - [ - 0.4957934617996216, - -0.648726224899292, - 1.7125133275985718 - ], - [ - -1.6824862957000732, - 0.9783869981765747, - 0.43105554580688477 - ] - ], - "z": [ - [ - 1.5472326278686523, - -0.5956251621246338, - 0.06835690140724182 - ], - [ - -0.9818713665008545, - 0.9314297437667847, - -0.4850603938102722 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.654796838760376, - 0.06340110301971436, - 0.866881251335144 - ], - [ - -0.4169642925262451, - 2.0999321937561035, - 1.254514217376709 - ] - ], - "y": [ - [ - 0.27546000480651855, - -0.48414337635040283, - 1.5828936100006104 - ], - [ - -1.8485426902770996, - 1.1024266481399536, - 0.33336639404296875 - ] - ], - "z": [ - [ - 1.2914133071899414, - -0.44116318225860596, - 0.01237863302230835 - ], - [ - -1.1746723651885986, - 1.0478416681289673, - -0.5272490382194519 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8844456672668457, - -0.16234266757965088, - 0.8239132165908813 - ], - [ - -0.2423853874206543, - 1.9283219575881958, - 1.2218499183654785 - ] - ], - "y": [ - [ - 0.5108997821807861, - -0.6600102186203003, - 1.721400260925293 - ], - [ - -1.6695618629455566, - 0.9687329530715942, - 0.4386589527130127 - ] - ], - "z": [ - [ - 1.5647717714309692, - -0.6062151193618774, - 0.07219481468200684 - ], - [ - -0.9668653011322021, - 0.922369122505188, - -0.48177677392959595 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.6524039506912231, - 0.06575322151184082, - 0.8673290014266968 - ], - [ - -0.05803370475769043, - 1.7471050024032593, - 1.1873571872711182 - ] - ], - "y": [ - [ - 0.273006796836853, - -0.4823108911514282, - 1.5814504623413086 - ], - [ - -1.4805614948272705, - 0.8275550603866577, - 0.5498456954956055 - ] - ], - "z": [ - [ - 1.288564920425415, - -0.4394434690475464, - 0.011755377054214478 - ], - [ - -0.7474253177642822, - 0.7898730039596558, - -0.43375903367996216 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.3321285247802734, - -0.6024128198623657, - 0.7401503324508667 - ], - [ - -0.6617734432220459, - 2.340578079223633, - 1.300318717956543 - ] - ], - "y": [ - [ - 0.9698716402053833, - -1.0028492212295532, - 1.991408348083496 - ], - [ - -2.099524974822998, - 1.2899032831192017, - 0.1857161521911621 - ] - ], - "z": [ - [ - 2.097663640975952, - -0.9279714226722717, - 0.18880197405815125 - ], - [ - -1.4660766124725342, - 1.2237895727157593, - -0.5910139679908752 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.9840936660766602, - -0.2602959871292114, - 0.8052687644958496 - ], - [ - -0.11981892585754395, - 1.8078397512435913, - 1.1989173889160156 - ] - ], - "y": [ - [ - 0.6130603551864624, - -0.7363213300704956, - 1.781500220298767 - ], - [ - -1.5439047813415527, - 0.8748706579208374, - 0.5125815868377686 - ] - ], - "z": [ - [ - 1.6833860874176025, - -0.6778335571289062, - 0.09814992547035217 - ], - [ - -0.8209702968597412, - 0.83427894115448, - -0.4498521685600281 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7974835634231567, - -0.0768592357635498, - 0.8401840925216675 - ], - [ - -0.529433012008667, - 2.2104883193969727, - 1.275557518005371 - ] - ], - "y": [ - [ - 0.42174482345581055, - -0.5934139490127563, - 1.6689512729644775 - ], - [ - -1.9638476371765137, - 1.1885560750961304, - 0.2655336856842041 - ] - ], - "z": [ - [ - 1.4612579345703125, - -0.543714165687561, - 0.04954397678375244 - ], - [ - -1.3085477352142334, - 1.1286746263504028, - -0.5565435290336609 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.1453258991241455, - -0.4187866449356079, - 0.7751017212867737 - ], - [ - -0.541701078414917, - 2.222548007965088, - 1.2778528928756714 - ] - ], - "y": [ - [ - 0.7783583402633667, - -0.8597942590713501, - 1.8787431716918945 - ], - [ - -1.9764251708984375, - 1.1979511976242065, - 0.2581343650817871 - ] - ], - "z": [ - [ - 1.875306248664856, - -0.7937135696411133, - 0.14014580845832825 - ], - [ - -1.323150873184204, - 1.137492060661316, - -0.5597390532493591 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.5878195762634277, - 0.12923943996429443, - 0.8794128894805908 - ], - [ - 0.024000167846679688, - 1.6664661169052124, - 1.1720083951950073 - ] - ], - "y": [ - [ - 0.20679378509521484, - -0.4328516721725464, - 1.5424981117248535 - ], - [ - -1.3964591026306152, - 0.7647327184677124, - 0.5993220806121826 - ] - ], - "z": [ - [ - 1.2116880416870117, - -0.39302563667297363, - -0.005066812038421631 - ], - [ - -0.6497776508331299, - 0.7309139966964722, - -0.4123918414115906 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.3876922130584717, - 0.3259636163711548, - 0.9168573617935181 - ], - [ - 0.1833639144897461, - 1.5098124742507935, - 1.142190933227539 - ] - ], - "y": [ - [ - 0.0016200542449951172, - -0.27959275245666504, - 1.4217966794967651 - ], - [ - -1.233076810836792, - 0.6426910161972046, - 0.6954381465911865 - ] - ], - "z": [ - [ - 0.9734699726104736, - -0.2491912841796875, - -0.0571935772895813 - ], - [ - -0.4600818157196045, - 0.6163769960403442, - -0.37088268995285034 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.005493640899658, - -0.28133225440979004, - 0.801264762878418 - ], - [ - -0.21794629096984863, - 1.9042984247207642, - 1.2172772884368896 - ] - ], - "y": [ - [ - 0.6350002288818359, - -0.7527097463607788, - 1.7944071292877197 - ], - [ - -1.6445064544677734, - 0.9500173330307007, - 0.4533984661102295 - ] - ], - "z": [ - [ - 1.7088593244552612, - -0.6932141780853271, - 0.10372400283813477 - ], - [ - -0.9377748966217041, - 0.9048045873641968, - -0.47541123628616333 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.9046074151992798, - -0.18216156959533691, - 0.8201408982276917 - ], - [ - -0.19312572479248047, - 1.8799000978469849, - 1.2126333713531494 - ] - ], - "y": [ - [ - 0.5315699577331543, - -0.6754502058029175, - 1.7335602045059204 - ], - [ - -1.6190600395202637, - 0.9310096502304077, - 0.4683685302734375 - ] - ], - "z": [ - [ - 1.588771104812622, - -0.6207057237625122, - 0.0774463415145874 - ], - [ - -0.9082300662994385, - 0.8869656324386597, - -0.46894627809524536 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.059861421585083, - -0.334775447845459, - 0.7910923957824707 - ], - [ - -0.08346962928771973, - 1.7721086740493774, - 1.192116379737854 - ] - ], - "y": [ - [ - 0.6907387971878052, - -0.7943449020385742, - 1.827197551727295 - ], - [ - -1.506639003753662, - 0.8470340967178345, - 0.5345046520233154 - ] - ], - "z": [ - [ - 1.773574948310852, - -0.7322889566421509, - 0.11788502335548401 - ], - [ - -0.7777025699615479, - 0.8081542253494263, - -0.4403843283653259 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.2079925537109375, - -0.4803875684738159, - 0.7633765935897827 - ], - [ - -0.5202538967132568, - 2.201465606689453, - 1.273840069770813 - ] - ], - "y": [ - [ - 0.8426052331924438, - -0.9077848196029663, - 1.916538953781128 - ], - [ - -1.954437255859375, - 1.181526780128479, - 0.2710697650909424 - ] - ], - "z": [ - [ - 1.9499003887176514, - -0.8387529850006104, - 0.1564684808254242 - ], - [ - -1.297621488571167, - 1.1220775842666626, - -0.55415278673172 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.3355813026428223, - -0.605806827545166, - 0.739504337310791 - ], - [ - -0.6499292850494385, - 2.3289356231689453, - 1.2981027364730835 - ] - ], - "y": [ - [ - 0.9734114408493042, - -1.005493402481079, - 1.9934906959533691 - ], - [ - -2.0873823165893555, - 1.280833125114441, - 0.19285964965820312 - ] - ], - "z": [ - [ - 2.101773738861084, - -0.9304530024528503, - 0.18970128893852234 - ], - [ - -1.4519784450531006, - 1.215276837348938, - -0.5879289507865906 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.910269021987915, - -0.18772685527801514, - 0.8190816044807434 - ], - [ - -0.16418671607971191, - 1.8514529466629028, - 1.2072187662124634 - ] - ], - "y": [ - [ - 0.5373742580413818, - -0.6797858476638794, - 1.736974835395813 - ], - [ - -1.5893912315368652, - 0.9088476896286011, - 0.4858222007751465 - ] - ], - "z": [ - [ - 1.5955101251602173, - -0.6247748136520386, - 0.07892099022865295 - ], - [ - -0.8737828731536865, - 0.8661667108535767, - -0.46140849590301514 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.9682292938232422, - -0.24470150470733643, - 0.8082370758056641 - ], - [ - -0.35120391845703125, - 2.035289764404297, - 1.2422102689743042 - ] - ], - "y": [ - [ - 0.5967960357666016, - -0.7241722345352173, - 1.7719320058822632 - ], - [ - -1.7811241149902344, - 1.0520669221878052, - 0.3730278015136719 - ] - ], - "z": [ - [ - 1.6645021438598633, - -0.6664316654205322, - 0.09401777386665344 - ], - [ - -1.09639573097229, - 1.000578761100769, - -0.5101205706596375 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.5276515483856201, - 0.18838441371917725, - 0.8906705379486084 - ], - [ - 0.0162503719329834, - 1.6740843057632446, - 1.1734583377838135 - ] - ], - "y": [ - [ - 0.14510869979858398, - -0.38677453994750977, - 1.506209373474121 - ], - [ - -1.4044041633605957, - 0.7706676721572876, - 0.5946481227874756 - ] - ], - "z": [ - [ - 1.1400680541992188, - -0.34978199005126953, - -0.020738661289215088 - ], - [ - -0.6590025424957275, - 0.7364839315414429, - -0.41441041231155396 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7626832723617554, - -0.042650818824768066, - 0.8466953635215759 - ], - [ - -0.07687139511108398, - 1.7656224966049194, - 1.1908817291259766 - ] - ], - "y": [ - [ - 0.3860670328140259, - -0.5667636394500732, - 1.6479624509811401 - ], - [ - -1.4998741149902344, - 0.841981053352356, - 0.5384843349456787 - ] - ], - "z": [ - [ - 1.4198341369628906, - -0.5187027454376221, - 0.0404796302318573 - ], - [ - -0.7698485851287842, - 0.8034118413925171, - -0.4386656880378723 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.6506389379501343, - 0.06748831272125244, - 0.8676592111587524 - ], - [ - -0.1518692970275879, - 1.839345097541809, - 1.2049140930175781 - ] - ], - "y": [ - [ - 0.2711973190307617, - -0.48095929622650146, - 1.5803859233856201 - ], - [ - -1.5767631530761719, - 0.8994148969650269, - 0.49325132369995117 - ] - ], - "z": [ - [ - 1.286463975906372, - -0.438174843788147, - 0.011295616626739502 - ], - [ - -0.8591210842132568, - 0.8573139905929565, - -0.45820021629333496 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.9798927307128906, - -0.25616657733917236, - 0.8060548305511475 - ], - [ - -0.24350476264953613, - 1.9294222593307495, - 1.2220594882965088 - ] - ], - "y": [ - [ - 0.6087535619735718, - -0.7331043481826782, - 1.7789665460586548 - ], - [ - -1.6707093715667725, - 0.9695900678634644, - 0.43798375129699707 - ] - ], - "z": [ - [ - 1.678385615348816, - -0.6748143434524536, - 0.09705573320388794 - ], - [ - -0.9681975841522217, - 0.9231737852096558, - -0.48206835985183716 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.837321400642395, - -0.11601972579956055, - 0.8327302932739258 - ], - [ - -0.5861842632293701, - 2.2662744522094727, - 1.2861758470535278 - ] - ], - "y": [ - [ - 0.46258723735809326, - -0.6239221096038818, - 1.6929785013198853 - ], - [ - -2.0220298767089844, - 1.232016682624817, - 0.23130559921264648 - ] - ], - "z": [ - [ - 1.5086781978607178, - -0.5723463296890259, - 0.05992045998573303 - ], - [ - -1.3761003017425537, - 1.1694625616073608, - -0.5713254809379578 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.3211731910705566, - 0.391351580619812, - 0.9293032884597778 - ], - [ - 0.18476390838623047, - 1.5084360837936401, - 1.1419289112091064 - ] - ], - "y": [ - [ - -0.06657648086547852, - -0.22865188121795654, - 1.3816773891448975 - ], - [ - -1.2316412925720215, - 0.6416186094284058, - 0.6962826251983643 - ] - ], - "z": [ - [ - 0.8942899703979492, - -0.20138299465179443, - -0.07451969385147095 - ], - [ - -0.45841526985168457, - 0.6153708696365356, - -0.3705180287361145 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.1164517402648926, - -0.3904033899307251, - 0.7805042266845703 - ], - [ - -0.5877268314361572, - 2.2677907943725586, - 1.2864644527435303 - ] - ], - "y": [ - [ - 0.7487560510635376, - -0.8376821279525757, - 1.861328363418579 - ], - [ - -2.023611545562744, - 1.2331980466842651, - 0.2303752899169922 - ] - ], - "z": [ - [ - 1.8409361839294434, - -0.7729612588882446, - 0.13262498378753662 - ], - [ - -1.3779370784759521, - 1.170571208000183, - -0.5717273354530334 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.849792242050171, - -0.12827837467193604, - 0.8303970098495483 - ], - [ - -0.10737419128417969, - 1.7956064939498901, - 1.1965889930725098 - ] - ], - "y": [ - [ - 0.47537243366241455, - -0.6334723234176636, - 1.7004998922348022 - ], - [ - -1.5311460494995117, - 0.8653403520584106, - 0.5200872421264648 - ] - ], - "z": [ - [ - 1.5235226154327393, - -0.5813091993331909, - 0.06316870450973511 - ], - [ - -0.8061568737030029, - 0.8253346681594849, - -0.446610689163208 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.6032534837722778, - 0.1140679121017456, - 0.8765251636505127 - ], - [ - 0.044921875, - 1.6459003686904907, - 1.1680939197540283 - ] - ], - "y": [ - [ - 0.22261691093444824, - -0.4446711540222168, - 1.5518066883087158 - ], - [ - -1.3750097751617432, - 0.7487107515335083, - 0.6119406223297119 - ] - ], - "z": [ - [ - 1.2300593852996826, - -0.4041181802749634, - -0.0010467767715454102 - ], - [ - -0.6248738765716553, - 0.7158774137496948, - -0.4069424271583557 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.7957884073257446, - -0.07519304752349854, - 0.8405013084411621 - ], - [ - -0.4216163158416748, - 2.1045050621032715, - 1.2553846836090088 - ] - ], - "y": [ - [ - 0.4200068712234497, - -0.5921158790588379, - 1.66792893409729 - ], - [ - -1.8533124923706055, - 1.1059893369674683, - 0.33056044578552246 - ] - ], - "z": [ - [ - 1.459240198135376, - -0.5424959659576416, - 0.049102455377578735 - ], - [ - -1.1802098751068115, - 1.0511852502822876, - -0.5284608006477356 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 1.8687241077423096, - -0.1468883752822876, - 0.8268548250198364 - ], - [ - -0.5498387813568115, - 2.2305469512939453, - 1.2793755531311035 - ] - ], - "y": [ - [ - 0.4947817325592041, - -0.64797043800354, - 1.7119181156158447 - ], - [ - -1.9847679138183594, - 1.2041829824447632, - 0.25322651863098145 - ] - ], - "z": [ - [ - 1.546057939529419, - -0.5949157476425171, - 0.06809985637664795 - ], - [ - -1.3328373432159424, - 1.1433404684066772, - -0.561858594417572 - ] - ] - }, - { - "line": { - "color": "rgb(255, 0, 0)", - "width": 10 - }, - "marker": { - "color": "rgb(255, 0, 0)", - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "size": 4 - }, - "showlegend": false, - "type": "scatter3d", - "x": [ - [ - 2.0208489894866943, - -0.2964264154434204, - 0.7983917593955994 - ], - [ - -0.22210168838500977, - 1.9083832502365112, - 1.2180547714233398 - ] - ], - "y": [ - [ - 0.6507426500320435, - -0.7644689083099365, - 1.8036682605743408 - ], - [ - -1.6487667560577393, - 0.9531995058059692, - 0.45089244842529297 - ] - ], - "z": [ - [ - 1.7271372079849243, - -0.7042502164840698, - 0.10772353410720825 - ], - [ - -0.9427211284637451, - 0.907791018486023, - -0.4764935374259949 - ] - ] - } - ], - "layout": { - "autosize": false, - "height": 1000, - "margin": { - "b": 100, - "l": 50, - "pad": 4, - "r": 50, - "t": 100 - }, - "scene": { - "aspectmode": "data", - "aspectratio": { - "x": 1.0846410230825063, - "y": 1.114784688198523, - "z": 0.8270332663321689 - }, - "camera": { - "center": { - "x": 0, - "y": 0, - "z": 0 - }, - "eye": { - "x": 1.7540937848022615, - "y": 0.9281605147086744, - "z": 0.8655478340645341 - }, - "projection": { - "type": "perspective" - }, - "up": { - "x": 0, - "y": 0, - "z": 1 - } - } - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "width": 1000 - } - }, - "image/png": "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AQQQQAABBBBAAAEEEEAAAQQQQAABQlXmAAIIIIAAAggggAACCCCAAAIIIIAAAgggYCFAqGqBxaYIIIAAAggggAACCCCAAAIIIIAAAggggAChKnMAAQQQQAABBBBAAAEEEEAAAQQQQAABBBCwECBUtcBiUwQQQAABBBBAAAEEEEAAAQQQQAABBBBAgFCVOYAAAggggAACCCCAAAIIIIAAAggggAACCFgIEKpaYLEpAggggAACCCCAAAIIIIAAAggggAACCCBAqMocQAABBBBAAAEEEEAAAQQQQAABBBBAAAEELAQIVS2w2BQBBBBAAAEEEEAAAQQQQAABBBBAAAEEECBUZQ4ggAACCCCAAAIIIIAAAggggAACCCCAAAIWAoSqFlhsigACCCCAAAIIIIAAAggggAACCCCAAAIIEKoyBxBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQsBQlULLDZFAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQIVZkDCCCAAAIIIIAAAggggAACCCCAAAIIIICAhQChqgUWmyKAAAIIIIAAAggggAACCCCAAAIIIIAAAoSqzAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMBCgFDVAotNEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABQlXmAAIIIIAAAggggAACCCCAAAIIIIAAAgggYCFAqGqBxaYIIIAAAggggAACCCCAAAIIIIAAAggggAChKnMAAQQQQAABBBBAAAEEEEAAAQQQQAABBBCwECBUtcBiUwQQQAABBBBAAAEEEEAAAQQQQAABBBBAgFCVOYAAAggggAACCCCAAAIIIIAAAggggAACCFgIEKpaYLEpAggggAACCCCAAAIIIIAAAggggAACCCBAqMocQAABBBBAAAEEEEAAAQQQQAABBBBAAAEELAQIVS2w2BQBBBBAAAEEEEAAAQQQQAABBBBAAAEE8hXo9wem0WyYdqsVu+OjXt902m3TbDZit3W5AaGqS132jQACCCCAAAIIIIAAAggggAACCCCAgGcC58+fN+985zvNrbfeatrttrn++uvNU57ylNLO8lkveKW54SEPNC/70e9beQ69/sA88knPM7/2yh8333Ljw0s7Xx2YULVUfg6OAAIIIIAAAggggAACCCCAAAIIIIBAcQIf/vCHzU033WTuuOOOiw76xCc+0dxy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IECAAAECCyLweL81M8HqxupyrDaW4+FuM7q9+QtUB0su1eb9wdvvxN/9r/+2IKvQMAkQIECAAAECBE4LCFWtBwIECBAgQIAAAQIECBAgQIAAAQIECGQICFUzsDQlQIAAAQIECBAgQIAAAQIECBAgQICAUNUaIECAAAECBAgQIECAAAECBAgQIECAQIaAUDUDS1MCBAgQIECAAAECBAgQIECAAAECBAgIVa0BAgQIECBAgAABAgQIECBAgAABAgQIZAgIVTOwNCVAgAABAgQIECBAgAABAgQIECBAgIBQ1RogQIAAAQIECBAgQIAAAQIECBAgQIBAhoBQNQNLUwIECBAgQIAAAQIECBAgQIAAAQIECAhVrQECBAgQIECAAAECBAgQIECAAAECBAhkCAhVM7A0JUCAAAECBAgQIECAAAECBAgQIECAgFDVGiBAgAABAgQIECBAgAABAgQIECBAgECGgFA1A0tTAgQIECBAgAABAgQIECBAgAABAgQICFWtAQIECBAgQIAAAQIECBAgQIAAAQIECGQICFUzsDQlQIAAAQIECBAgQIAAAQIECBAgQICAUNUaIECAAAECBAgQIECAAAECBAgQIECAQIaAUDUDS1MCBAgQIECAAAECBAgQIECAAAECBAgIVa0BAgQIECBAgAABAgQIECBAgAABAgQIZAgIVTOwNCVAgAABAgQIECBAgAABAgQIECBAgIBQ1RogQIAAAQIECBAgQIAAAQIECBAgQIBAhoBQNQNLUwIECBAgQIAAAQIECBAgQIAAAQIECAhVrQECBAgQIECAAAECBAgQIECAAAECBAhkCAhVM7A0JUCAAAECBAgQIECAAAECBAgQIECAgFDVGiBAgAABAgQIECBAgAABAgQIECBAgECGgFA1A0tTAgQIECBAgAABAgQIECBAgAABAgQICFWtAQIECBAgQIAAAQIECBAgQIAAAQIECGQICFUzsDQlQIAAAQIECBAgQIAAAQIECBAgQICAUNUaIECAAAECBAgQIECAAAECBAgQIECAQIaAUDUDS1MCBAgQIECAAAECBAgQIECAAAFByfMuAAAHj0lEQVQCBAgIVa0BAgQIECBAgAABAgQIECBAgAABAgQIZAgIVTOwNCVAgAABAgQIECBAgAABAgQIECBAgIBQ1RogQIAAAQIECBAgQIAAAQIECBAgQIBAhoBQNQNLUwIECBAgQIAAAQIECBAgQIAAAQIECAhVrQECBAgQIECAAAECBAgQIECAAAECBAhkCAhVM7A0JUCAAAECBAgQIECAAAECBAgQIECAgFDVGiBAgAABAgQIECBAgAABAgQIECBAgECGgFA1A0tTAgQIECBAgAABAgQIECBAgAABAgQICFWtAQIECBAgQIAAAQIECBAgQIAAAQIECGQICFUzsDQlQIAAAQIECBAgQIAAAQIECBAgQICAUNUaIECAAAECBAgQIECAAAECBAgQIECAQIaAUDUDS1MCBAgQIECAAAECBAgQIECAAAECBAgIVa0BAgQIECBAgAABAgQIECBAgAABAgQIZAgIVTOwNCVAgAABAgQIECBAgAABAgQIECBAgIBQ1RogQIAAAQIECBAgQIAAAQIECBAgQIBAhoBQNQNLUwIECBAgQIAAAQIECBAgQIAAAQIECAhVrQECBAgQIECAAAECBAgQIECAAAECBAhkCAhVM7A0JUCAAAECBAgQIECAAAECBAgQIECAgFDVGiBAgAABAgQIECBAgAABAgQIECBAgECGgFA1A0tTAgQIECBAgAABAgQIECBAgAABAgQICFWtAQIECBAgQIAAAQIECBAgQIAAAQIECGQICFUzsDQlQIAAAQIECBAgQIAAAQIECBAgQICAUNUaIECAAAECBAgQIECAAAECBAgQIECAQIaAUDUDS1MCBAgQIECAAAECBAgQIECAAAECBAgIVa0BAgQIECBAgAABAgQIECBAgAABAgQIZAgIVTOwNCVAgAABAgQIECBAgAABAgQIECBAgIBQ1RogQIAAAQIECBAgQIAAAQIECBAgQIBAhoBQNQNLUwIECBAgQIAAAQIECBAgQIAAAQIECAhVrQECBAgQIECAAAECBAgQIECAAAECBAhkCAhVM7A0JUCAAAECBAgQIECAAAECBAgQIECAgFDVGiBAgAABAgQIECBAgAABAgQIECBAgECGgFA1A0tTAgQIECBAgAABAgQIECBAgAABAgQICFWtAQIECBAgQIAAAQIECBAgQIAAAQIECGQICFUzsDQlQIAAAQIECBAgQIAAAQIECBAgQICAUNUaIECAAAECBAgQIECAAAECBAgQIECAQIaAUDUDS1MCBAgQIECAAAECBAgQIECAAAECBAgIVa0BAgQIECBAgAABAgQIECBAgAABAgQIZAgIVTOwNCVAgAABAgQIECBAgAABAgQIECBAgIBQ1RogQIAAAQIECBAgQIAAAQIECBAgQIBAhoBQNQNLUwIECBAgQIAAAQIECBAgQIAAAQIECAhVrQECBAgQIECAAAECBAgQIECAAAECBAhkCAhVM7A0JUCAAAECBAgQIECAAAECBAgQIECAgFDVGiBAgAABAgQIECBAgAABAgQIECBAgECGgFA1A0tTAgQIECBAgAABAgQIECBAgAABAgQICFWtAQIECBAgQIAAAQIECBAgQIAAAQIECGQICFUzsDQlQIAAAQIECBAgQIAAAQIECBAgQICAUNUaIECAAAECBAgQIECAAAECBAgQIECAQIaAUDUDS1MCBAgQIECAAAECBAgQIECAAAECBAgIVa0BAgQIECBAgAABAgQIECBAgAABAgQIZAgIVTOwNCVAgAABAgQIECBAgAABAgQIECBAgIBQ1RogQIAAAQIECBAgQIAAAQIECBAgQIBAhoBQNQNLUwIECBAgQIAAAQIECBAgQIAAAQIECAhVrQECBAgQIECAAAECBAgQIECAAAECBAhkCAhVM7A0JUCAAAECBAgQIECAAAECBAgQIECAgFDVGiBAgAABAgQIECBAgAABAgQIECBAgECGgFA1A0tTAgQIECBAgAABAgQIECBAgAABAgQICFWtAQIECBAgQIAAAQIECBAgQIAAAQIECGQICFUzsDQlQIAAAQIECBAgQIAAAQIECBAgQICAUNUaIECAAAECBAgQIECAAAECBAgQIECAQIaAUDUDS1MCBAgQIECAAAECBAgQIECAAAECBAgIVa0BAgQIECBAgAABAgQIECBAgAABAgQIZAgIVTOwNCVAgAABAgQIECBAgAABAgQIECBAgIBQ1RogQIAAAQIECBAgQIAAAQIECBAgQIBAhoBQNQNLUwIECBAgQIAAAQIECBAgQIAAAQIECAhVrQECBAgQIECAAAECBAgQIECAAAECBAhkCAhVM7A0JUCAAAECBAgQIECAAAECBAgQIECAgFDVGiBAgAABAgQIECBAgAABAgQIECBAgECGgFA1A0tTAgQIECBAgAABAgQIECBAgAABAgQICFWtAQIECBAgQIAAAQIECBAgQIAAAQIECGQICFUzsDQlQIAAAQIECBAgQIAAAQIECBAgQICAUNUaIECAAAECBAgQIECAAAECBAgQIECAQIaAUDUDS1MCBAgQIECAAAECBAgQIECAAAECBAj8M2oDxIIiJuyVAAAAAElFTkSuQmCC", - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "ray_indices = batch[\"indices\"]\n", - "ray_bundle = ray_generator(ray_indices)\n", - "\n", - "skip = 1\n", - "size = 8\n", - "data = []\n", - "data += [\n", - " go.Scatter3d(\n", - " x=ray_generator.camera_to_world[::skip, 0, 3],\n", - " y=ray_generator.camera_to_world[::skip, 1, 3],\n", - " z=ray_generator.camera_to_world[::skip, 2, 3],\n", - " mode=\"markers\",\n", - " name=\"origins\",\n", - " marker=dict(color=\"rgba(0, 0, 0, 1)\", size=size),\n", - " )\n", - "]\n", - "\n", - "scene_bounds_collider = AABBBoxCollider(dataset_inputs.scene_bounds)\n", - "intersected_ray_bundle = scene_bounds_collider(ray_bundle)\n", - "\n", - "lines = torch.stack(\n", - " [\n", - " intersected_ray_bundle.origins + intersected_ray_bundle.directions * intersected_ray_bundle.nears[..., None],\n", - " intersected_ray_bundle.origins + intersected_ray_bundle.directions * intersected_ray_bundle.fars[..., None],\n", - " ],\n", - " dim=1,\n", - ").tolist() # (num_rays, 2, 3)\n", - "lines = torch.tensor(random.sample(lines, k=100))\n", - "\n", - "data += get_line_segments_from_lines(lines)\n", - "\n", - "layout = go.Layout(\n", - " autosize=False,\n", - " width=1000,\n", - " height=1000,\n", - " margin=go.layout.Margin(l=50, r=50, b=100, t=100, pad=4),\n", - " scene=go.layout.Scene(\n", - " aspectmode=\"data\",\n", - " camera=dict(up=dict(x=0, y=0, z=1), center=dict(x=0, y=0, z=0), eye=dict(x=1.25, y=1.25, z=1.25)),\n", - " ),\n", - ")\n", - "fig = go.Figure(data=data, layout=layout)\n", - "fig.show()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.13" - }, - "vscode": { - "interpreter": { - "hash": "41f62990c6e03ccb48eec29860b83c64e20fcd45204ae5014afab6809cd6f1f1" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/visualize_viewer.ipynb b/notebooks/visualize_viewer.ipynb deleted file mode 100644 index 3c686f9af..000000000 --- a/notebooks/visualize_viewer.ipynb +++ /dev/null @@ -1,129 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3c00934d-0f14-4c1a-a563-94d627b377e5", - "metadata": {}, - "source": [ - "## Notebook to visualize the viewer functionality\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b15dfdc1-5054-40bc-9631-4c7426eecfd9", - "metadata": {}, - "outputs": [], - "source": [ - "from notebook_imports import *\n", - "\n", - "import time\n", - "import torch\n", - "from torch.utils.data import DataLoader\n", - "\n", - "from nerfactory.data.dataloader import TrainDataloader\n", - "from nerfactory.data.image_dataset import ImageDataset, PanopticImageDataset\n", - "from nerfactory.data.image_sampler import CacheImageSampler\n", - "from nerfactory.data.pixel_sampler import PixelSampler\n", - "from nerfactory.data.utils import DatasetInputs, get_dataset_inputs_from_dataset_config\n", - "from nerfactory.graphs.modules.ray_generator import RayGenerator\n", - "from nerfactory.graphs.modules.scene_colliders import SceneBoundsCollider, AABBBoxCollider\n", - "from nerfactory.cameras.cameras import get_camera\n", - "from nerfactory.cameras.rays import RayBundle\n", - "from nerfactory.utils.io import get_absolute_path\n", - "from nerfactory.utils.plotly import get_line_segments_from_lines\n", - "from nerfactory.cameras.cameras import get_camera_model\n", - "from nerfactory.utils.misc import get_dict_to_torch, instantiate_from_dict_config\n", - "from nerfactory.engine.trainer import Trainer\n", - "from nerfactory.utils.config import Config, setup_config\n", - "\n", - "from hydra import compose, initialize\n", - "from omegaconf import open_dict\n", - "import pprint\n", - "from tqdm import tqdm\n", - "import random\n", - "\n", - "import numpy as np\n", - "\n", - "import umsgpack\n", - "from nerfactory.viewer.server.utils import get_chunks, get_intrinsics_matrix_and_camera_to_world_h\n", - "\n", - "from nerfactory.viewer.server import viewer_utils\n", - "from nerfactory.viewer.server.visualizer import Viewer\n", - "from nerfactory.viewer.server.utils import get_camera_from_vis" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "26d6da3c-e28a-4c55-9592-d90dccb86051", - "metadata": {}, - "outputs": [], - "source": [ - "# connect to the viewer\n", - "vis = Viewer(zmq_url=\"tcp://127.0.0.1:6000\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "605e0131-bfbe-4309-b338-c49a46923d8f", - "metadata": {}, - "outputs": [], - "source": [ - "# draw a red box\n", - "viewer_utils.show_box_test(vis)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1b3ba0e1-ade8-4bda-bcb4-0dd2ca74dda4", - "metadata": {}, - "outputs": [], - "source": [ - "# move the camera in a spiral path\n", - "camera = get_camera_from_vis(vis)\n", - "camera_path = get_spiral_path(camera, steps=120, radius=0.5)\n", - "seconds = 5\n", - "fps = len(camera_path.cameras) / seconds\n", - "spf = 1 / fps\n", - "for cam in camera_path.cameras:\n", - " viewer_utils.set_camera(vis, cam)\n", - " time.sleep(spf)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5a01cf1c-07d1-47fd-a39b-817298a83760", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "interpreter": { - "hash": "4a749acc7d255f078aee52e0584cc77b3cb5aaed1b3a7407ec4262c1bf6cb526" - }, - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/package.json b/package.json deleted file mode 100644 index 5c8077a13..000000000 --- a/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "dependencies": {}, - "devDependencies": { - "prettier": "2.7.1" - } -} diff --git a/pyproject.toml b/pyproject.toml index 6b63cf77b..6109b948c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ line-length = 120 max-line-length = 120 generated-members = ["numpy.*", "torch.*", "cv2.*", "cv.*"] good-names-rgxs = "^[_a-zA-Z][_a-z0-9]?$" -ignore-paths = ["nerfactory/ngp_pl/.*$", "scripts/colmap2nerf.py", "^nerfactory/cuda/.*$", "^tests/cuda/.*$", "^nerfactory/viewer/.*$", "^tests/viewer/.*$"] +ignore-paths = ["scripts/colmap2nerf.py", "^nerfactory/cuda/.*$", "^tests/cuda/.*$"] disable = [ "too-many-arguments", @@ -40,7 +40,7 @@ disable = [ #pytest [tool.pytest.ini_options] -addopts = "--typeguard-packages=nerfactory --torchtyping-patch-typeguard --disable-warnings --ignore=tests/cuda --ignore=tests/viewer" +addopts = "--typeguard-packages=nerfactory --torchtyping-patch-typeguard --disable-warnings --ignore=tests/cuda" testpaths = [ "tests", ] diff --git a/scripts/debugging/run_actions.py b/scripts/debugging/run_actions.py index bfd9130e0..9827e1953 100644 --- a/scripts/debugging/run_actions.py +++ b/scripts/debugging/run_actions.py @@ -26,7 +26,7 @@ def main(continue_on_fail: bool = False): """Run the github actions locally. Args: - continue_on_fail: Whether to continue running actions commands if the current one fails + continue_on_fail: Whether or not to continue running actions commands if the current one fails """ with open(".github/workflows/code_checks.yml", "rb") as f: my_dict = yaml.safe_load(f) diff --git a/tests/viewer/test_viewer.py b/tests/viewer/test_viewer.py deleted file mode 100644 index 5a3c31300..000000000 --- a/tests/viewer/test_viewer.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -Test the viewer comms code. -""" - - -import random -import time - -import cv2 -import numpy as np -import umsgpack -from tqdm import tqdm - -import nerfactory.viewer.server.geometry as g -from nerfactory.cameras import camera_paths -from nerfactory.cameras.cameras import get_camera -from nerfactory.data.datasets import Blender -from nerfactory.utils.io import get_absolute_path -from nerfactory.viewer.server.transformations import ( - get_rotation_matrix, - get_translation_matrix, -) -from nerfactory.viewer.server.viewer_utils import get_default_vis, set_camera - - -def test_drawing(): - """Test drawing objects in the viewer.""" - vis = get_default_vis() - vis.delete() - - v = vis["shapes"] - v.set_transform(get_translation_matrix([1.0, 0, 0])) - v["box"].set_object(g.Box([1.0, 0.2, 0.3])) - v["box"].delete() - v["box"].set_object(g.Box([0.1, 0.2, 0.3])) - v["box"].set_transform(get_translation_matrix([0.05, 0.1, 0.15])) - v["cylinder"].set_object(g.Cylinder(0.2, 0.1), g.MeshLambertMaterial(color=0x22DD22)) - v["cylinder"].set_transform(get_translation_matrix([0, 0.5, 0.1]).dot(get_rotation_matrix(-np.pi / 2, [1, 0, 0]))) - v["sphere"].set_object(g.Mesh(g.Sphere(0.15), g.MeshLambertMaterial(color=0xFF11DD))) - v["sphere"].set_transform(get_translation_matrix([0, 1, 0.15])) - v["ellipsoid"].set_object(g.Ellipsoid([0.3, 0.1, 0.1])) - v["ellipsoid"].set_transform(get_translation_matrix([0, 1.5, 0.1])) - - v["transparent_ellipsoid"].set_object( - g.Mesh(g.Ellipsoid([0.3, 0.1, 0.1]), g.MeshLambertMaterial(color=0xFFFFFF, opacity=0.5)) - ) - v["transparent_ellipsoid"].set_transform(get_translation_matrix([0, 2.0, 0.1])) - - v = vis["meshes/convex"] - v["obj"].set_object( - g.Mesh(g.ObjMeshGeometry.from_file(get_absolute_path("tests/viewer/data/mesh_0_convex_piece_0.obj"))) - ) - v["stl_ascii"].set_object( - g.Mesh(g.StlMeshGeometry.from_file(get_absolute_path("tests/viewer/data/mesh_0_convex_piece_0.stl_ascii"))) - ) - v["stl_ascii"].set_transform(get_translation_matrix([0, -0.5, 0])) - v["stl_binary"].set_object( - g.Mesh(g.StlMeshGeometry.from_file(get_absolute_path("tests/viewer/data/mesh_0_convex_piece_0.stl_binary"))) - ) - v["stl_binary"].set_transform(get_translation_matrix([0, -1, 0])) - v["dae"].set_object( - g.Mesh(g.DaeMeshGeometry.from_file(get_absolute_path("tests/viewer/data/mesh_0_convex_piece_0.dae"))) - ) - v["dae"].set_transform(get_translation_matrix([0, -1.5, 0])) - - v = vis["points"] - v.set_transform(get_translation_matrix([0, 2, 0])) - verts = np.random.rand(3, 1000000) - colors = verts - v["random"].set_object(g.PointCloud(verts, colors)) - v["random"].set_transform(get_translation_matrix([-0.5, -0.5, 0])) - - v = vis["lines"] - v.set_transform(get_translation_matrix([-2, -3, 0])) - - vertices = np.random.random((3, 10)).astype(np.float32) - v["line_segments"].set_object(g.LineSegments(g.PointsGeometry(vertices))) - - v["line"].set_object(g.Line(g.PointsGeometry(vertices))) - v["line"].set_transform(get_translation_matrix([0, 1, 0])) - - v["line_loop"].set_object(g.LineLoop(g.PointsGeometry(vertices))) - v["line_loop"].set_transform(get_translation_matrix([0, 2, 0])) - - v["line_loop_with_material"].set_object(g.LineLoop(g.PointsGeometry(vertices), g.LineBasicMaterial(color=0xFF0000))) - v["line_loop_with_material"].set_transform(get_translation_matrix([0, 3, 0])) - - colors = vertices # Color each line by treating its xyz coordinates as RGB colors - v["line_with_vertex_colors"].set_object( - g.Line(g.PointsGeometry(vertices, colors), g.LineBasicMaterial(vertexColors=True)) - ) - v["line_with_vertex_colors"].set_transform(get_translation_matrix([0, 4, 0])) - - v["triad"].set_object( - g.LineSegments( - g.PointsGeometry( - position=np.array([[0, 0, 0], [1, 0, 0], [0, 0, 0], [0, 1, 0], [0, 0, 0], [0, 0, 1]]) - .astype(np.float32) - .T, - color=np.array([[1, 0, 0], [1, 0.6, 0], [0, 1, 0], [0.6, 1, 0], [0, 0, 1], [0, 0.6, 1]]) - .astype(np.float32) - .T, - ), - g.LineBasicMaterial(vertexColors=True), - ) - ) - v["triad"].set_transform(get_translation_matrix([0, 5, 0])) - - v["triad_function"].set_object(g.triad(0.5)) - v["triad_function"].set_transform(get_translation_matrix([0, 6, 0])) - - -def test_streaming(): - """Test streaming of data to the viewer.""" - - -def test_rendering(): - """Test rendering.""" - - -def test_camera_trajectory(): - """Test generating camera trajectory.""" - vis = get_default_vis() - # vis.delete() - - # sample poses from a dataset - dataset = Blender(data_directory="data/blender/lego") - dataset_inputs = dataset.get_dataset_inputs(split="train") - num_cameras = len(dataset_inputs.intrinsics) - intrinsics = dataset_inputs.intrinsics - camera_to_world = dataset_inputs.camera_to_world - idx0, idx1 = random.sample(range(num_cameras), k=2) - camera_a = get_camera(intrinsics[idx0], camera_to_world[idx0], None) - camera_b = get_camera(intrinsics[idx1], camera_to_world[idx1], None) - - num_steps = 100 - fps = 30 - estimated_time = num_steps / fps - print("estimated_time:", estimated_time) - - camera_path = camera_paths.get_interpolated_camera_path(camera_a, camera_b, steps=num_steps) - - start = time.time() - for camera in camera_path.cameras: - set_camera(vis, camera) - time.sleep(1 / fps) - time_elapsed = time.time() - start - print("time_elapsed:", time_elapsed) - - -def test_send_image_stream(): - """Test sending image stream.""" - vis = get_default_vis() - vis_background = vis["/Background"] - - video_filename = get_absolute_path("data/instant_ngp/bear/bear.MOV") - images = [] - cap = cv2.VideoCapture(video_filename) - ret, image = cap.read() - while ret: - image = image[:, :, ::-1] # to RGB - image = cv2.resize(image, (200, 300)) - images.append(image) - ret, image = cap.read() - # break - - fps = 30 - for image in tqdm(images): - rgba = cv2.cvtColor(image, cv2.COLOR_RGB2RGBA) - encoded = umsgpack.Ext(0x12, rgba.tobytes()) - vis_background.set_image(encoded) - time.sleep(1 / fps) - - -def test_perspective_camera(): - """Test perspective camera in viewer.""" - vis = get_default_vis() - vis.set_object(g.Box([0.5, 0.5, 0.5])) - camera = g.PerspectiveCamera(fov=90) - vis["/Cameras/default/rotated"].set_object(camera) - vis["/Cameras/default"].set_transform(get_translation_matrix([1, -1, 0.5])) - vis["/Cameras/default/rotated/"].set_property("position", [0, 0, 0]) - - -if __name__ == "__main__": - # TODO: start the TCP server - test_drawing() - time.sleep(5) - test_camera_trajectory() - test_send_image_stream() - # test_perspective_camera() - # TODO: close the TCP server