-
-
+
+
- Yiqin Zhao
+ Khang Luu
-
-
+
+
- Khang Luu
+ Yiqin Zhao
diff --git a/protos/arflow/service.proto b/protos/arflow_grpc/service.proto
similarity index 60%
rename from protos/arflow/service.proto
rename to protos/arflow_grpc/service.proto
index 2d93753..e6bbbd7 100644
--- a/protos/arflow/service.proto
+++ b/protos/arflow_grpc/service.proto
@@ -2,16 +2,27 @@ syntax = "proto3";
option csharp_namespace = "ARFlow";
-// The ARFlowService service definition.
-service ARFlowService {
- // Registers a device with the given specifications.
- rpc register(RegisterRequest) returns (RegisterResponse);
+package arflow.v1;
- // Sends a data frame from a device.
- rpc data_frame(DataFrameRequest) returns (DataFrameResponse);
+// The ARFlow service definition.
+service ARFlowService {
+ // Registers a client with the given specifications.
+ //
+ // The client is registered with the server and is assigned a unique identifier.
+ // The client can then send data frames to the server using the assigned identifier.
+ rpc RegisterClient(RegisterClientRequest) returns (RegisterClientResponse);
+
+ // Accepts a data frame from a client, returning an acknowledgment.
+ //
+ // Errors:
+ // - NOT_FOUND: If the client configuration is not found.
+ // - INVALID_ARGUMENT: If the color data type is not recognized or the depth data type
+ // is not recognized or if the request's data cannot be decoded (e.g., corrupted or invalid data).
+ rpc ProcessFrame(ProcessFrameRequest) returns (ProcessFrameResponse);
}
-message RegisterRequest {
+message RegisterClientRequest {
+ // TODO: Add documentation for each field, units of measurement, etc.
string device_name = 1;
message CameraIntrinsics {
@@ -78,11 +89,11 @@ message RegisterRequest {
Meshing meshing = 10;
}
-message RegisterResponse {
+message RegisterClientResponse {
string uid = 1;
}
-message DataFrameRequest {
+message ProcessFrameRequest {
string uid = 1;
bytes color = 2;
bytes depth = 3;
@@ -98,12 +109,13 @@ message DataFrameRequest {
float x = 1;
float y = 2;
}
- message Planes {
+ message Plane {
Vector3 center = 1;
Vector3 normal = 2;
Vector2 size = 3;
+ repeated Vector2 boundary_points = 4;
}
- repeated Planes plane_detection = 5;
+ repeated Plane plane_detection = 5;
message Quaternion {
float x = 1;
@@ -111,18 +123,24 @@ message DataFrameRequest {
float z = 3;
float w = 4;
}
- message gyroscope_data {
+ message GyroscopeData {
Quaternion attitude = 1;
Vector3 rotation_rate = 2;
Vector3 gravity = 3;
Vector3 acceleration = 4;
}
- gyroscope_data gyroscope = 6;
+ GyroscopeData gyroscope = 6;
- bytes audio = 8;
- bytes meshing = 9;
+ repeated float audio_data = 8;
+
+ // Represent a mesh
+ message Mesh {
+ bytes data = 1;
+ }
+ // Multiple meshes can be sent in a single frame
+ repeated Mesh meshes = 9;
}
-message DataFrameResponse {
+message ProcessFrameResponse {
string message = 1;
}
diff --git a/protos/scripts/compile.sh b/protos/scripts/compile.sh
deleted file mode 100755
index ebe2b64..0000000
--- a/protos/scripts/compile.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-python -m grpc_tools.protoc -Iprotos --python_out=python --pyi_out=python --grpc_python_out=python protos/arflow/*.proto
-protoc --csharp_out=unity/Assets/Scripts/ARFlow --grpc_csharp_out=unity/Assets/Scripts/ARFlow protos/arflow/*.proto
diff --git a/python/.gitignore b/python/.gitignore
index 5bc5b96..62f429b 100644
--- a/python/.gitignore
+++ b/python/.gitignore
@@ -1,38 +1,5 @@
-# Created by https://www.toptal.com/developers/gitignore/api/macos,windows,visualstudiocode,python
-# Edit at https://www.toptal.com/developers/gitignore?templates=macos,windows,visualstudiocode,python
-
-### macOS ###
-# General
-.DS_Store
-.AppleDouble
-.LSOverride
-
-# Icon must end with two \r
-Icon
-
-
-# Thumbnails
-._*
-
-# Files that might appear in the root of a volume
-.DocumentRevisions-V100
-.fseventsd
-.Spotlight-V100
-.TemporaryItems
-.Trashes
-.VolumeIcon.icns
-.com.apple.timemachine.donotpresent
-
-# Directories potentially created on remote AFP share
-.AppleDB
-.AppleDesktop
-Network Trash Folder
-Temporary Items
-.apdisk
-
-### macOS Patch ###
-# iCloud generated files
-*.icloud
+# Created by https://www.toptal.com/developers/gitignore/api/python
+# Edit at https://www.toptal.com/developers/gitignore?templates=python
### Python ###
# Byte-compiled / optimized / DLL files
@@ -43,6 +10,8 @@ __pycache__/
# C extensions
*.so
+.test-draco
+
# Distribution / packaging
.Python
build/
@@ -122,7 +91,7 @@ ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
-# .python-version
+.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
@@ -136,6 +105,8 @@ ipython_config.py
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+# NOTICE FOR ARFLOW DEVELOPERS: poetry.lock should be kept in version control. See
+# https://python-poetry.org/docs/basic-usage/#as-a-library-developer
#poetry.lock
# pdm
@@ -206,57 +177,4 @@ poetry.toml
# LSP config files
pyrightconfig.json
-### VisualStudioCode ###
-.vscode/*
-!.vscode/settings.json
-!.vscode/tasks.json
-!.vscode/launch.json
-!.vscode/extensions.json
-!.vscode/*.code-snippets
-
-# Local History for Visual Studio Code
-.history/
-
-# Built Visual Studio Code Extensions
-*.vsix
-
-### VisualStudioCode Patch ###
-# Ignore all local history of files
-.history
-.ionide
-
-### Windows ###
-# Windows thumbnail cache files
-Thumbs.db
-Thumbs.db:encryptable
-ehthumbs.db
-ehthumbs_vista.db
-
-# Dump file
-*.stackdump
-
-# Folder config file
-[Dd]esktop.ini
-
-# Recycle Bin used on file shares
-$RECYCLE.BIN/
-
-# Windows Installer files
-*.cab
-*.msi
-*.msix
-*.msm
-*.msp
-
-# Windows shortcuts
-*.lnk
-
-# End of https://www.toptal.com/developers/gitignore/api/macos,windows,visualstudiocode,python
-
-test_data/*
-docs/*
-
-# Ignore all gRPC-generated files
-# arflow/service_pb2_grpc.py
-# arflow/service_pb2.py
-# arflow/service_pb2.pyi
+# End of https://www.toptal.com/developers/gitignore/api/python
diff --git a/python/.pre-commit-config.yaml b/python/.pre-commit-config.yaml
index 29fb08d..a5fd91e 100644
--- a/python/.pre-commit-config.yaml
+++ b/python/.pre-commit-config.yaml
@@ -1,25 +1,19 @@
repos:
-- repo: https://github.com/pre-commit/pre-commit-hooks
+ - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- - id: check-added-large-files
- - id: check-toml
- - id: check-yaml
+ - id: check-added-large-files
+ - id: check-json
+ - id: check-toml
+ - id: check-yaml
args:
- - --unsafe
- - id: end-of-file-fixer
- - id: trailing-whitespace
-- repo: https://github.com/astral-sh/ruff-pre-commit
- # Ruff version.
- rev: v0.6.4
- hooks:
- # Run the linter.
- - id: ruff
- args: [ --fix ]
- # Run the formatter.
- - id: ruff-format
-# TODO: Add pyright. Current issue is pre-commit not picking up the virtual environment.
-# - repo: https://github.com/RobertCraigie/pyright-python
-# rev: v1.1.379
-# hooks:
-# - id: pyright
+ - --unsafe
+ - repo: https://github.com/astral-sh/ruff-pre-commit
+ # Ruff version.
+ rev: v0.6.4
+ hooks:
+ # Run the linter.
+ - id: ruff
+ args: [--fix]
+ # Run the formatter.
+ - id: ruff-format
diff --git a/python/README.md b/python/README.md
index ee24374..27d1222 100644
--- a/python/README.md
+++ b/python/README.md
@@ -1,8 +1,12 @@
# The ARFlow Python Server
-[](https://www.gnu.org/licenses/gpl-3.0)
+[](https://pypi.python.org/pypi/arflow)
+[](https://github.com/cake-lab/ARFlow/blob/main/LICENSE)
+[](https://pypi.python.org/pypi/arflow)
[](https://github.com/astral-sh/ruff)
[](https://microsoft.github.io/pyright/)
+[](https://github.com/cake-lab/ARFlow/actions)
+[](https://github.com/cake-lab/ARFlow/actions)
The ARFlow Python server collects streaming data from your ARFlow clients. The server is designed to be easily extensible and can be integrated with your own research prototype. Data is streamed to the `rerun` logger and saved to a `pickle` file at the end of a session, which can be visualized later using the ARFlow Player.
@@ -12,75 +16,28 @@ The ARFlow Python server collects streaming data from your ARFlow clients. The s
The ARFlow server can be simply installed via `pip`:
-```bash
+```shell
+# Create a python environment using your favorite tool, then
pip install arflow
```
-## Examples
-
-Next, you may integrate ARFlow with your own research prototype via the Python API:
-
-
-
-```python
-"""A simple example of extending the ARFlow server."""
-
-import arflow
-
-
-class CustomService(arflow.ARFlowService):
- def on_frame_received(self, frame: arflow.DataFrameRequest):
- """Called when a frame is received."""
- print("Frame received!")
-
-
-def main():
- arflow.create_server(CustomService, port=8500, path_to_save="./")
-
-
-if __name__ == "__main__":
- main()
-
-```
-
-Save the above code to a file, e.g., `simple_server.py`, and run it:
-
-```bash
-python3 simple_server.py
-```
-
-Once you have your server running, you can start your ARFlow clients and connect them to the server. The server will start collecting data from the clients and save it to a `pickle` file at the end of the session.
-
-You can visualize the data using the ARFlow Player:
+## Server CLI
-```python
-"""A simple example of replaying saved ARFlow data."""
+Here are some example usages of the ARFlow server CLI:
-import arflow
-from .simple_server import CustomService
+```shell
+arflow serve # ARFlow port 8500, no save file
+arflow serve -p 1234 -s ./ # ARFlow port 1234, save to current working directory
-def main():
- """Run the example."""
- player = arflow.ARFlowPlayer(
- CustomService, frame_data_path="FRAME_DATA_PATH.pkl"
- )
- player.run()
-
-
-if __name__ == "__main__":
- main()
+arflow replay ./FRAME_DATA_PATH.pkl # replay ARFlow data file
+arflow -h # show help
```
-Save the above code to a file, e.g., `simple_replay.py`, replace `FRAME_DATA_PATH` with the path to your saved `pickle` file, and run it:
-
-
-```bash
-python3 simple_replay.py
-```
+## Examples
-For more examples, check out the [examples](https://github.com/cake-lab/ARFlow/tree/main/python/examples) directory.
+Check out the [examples](https://github.com/cake-lab/ARFlow/tree/main/python/examples). We recommend starting with the [`simple`](examples/simple/README.md) example.
## Contributing
diff --git a/python/arflow/__init__.py b/python/arflow/__init__.py
index f930367..6ac0414 100644
--- a/python/arflow/__init__.py
+++ b/python/arflow/__init__.py
@@ -1,15 +1,19 @@
-"""
-.. include:: ../README.md
-"""
+""".. include:: ../README.md""" # noqa: D415
-from arflow.core import * # noqa
-from arflow.replay import * # noqa
-from arflow.serve import * # noqa
-from arflow.service_pb2 import * # noqa
+# Imported symbols are private by default. By aliasing them here, we make it clear that they are part of the public API.
+from arflow._core import ARFlowServicer as ARFlowServicer
+from arflow._core import run_server as run_server
+from arflow._replay import ARFlowPlayer as ARFlowPlayer
+from arflow._types import DecodedDataFrame as DecodedDataFrame
+from arflow_grpc.service_pb2 import RegisterClientRequest as RegisterClientRequest
+
+__docformat__ = "google" # Should match Ruff docstring format in ../pyproject.toml
# https://pdoc.dev/docs/pdoc.html#exclude-submodules-from-being-documented
-__all__ = [ # noqa
- "core", # noqa
- "replay", # noqa
- "serve", # noqa
+__all__ = [
+ "run_server",
+ "ARFlowServicer",
+ "ARFlowPlayer",
+ "DecodedDataFrame",
+ "RegisterClientRequest",
]
diff --git a/python/arflow/_cli.py b/python/arflow/_cli.py
new file mode 100644
index 0000000..a857209
--- /dev/null
+++ b/python/arflow/_cli.py
@@ -0,0 +1,116 @@
+"""ARFlow command line interface."""
+
+import argparse
+import logging
+from pathlib import Path
+from typing import Any, Sequence
+
+from arflow._core import ARFlowServicer, run_server
+from arflow._replay import ARFlowPlayer
+
+
+def _validate_dir_path(path_as_str: str | None) -> str | None:
+ """Check if the path is a valid directory."""
+ if path_as_str is None:
+ return None
+ path = Path(path_as_str)
+ if not path.is_dir():
+ raise argparse.ArgumentTypeError(f"{path_as_str} is not a valid path.")
+ return path_as_str
+
+
+def _validate_file_path(path_as_str: str) -> str:
+ """Check if the path is a valid file."""
+ path = Path(path_as_str)
+ if not path.is_file():
+ raise argparse.ArgumentTypeError(f"{path_as_str} is not a valid file.")
+ return path_as_str
+
+
+def serve(args: Any):
+ """Run the ARFlow server."""
+ run_server(
+ ARFlowServicer,
+ port=args.port,
+ path_to_save=Path(args.save_path) if args.save_path else None,
+ )
+
+
+def replay(args: Any):
+ """Replay an ARFlow data file."""
+ player = ARFlowPlayer(ARFlowServicer, Path(args.file_path))
+ player.run()
+
+
+def parse_args(
+ argv: Sequence[str] | None = None,
+) -> tuple[argparse.ArgumentParser, argparse.Namespace]:
+ parser = argparse.ArgumentParser(description="ARFlow CLI")
+ subparsers = parser.add_subparsers()
+
+ group = parser.add_mutually_exclusive_group()
+ group.add_argument(
+ "-d",
+ "--debug",
+ help="Print debug information.",
+ action="store_const",
+ dest="loglevel",
+ const=logging.DEBUG,
+ default=logging.WARNING,
+ )
+ group.add_argument(
+ "-v",
+ "--verbose",
+ help="Print verbose information.",
+ action="store_const",
+ dest="loglevel",
+ const=logging.INFO,
+ )
+
+ # Serve subcommand
+ serve_parser = subparsers.add_parser("serve", help="Run a simple ARFlow server")
+ serve_parser.add_argument(
+ "-p",
+ "--port",
+ type=int,
+ default=8500,
+ help="Port to run the server on.",
+ )
+ serve_parser.add_argument(
+ "-s",
+ "--save_path",
+ type=_validate_dir_path,
+ default=None,
+ help="Path to the directory to save the requests history. If not provided, the requests history will not be saved.",
+ )
+ serve_parser.set_defaults(func=serve)
+
+ # Replay subcommand
+ replay_parser = subparsers.add_parser("replay", help="Replay an ARFlow data file")
+ replay_parser.add_argument(
+ "file_path",
+ type=_validate_file_path,
+ help="Path to the ARFlow data file.",
+ )
+ replay_parser.set_defaults(func=replay)
+
+ parsed_args = parser.parse_args(argv)
+
+ logging.basicConfig(
+ level=parsed_args.loglevel,
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)",
+ )
+
+ return parser, parsed_args
+
+
+def main(argv: Sequence[str] | None = None): # pragma: no cover
+ parser, args = parse_args(argv)
+ if hasattr(args, "func"):
+ args.func(args)
+ else:
+ parser.print_help()
+
+
+if __name__ == "__main__": # pragma: no cover
+ main()
diff --git a/python/arflow/_core.py b/python/arflow/_core.py
new file mode 100644
index 0000000..d573582
--- /dev/null
+++ b/python/arflow/_core.py
@@ -0,0 +1,442 @@
+"""Data exchanging service."""
+
+import logging
+import pickle
+import time
+import uuid
+from concurrent import futures
+from pathlib import Path
+from signal import SIGINT, SIGTERM, signal
+from typing import Any, List, Type, cast
+
+import DracoPy
+import grpc
+import numpy as np
+import rerun as rr
+from grpc_interceptor.exceptions import InvalidArgument, NotFound
+
+from arflow._decoding import (
+ convert_2d_to_3d_boundary_points,
+ decode_depth_image,
+ decode_intrinsic,
+ decode_point_cloud,
+ decode_rgb_image,
+ decode_transform,
+)
+from arflow._error_interceptor import ErrorInterceptor
+from arflow._types import (
+ ARFlowRequest,
+ Audio,
+ ClientConfigurations,
+ ColorDataType,
+ ColorRGB,
+ DecodedDataFrame,
+ DepthDataType,
+ DepthImg,
+ EnrichedARFlowRequest,
+ GyroscopeInfo,
+ HashableClientIdentifier,
+ Intrinsic,
+ Mesh,
+ PlaneBoundaryPoints3D,
+ PlaneInfo,
+ PointCloudCLR,
+ PointCloudPCD,
+ RequestsHistory,
+ Transform,
+)
+from arflow_grpc import service_pb2_grpc
+from arflow_grpc.service_pb2 import (
+ ProcessFrameRequest,
+ ProcessFrameResponse,
+ RegisterClientRequest,
+ RegisterClientResponse,
+)
+
+logger = logging.getLogger(__name__)
+
+
+class ARFlowServicer(service_pb2_grpc.ARFlowServiceServicer):
+ """Provides methods that implement the functionality of the ARFlow gRPC server."""
+
+ def __init__(self) -> None:
+ """Initialize the ARFlowServicer."""
+ self._start_time = time.time_ns()
+ self._requests_history: RequestsHistory = []
+ self._client_configurations: ClientConfigurations = {}
+ self.recorder = rr
+ """A recorder object for logging data."""
+ super().__init__()
+
+ def _save_request(self, request: ARFlowRequest):
+ timestamp = (time.time_ns() - self._start_time) / 1e9
+ enriched_request = EnrichedARFlowRequest(
+ timestamp=timestamp,
+ data=request,
+ )
+ self._requests_history.append(enriched_request)
+
+ def RegisterClient(
+ self,
+ request: RegisterClientRequest,
+ context: grpc.ServicerContext | None = None,
+ init_uid: str | None = None,
+ ) -> RegisterClientResponse:
+ """Register a client.
+
+ @private
+ """
+ self._save_request(request)
+
+ if init_uid is None:
+ init_uid = str(uuid.uuid4())
+
+ self._client_configurations[HashableClientIdentifier(init_uid)] = request
+
+ self.recorder.init(f"{request.device_name} - ARFlow", spawn=True)
+ logger.debug(
+ "Registered a client with UUID: %s, Request: %s", init_uid, request
+ )
+
+ # Call the for user extension code.
+ self.on_register(request)
+
+ return RegisterClientResponse(uid=init_uid)
+
+ def ProcessFrame(
+ self,
+ request: ProcessFrameRequest,
+ context: grpc.ServicerContext | None = None,
+ ) -> ProcessFrameResponse:
+ """Process an incoming frame.
+
+ @private
+
+ Raises:
+ grpc_interceptor.exceptions.NotFound: If the client configuration is not found.
+ grpc_interceptor.exceptions.InvalidArgument: If the color data type is not recognized
+ or the depth data type is not recognized or if the request's data cannot be decoded (e.g., corrupted or invalid data).
+ """
+ self._save_request(request)
+
+ try:
+ client_config = self._client_configurations[
+ HashableClientIdentifier(request.uid)
+ ]
+ except KeyError:
+ raise NotFound("Client configuration not found")
+
+ color_rgb: ColorRGB | None = None
+ depth_img: DepthImg | None = None
+ transform: Transform | None = None
+ k: Intrinsic | None = None
+ point_cloud_pcd: PointCloudPCD | None = None
+ point_cloud_clr: PointCloudCLR | None = None
+ audio_data: Audio | None = None
+
+ if client_config.camera_color.enabled:
+ try:
+ color_rgb = np.flipud(
+ decode_rgb_image(
+ client_config.camera_intrinsics.resolution_y,
+ client_config.camera_intrinsics.resolution_x,
+ client_config.camera_color.resize_factor_y,
+ client_config.camera_color.resize_factor_x,
+ cast(ColorDataType, client_config.camera_color.data_type),
+ request.color,
+ )
+ )
+ except ValueError as e:
+ raise InvalidArgument(str(e))
+
+ self.recorder.log("rgb", rr.Image(color_rgb))
+
+ if client_config.camera_depth.enabled:
+ try:
+ depth_img = np.flipud(
+ decode_depth_image(
+ client_config.camera_depth.resolution_y,
+ client_config.camera_depth.resolution_x,
+ cast(DepthDataType, client_config.camera_depth.data_type),
+ request.depth,
+ )
+ )
+ except ValueError as e:
+ raise InvalidArgument(str(e))
+ self.recorder.log("depth", rr.DepthImage(depth_img, meter=1.0))
+
+ if client_config.camera_transform.enabled:
+ self.recorder.log("world/origin", rr.ViewCoordinates.RIGHT_HAND_Y_DOWN)
+ # self.logger.log(
+ # "world/xyz",
+ # rr.Arrows3D(
+ # vectors=[[1, 0, 0], [0, 1, 0], [0, 0, 1]],
+ # colors=[[255, 0, 0], [0, 255, 0], [0, 0, 255]],
+ # ),
+ # )
+
+ try:
+ transform = decode_transform(request.transform)
+ except ValueError as e:
+ raise InvalidArgument(str(e))
+ self.recorder.log(
+ "world/camera",
+ self.recorder.Transform3D(
+ mat3x3=transform[:3, :3], translation=transform[:3, 3]
+ ),
+ )
+
+ # Won't thow any potential exceptions for now.
+ k = decode_intrinsic(
+ client_config.camera_color.resize_factor_y,
+ client_config.camera_color.resize_factor_x,
+ client_config.camera_intrinsics.focal_length_y,
+ client_config.camera_intrinsics.focal_length_x,
+ client_config.camera_intrinsics.principal_point_y,
+ client_config.camera_intrinsics.principal_point_x,
+ )
+
+ self.recorder.log("world/camera", rr.Pinhole(image_from_camera=k))
+ if color_rgb is not None:
+ self.recorder.log("world/camera", rr.Image(np.flipud(color_rgb)))
+
+ if client_config.camera_point_cloud.enabled:
+ if (
+ k is not None
+ and color_rgb is not None
+ and depth_img is not None
+ and transform is not None
+ ):
+ # Won't thow any potential exceptions for now.
+ point_cloud_pcd, point_cloud_clr = decode_point_cloud(
+ client_config.camera_intrinsics.resolution_y,
+ client_config.camera_intrinsics.resolution_x,
+ client_config.camera_color.resize_factor_y,
+ client_config.camera_color.resize_factor_x,
+ k,
+ color_rgb,
+ depth_img,
+ transform,
+ )
+ self.recorder.log(
+ "world/point_cloud",
+ rr.Points3D(point_cloud_pcd, colors=point_cloud_clr),
+ )
+
+ if client_config.camera_plane_detection.enabled:
+ strips: List[PlaneBoundaryPoints3D] = []
+ for plane in request.plane_detection:
+ boundary_points_2d: List[List[float]] = list(
+ map(lambda pt: [pt.x, pt.y], plane.boundary_points)
+ )
+
+ plane = PlaneInfo(
+ center=np.array([plane.center.x, plane.center.y, plane.center.z]),
+ normal=np.array([plane.normal.x, plane.normal.y, plane.normal.z]),
+ size=np.array([plane.size.x, plane.size.y]),
+ boundary_points=np.array(boundary_points_2d),
+ )
+
+ try:
+ boundary_3d = convert_2d_to_3d_boundary_points(
+ plane.boundary_points, plane.normal, plane.center
+ )
+ except ValueError as e:
+ raise InvalidArgument(str(e))
+
+ # Close the boundary by adding the first point to the end.
+ boundary_3d = np.vstack([boundary_3d, boundary_3d[0]])
+ strips.append(boundary_3d)
+ self.recorder.log(
+ f"world/detected-planes",
+ rr.LineStrips3D(
+ strips=strips,
+ colors=[[255, 0, 0]],
+ radii=rr.Radius.ui_points(5.0),
+ ),
+ )
+
+ if client_config.gyroscope.enabled:
+ gyro_data_proto = request.gyroscope
+ gyro_data = GyroscopeInfo(
+ attitude=np.array(
+ [
+ gyro_data_proto.attitude.x,
+ gyro_data_proto.attitude.y,
+ gyro_data_proto.attitude.z,
+ gyro_data_proto.attitude.w,
+ ]
+ ),
+ rotation_rate=np.array(
+ [
+ gyro_data_proto.rotation_rate.x,
+ gyro_data_proto.rotation_rate.y,
+ gyro_data_proto.rotation_rate.z,
+ ]
+ ),
+ gravity=np.array(
+ [
+ gyro_data_proto.gravity.x,
+ gyro_data_proto.gravity.y,
+ gyro_data_proto.gravity.z,
+ ]
+ ),
+ acceleration=np.array(
+ [
+ gyro_data_proto.acceleration.x,
+ gyro_data_proto.acceleration.y,
+ gyro_data_proto.acceleration.z,
+ ]
+ ),
+ )
+ attitude = rr.Quaternion(
+ xyzw=gyro_data.attitude,
+ )
+ rotation_rate = rr.datatypes.Vec3D(gyro_data.rotation_rate)
+ gravity = rr.datatypes.Vec3D(gyro_data.gravity)
+ acceleration = rr.datatypes.Vec3D(gyro_data.acceleration)
+ # Attitute is displayed as a box, and the other acceleration variables are displayed as arrows.
+ rr.log(
+ "rotations/gyroscope/attitude",
+ rr.Boxes3D(half_sizes=[0.5, 0.5, 0.5], quaternions=[attitude]),
+ )
+ rr.log(
+ "rotations/gyroscope/rotation_rate",
+ rr.Arrows3D(vectors=[rotation_rate], colors=[[0, 255, 0]]),
+ )
+ rr.log(
+ "rotations/gyroscope/gravity",
+ rr.Arrows3D(vectors=[gravity], colors=[[0, 0, 255]]),
+ )
+ rr.log(
+ "rotations/gyroscope/acceleration",
+ rr.Arrows3D(vectors=[acceleration], colors=[[255, 255, 0]]),
+ )
+
+ if client_config.audio.enabled:
+ audio_data = np.array(request.audio_data)
+ for i in audio_data:
+ self.recorder.log("world/audio", rr.Scalar(i))
+
+ if client_config.meshing.enabled:
+ logger.debug("Number of meshes: %s", len(request.meshes))
+ # Binary arrays can be empty if no mesh is sent. This could be due to non-supporting devices. We can log this in the future.
+ binary_arrays = request.meshes
+ for index, mesh_data in enumerate(binary_arrays):
+ # We are ignoring type because DracoPy is written with Cython, and Pyright cannot infer types from a native module.
+ dracoMesh = DracoPy.decode(mesh_data.data) # pyright: ignore [reportUnknownMemberType, reportUnknownVariableType]
+
+ mesh = Mesh(
+ faces=dracoMesh.faces, # pyright: ignore [reportUnknownMemberType, reportUnknownArgumentType]
+ points=dracoMesh.points, # pyright: ignore [reportUnknownMemberType, reportUnknownArgumentType]
+ normals=dracoMesh.normals, # pyright: ignore [reportUnknownMemberType, reportUnknownArgumentType]
+ tex_coord=dracoMesh.tex_coord, # pyright: ignore [reportUnknownMemberType, reportUnknownArgumentType]
+ colors=dracoMesh.colors, # pyright: ignore [reportUnknownMemberType, reportUnknownArgumentType]
+ )
+
+ rr.log(
+ f"world/mesh/mesh-{index}",
+ rr.Mesh3D(
+ vertex_positions=mesh.points,
+ triangle_indices=mesh.faces,
+ vertex_normals=mesh.normals,
+ vertex_colors=mesh.colors,
+ vertex_texcoords=mesh.tex_coord,
+ ),
+ )
+
+ # Call the for user extension code.
+ self.on_frame_received(
+ DecodedDataFrame(
+ color_rgb=color_rgb,
+ depth_img=depth_img,
+ transform=transform,
+ intrinsic=k,
+ point_cloud_pcd=point_cloud_pcd,
+ point_cloud_clr=point_cloud_clr,
+ )
+ )
+
+ return ProcessFrameResponse(message="OK")
+
+ def on_register(self, request: RegisterClientRequest) -> None:
+ """Called when a new device is registered. Override this method to process the data."""
+ pass
+
+ def on_frame_received(self, decoded_data_frame: DecodedDataFrame) -> None:
+ """Called when a frame is received. Override this method to process the data."""
+ pass # pragma: no cover
+
+ def on_program_exit(self, path_to_save: Path) -> None:
+ """Save the data and exit.
+
+ @private
+ """
+ logger.debug("Saving the data...")
+ # Ensure the directory exists.
+ path_to_save.mkdir(parents=True, exist_ok=True)
+ save_path = (
+ path_to_save
+ / f"frames_{time.strftime('%Y_%m_%d_%H_%M_%S', time.gmtime())}.pkl"
+ )
+ with save_path.open("wb") as f:
+ pickle.dump(self._requests_history, f)
+
+ logger.info("Data saved to %s", save_path)
+
+
+# TODO: Integration tests once more infrastructure work has been done (e.g., Docker). Remove pragma once implemented.
+def run_server( # pragma: no cover
+ service: Type[ARFlowServicer], port: int = 8500, path_to_save: Path | None = None
+) -> None:
+ """Run gRPC server.
+
+ Args:
+ service: The service class to use. Custom servers should subclass `arflow.ARFlowServicer`.
+ port: The port to listen on.
+ path_to_save: The path to save data to.
+ """
+ servicer = service()
+ interceptors = [ErrorInterceptor()] # pyright: ignore [reportUnknownVariableType]
+ server = grpc.server( # pyright: ignore [reportUnknownMemberType]
+ futures.ThreadPoolExecutor(max_workers=10),
+ interceptors=interceptors, # pyright: ignore [reportArgumentType]
+ options=[
+ ("grpc.max_send_message_length", -1),
+ ("grpc.max_receive_message_length", -1),
+ ],
+ )
+ service_pb2_grpc.add_ARFlowServiceServicer_to_server(servicer, server) # pyright: ignore [reportUnknownMemberType]
+ server.add_insecure_port("[::]:%s" % port)
+ server.start()
+ logger.info("Server started, listening on %s", port)
+
+ def handle_shutdown(*_: Any) -> None:
+ """Shutdown gracefully.
+
+ This function handles graceful shutdown of the server. It is triggered by termination signals,
+ which are typically sent by Kubernetes or other orchestration tools to stop the service.
+
+ - When running locally, pressing will raise a `KeyboardInterrupt`, which can be caught to call this function.
+ - In a Kubernetes environment, a SIGTERM signal is sent to the service, followed by a SIGKILL if the service does not stop within 30 seconds.
+
+ Steps:
+ 1. Catch the SIGTERM signal.
+ 2. Call `server.stop(30)` to refuse new requests and wait up to 30 seconds for ongoing requests to complete.
+ 3. Wait on the `threading.Event` object returned by `server.stop(30)` to ensure Python does not exit prematurely.
+ 4. Optionally, perform cleanup procedures and save any necessary data before shutting down completely.
+ """
+ logger.debug("Shutting down gracefully")
+ all_rpcs_done_event = server.stop(30)
+ all_rpcs_done_event.wait(30)
+
+ if path_to_save is not None:
+ servicer.on_program_exit(path_to_save)
+
+ # TODO: Discuss hook for user-defined cleanup procedures.
+
+ logger.debug("Server shut down gracefully")
+
+ signal(SIGTERM, handle_shutdown)
+ signal(SIGINT, handle_shutdown)
+ server.wait_for_termination()
diff --git a/python/arflow/_decoding.py b/python/arflow/_decoding.py
new file mode 100644
index 0000000..2ac33ec
--- /dev/null
+++ b/python/arflow/_decoding.py
@@ -0,0 +1,227 @@
+import numpy as np
+
+from arflow._types import (
+ ColorDataType,
+ ColorRGB,
+ DepthDataType,
+ DepthImg,
+ Intrinsic,
+ PlaneBoundaryPoints2D,
+ PlaneBoundaryPoints3D,
+ PlaneCenter,
+ PlaneNormal,
+ PointCloudCLR,
+ PointCloudPCD,
+ Transform,
+)
+
+
+def decode_rgb_image(
+ resolution_y: int,
+ resolution_x: int,
+ resize_factor_y: float,
+ resize_factor_x: float,
+ data_type: ColorDataType,
+ buffer: bytes,
+) -> ColorRGB:
+ """Decode the color image from the buffer.
+
+ Raises:
+ ValueError: If the data type is not recognized
+ """
+ # Calculate the size of the image.
+ color_img_w = int(resolution_x * resize_factor_x)
+ color_img_h = int(resolution_y * resize_factor_y)
+ p = color_img_w * color_img_h
+ color_img = np.frombuffer(buffer, dtype=np.uint8)
+
+ # Decode RGB bytes into RGB.
+ if data_type == "RGB24":
+ color_rgb = color_img.reshape((color_img_h, color_img_w, 3))
+
+ # Decode YCbCr bytes into RGB.
+ elif data_type == "YCbCr420":
+ y = color_img[:p].reshape((color_img_h, color_img_w))
+ cbcr = color_img[p:].reshape((color_img_h // 2, color_img_w // 2, 2))
+ cb, cr = cbcr[:, :, 0], cbcr[:, :, 1]
+
+ # Very important! Convert to float32 first!
+ cb = np.repeat(cb, 2, axis=0).repeat(2, axis=1).astype(np.float32) - 128
+ cr = np.repeat(cr, 2, axis=0).repeat(2, axis=1).astype(np.float32) - 128
+
+ r = np.clip(y + 1.403 * cr, 0, 255)
+ g = np.clip(y - 0.344 * cb - 0.714 * cr, 0, 255)
+ b = np.clip(y + 1.772 * cb, 0, 255)
+
+ color_rgb = np.stack([r, g, b], axis=-1)
+
+ else:
+ raise ValueError(f"Unknown data type: {data_type}")
+
+ return color_rgb.astype(np.uint8)
+
+
+def decode_depth_image(
+ resolution_y: int,
+ resolution_x: int,
+ data_type: DepthDataType,
+ buffer: bytes,
+) -> DepthImg:
+ """Decode the depth image from the buffer.
+
+ Args:
+ data_type: `f32` for iOS, `u16` for Android.
+
+ Raises:
+ ValueError: If the data type is not recognized.
+ """
+ # The `Any` means that the array can have any shape. We cannot
+ # determine the shape of the array from the buffer.
+ if data_type == "f32":
+ dtype = np.float32
+ elif data_type == "u16":
+ dtype = np.uint16
+ else:
+ raise ValueError(f"Unknown data type: {data_type}")
+
+ depth_img = np.frombuffer(buffer, dtype=dtype).reshape(
+ (
+ resolution_y,
+ resolution_x,
+ )
+ )
+
+ # If it's a 16-bit unsigned integer, convert to float32 and scale to meters.
+ if dtype == np.uint16:
+ depth_img = (depth_img.astype(np.float32) / 1000.0).astype(np.float32)
+
+ return depth_img.astype(np.float32)
+
+
+def decode_transform(buffer: bytes) -> Transform:
+ y_down_to_y_up = np.array(
+ [
+ [1.0, -0.0, 0.0, 0],
+ [0.0, -1.0, 0.0, 0],
+ [0.0, 0.0, 1.0, 0],
+ [0.0, 0.0, 0, 1.0],
+ ],
+ dtype=np.float32,
+ )
+
+ t = np.frombuffer(buffer, dtype=np.float32)
+ transform = np.eye(4, dtype=np.float32)
+ transform[:3, :] = t.reshape((3, 4))
+ transform[:3, 3] = 0
+ transform = y_down_to_y_up @ transform
+
+ return transform.astype(np.float32)
+
+
+def decode_intrinsic(
+ resize_factor_y: float,
+ resize_factor_x: float,
+ focal_length_y: float,
+ focal_length_x: float,
+ principal_point_y: float,
+ principal_point_x: float,
+) -> Intrinsic:
+ sx = resize_factor_x
+ sy = resize_factor_y
+
+ fx, fy = (
+ focal_length_x * sx,
+ focal_length_y * sy,
+ )
+ cx, cy = (
+ principal_point_x * sx,
+ principal_point_y * sy,
+ )
+
+ k = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]], dtype=np.float32)
+
+ return k
+
+
+def decode_point_cloud(
+ resolution_y: int,
+ resolution_x: int,
+ resize_factor_y: float,
+ resize_factor_x: float,
+ k: Intrinsic,
+ color_rgb: ColorRGB,
+ depth_img: DepthImg,
+ transform: Transform,
+) -> tuple[PointCloudPCD, PointCloudCLR]:
+ # Flip image is needed for point cloud generation.
+ color_rgb = np.flipud(color_rgb)
+ depth_img = np.flipud(depth_img)
+
+ color_img_w = int(resolution_x * resize_factor_x)
+ color_img_h = int(resolution_y * resize_factor_y)
+
+ u, v = np.meshgrid(np.arange(color_img_w), np.arange(color_img_h))
+
+ fx: np.float32 = k[0, 0]
+ fy: np.float32 = k[1, 1]
+ cx: np.float32 = k[0, 2]
+ cy: np.float32 = k[1, 2]
+
+ z = depth_img.copy()
+ x = ((u - cx) * z) / fx
+ y = ((v - cy) * z) / fy
+ pre_pcd = np.stack([x, y, z], axis=-1).reshape(-1, 3)
+ pcd = np.matmul(transform[:3, :3], pre_pcd.T).T + transform[:3, 3]
+ clr = color_rgb.reshape(-1, 3)
+
+ return pcd.astype(np.float32), clr
+
+
+def convert_2d_to_3d_boundary_points(
+ boundary_points_2d: PlaneBoundaryPoints2D, normal: PlaneNormal, center: PlaneCenter
+) -> PlaneBoundaryPoints3D:
+ # Check boundary points validity
+ if boundary_points_2d.shape[1] != 2:
+ raise ValueError("Boundary points should be in 2D")
+ if boundary_points_2d.shape[0] < 3:
+ raise ValueError("At least 3 boundary points are required")
+
+ # Check normal validity
+ if len(normal.shape) != 1:
+ raise ValueError("There should only be 1 normal")
+ if normal.shape[0] != 3:
+ raise ValueError("Normal should be in 3D")
+ if np.linalg.norm(normal) == 0:
+ raise ValueError("Normal should be non-zero")
+
+ # Check center validity
+ if len(center.shape) != 1:
+ raise ValueError("There should only be 1 center")
+ if center.shape[0] != 3:
+ raise ValueError("Center should be in 3D")
+
+ # Ensure the normal is normalized
+ normal = normal / np.linalg.norm(normal)
+
+ # Generate two orthogonal vectors (u and v) that lie on the plane
+ # Find a vector that is not parallel to the normal
+ arbitrary_vector = (
+ np.array([1, 0, 0])
+ if not np.allclose(normal, [1, 0, 0])
+ else np.array([0, 1, 0])
+ )
+
+ # Create u vector, which is perpendicular to the normal
+ u = np.cross(normal, arbitrary_vector)
+ u = u / np.linalg.norm(u)
+
+ # Create v vector, which is perpendicular to both the normal and u
+ v = np.cross(normal, u)
+
+ # Convert the 2D points into 3D
+ # Each 2D point can be written as a linear combination of u and v, plus the center
+ boundary_points_3d = np.array(
+ [center + point_2d[0] * u + point_2d[1] * v for point_2d in boundary_points_2d]
+ )
+
+ return np.array(boundary_points_3d, dtype=np.float32)
diff --git a/python/arflow/_error_interceptor.py b/python/arflow/_error_interceptor.py
new file mode 100644
index 0000000..0708fa9
--- /dev/null
+++ b/python/arflow/_error_interceptor.py
@@ -0,0 +1,22 @@
+import logging
+from typing import Any, NoReturn
+
+import grpc
+from grpc_interceptor import ExceptionToStatusInterceptor
+
+logger = logging.getLogger(__name__)
+
+
+class ErrorInterceptor(ExceptionToStatusInterceptor):
+ def handle_exception(
+ self,
+ ex: Exception,
+ request_or_iterator: Any,
+ context: grpc.ServicerContext,
+ method_name: str,
+ ) -> NoReturn:
+ self.log_error(ex)
+ super().handle_exception(ex, request_or_iterator, context, method_name)
+
+ def log_error(self, e: Exception) -> None:
+ logger.exception(e)
diff --git a/python/arflow/_replay.py b/python/arflow/_replay.py
new file mode 100644
index 0000000..f99c88e
--- /dev/null
+++ b/python/arflow/_replay.py
@@ -0,0 +1,97 @@
+"""A library for replaying ARFlow data."""
+
+import logging
+import pickle
+import threading
+import time
+from pathlib import Path
+from typing import Type
+
+from arflow._core import ARFlowServicer
+from arflow._types import EnrichedARFlowRequest, RequestsHistory
+from arflow_grpc.service_pb2 import ProcessFrameRequest, RegisterClientRequest
+
+logger = logging.getLogger(__name__)
+
+
+class ARFlowPlayer(threading.Thread):
+ """A class for replaying ARFlow data."""
+
+ def __init__(self, service: Type[ARFlowServicer], frame_data_path: Path) -> None:
+ """Initialize the ARFlowPlayer."""
+ super().__init__()
+ self._service = service()
+ self._requests_history: RequestsHistory = []
+
+ with frame_data_path.open("rb") as f:
+ raw_data: RequestsHistory = pickle.load(f)
+
+ if not raw_data:
+ raise ValueError("No data to replay.")
+ if not isinstance(raw_data[0].data, RegisterClientRequest):
+ raise ValueError("The first request should be a RegisterClientRequest.")
+ if not isinstance(raw_data[1].data, ProcessFrameRequest):
+ raise ValueError("The second request should be a ProcessFrameRequest.")
+
+ start_delta = 0
+ for i, data in enumerate(raw_data):
+ if i == 0:
+ start_delta = data.timestamp - 3
+ self._requests_history.append(
+ EnrichedARFlowRequest(
+ timestamp=data.timestamp - start_delta,
+ data=data.data,
+ )
+ )
+ else:
+ self._requests_history.append(
+ EnrichedARFlowRequest(
+ timestamp=data.timestamp - start_delta,
+ data=data.data,
+ )
+ )
+
+ sent_dataframe = self._requests_history[1].data
+ if not isinstance(sent_dataframe, ProcessFrameRequest):
+ raise ValueError("The second request should be a ProcessFrameRequest.")
+ else:
+ self._uid = sent_dataframe.uid
+
+ self._period = 0.001 # Simulate a 1ms loop.
+ self._n_frame = 0
+
+ self._i = 0
+ self._t0 = time.time()
+ self.start()
+
+ def _sleep(self):
+ self._i += 1
+ delta = self._t0 + self._period * self._i - time.time()
+ if delta > 0:
+ time.sleep(delta)
+
+ def run(self) -> None:
+ """Run the replay."""
+ while True:
+ current_time = time.time() - self._t0
+
+ t = self._requests_history[self._n_frame].timestamp
+
+ if t - current_time < 0.001:
+ data = self._requests_history[self._n_frame].data
+ if self._n_frame == 0 and isinstance(data, RegisterClientRequest):
+ self._service.RegisterClient(data, None, init_uid=self._uid)
+ elif isinstance(data, ProcessFrameRequest):
+ self._service.ProcessFrame(data, None)
+ else:
+ raise ValueError("Unknown request data type.")
+
+ self._n_frame += 1
+
+ if self._n_frame > len(self._requests_history) - 1:
+ break
+
+ self._sleep()
+
+ logger.debug("Reply finished.")
+ exit()
diff --git a/python/arflow/_types.py b/python/arflow/_types.py
new file mode 100644
index 0000000..42bacc5
--- /dev/null
+++ b/python/arflow/_types.py
@@ -0,0 +1,122 @@
+"""Type definitions for ARFlow."""
+
+from __future__ import annotations
+
+from dataclasses import dataclass
+from typing import Dict, List, Literal, NewType
+
+import numpy as np
+import numpy.typing as npt
+
+from arflow_grpc.service_pb2 import ProcessFrameRequest, RegisterClientRequest
+
+ARFlowRequest = ProcessFrameRequest | RegisterClientRequest
+
+
+@dataclass
+class EnrichedARFlowRequest:
+ """An enriched ARFlow request."""
+
+ timestamp: float
+ """The timestamp of the request."""
+ data: ARFlowRequest
+ """The ARFlow request data."""
+
+
+ColorDataType = Literal["RGB24", "YCbCr420"]
+DepthDataType = Literal["f32", "u16"]
+"""The depth data type. `f32` for iOS, `u16` for Android."""
+
+ColorRGB = npt.NDArray[np.uint8]
+DepthImg = npt.NDArray[np.float32]
+Transform = npt.NDArray[np.float32]
+Intrinsic = npt.NDArray[np.float32]
+PointCloudPCD = npt.NDArray[np.float32]
+PointCloudCLR = npt.NDArray[np.uint8]
+
+Attitude = npt.NDArray[np.float32]
+RotationRate = npt.NDArray[np.float32]
+Gravity = npt.NDArray[np.float32]
+Acceleration = npt.NDArray[np.float32]
+
+Audio = npt.NDArray[np.float32]
+
+MeshFaces = npt.NDArray[np.uint32]
+MeshPoints = npt.NDArray[np.float32]
+MeshNormals = npt.NDArray[np.float32]
+MeshTexCoord = npt.NDArray[np.float32]
+MeshColors = npt.NDArray[np.float32]
+
+PlaneCenter = npt.NDArray[np.float32]
+PlaneNormal = npt.NDArray[np.float32]
+PlaneSize = npt.NDArray[np.float32]
+PlaneBoundaryPoints2D = npt.NDArray[np.float32]
+PlaneBoundaryPoints3D = npt.NDArray[np.float32]
+
+
+@dataclass
+class PlaneInfo:
+ """Information about a plane."""
+
+ center: PlaneCenter
+ """The center of the plane. In world space (3D)."""
+ normal: PlaneNormal
+ """The normal of the plane. In world space (3D)."""
+ size: PlaneSize
+ """Width and Height of the plane. In meters (2D)"""
+ boundary_points: PlaneBoundaryPoints2D
+ """The boundary points of the plane. In plane space (2D)."""
+
+
+@dataclass
+class GyroscopeInfo:
+ """Information about a gyroscope."""
+
+ attitude: Attitude
+ """The attitude of the gyroscope."""
+ rotation_rate: RotationRate
+ """The rotation rate of the gyroscope."""
+ gravity: Gravity
+ """The gravity of the gyroscope."""
+ acceleration: Acceleration
+ """The acceleration of the gyroscope."""
+
+
+@dataclass
+class Mesh:
+ """A mesh object. Draco's meshes have additional methods and properties, but with limited documentation and usage on them, I will not include them here."""
+
+ faces: MeshFaces
+ """The mesh faces. Each face is an array of [3] indices."""
+ points: MeshPoints
+ """The mesh points. Each point is an array of [3] coordinates."""
+ normals: MeshNormals | None = None
+ """The mesh normals. Each normal is an array of [3] coordinates. If the mesh does not have normals, this field is `None`."""
+ tex_coord: MeshTexCoord | None = None
+ """The mesh texture coordinates. Each texture coordinate is an array of [2] coordinates. If the mesh does not have texture coordinates, this field is `None`."""
+ colors: MeshColors | None = None
+ """The mesh colors. If the mesh does not have colors, this field is `None`."""
+
+
+@dataclass
+class DecodedDataFrame:
+ """A decoded data frame."""
+
+ color_rgb: ColorRGB | None = None
+ """The color image in RGB format."""
+ depth_img: DepthImg | None = None
+ """The depth image."""
+ transform: Transform | None = None
+ """The transformation matrix of the camera."""
+ intrinsic: Intrinsic | None = None
+ """The intrinsic matrix of the camera."""
+ point_cloud_pcd: PointCloudPCD | None = None
+ """The point cloud in PCD format."""
+ point_cloud_clr: PointCloudCLR | None = None
+ """The point cloud colors in RGB format."""
+
+
+RequestsHistory = List[EnrichedARFlowRequest]
+HashableClientIdentifier = NewType("HashableClientIdentifier", str)
+"""This should match a hashable field in the `RegisterClientRequest` message."""
+ClientConfigurations = Dict[HashableClientIdentifier, RegisterClientRequest]
diff --git a/python/arflow/core.py b/python/arflow/core.py
deleted file mode 100644
index 21425d3..0000000
--- a/python/arflow/core.py
+++ /dev/null
@@ -1,331 +0,0 @@
-"""Data exchanging service."""
-
-import os
-import pickle
-import time
-import uuid
-from time import gmtime, strftime
-from typing import Dict, List
-
-import numpy as np
-import rerun as rr
-
-from arflow import service_pb2, service_pb2_grpc
-
-sessions: Dict[str, service_pb2.RegisterRequest] = {}
-"""@private"""
-
-
-class ARFlowService(service_pb2_grpc.ARFlowService):
- """ARFlow gRPC service."""
-
- _start_time = time.time_ns()
- _frame_data: List[Dict[str, float | bytes]] = []
-
- def __init__(self, use_visualizer: bool = True) -> None:
- self.recorder = rr
- self.use_visualizer = use_visualizer
- super().__init__()
-
- def _save_frame_data(
- self, request: service_pb2.DataFrameRequest | service_pb2.RegisterRequest
- ):
- """@private"""
- time_stamp = (time.time_ns() - self._start_time) / 1e9
- self._frame_data.append(
- {"time_stamp": time_stamp, "data": request.SerializeToString()}
- )
-
- def register(
- self, request: service_pb2.RegisterRequest, context, uid: str | None = None
- ) -> service_pb2.RegisterResponse:
- """Register a client."""
-
- self._save_frame_data(request)
-
- # Start processing.
- if uid is None:
- uid = str(uuid.uuid4())
-
- sessions[uid] = request
-
- self.recorder.init(
- f"{request.device_name} - ARFlow",
- spawn=self.use_visualizer,
- default_enabled=self.use_visualizer,
- )
- print("Registered a client with UUID: %s" % uid, request)
-
- # Call the for user extension code.
- self.on_register(request)
-
- return service_pb2.RegisterResponse(uid=uid)
-
- def data_frame(
- self,
- request: service_pb2.DataFrameRequest,
- context,
- ) -> service_pb2.DataFrameResponse:
- """Process an incoming frame."""
-
- self._save_frame_data(request)
-
- # Start processing.
- decoded_data = {}
- session_configs = sessions[request.uid]
-
- if session_configs.camera_color.enabled:
- color_rgb = ARFlowService.decode_rgb_image(session_configs, request.color)
- decoded_data["image/color_rgb"] = color_rgb
- color_rgb = np.flipud(color_rgb)
- self.recorder.log("rgb", rr.Image(color_rgb))
-
- if session_configs.camera_depth.enabled:
- depth_img = ARFlowService.decode_depth_image(session_configs, request.depth)
- decoded_data["image/depth_img"] = depth_img
- depth_img = np.flipud(depth_img)
- self.recorder.log("depth", rr.DepthImage(depth_img, meter=1.0))
-
- if session_configs.camera_transform.enabled:
- self.recorder.log("world/origin", rr.ViewCoordinates.RIGHT_HAND_Y_DOWN)
- # self.logger.log(
- # "world/xyz",
- # rr.Arrows3D(
- # vectors=[[1, 0, 0], [0, 1, 0], [0, 0, 1]],
- # colors=[[255, 0, 0], [0, 255, 0], [0, 0, 255]],
- # ),
- # )
-
- transform = ARFlowService.decode_transform(request.transform)
- decoded_data["transform"] = transform
- self.recorder.log(
- "world/camera",
- self.recorder.Transform3D(
- mat3x3=transform[:3, :3], translation=transform[:3, 3]
- ),
- )
-
- k = ARFlowService.decode_intrinsic(session_configs)
- self.recorder.log("world/camera", rr.Pinhole(image_from_camera=k))
- self.recorder.log("world/camera", rr.Image(np.flipud(color_rgb)))
-
- if session_configs.camera_point_cloud.enabled:
- pcd, clr = ARFlowService.decode_point_cloud(
- session_configs, k, color_rgb, depth_img, transform
- )
- decoded_data["point_cloud_pcd"] = pcd
- decoded_data["point_cloud_clr"] = clr
- self.recorder.log("world/point_cloud", rr.Points3D(pcd, colors=clr))
-
- if session_configs.camera_plane_detection.enabled:
- pass
-
- if session_configs.gyroscope.enabled:
- gyro_data = request.gyroscope
-
- attitude = rr.Quaternion(
- xyzw=[
- gyro_data.attitude.x,
- gyro_data.attitude.y,
- gyro_data.attitude.z,
- gyro_data.attitude.w,
- ]
- )
- rotation_rate = rr.datatypes.Vec3D(
- [
- gyro_data.rotation_rate.x,
- gyro_data.rotation_rate.y,
- gyro_data.rotation_rate.z,
- ]
- )
- gravity = rr.datatypes.Vec3D(
- [gyro_data.gravity.x, gyro_data.gravity.y, gyro_data.gravity.z]
- )
- acceleration = rr.datatypes.Vec3D(
- [
- gyro_data.acceleration.x,
- gyro_data.acceleration.y,
- gyro_data.acceleration.z,
- ]
- )
-
- # Attitute is displayed as a box, and the other acceleration variables are displayed as arrows.
- rr.log(
- "rotations/gyroscope/attitude",
- rr.Boxes3D(half_sizes=[0.5, 0.5, 0.5], quaternions=[attitude]),
- )
- rr.log(
- "rotations/gyroscope/rotation_rate",
- rr.Arrows3D(vectors=[rotation_rate], colors=[[0, 255, 0]]),
- )
- rr.log(
- "rotations/gyroscope/gravity",
- rr.Arrows3D(vectors=[gravity], colors=[[0, 0, 255]]),
- )
- rr.log(
- "rotations/gyroscope/acceleration",
- rr.Arrows3D(vectors=[acceleration], colors=[[255, 255, 0]]),
- )
-
- # Call the for user extension code.
- self.on_frame_received(decoded_data)
-
- return service_pb2.DataFrameResponse(message="OK")
-
- def on_register(self, request: service_pb2.RegisterRequest):
- """Called when a new device is registered. Override this method to process the data."""
- pass
-
- def on_frame_received(self, frame_data: service_pb2.DataFrameRequest):
- """Called when a frame is received. Override this method to process the data."""
- pass
-
- def on_program_exit(self, path_to_save: str | None):
- """Save the data and exit."""
- if path_to_save is None:
- return
- print("Saving the data...")
- f_name = strftime("%Y_%m_%d_%H_%M_%S", gmtime())
- save_path = os.path.join(path_to_save, f"frames_{f_name}.pkl")
- with open(save_path, "wb") as f:
- pickle.dump(self._frame_data, f)
-
- print(f"Data saved to {save_path}")
-
- @staticmethod
- def decode_rgb_image(
- session_configs: service_pb2.RegisterRequest, buffer: bytes
- ) -> np.ndarray:
- # Calculate the size of the image.
- color_img_w = int(
- session_configs.camera_intrinsics.resolution_x
- * session_configs.camera_color.resize_factor_x
- )
- color_img_h = int(
- session_configs.camera_intrinsics.resolution_y
- * session_configs.camera_color.resize_factor_y
- )
- p = color_img_w * color_img_h
- color_img = np.frombuffer(buffer, dtype=np.uint8)
-
- # Decode RGB bytes into RGB.
- if session_configs.camera_color.data_type == "RGB24":
- color_rgb = color_img.reshape((color_img_h, color_img_w, 3))
- color_rgb = color_rgb.astype(np.uint8)
-
- # Decode YCbCr bytes into RGB.
- elif session_configs.camera_color.data_type == "YCbCr420":
- y = color_img[:p].reshape((color_img_h, color_img_w))
- cbcr = color_img[p:].reshape((color_img_h // 2, color_img_w // 2, 2))
- cb, cr = cbcr[:, :, 0], cbcr[:, :, 1]
-
- # Very important! Convert to float32 first!
- cb = np.repeat(cb, 2, axis=0).repeat(2, axis=1).astype(np.float32) - 128
- cr = np.repeat(cr, 2, axis=0).repeat(2, axis=1).astype(np.float32) - 128
-
- r = np.clip(y + 1.403 * cr, 0, 255)
- g = np.clip(y - 0.344 * cb - 0.714 * cr, 0, 255)
- b = np.clip(y + 1.772 * cb, 0, 255)
-
- color_rgb = np.stack([r, g, b], axis=-1)
- color_rgb = color_rgb.astype(np.uint8)
-
- return color_rgb
-
- @staticmethod
- def decode_depth_image(
- session_configs: service_pb2.RegisterRequest, buffer: bytes
- ) -> np.ndarray:
- if session_configs.camera_depth.data_type == "f32":
- dtype = np.float32
- elif session_configs.camera_depth.data_type == "u16":
- dtype = np.uint16
- else:
- raise ValueError(
- f"Unknown depth data type: {session_configs.camera_depth.data_type}"
- )
-
- depth_img = np.frombuffer(buffer, dtype=dtype)
- depth_img = depth_img.reshape(
- (
- session_configs.camera_depth.resolution_y,
- session_configs.camera_depth.resolution_x,
- )
- )
-
- # 16-bit unsigned integer, describing the depth (distance to an object) in millimeters.
- if dtype == np.uint16:
- depth_img = depth_img.astype(np.float32) / 1000.0
-
- return depth_img
-
- @staticmethod
- def decode_transform(buffer: bytes):
- y_down_to_y_up = np.array(
- [
- [1.0, -0.0, 0.0, 0],
- [0.0, -1.0, 0.0, 0],
- [0.0, 0.0, 1.0, 0],
- [0.0, 0.0, 0, 1.0],
- ],
- dtype=np.float32,
- )
-
- t = np.frombuffer(buffer, dtype=np.float32)
- transform = np.eye(4)
- transform[:3, :] = t.reshape((3, 4))
- transform[:3, 3] = 0
- transform = y_down_to_y_up @ transform
-
- return transform
-
- @staticmethod
- def decode_intrinsic(session_configs: service_pb2.RegisterRequest):
- sx = session_configs.camera_color.resize_factor_x
- sy = session_configs.camera_color.resize_factor_y
-
- fx, fy = (
- session_configs.camera_intrinsics.focal_length_x * sx,
- session_configs.camera_intrinsics.focal_length_y * sy,
- )
- cx, cy = (
- session_configs.camera_intrinsics.principal_point_x * sx,
- session_configs.camera_intrinsics.principal_point_y * sy,
- )
-
- k = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
-
- return k
-
- @staticmethod
- def decode_point_cloud(
- session_configs: service_pb2.RegisterRequest,
- k: np.ndarray,
- color_rgb: np.ndarray,
- depth_img: np.ndarray,
- transform: np.ndarray,
- ) -> np.ndarray:
- # Flip image is needed for point cloud generation.
- color_rgb = np.flipud(color_rgb)
- depth_img = np.flipud(depth_img)
-
- color_img_w = int(
- session_configs.camera_intrinsics.resolution_x
- * session_configs.camera_color.resize_factor_x
- )
- color_img_h = int(
- session_configs.camera_intrinsics.resolution_y
- * session_configs.camera_color.resize_factor_y
- )
- u, v = np.meshgrid(np.arange(color_img_w), np.arange(color_img_h))
- fx, fy = k[0, 0], k[1, 1]
- cx, cy = k[0, 2], k[1, 2]
-
- z = depth_img.copy()
- x = ((u - cx) * z) / fx
- y = ((v - cy) * z) / fy
- pcd = np.stack([x, y, z], axis=-1).reshape(-1, 3)
- pcd = np.matmul(transform[:3, :3], pcd.T).T + transform[:3, 3]
- clr = color_rgb.reshape(-1, 3)
-
- return pcd, clr
diff --git a/python/arflow/py.typed b/python/arflow/py.typed
new file mode 100644
index 0000000..e69de29
diff --git a/python/arflow/replay.py b/python/arflow/replay.py
deleted file mode 100644
index 894f3c5..0000000
--- a/python/arflow/replay.py
+++ /dev/null
@@ -1,80 +0,0 @@
-"""A library for replaying ARFlow data."""
-
-import pickle
-import threading
-import time
-from typing import List
-
-from arflow.core import ARFlowService
-from arflow.service_pb2 import DataFrameRequest, RegisterRequest
-
-
-class ARFlowPlayer(threading.Thread):
- """A class for replaying ARFlow data."""
-
- service: ARFlowService
- frame_data: List
- n_frame: int
-
- def __init__(self, service: ARFlowService, frame_data_path: str) -> None:
- super().__init__()
- self.service = service()
- with open(frame_data_path, "rb") as f:
- raw_data = pickle.load(f)
-
- self.frame_data = []
- start_delta = 0
- for i, data in enumerate(raw_data):
- if i == 0:
- start_delta = data["time_stamp"] - 3
- self.frame_data.append(
- {
- "time_stamp": data["time_stamp"] - start_delta,
- "data": RegisterRequest.FromString(data["data"]),
- }
- )
- else:
- self.frame_data.append(
- {
- "time_stamp": data["time_stamp"] - start_delta,
- "data": DataFrameRequest.FromString(data["data"]),
- }
- )
-
- self.uid = self.frame_data[1]["data"].uid
-
- self.period = 0.001 # Simulate a 1ms loop.
- self.n_frame = 0
-
- self.i = 0
- self.t0 = time.time()
- self.start()
-
- def sleep(self):
- self.i += 1
- delta = self.t0 + self.period * self.i - time.time()
- if delta > 0:
- time.sleep(delta)
-
- def run(self):
- while True:
- current_time = time.time() - self.t0
-
- t = self.frame_data[self.n_frame]["time_stamp"]
-
- if t - current_time < 0.001:
- data = self.frame_data[self.n_frame]["data"]
- if self.n_frame == 0:
- self.service.register(data, None, uid=self.uid)
- else:
- self.service.data_frame(data, None)
-
- self.n_frame += 1
-
- if self.n_frame > len(self.frame_data) - 1:
- break
-
- self.sleep()
-
- print("Reply finished.")
- exit()
diff --git a/python/arflow/serve.py b/python/arflow/serve.py
deleted file mode 100644
index 2b2f468..0000000
--- a/python/arflow/serve.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""Simple server for ARFlow service."""
-
-import sys
-from concurrent import futures
-
-import grpc
-
-from arflow import service_pb2_grpc
-from arflow.core import ARFlowService
-
-
-def create_server(
- service: ARFlowService, port: int = 8500, path_to_save: str | None = None
-):
- """Run gRPC server."""
- try:
- service = service()
- server = grpc.server(
- futures.ThreadPoolExecutor(max_workers=10),
- options=[
- ("grpc.max_send_message_length", -1),
- ("grpc.max_receive_message_length", -1),
- ],
- )
- service_pb2_grpc.add_ARFlowServiceServicer_to_server(service, server)
- server.add_insecure_port("[::]:%s" % port)
- server.start()
-
- print(f"ARFlow server started on port {port}")
- server.wait_for_termination()
- except KeyboardInterrupt:
- if path_to_save is not None:
- service.on_program_exit(path_to_save)
- sys.exit(0)
-
- # except Exception as e:
- # print(e)
-
-
-def serve():
- """Run a simple ARFlow server."""
- create_server(ARFlowService)
-
-
-if __name__ == "__main__":
- serve()
diff --git a/python/arflow/service_pb2.py b/python/arflow/service_pb2.py
deleted file mode 100644
index fc3e571..0000000
--- a/python/arflow/service_pb2.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler. DO NOT EDIT!
-# NO CHECKED-IN PROTOBUF GENCODE
-# source: arflow/service.proto
-# Protobuf Python Version: 5.27.2
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import runtime_version as _runtime_version
-from google.protobuf import symbol_database as _symbol_database
-from google.protobuf.internal import builder as _builder
-_runtime_version.ValidateProtobufRuntimeVersion(
- _runtime_version.Domain.PUBLIC,
- 5,
- 27,
- 2,
- '',
- 'arflow/service.proto'
-)
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x61rflow/service.proto\"\x83\t\n\x0fRegisterRequest\x12\x13\n\x0b\x64\x65vice_name\x18\x01 \x01(\t\x12<\n\x11\x63\x61mera_intrinsics\x18\x02 \x01(\x0b\x32!.RegisterRequest.CameraIntrinsics\x12\x32\n\x0c\x63\x61mera_color\x18\x03 \x01(\x0b\x32\x1c.RegisterRequest.CameraColor\x12\x32\n\x0c\x63\x61mera_depth\x18\x04 \x01(\x0b\x32\x1c.RegisterRequest.CameraDepth\x12:\n\x10\x63\x61mera_transform\x18\x05 \x01(\x0b\x32 .RegisterRequest.CameraTransform\x12=\n\x12\x63\x61mera_point_cloud\x18\x06 \x01(\x0b\x32!.RegisterRequest.CameraPointCloud\x12\x45\n\x16\x63\x61mera_plane_detection\x18\x07 \x01(\x0b\x32%.RegisterRequest.CameraPlaneDetection\x12-\n\tgyroscope\x18\x08 \x01(\x0b\x32\x1a.RegisterRequest.Gyroscope\x12%\n\x05\x61udio\x18\t \x01(\x0b\x32\x16.RegisterRequest.Audio\x12)\n\x07meshing\x18\n \x01(\x0b\x32\x18.RegisterRequest.Meshing\x1a\xa4\x01\n\x10\x43\x61meraIntrinsics\x12\x16\n\x0e\x66ocal_length_x\x18\x01 \x01(\x02\x12\x16\n\x0e\x66ocal_length_y\x18\x02 \x01(\x02\x12\x19\n\x11principal_point_x\x18\x03 \x01(\x02\x12\x19\n\x11principal_point_y\x18\x04 \x01(\x02\x12\x14\n\x0cresolution_x\x18\x05 \x01(\x05\x12\x14\n\x0cresolution_y\x18\x06 \x01(\x05\x1a\x63\n\x0b\x43\x61meraColor\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x11\n\tdata_type\x18\x02 \x01(\t\x12\x17\n\x0fresize_factor_x\x18\x03 \x01(\x02\x12\x17\n\x0fresize_factor_y\x18\x04 \x01(\x02\x1a\x81\x01\n\x0b\x43\x61meraDepth\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x11\n\tdata_type\x18\x02 \x01(\t\x12\"\n\x1a\x63onfidence_filtering_level\x18\x03 \x01(\x05\x12\x14\n\x0cresolution_x\x18\x04 \x01(\x05\x12\x14\n\x0cresolution_y\x18\x05 \x01(\x05\x1a\"\n\x0f\x43\x61meraTransform\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a\x41\n\x10\x43\x61meraPointCloud\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1c\n\x14\x64\x65pth_upscale_factor\x18\x02 \x01(\x02\x1a\'\n\x14\x43\x61meraPlaneDetection\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a\x1c\n\tGyroscope\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a\x18\n\x05\x41udio\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a\x1a\n\x07Meshing\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\"\x1f\n\x10RegisterResponse\x12\x0b\n\x03uid\x18\x01 \x01(\t\"\xbb\x05\n\x10\x44\x61taFrameRequest\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\r\n\x05\x63olor\x18\x02 \x01(\x0c\x12\r\n\x05\x64\x65pth\x18\x03 \x01(\x0c\x12\x11\n\ttransform\x18\x04 \x01(\x0c\x12\x31\n\x0fplane_detection\x18\x05 \x03(\x0b\x32\x18.DataFrameRequest.Planes\x12\x33\n\tgyroscope\x18\x06 \x01(\x0b\x32 .DataFrameRequest.gyroscope_data\x12\r\n\x05\x61udio\x18\x08 \x01(\x0c\x12\x0f\n\x07meshing\x18\t \x01(\x0c\x1a*\n\x07Vector3\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\x1a\x1f\n\x07Vector2\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x1a\x87\x01\n\x06Planes\x12)\n\x06\x63\x65nter\x18\x01 \x01(\x0b\x32\x19.DataFrameRequest.Vector3\x12)\n\x06normal\x18\x02 \x01(\x0b\x32\x19.DataFrameRequest.Vector3\x12\'\n\x04size\x18\x03 \x01(\x0b\x32\x19.DataFrameRequest.Vector2\x1a\x38\n\nQuaternion\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\x12\t\n\x01w\x18\x04 \x01(\x02\x1a\xcf\x01\n\x0egyroscope_data\x12.\n\x08\x61ttitude\x18\x01 \x01(\x0b\x32\x1c.DataFrameRequest.Quaternion\x12\x30\n\rrotation_rate\x18\x02 \x01(\x0b\x32\x19.DataFrameRequest.Vector3\x12*\n\x07gravity\x18\x03 \x01(\x0b\x32\x19.DataFrameRequest.Vector3\x12/\n\x0c\x61\x63\x63\x65leration\x18\x04 \x01(\x0b\x32\x19.DataFrameRequest.Vector3\"$\n\x11\x44\x61taFrameResponse\x12\x0f\n\x07message\x18\x01 \x01(\t2u\n\rARFlowService\x12/\n\x08register\x12\x10.RegisterRequest\x1a\x11.RegisterResponse\x12\x33\n\ndata_frame\x12\x11.DataFrameRequest\x1a\x12.DataFrameResponseB\t\xaa\x02\x06\x41RFlowb\x06proto3')
-
-_globals = globals()
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'arflow.service_pb2', _globals)
-if not _descriptor._USE_C_DESCRIPTORS:
- _globals['DESCRIPTOR']._loaded_options = None
- _globals['DESCRIPTOR']._serialized_options = b'\252\002\006ARFlow'
- _globals['_REGISTERREQUEST']._serialized_start=25
- _globals['_REGISTERREQUEST']._serialized_end=1180
- _globals['_REGISTERREQUEST_CAMERAINTRINSICS']._serialized_start=555
- _globals['_REGISTERREQUEST_CAMERAINTRINSICS']._serialized_end=719
- _globals['_REGISTERREQUEST_CAMERACOLOR']._serialized_start=721
- _globals['_REGISTERREQUEST_CAMERACOLOR']._serialized_end=820
- _globals['_REGISTERREQUEST_CAMERADEPTH']._serialized_start=823
- _globals['_REGISTERREQUEST_CAMERADEPTH']._serialized_end=952
- _globals['_REGISTERREQUEST_CAMERATRANSFORM']._serialized_start=954
- _globals['_REGISTERREQUEST_CAMERATRANSFORM']._serialized_end=988
- _globals['_REGISTERREQUEST_CAMERAPOINTCLOUD']._serialized_start=990
- _globals['_REGISTERREQUEST_CAMERAPOINTCLOUD']._serialized_end=1055
- _globals['_REGISTERREQUEST_CAMERAPLANEDETECTION']._serialized_start=1057
- _globals['_REGISTERREQUEST_CAMERAPLANEDETECTION']._serialized_end=1096
- _globals['_REGISTERREQUEST_GYROSCOPE']._serialized_start=1098
- _globals['_REGISTERREQUEST_GYROSCOPE']._serialized_end=1126
- _globals['_REGISTERREQUEST_AUDIO']._serialized_start=1128
- _globals['_REGISTERREQUEST_AUDIO']._serialized_end=1152
- _globals['_REGISTERREQUEST_MESHING']._serialized_start=1154
- _globals['_REGISTERREQUEST_MESHING']._serialized_end=1180
- _globals['_REGISTERRESPONSE']._serialized_start=1182
- _globals['_REGISTERRESPONSE']._serialized_end=1213
- _globals['_DATAFRAMEREQUEST']._serialized_start=1216
- _globals['_DATAFRAMEREQUEST']._serialized_end=1915
- _globals['_DATAFRAMEREQUEST_VECTOR3']._serialized_start=1434
- _globals['_DATAFRAMEREQUEST_VECTOR3']._serialized_end=1476
- _globals['_DATAFRAMEREQUEST_VECTOR2']._serialized_start=1478
- _globals['_DATAFRAMEREQUEST_VECTOR2']._serialized_end=1509
- _globals['_DATAFRAMEREQUEST_PLANES']._serialized_start=1512
- _globals['_DATAFRAMEREQUEST_PLANES']._serialized_end=1647
- _globals['_DATAFRAMEREQUEST_QUATERNION']._serialized_start=1649
- _globals['_DATAFRAMEREQUEST_QUATERNION']._serialized_end=1705
- _globals['_DATAFRAMEREQUEST_GYROSCOPE_DATA']._serialized_start=1708
- _globals['_DATAFRAMEREQUEST_GYROSCOPE_DATA']._serialized_end=1915
- _globals['_DATAFRAMERESPONSE']._serialized_start=1917
- _globals['_DATAFRAMERESPONSE']._serialized_end=1953
- _globals['_ARFLOWSERVICE']._serialized_start=1955
- _globals['_ARFLOWSERVICE']._serialized_end=2072
-# @@protoc_insertion_point(module_scope)
diff --git a/python/arflow_grpc/__init__.py b/python/arflow_grpc/__init__.py
new file mode 100644
index 0000000..22dc6e8
--- /dev/null
+++ b/python/arflow_grpc/__init__.py
@@ -0,0 +1 @@
+"""Python gRPC modules generated by `protoc`."""
diff --git a/python/arflow_grpc/py.typed b/python/arflow_grpc/py.typed
new file mode 100644
index 0000000..e69de29
diff --git a/python/arflow_grpc/service_pb2.py b/python/arflow_grpc/service_pb2.py
new file mode 100644
index 0000000..732bebe
--- /dev/null
+++ b/python/arflow_grpc/service_pb2.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: arflow_grpc/service.proto
+# Protobuf Python Version: 5.27.2
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 5,
+ 27,
+ 2,
+ '',
+ 'arflow_grpc/service.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x61rflow_grpc/service.proto\x12\tarflow.v1\"\x99\n\n\x15RegisterClientRequest\x12\x13\n\x0b\x64\x65vice_name\x18\x01 \x01(\t\x12L\n\x11\x63\x61mera_intrinsics\x18\x02 \x01(\x0b\x32\x31.arflow.v1.RegisterClientRequest.CameraIntrinsics\x12\x42\n\x0c\x63\x61mera_color\x18\x03 \x01(\x0b\x32,.arflow.v1.RegisterClientRequest.CameraColor\x12\x42\n\x0c\x63\x61mera_depth\x18\x04 \x01(\x0b\x32,.arflow.v1.RegisterClientRequest.CameraDepth\x12J\n\x10\x63\x61mera_transform\x18\x05 \x01(\x0b\x32\x30.arflow.v1.RegisterClientRequest.CameraTransform\x12M\n\x12\x63\x61mera_point_cloud\x18\x06 \x01(\x0b\x32\x31.arflow.v1.RegisterClientRequest.CameraPointCloud\x12U\n\x16\x63\x61mera_plane_detection\x18\x07 \x01(\x0b\x32\x35.arflow.v1.RegisterClientRequest.CameraPlaneDetection\x12=\n\tgyroscope\x18\x08 \x01(\x0b\x32*.arflow.v1.RegisterClientRequest.Gyroscope\x12\x35\n\x05\x61udio\x18\t \x01(\x0b\x32&.arflow.v1.RegisterClientRequest.Audio\x12\x39\n\x07meshing\x18\n \x01(\x0b\x32(.arflow.v1.RegisterClientRequest.Meshing\x1a\xa4\x01\n\x10\x43\x61meraIntrinsics\x12\x16\n\x0e\x66ocal_length_x\x18\x01 \x01(\x02\x12\x16\n\x0e\x66ocal_length_y\x18\x02 \x01(\x02\x12\x19\n\x11principal_point_x\x18\x03 \x01(\x02\x12\x19\n\x11principal_point_y\x18\x04 \x01(\x02\x12\x14\n\x0cresolution_x\x18\x05 \x01(\x05\x12\x14\n\x0cresolution_y\x18\x06 \x01(\x05\x1a\x63\n\x0b\x43\x61meraColor\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x11\n\tdata_type\x18\x02 \x01(\t\x12\x17\n\x0fresize_factor_x\x18\x03 \x01(\x02\x12\x17\n\x0fresize_factor_y\x18\x04 \x01(\x02\x1a\x81\x01\n\x0b\x43\x61meraDepth\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x11\n\tdata_type\x18\x02 \x01(\t\x12\"\n\x1a\x63onfidence_filtering_level\x18\x03 \x01(\x05\x12\x14\n\x0cresolution_x\x18\x04 \x01(\x05\x12\x14\n\x0cresolution_y\x18\x05 \x01(\x05\x1a\"\n\x0f\x43\x61meraTransform\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a\x41\n\x10\x43\x61meraPointCloud\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1c\n\x14\x64\x65pth_upscale_factor\x18\x02 \x01(\x02\x1a\'\n\x14\x43\x61meraPlaneDetection\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a\x1c\n\tGyroscope\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a\x18\n\x05\x41udio\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a\x1a\n\x07Meshing\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\"%\n\x16RegisterClientResponse\x12\x0b\n\x03uid\x18\x01 \x01(\t\"\xaf\x07\n\x13ProcessFrameRequest\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\r\n\x05\x63olor\x18\x02 \x01(\x0c\x12\r\n\x05\x64\x65pth\x18\x03 \x01(\x0c\x12\x11\n\ttransform\x18\x04 \x01(\x0c\x12=\n\x0fplane_detection\x18\x05 \x03(\x0b\x32$.arflow.v1.ProcessFrameRequest.Plane\x12?\n\tgyroscope\x18\x06 \x01(\x0b\x32,.arflow.v1.ProcessFrameRequest.GyroscopeData\x12\x12\n\naudio_data\x18\x08 \x03(\x02\x12\x33\n\x06meshes\x18\t \x03(\x0b\x32#.arflow.v1.ProcessFrameRequest.Mesh\x1a*\n\x07Vector3\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\x1a\x1f\n\x07Vector2\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x1a\xee\x01\n\x05Plane\x12\x36\n\x06\x63\x65nter\x18\x01 \x01(\x0b\x32&.arflow.v1.ProcessFrameRequest.Vector3\x12\x36\n\x06normal\x18\x02 \x01(\x0b\x32&.arflow.v1.ProcessFrameRequest.Vector3\x12\x34\n\x04size\x18\x03 \x01(\x0b\x32&.arflow.v1.ProcessFrameRequest.Vector2\x12?\n\x0f\x62oundary_points\x18\x04 \x03(\x0b\x32&.arflow.v1.ProcessFrameRequest.Vector2\x1a\x38\n\nQuaternion\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\x12\t\n\x01w\x18\x04 \x01(\x02\x1a\x82\x02\n\rGyroscopeData\x12;\n\x08\x61ttitude\x18\x01 \x01(\x0b\x32).arflow.v1.ProcessFrameRequest.Quaternion\x12=\n\rrotation_rate\x18\x02 \x01(\x0b\x32&.arflow.v1.ProcessFrameRequest.Vector3\x12\x37\n\x07gravity\x18\x03 \x01(\x0b\x32&.arflow.v1.ProcessFrameRequest.Vector3\x12<\n\x0c\x61\x63\x63\x65leration\x18\x04 \x01(\x0b\x32&.arflow.v1.ProcessFrameRequest.Vector3\x1a\x14\n\x04Mesh\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\'\n\x14ProcessFrameResponse\x12\x0f\n\x07message\x18\x01 \x01(\t2\xb7\x01\n\rARFlowService\x12U\n\x0eRegisterClient\x12 .arflow.v1.RegisterClientRequest\x1a!.arflow.v1.RegisterClientResponse\x12O\n\x0cProcessFrame\x12\x1e.arflow.v1.ProcessFrameRequest\x1a\x1f.arflow.v1.ProcessFrameResponseB\t\xaa\x02\x06\x41RFlowb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'arflow_grpc.service_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\252\002\006ARFlow'
+ _globals['_REGISTERCLIENTREQUEST']._serialized_start=41
+ _globals['_REGISTERCLIENTREQUEST']._serialized_end=1346
+ _globals['_REGISTERCLIENTREQUEST_CAMERAINTRINSICS']._serialized_start=721
+ _globals['_REGISTERCLIENTREQUEST_CAMERAINTRINSICS']._serialized_end=885
+ _globals['_REGISTERCLIENTREQUEST_CAMERACOLOR']._serialized_start=887
+ _globals['_REGISTERCLIENTREQUEST_CAMERACOLOR']._serialized_end=986
+ _globals['_REGISTERCLIENTREQUEST_CAMERADEPTH']._serialized_start=989
+ _globals['_REGISTERCLIENTREQUEST_CAMERADEPTH']._serialized_end=1118
+ _globals['_REGISTERCLIENTREQUEST_CAMERATRANSFORM']._serialized_start=1120
+ _globals['_REGISTERCLIENTREQUEST_CAMERATRANSFORM']._serialized_end=1154
+ _globals['_REGISTERCLIENTREQUEST_CAMERAPOINTCLOUD']._serialized_start=1156
+ _globals['_REGISTERCLIENTREQUEST_CAMERAPOINTCLOUD']._serialized_end=1221
+ _globals['_REGISTERCLIENTREQUEST_CAMERAPLANEDETECTION']._serialized_start=1223
+ _globals['_REGISTERCLIENTREQUEST_CAMERAPLANEDETECTION']._serialized_end=1262
+ _globals['_REGISTERCLIENTREQUEST_GYROSCOPE']._serialized_start=1264
+ _globals['_REGISTERCLIENTREQUEST_GYROSCOPE']._serialized_end=1292
+ _globals['_REGISTERCLIENTREQUEST_AUDIO']._serialized_start=1294
+ _globals['_REGISTERCLIENTREQUEST_AUDIO']._serialized_end=1318
+ _globals['_REGISTERCLIENTREQUEST_MESHING']._serialized_start=1320
+ _globals['_REGISTERCLIENTREQUEST_MESHING']._serialized_end=1346
+ _globals['_REGISTERCLIENTRESPONSE']._serialized_start=1348
+ _globals['_REGISTERCLIENTRESPONSE']._serialized_end=1385
+ _globals['_PROCESSFRAMEREQUEST']._serialized_start=1388
+ _globals['_PROCESSFRAMEREQUEST']._serialized_end=2331
+ _globals['_PROCESSFRAMEREQUEST_VECTOR3']._serialized_start=1674
+ _globals['_PROCESSFRAMEREQUEST_VECTOR3']._serialized_end=1716
+ _globals['_PROCESSFRAMEREQUEST_VECTOR2']._serialized_start=1718
+ _globals['_PROCESSFRAMEREQUEST_VECTOR2']._serialized_end=1749
+ _globals['_PROCESSFRAMEREQUEST_PLANE']._serialized_start=1752
+ _globals['_PROCESSFRAMEREQUEST_PLANE']._serialized_end=1990
+ _globals['_PROCESSFRAMEREQUEST_QUATERNION']._serialized_start=1992
+ _globals['_PROCESSFRAMEREQUEST_QUATERNION']._serialized_end=2048
+ _globals['_PROCESSFRAMEREQUEST_GYROSCOPEDATA']._serialized_start=2051
+ _globals['_PROCESSFRAMEREQUEST_GYROSCOPEDATA']._serialized_end=2309
+ _globals['_PROCESSFRAMEREQUEST_MESH']._serialized_start=2311
+ _globals['_PROCESSFRAMEREQUEST_MESH']._serialized_end=2331
+ _globals['_PROCESSFRAMERESPONSE']._serialized_start=2333
+ _globals['_PROCESSFRAMERESPONSE']._serialized_end=2372
+ _globals['_ARFLOWSERVICE']._serialized_start=2375
+ _globals['_ARFLOWSERVICE']._serialized_end=2558
+# @@protoc_insertion_point(module_scope)
diff --git a/python/arflow/service_pb2.pyi b/python/arflow_grpc/service_pb2.pyi
similarity index 66%
rename from python/arflow/service_pb2.pyi
rename to python/arflow_grpc/service_pb2.pyi
index 1d2182f..43c2453 100644
--- a/python/arflow/service_pb2.pyi
+++ b/python/arflow_grpc/service_pb2.pyi
@@ -5,7 +5,7 @@ from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Map
DESCRIPTOR: _descriptor.FileDescriptor
-class RegisterRequest(_message.Message):
+class RegisterClientRequest(_message.Message):
__slots__ = ("device_name", "camera_intrinsics", "camera_color", "camera_depth", "camera_transform", "camera_point_cloud", "camera_plane_detection", "gyroscope", "audio", "meshing")
class CameraIntrinsics(_message.Message):
__slots__ = ("focal_length_x", "focal_length_y", "principal_point_x", "principal_point_y", "resolution_x", "resolution_y")
@@ -89,25 +89,25 @@ class RegisterRequest(_message.Message):
AUDIO_FIELD_NUMBER: _ClassVar[int]
MESHING_FIELD_NUMBER: _ClassVar[int]
device_name: str
- camera_intrinsics: RegisterRequest.CameraIntrinsics
- camera_color: RegisterRequest.CameraColor
- camera_depth: RegisterRequest.CameraDepth
- camera_transform: RegisterRequest.CameraTransform
- camera_point_cloud: RegisterRequest.CameraPointCloud
- camera_plane_detection: RegisterRequest.CameraPlaneDetection
- gyroscope: RegisterRequest.Gyroscope
- audio: RegisterRequest.Audio
- meshing: RegisterRequest.Meshing
- def __init__(self, device_name: _Optional[str] = ..., camera_intrinsics: _Optional[_Union[RegisterRequest.CameraIntrinsics, _Mapping]] = ..., camera_color: _Optional[_Union[RegisterRequest.CameraColor, _Mapping]] = ..., camera_depth: _Optional[_Union[RegisterRequest.CameraDepth, _Mapping]] = ..., camera_transform: _Optional[_Union[RegisterRequest.CameraTransform, _Mapping]] = ..., camera_point_cloud: _Optional[_Union[RegisterRequest.CameraPointCloud, _Mapping]] = ..., camera_plane_detection: _Optional[_Union[RegisterRequest.CameraPlaneDetection, _Mapping]] = ..., gyroscope: _Optional[_Union[RegisterRequest.Gyroscope, _Mapping]] = ..., audio: _Optional[_Union[RegisterRequest.Audio, _Mapping]] = ..., meshing: _Optional[_Union[RegisterRequest.Meshing, _Mapping]] = ...) -> None: ...
+ camera_intrinsics: RegisterClientRequest.CameraIntrinsics
+ camera_color: RegisterClientRequest.CameraColor
+ camera_depth: RegisterClientRequest.CameraDepth
+ camera_transform: RegisterClientRequest.CameraTransform
+ camera_point_cloud: RegisterClientRequest.CameraPointCloud
+ camera_plane_detection: RegisterClientRequest.CameraPlaneDetection
+ gyroscope: RegisterClientRequest.Gyroscope
+ audio: RegisterClientRequest.Audio
+ meshing: RegisterClientRequest.Meshing
+ def __init__(self, device_name: _Optional[str] = ..., camera_intrinsics: _Optional[_Union[RegisterClientRequest.CameraIntrinsics, _Mapping]] = ..., camera_color: _Optional[_Union[RegisterClientRequest.CameraColor, _Mapping]] = ..., camera_depth: _Optional[_Union[RegisterClientRequest.CameraDepth, _Mapping]] = ..., camera_transform: _Optional[_Union[RegisterClientRequest.CameraTransform, _Mapping]] = ..., camera_point_cloud: _Optional[_Union[RegisterClientRequest.CameraPointCloud, _Mapping]] = ..., camera_plane_detection: _Optional[_Union[RegisterClientRequest.CameraPlaneDetection, _Mapping]] = ..., gyroscope: _Optional[_Union[RegisterClientRequest.Gyroscope, _Mapping]] = ..., audio: _Optional[_Union[RegisterClientRequest.Audio, _Mapping]] = ..., meshing: _Optional[_Union[RegisterClientRequest.Meshing, _Mapping]] = ...) -> None: ...
-class RegisterResponse(_message.Message):
+class RegisterClientResponse(_message.Message):
__slots__ = ("uid",)
UID_FIELD_NUMBER: _ClassVar[int]
uid: str
def __init__(self, uid: _Optional[str] = ...) -> None: ...
-class DataFrameRequest(_message.Message):
- __slots__ = ("uid", "color", "depth", "transform", "plane_detection", "gyroscope", "audio", "meshing")
+class ProcessFrameRequest(_message.Message):
+ __slots__ = ("uid", "color", "depth", "transform", "plane_detection", "gyroscope", "audio_data", "meshes")
class Vector3(_message.Message):
__slots__ = ("x", "y", "z")
X_FIELD_NUMBER: _ClassVar[int]
@@ -124,15 +124,17 @@ class DataFrameRequest(_message.Message):
x: float
y: float
def __init__(self, x: _Optional[float] = ..., y: _Optional[float] = ...) -> None: ...
- class Planes(_message.Message):
- __slots__ = ("center", "normal", "size")
+ class Plane(_message.Message):
+ __slots__ = ("center", "normal", "size", "boundary_points")
CENTER_FIELD_NUMBER: _ClassVar[int]
NORMAL_FIELD_NUMBER: _ClassVar[int]
SIZE_FIELD_NUMBER: _ClassVar[int]
- center: DataFrameRequest.Vector3
- normal: DataFrameRequest.Vector3
- size: DataFrameRequest.Vector2
- def __init__(self, center: _Optional[_Union[DataFrameRequest.Vector3, _Mapping]] = ..., normal: _Optional[_Union[DataFrameRequest.Vector3, _Mapping]] = ..., size: _Optional[_Union[DataFrameRequest.Vector2, _Mapping]] = ...) -> None: ...
+ BOUNDARY_POINTS_FIELD_NUMBER: _ClassVar[int]
+ center: ProcessFrameRequest.Vector3
+ normal: ProcessFrameRequest.Vector3
+ size: ProcessFrameRequest.Vector2
+ boundary_points: _containers.RepeatedCompositeFieldContainer[ProcessFrameRequest.Vector2]
+ def __init__(self, center: _Optional[_Union[ProcessFrameRequest.Vector3, _Mapping]] = ..., normal: _Optional[_Union[ProcessFrameRequest.Vector3, _Mapping]] = ..., size: _Optional[_Union[ProcessFrameRequest.Vector2, _Mapping]] = ..., boundary_points: _Optional[_Iterable[_Union[ProcessFrameRequest.Vector2, _Mapping]]] = ...) -> None: ...
class Quaternion(_message.Message):
__slots__ = ("x", "y", "z", "w")
X_FIELD_NUMBER: _ClassVar[int]
@@ -144,36 +146,41 @@ class DataFrameRequest(_message.Message):
z: float
w: float
def __init__(self, x: _Optional[float] = ..., y: _Optional[float] = ..., z: _Optional[float] = ..., w: _Optional[float] = ...) -> None: ...
- class gyroscope_data(_message.Message):
+ class GyroscopeData(_message.Message):
__slots__ = ("attitude", "rotation_rate", "gravity", "acceleration")
ATTITUDE_FIELD_NUMBER: _ClassVar[int]
ROTATION_RATE_FIELD_NUMBER: _ClassVar[int]
GRAVITY_FIELD_NUMBER: _ClassVar[int]
ACCELERATION_FIELD_NUMBER: _ClassVar[int]
- attitude: DataFrameRequest.Quaternion
- rotation_rate: DataFrameRequest.Vector3
- gravity: DataFrameRequest.Vector3
- acceleration: DataFrameRequest.Vector3
- def __init__(self, attitude: _Optional[_Union[DataFrameRequest.Quaternion, _Mapping]] = ..., rotation_rate: _Optional[_Union[DataFrameRequest.Vector3, _Mapping]] = ..., gravity: _Optional[_Union[DataFrameRequest.Vector3, _Mapping]] = ..., acceleration: _Optional[_Union[DataFrameRequest.Vector3, _Mapping]] = ...) -> None: ...
+ attitude: ProcessFrameRequest.Quaternion
+ rotation_rate: ProcessFrameRequest.Vector3
+ gravity: ProcessFrameRequest.Vector3
+ acceleration: ProcessFrameRequest.Vector3
+ def __init__(self, attitude: _Optional[_Union[ProcessFrameRequest.Quaternion, _Mapping]] = ..., rotation_rate: _Optional[_Union[ProcessFrameRequest.Vector3, _Mapping]] = ..., gravity: _Optional[_Union[ProcessFrameRequest.Vector3, _Mapping]] = ..., acceleration: _Optional[_Union[ProcessFrameRequest.Vector3, _Mapping]] = ...) -> None: ...
+ class Mesh(_message.Message):
+ __slots__ = ("data",)
+ DATA_FIELD_NUMBER: _ClassVar[int]
+ data: bytes
+ def __init__(self, data: _Optional[bytes] = ...) -> None: ...
UID_FIELD_NUMBER: _ClassVar[int]
COLOR_FIELD_NUMBER: _ClassVar[int]
DEPTH_FIELD_NUMBER: _ClassVar[int]
TRANSFORM_FIELD_NUMBER: _ClassVar[int]
PLANE_DETECTION_FIELD_NUMBER: _ClassVar[int]
GYROSCOPE_FIELD_NUMBER: _ClassVar[int]
- AUDIO_FIELD_NUMBER: _ClassVar[int]
- MESHING_FIELD_NUMBER: _ClassVar[int]
+ AUDIO_DATA_FIELD_NUMBER: _ClassVar[int]
+ MESHES_FIELD_NUMBER: _ClassVar[int]
uid: str
color: bytes
depth: bytes
transform: bytes
- plane_detection: _containers.RepeatedCompositeFieldContainer[DataFrameRequest.Planes]
- gyroscope: DataFrameRequest.gyroscope_data
- audio: bytes
- meshing: bytes
- def __init__(self, uid: _Optional[str] = ..., color: _Optional[bytes] = ..., depth: _Optional[bytes] = ..., transform: _Optional[bytes] = ..., plane_detection: _Optional[_Iterable[_Union[DataFrameRequest.Planes, _Mapping]]] = ..., gyroscope: _Optional[_Union[DataFrameRequest.gyroscope_data, _Mapping]] = ..., audio: _Optional[bytes] = ..., meshing: _Optional[bytes] = ...) -> None: ...
+ plane_detection: _containers.RepeatedCompositeFieldContainer[ProcessFrameRequest.Plane]
+ gyroscope: ProcessFrameRequest.GyroscopeData
+ audio_data: _containers.RepeatedScalarFieldContainer[float]
+ meshes: _containers.RepeatedCompositeFieldContainer[ProcessFrameRequest.Mesh]
+ def __init__(self, uid: _Optional[str] = ..., color: _Optional[bytes] = ..., depth: _Optional[bytes] = ..., transform: _Optional[bytes] = ..., plane_detection: _Optional[_Iterable[_Union[ProcessFrameRequest.Plane, _Mapping]]] = ..., gyroscope: _Optional[_Union[ProcessFrameRequest.GyroscopeData, _Mapping]] = ..., audio_data: _Optional[_Iterable[float]] = ..., meshes: _Optional[_Iterable[_Union[ProcessFrameRequest.Mesh, _Mapping]]] = ...) -> None: ...
-class DataFrameResponse(_message.Message):
+class ProcessFrameResponse(_message.Message):
__slots__ = ("message",)
MESSAGE_FIELD_NUMBER: _ClassVar[int]
message: str
diff --git a/python/arflow/service_pb2_grpc.py b/python/arflow_grpc/service_pb2_grpc.py
similarity index 50%
rename from python/arflow/service_pb2_grpc.py
rename to python/arflow_grpc/service_pb2_grpc.py
index 5c08c8f..29f1cf4 100644
--- a/python/arflow/service_pb2_grpc.py
+++ b/python/arflow_grpc/service_pb2_grpc.py
@@ -3,9 +3,9 @@
import grpc
import warnings
-from arflow import service_pb2 as arflow_dot_service__pb2
+from arflow_grpc import service_pb2 as arflow__grpc_dot_service__pb2
-GRPC_GENERATED_VERSION = '1.66.1'
+GRPC_GENERATED_VERSION = '1.66.2'
GRPC_VERSION = grpc.__version__
_version_not_supported = False
@@ -18,7 +18,7 @@
if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
- + f' but the generated code in arflow/service_pb2_grpc.py depends on'
+ + f' but the generated code in arflow_grpc/service_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
@@ -26,7 +26,7 @@
class ARFlowServiceStub(object):
- """The ARFlowService service definition.
+ """The ARFlow service definition.
"""
def __init__(self, channel):
@@ -35,31 +35,39 @@ def __init__(self, channel):
Args:
channel: A grpc.Channel.
"""
- self.register = channel.unary_unary(
- '/ARFlowService/register',
- request_serializer=arflow_dot_service__pb2.RegisterRequest.SerializeToString,
- response_deserializer=arflow_dot_service__pb2.RegisterResponse.FromString,
+ self.RegisterClient = channel.unary_unary(
+ '/arflow.v1.ARFlowService/RegisterClient',
+ request_serializer=arflow__grpc_dot_service__pb2.RegisterClientRequest.SerializeToString,
+ response_deserializer=arflow__grpc_dot_service__pb2.RegisterClientResponse.FromString,
_registered_method=True)
- self.data_frame = channel.unary_unary(
- '/ARFlowService/data_frame',
- request_serializer=arflow_dot_service__pb2.DataFrameRequest.SerializeToString,
- response_deserializer=arflow_dot_service__pb2.DataFrameResponse.FromString,
+ self.ProcessFrame = channel.unary_unary(
+ '/arflow.v1.ARFlowService/ProcessFrame',
+ request_serializer=arflow__grpc_dot_service__pb2.ProcessFrameRequest.SerializeToString,
+ response_deserializer=arflow__grpc_dot_service__pb2.ProcessFrameResponse.FromString,
_registered_method=True)
class ARFlowServiceServicer(object):
- """The ARFlowService service definition.
+ """The ARFlow service definition.
"""
- def register(self, request, context):
- """Registers a device with the given specifications.
+ def RegisterClient(self, request, context):
+ """Registers a client with the given specifications.
+
+ The client is registered with the server and is assigned a unique identifier.
+ The client can then send data frames to the server using the assigned identifier.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
- def data_frame(self, request, context):
- """Sends a data frame from a device.
+ def ProcessFrame(self, request, context):
+ """Accepts a data frame from a client, returning an acknowledgment.
+
+ Errors:
+ - NOT_FOUND: If the client configuration is not found.
+ - INVALID_ARGUMENT: If the color data type is not recognized or the depth data type
+ is not recognized or if the request's data cannot be decoded (e.g., corrupted or invalid data).
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
@@ -68,30 +76,30 @@ def data_frame(self, request, context):
def add_ARFlowServiceServicer_to_server(servicer, server):
rpc_method_handlers = {
- 'register': grpc.unary_unary_rpc_method_handler(
- servicer.register,
- request_deserializer=arflow_dot_service__pb2.RegisterRequest.FromString,
- response_serializer=arflow_dot_service__pb2.RegisterResponse.SerializeToString,
+ 'RegisterClient': grpc.unary_unary_rpc_method_handler(
+ servicer.RegisterClient,
+ request_deserializer=arflow__grpc_dot_service__pb2.RegisterClientRequest.FromString,
+ response_serializer=arflow__grpc_dot_service__pb2.RegisterClientResponse.SerializeToString,
),
- 'data_frame': grpc.unary_unary_rpc_method_handler(
- servicer.data_frame,
- request_deserializer=arflow_dot_service__pb2.DataFrameRequest.FromString,
- response_serializer=arflow_dot_service__pb2.DataFrameResponse.SerializeToString,
+ 'ProcessFrame': grpc.unary_unary_rpc_method_handler(
+ servicer.ProcessFrame,
+ request_deserializer=arflow__grpc_dot_service__pb2.ProcessFrameRequest.FromString,
+ response_serializer=arflow__grpc_dot_service__pb2.ProcessFrameResponse.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
- 'ARFlowService', rpc_method_handlers)
+ 'arflow.v1.ARFlowService', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
- server.add_registered_method_handlers('ARFlowService', rpc_method_handlers)
+ server.add_registered_method_handlers('arflow.v1.ARFlowService', rpc_method_handlers)
# This class is part of an EXPERIMENTAL API.
class ARFlowService(object):
- """The ARFlowService service definition.
+ """The ARFlow service definition.
"""
@staticmethod
- def register(request,
+ def RegisterClient(request,
target,
options=(),
channel_credentials=None,
@@ -104,9 +112,9 @@ def register(request,
return grpc.experimental.unary_unary(
request,
target,
- '/ARFlowService/register',
- arflow_dot_service__pb2.RegisterRequest.SerializeToString,
- arflow_dot_service__pb2.RegisterResponse.FromString,
+ '/arflow.v1.ARFlowService/RegisterClient',
+ arflow__grpc_dot_service__pb2.RegisterClientRequest.SerializeToString,
+ arflow__grpc_dot_service__pb2.RegisterClientResponse.FromString,
options,
channel_credentials,
insecure,
@@ -118,7 +126,7 @@ def register(request,
_registered_method=True)
@staticmethod
- def data_frame(request,
+ def ProcessFrame(request,
target,
options=(),
channel_credentials=None,
@@ -131,9 +139,9 @@ def data_frame(request,
return grpc.experimental.unary_unary(
request,
target,
- '/ARFlowService/data_frame',
- arflow_dot_service__pb2.DataFrameRequest.SerializeToString,
- arflow_dot_service__pb2.DataFrameResponse.FromString,
+ '/arflow.v1.ARFlowService/ProcessFrame',
+ arflow__grpc_dot_service__pb2.ProcessFrameRequest.SerializeToString,
+ arflow__grpc_dot_service__pb2.ProcessFrameResponse.FromString,
options,
channel_credentials,
insecure,
diff --git a/python/examples/README.md b/python/examples/README.md
index 2dc98cc..9c52fe6 100644
--- a/python/examples/README.md
+++ b/python/examples/README.md
@@ -1,12 +1,12 @@
# ARFlow Server Examples
-The simplest example is [`minimal`](minimal/minimal.py). You may want to start there!
+The simplest example is [`simple`](simple/simple.py). You may want to start there!
## Setup
If you're using `pip`, you should create and activate a virtual environment before installing any example's dependencies:
-```sh
+```shell
python3 -m venv .venv
source .venv/bin/activate
```
@@ -17,14 +17,14 @@ If you're using `poetry` instead, you can just install the dependencies directly
Each example is packaged as a regular Python package, with a `pyproject.toml` file specifying its required dependencies. To run an example, it must first be installed.
-For example, to install dependencies and run the toy `minimal` example (which doesn't need to download any data) run:
+For example, to install dependencies and run the toy `simple` example (which doesn't need to download any data) run:
-```sh
+```shell
# Using pip:
-pip install -e python/examples/minimal
+pip install -e python/examples/simple
# Using poetry:
-cd python/examples/minimal
+cd python/examples/simple
poetry install
```
@@ -33,19 +33,20 @@ poetry install
Once installed, the example can be run as a regular Python module:
```shell
-python3 -m minimal
+python3 -m simple
# or, if you're using poetry:
-poetry run minimal
+poetry run simple
```
Examples also declare console script, so they can also be run directly:
```shell
-minimal
+simple
```
## Contributions welcome
+
Feel free to open a PR to add a new example!
-See the [`CONTRIBUTING.md`](https://github.com/cake-lab/ARFlow/blob/main/CONTRIBUTING.md) file for details on how to contribute.
+See the [`CONTRIBUTING.md`](https://github.com/cake-lab/ARFlow/blob/main/CONTRIBUTING.md) file for details on how to contribute.
diff --git a/python/examples/__init__.py b/python/examples/__init__.py
index a57e990..431c6bf 100644
--- a/python/examples/__init__.py
+++ b/python/examples/__init__.py
@@ -1,3 +1,2 @@
-"""
-.. include:: ./README.md
+""".. include:: ./README.md
"""
diff --git a/python/examples/depthanythingv2/depthanythingv2.py b/python/examples/depthanythingv2/depthanythingv2.py
old mode 100755
new mode 100644
index 5e71f07..37a2209
--- a/python/examples/depthanythingv2/depthanythingv2.py
+++ b/python/examples/depthanythingv2/depthanythingv2.py
@@ -1,22 +1,27 @@
#!/usr/bin/env python3
-"""Demonstrates the usage of ARFlow with Depth Anything v2."""
+# type: ignore
+"""Demonstrates the usage of ARFlow with Depth Anything v2.
+
+Note: `# type: ignore` is added to the first line to suppress typecheck errors.
+In case you want to copy this code, please remove the first line if you are using typecheck.
+"""
from __future__ import annotations
import sys
from threading import Thread
-from typing import Any, Dict
import numpy as np
import torch
+import numpy.typing as npt
from PIL import Image
from transformers import pipeline
import arflow
-class DepthAnythingV2Service(arflow.ARFlowService):
- def __init__(self, *args, **kwargs) -> None:
+class DepthAnythingV2Service(arflow.ARFlowServicer):
+ def __init__(self) -> None:
super().__init__()
self.device = "cuda" if torch.cuda.is_available() else "cpu"
self.pipe = pipeline(
@@ -25,18 +30,19 @@ def __init__(self, *args, **kwargs) -> None:
device=self.device,
)
- def on_register(self, request: arflow.RegisterRequest):
+ def on_register(self, request: arflow.RegisterClientRequest):
self.num_frame = 0
- def on_frame_received(self, frame_data: Dict[str, Any]):
- color_rgb = frame_data["color_rgb"]
+ def on_frame_received(self, decoded_data_frame: arflow.DecodedDataFrame):
if self.num_frame % 50 == 0:
- thread = Thread(target=lambda: (self.run_depth_estimation(color_rgb.copy())) )
+ thread = Thread(
+ target=lambda: (self.run_depth_estimation(decoded_data_frame.color_rgb.copy()))
+ )
thread.start()
self.num_frame = self.num_frame + 1
- def run_depth_estimation(self, color_rgb: np.ndarray):
+ def run_depth_estimation(self, color_rgb: npt.NDArray[np.uint8]):
"""Run depth estimation on the given image. The pipeline returns a dictionary with two entries.
The first one, called predicted_depth, is a tensor with the values being the depth expressed in
meters for each pixel. The second one, depth, is a PIL image that visualizes the depth estimation result."""
@@ -47,7 +53,7 @@ def run_depth_estimation(self, color_rgb: np.ndarray):
self.record_predictions(predictions)
return predictions
- def record_predictions(self, predictions: dict):
+ def record_predictions(self, predictions):
self.recorder.log(
"DepthAnythingV2/depth", self.recorder.Image(predictions["depth"])
)
@@ -56,7 +62,7 @@ def record_predictions(self, predictions: dict):
def main() -> None:
# sanity-check since all other example scripts take arguments:
assert len(sys.argv) == 1, f"{sys.argv[0]} does not take any arguments"
- arflow.create_server(DepthAnythingV2Service, port=8500, path_to_save=None)
+ arflow.run_server(DepthAnythingV2Service, port=8500, path_to_save=None)
if __name__ == "__main__":
diff --git a/python/examples/minimal/README.md b/python/examples/minimal/README.md
deleted file mode 100644
index 4640904..0000000
--- a/python/examples/minimal/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# TODO
diff --git a/python/examples/minimal/minimal.py b/python/examples/minimal/minimal.py
deleted file mode 100755
index 2ede854..0000000
--- a/python/examples/minimal/minimal.py
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env python3
-"""Demonstrates the most barebone usage of ARFlow."""
-
-from __future__ import annotations
-
-import sys
-
-import numpy as np
-
-import arflow
-
-
-class MinimalService(arflow.ARFlowService):
- def __init__(self):
- super().__init__()
-
- def on_register(self, request: arflow.RegisterRequest):
- positions = np.vstack(
- [xyz.ravel() for xyz in np.mgrid[3 * [slice(-10, 10, 10j)]]]
- ).T
- colors = (
- np.vstack([rgb.ravel() for rgb in np.mgrid[3 * [slice(0, 255, 10j)]]])
- .astype(np.uint8)
- .T
- )
-
- self.recorder.log(
- "my_points", self.recorder.Points3D(positions, colors=colors, radii=0.5)
- )
- pass
-
- def on_frame_received(self, frame_data: arflow.DataFrameRequest):
- print("Received a frame")
-
-
-def main() -> None:
- # sanity-check since all other example scripts take arguments:
- assert len(sys.argv) == 1, f"{sys.argv[0]} does not take any arguments"
- arflow.create_server(MinimalService, port=8500, path_to_save=None)
-
-
-if __name__ == "__main__":
- main()
diff --git a/python/examples/simple/README.md b/python/examples/simple/README.md
new file mode 100644
index 0000000..60bda30
--- /dev/null
+++ b/python/examples/simple/README.md
@@ -0,0 +1,19 @@
+# ARFlow Simple Example
+
+Next, you may integrate ARFlow with your own research prototype via the Python API. [`simple.py`](simple.py) demonstrates how to build your own custom server by extending the default ARFlow server.
+
+First, let's start the server:
+
+```shell
+server
+```
+
+Once you have your server running, you can start your ARFlow clients and connect them to the server. The server will start collecting data from the clients and save it to a `pickle` file at the end of the session.
+
+You can visualize the data using the ARFlow Player:
+
+```shell
+arflow replay ./FRAME_DATA_PATH.pkl
+```
+
+Replace `FRAME_DATA_PATH` with the path to your saved `pickle` file and you will see the ARFlow data visualized in the ARFlow Player.
diff --git a/python/examples/minimal/poetry.lock b/python/examples/simple/poetry.lock
similarity index 64%
rename from python/examples/minimal/poetry.lock
rename to python/examples/simple/poetry.lock
index ff0855c..147b75a 100644
--- a/python/examples/minimal/poetry.lock
+++ b/python/examples/simple/poetry.lock
@@ -2,7 +2,7 @@
[[package]]
name = "arflow"
-version = "0.2.0"
+version = "0.3.0"
description = "ARFlow is a data-sharing layer that enables developer-friendly data streaming, storage, and visualization for augmented reality (AR) device data."
optional = false
python-versions = ">=3.9,<3.13"
@@ -10,6 +10,7 @@ files = []
develop = false
[package.dependencies]
+grpc-interceptor = "^0.15.4"
grpcio = "^1.60.1"
grpcio-tools = "^1.60.1"
rerun-sdk = "^0.18.2"
@@ -37,121 +38,156 @@ docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphi
tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"]
+[[package]]
+name = "grpc-interceptor"
+version = "0.15.4"
+description = "Simplifies gRPC interceptors"
+optional = false
+python-versions = ">=3.7,<4.0"
+files = [
+ {file = "grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926"},
+ {file = "grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d"},
+]
+
+[package.dependencies]
+grpcio = ">=1.49.1,<2.0.0"
+
+[package.extras]
+testing = ["protobuf (>=4.21.9)"]
+
[[package]]
name = "grpcio"
-version = "1.66.1"
+version = "1.66.2"
description = "HTTP/2-based RPC framework"
optional = false
python-versions = ">=3.8"
files = [
- {file = "grpcio-1.66.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492"},
- {file = "grpcio-1.66.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac"},
- {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60"},
- {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f"},
- {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083"},
- {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a"},
- {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d"},
- {file = "grpcio-1.66.1-cp310-cp310-win32.whl", hash = "sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c"},
- {file = "grpcio-1.66.1-cp310-cp310-win_amd64.whl", hash = "sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858"},
- {file = "grpcio-1.66.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a"},
- {file = "grpcio-1.66.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26"},
- {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df"},
- {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22"},
- {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1"},
- {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e"},
- {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd"},
- {file = "grpcio-1.66.1-cp311-cp311-win32.whl", hash = "sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791"},
- {file = "grpcio-1.66.1-cp311-cp311-win_amd64.whl", hash = "sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb"},
- {file = "grpcio-1.66.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a"},
- {file = "grpcio-1.66.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9"},
- {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d"},
- {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0"},
- {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761"},
- {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815"},
- {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524"},
- {file = "grpcio-1.66.1-cp312-cp312-win32.whl", hash = "sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759"},
- {file = "grpcio-1.66.1-cp312-cp312-win_amd64.whl", hash = "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734"},
- {file = "grpcio-1.66.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2"},
- {file = "grpcio-1.66.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce"},
- {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c"},
- {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b"},
- {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef"},
- {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb"},
- {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d"},
- {file = "grpcio-1.66.1-cp38-cp38-win32.whl", hash = "sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3"},
- {file = "grpcio-1.66.1-cp38-cp38-win_amd64.whl", hash = "sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce"},
- {file = "grpcio-1.66.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503"},
- {file = "grpcio-1.66.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e"},
- {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0"},
- {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44"},
- {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e"},
- {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb"},
- {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c"},
- {file = "grpcio-1.66.1-cp39-cp39-win32.whl", hash = "sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45"},
- {file = "grpcio-1.66.1-cp39-cp39-win_amd64.whl", hash = "sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8"},
- {file = "grpcio-1.66.1.tar.gz", hash = "sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2"},
+ {file = "grpcio-1.66.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:fe96281713168a3270878255983d2cb1a97e034325c8c2c25169a69289d3ecfa"},
+ {file = "grpcio-1.66.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:73fc8f8b9b5c4a03e802b3cd0c18b2b06b410d3c1dcbef989fdeb943bd44aff7"},
+ {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:03b0b307ba26fae695e067b94cbb014e27390f8bc5ac7a3a39b7723fed085604"},
+ {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d69ce1f324dc2d71e40c9261d3fdbe7d4c9d60f332069ff9b2a4d8a257c7b2b"},
+ {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05bc2ceadc2529ab0b227b1310d249d95d9001cd106aa4d31e8871ad3c428d73"},
+ {file = "grpcio-1.66.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ac475e8da31484efa25abb774674d837b343afb78bb3bcdef10f81a93e3d6bf"},
+ {file = "grpcio-1.66.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0be4e0490c28da5377283861bed2941d1d20ec017ca397a5df4394d1c31a9b50"},
+ {file = "grpcio-1.66.2-cp310-cp310-win32.whl", hash = "sha256:4e504572433f4e72b12394977679161d495c4c9581ba34a88d843eaf0f2fbd39"},
+ {file = "grpcio-1.66.2-cp310-cp310-win_amd64.whl", hash = "sha256:2018b053aa15782db2541ca01a7edb56a0bf18c77efed975392583725974b249"},
+ {file = "grpcio-1.66.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:2335c58560a9e92ac58ff2bc5649952f9b37d0735608242973c7a8b94a6437d8"},
+ {file = "grpcio-1.66.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45a3d462826f4868b442a6b8fdbe8b87b45eb4f5b5308168c156b21eca43f61c"},
+ {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a9539f01cb04950fd4b5ab458e64a15f84c2acc273670072abe49a3f29bbad54"},
+ {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce89f5876662f146d4c1f695dda29d4433a5d01c8681fbd2539afff535da14d4"},
+ {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25a14af966438cddf498b2e338f88d1c9706f3493b1d73b93f695c99c5f0e2a"},
+ {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6001e575b8bbd89eee11960bb640b6da6ae110cf08113a075f1e2051cc596cae"},
+ {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ea1d062c9230278793820146c95d038dc0f468cbdd172eec3363e42ff1c7d01"},
+ {file = "grpcio-1.66.2-cp311-cp311-win32.whl", hash = "sha256:38b68498ff579a3b1ee8f93a05eb48dc2595795f2f62716e797dc24774c1aaa8"},
+ {file = "grpcio-1.66.2-cp311-cp311-win_amd64.whl", hash = "sha256:6851de821249340bdb100df5eacfecfc4e6075fa85c6df7ee0eb213170ec8e5d"},
+ {file = "grpcio-1.66.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:802d84fd3d50614170649853d121baaaa305de7b65b3e01759247e768d691ddf"},
+ {file = "grpcio-1.66.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80fd702ba7e432994df208f27514280b4b5c6843e12a48759c9255679ad38db8"},
+ {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:12fda97ffae55e6526825daf25ad0fa37483685952b5d0f910d6405c87e3adb6"},
+ {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:950da58d7d80abd0ea68757769c9db0a95b31163e53e5bb60438d263f4bed7b7"},
+ {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e636ce23273683b00410f1971d209bf3689238cf5538d960adc3cdfe80dd0dbd"},
+ {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a917d26e0fe980b0ac7bfcc1a3c4ad6a9a4612c911d33efb55ed7833c749b0ee"},
+ {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49f0ca7ae850f59f828a723a9064cadbed90f1ece179d375966546499b8a2c9c"},
+ {file = "grpcio-1.66.2-cp312-cp312-win32.whl", hash = "sha256:31fd163105464797a72d901a06472860845ac157389e10f12631025b3e4d0453"},
+ {file = "grpcio-1.66.2-cp312-cp312-win_amd64.whl", hash = "sha256:ff1f7882e56c40b0d33c4922c15dfa30612f05fb785074a012f7cda74d1c3679"},
+ {file = "grpcio-1.66.2-cp313-cp313-linux_armv7l.whl", hash = "sha256:3b00efc473b20d8bf83e0e1ae661b98951ca56111feb9b9611df8efc4fe5d55d"},
+ {file = "grpcio-1.66.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1caa38fb22a8578ab8393da99d4b8641e3a80abc8fd52646f1ecc92bcb8dee34"},
+ {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c408f5ef75cfffa113cacd8b0c0e3611cbfd47701ca3cdc090594109b9fcbaed"},
+ {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c806852deaedee9ce8280fe98955c9103f62912a5b2d5ee7e3eaa284a6d8d8e7"},
+ {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f145cc21836c332c67baa6fc81099d1d27e266401565bf481948010d6ea32d46"},
+ {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:73e3b425c1e155730273f73e419de3074aa5c5e936771ee0e4af0814631fb30a"},
+ {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c509a4f78114cbc5f0740eb3d7a74985fd2eff022971bc9bc31f8bc93e66a3b"},
+ {file = "grpcio-1.66.2-cp313-cp313-win32.whl", hash = "sha256:20657d6b8cfed7db5e11b62ff7dfe2e12064ea78e93f1434d61888834bc86d75"},
+ {file = "grpcio-1.66.2-cp313-cp313-win_amd64.whl", hash = "sha256:fb70487c95786e345af5e854ffec8cb8cc781bcc5df7930c4fbb7feaa72e1cdf"},
+ {file = "grpcio-1.66.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:a18e20d8321c6400185b4263e27982488cb5cdd62da69147087a76a24ef4e7e3"},
+ {file = "grpcio-1.66.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:02697eb4a5cbe5a9639f57323b4c37bcb3ab2d48cec5da3dc2f13334d72790dd"},
+ {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:99a641995a6bc4287a6315989ee591ff58507aa1cbe4c2e70d88411c4dcc0839"},
+ {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ed71e81782966ffead60268bbda31ea3f725ebf8aa73634d5dda44f2cf3fb9c"},
+ {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd27c24a4cc5e195a7f56cfd9312e366d5d61b86e36d46bbe538457ea6eb8dd"},
+ {file = "grpcio-1.66.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d9a9724a156c8ec6a379869b23ba3323b7ea3600851c91489b871e375f710bc8"},
+ {file = "grpcio-1.66.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d8d4732cc5052e92cea2f78b233c2e2a52998ac40cd651f40e398893ad0d06ec"},
+ {file = "grpcio-1.66.2-cp38-cp38-win32.whl", hash = "sha256:7b2c86457145ce14c38e5bf6bdc19ef88e66c5fee2c3d83285c5aef026ba93b3"},
+ {file = "grpcio-1.66.2-cp38-cp38-win_amd64.whl", hash = "sha256:e88264caad6d8d00e7913996030bac8ad5f26b7411495848cc218bd3a9040b6c"},
+ {file = "grpcio-1.66.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:c400ba5675b67025c8a9f48aa846f12a39cf0c44df5cd060e23fda5b30e9359d"},
+ {file = "grpcio-1.66.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:66a0cd8ba6512b401d7ed46bb03f4ee455839957f28b8d61e7708056a806ba6a"},
+ {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:06de8ec0bd71be123eec15b0e0d457474931c2c407869b6c349bd9bed4adbac3"},
+ {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb57870449dfcfac428afbb5a877829fcb0d6db9d9baa1148705739e9083880e"},
+ {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b672abf90a964bfde2d0ecbce30f2329a47498ba75ce6f4da35a2f4532b7acbc"},
+ {file = "grpcio-1.66.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ad2efdbe90c73b0434cbe64ed372e12414ad03c06262279b104a029d1889d13e"},
+ {file = "grpcio-1.66.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c3a99c519f4638e700e9e3f83952e27e2ea10873eecd7935823dab0c1c9250e"},
+ {file = "grpcio-1.66.2-cp39-cp39-win32.whl", hash = "sha256:78fa51ebc2d9242c0fc5db0feecc57a9943303b46664ad89921f5079e2e4ada7"},
+ {file = "grpcio-1.66.2-cp39-cp39-win_amd64.whl", hash = "sha256:728bdf36a186e7f51da73be7f8d09457a03061be848718d0edf000e709418987"},
+ {file = "grpcio-1.66.2.tar.gz", hash = "sha256:563588c587b75c34b928bc428548e5b00ea38c46972181a4d8b75ba7e3f24231"},
]
[package.extras]
-protobuf = ["grpcio-tools (>=1.66.1)"]
+protobuf = ["grpcio-tools (>=1.66.2)"]
[[package]]
name = "grpcio-tools"
-version = "1.66.1"
+version = "1.66.2"
description = "Protobuf code generator for gRPC"
optional = false
python-versions = ">=3.8"
files = [
- {file = "grpcio_tools-1.66.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:e0c71405399ef59782600b1f0bdebc69ba12d7c9527cd268162a86273971d294"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:df1a174a6f9d3b4c380f005f33352d2e95464f33f021fb08084735a2eb6e23b1"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:7d789bfe53fce9e87aa80c3694a366258ce4c41b706258e9228ed4994832b780"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95c44a265ff01fd05166edae9350bc2e7d1d9a95e8f53b8cd04d2ae0a588c583"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b962a8767c3c0f9afe92e0dd6bb0b2305d35195a1053f84d4d31f585b87557ed"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d8616773126ec3cdf747b06a12e957b43ac15c34e4728def91fa67249a7c689a"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0067e79b6001560ac6acc78cca11fd3504fa27f8af46e3cdbac2f4998505e597"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-win32.whl", hash = "sha256:fa4f95a79a34afc3b5464895d091cd1911227fc3ab0441b9a37cd1817cf7db86"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-win_amd64.whl", hash = "sha256:3acce426f5e643de63019311171f4d31131da8149de518716a95c29a2c12dd38"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:9a07e24feb7472419cf70ebbb38dd4299aea696f91f191b62a99b3ee9ff03f89"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:097a069e7c640043921ecaf3e88d7af78ccd40c25dbddc91db2a4a2adbd0393d"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:016fa273dc696c9d8045091ac50e000bce766183a6b150801f51c2946e33dbe3"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ec9f4f964f8e8ed5e9cc13deb678c83d5597074c256805373220627833bc5ad"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3198815814cdd12bdb69b7580d7770a4ad4c8b2093e0bd6b987bc817618e3eec"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:796620fc41d3fbb566d9614ef22bc55df67fac1f1e19c1e0fb6ec48bc9b6a44b"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:222d8dc218560698e1abf652fb47e4015994ec7a265ef46e012fd9c9e77a4d6b"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-win32.whl", hash = "sha256:56e17a11f34df252b4c6fb8aa8cd7b44d162dba9f3333be87ddf7c8bf496622a"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-win_amd64.whl", hash = "sha256:edd52d667f2aa3c73233be0a821596937f24536647c12d96bfc54aa4cb04747d"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:869b6960d5daffda0dac1a474b44144f0dace0d4336394e499c4f400c5e2f8d9"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:68d9390bf9ba863ac147fc722d6548caa587235e887cac1bc2438212e89d1de7"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:b8660401beca7e3af28722439e07b0bcdca80b4a68f5a5a1138ae7b7780a6abf"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb67b9aa9cd69468bceb933e8e0f89fd13695746c018c4d2e6b3b84e73f3ad97"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5daceb9716e31edc0e1ba0f93303785211438c43502edddad7a919fc4cb3d664"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0a86398a4cd0665bc7f09fa90b89bac592c959d2c895bf3cf5d47a98c0f2d24c"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1b4acb53338072ab3023e418a5c7059cb15686abd1607516fa1453406dd5f69d"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-win32.whl", hash = "sha256:88e04b7546101bc79c868c941777efd5088063a9e4f03b4d7263dde796fbabf7"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-win_amd64.whl", hash = "sha256:5b4fc56abeafae74140f5da29af1093e88ce64811d77f1a81c3146e9e996fb6a"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:d4dd2ff982c1aa328ef47ce34f07af82f1f13599912fb1618ebc5fe1e14dddb8"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:066648543f786cb74b1fef5652359952455dbba37e832642026fd9fd8a219b5f"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d19d47744c30e6bafa76b3113740e71f382d75ebb2918c1efd62ebe6ba7e20f9"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:739c53571130b359b738ac7d6d0a1f772e15779b66df7e6764bee4071cd38689"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2226ff8d3ecba83b7622946df19d6e8e15cb52f761b8d9e2f807b228db5f1b1e"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f4b1498cb8b422fbae32a491c9154e8d47650caf5852fbe6b3b34253e824343"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:93d2d9e14e81affdc63d67c42eb16a8da1b6fecc16442a703ca60eb0e7591691"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-win32.whl", hash = "sha256:d761dfd97a10e4aae73628b5120c64e56f0cded88651d0003d2d80e678c3e7c9"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-win_amd64.whl", hash = "sha256:e1c2ac0955f5fb87b8444316e475242d194c3f3cd0b7b6e54b889a7b6f05156f"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:5f1f04578b72c281e39274348a61d240c48d5321ba8d7a8838e194099ecbc322"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:da9b0c08dbbf07535ee1b75a22d0acc5675a808a3a3df9f9b21e0e73ddfbb3a9"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:e302b4e1fa856d74ff65c65888b3a37153287ce6ad5bad80b2fdf95130accec2"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fc3f62494f238774755ff90f0e66a93ac7972ea1eb7180c45acf4fd53b25cca"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cad65ff22459aa387f543d293f54834c9aac8f76fb7416a7046556df75b567"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3d17a27c567a5e4d18f487368215cb51b43e2499059fd6113b92f7ae1fee48be"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4df167e67b083f96bc277032a526f6186e98662aaa49baea1dfb8ecfe26ce117"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-win32.whl", hash = "sha256:f94d5193b2f2a9595795b83e7978b2bee1c0399da66f2f24d179c388f81fb99c"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-win_amd64.whl", hash = "sha256:66f527a1e3f063065e29cf6f3e55892434d13a5a51e3b22402e09da9521e98a3"},
- {file = "grpcio_tools-1.66.1.tar.gz", hash = "sha256:5055ffe840ea8f505c30378be02afb4dbecb33480e554debe10b63d6b2f641c3"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:40b7ad804ff78490408177cfe87427d5a67224f82a2bdfabe9d8d6ac6239733b"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:a886fa2ff9e897b35489557d1c61cbc0e4efc42c4dc0d120a9516f294fefb107"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:1d5e22b2c7f5b453462c85aa66f99961d5c7b275d1c60b84fe847c06c73c9400"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a425b2600ad4fcf887107ee975a9b7c20478c2959c58b12af7f36577d7a7f7b3"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef979af76b0cd3f5235d3ec30e86a4f0acc0eab179e796ddbb481aa351a1e6ca"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:99638043e1a78b8617f31b676f1ecf248d75a45b318776af3acc48a85c8e10a2"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0a465850c7e5c4ab588c7b7275d47781e9c0ee397a8faf4977262592f95e1831"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-win32.whl", hash = "sha256:48997b704d2fcf59d922228c7a79fcd35d52ca8b2202e5cfe193962643b8354f"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-win_amd64.whl", hash = "sha256:ab4eda584ba2e647e9bb5098f5e4e8d370a333761bf33924e9a7c14f069c8b08"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:007750b4db62018e441f8401fa567aa11174ae0173826cbbe54982fdf2383067"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18554bc91640b2f1ce18aa5c6bebd51500ca0b43b5df4e700e6f76522e2b0e94"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:3fe2fc2e4a16d745cae01e1348b401378e58ced920ff759a6b4b85a7ad507896"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0933420362621d8792fea9350f0c82c514da5f93888d1476c37d9e3722d260b0"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3aef5abd34bea8ea98448cd58a938992238c4717df93d12f84fa5f56efb11d0"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7afd9eb9be413a731cff7ad638081795a7ed0fec4b23af5cec2099fbd9d742f9"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fd1fa95188ae7d5460a8c4a2abcb2777fdf9c3b80d592a2e8434c52a6eb48e8d"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-win32.whl", hash = "sha256:80c233215cf0f08353b7aac4e86cdedf4d545ed368a7491ccc9996e5a317dce4"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-win_amd64.whl", hash = "sha256:2a9a376b300aa2b4da8e6c4f6f746e824d3f24eefeac2753ffffe2b9f37d156d"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:d8ca76fc40a7d35ddf1229afd04408e2ff94caf4385068c8b147e064e951e0ba"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6cc3da6994d575c425c74ce33e34b86a975ea7e78bb9c3525e8439a3af3c508f"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:89e437ced43275e7427cc82a837f5cd43ebe18a1080b0e50a47627895b44b0e6"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d95f030e708266d7fd6d3e5d56e30a9bbbe230604856b1fe93edd892e4389aab"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b3cf9ae67f8bb431ab3ff60db75c3586dc5aa993be4b15bd7cad651362563cd"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b4896a0853fc402273e908c0a0710d25242f1ae907efb9d22ba6d82d4ba00ad8"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d31aad10f90fccb0073bc03b4d1b67690ef4f0cd9af96e82944b9cc655d12b6f"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-win32.whl", hash = "sha256:d8f976f35683e49467d0bf2b90c170ac5443cd162d48d8d868801fd0d87a5fa8"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-win_amd64.whl", hash = "sha256:b2c19e5a888a6ee48ba699581a90c04806b2a93f574f37449c359ec17a793669"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-linux_armv7l.whl", hash = "sha256:7e8c9aa91a9e51199048202e3c54491e0a89fb3ac47dde36ff2964fbcee143a3"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0eaedd3c77824c3762b728c485f91097a58116fa135f3bbc24703621476cd866"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:a14007902fb6565c21815da4177105ec905ef37f0550190c4d1bbeb2928c6560"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8f098bb92d192230f3b23df514b139f3549e2a4390d1f0f0d8ff89de458c54"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68642829368f4f83929e0df571dbbc99f1f1553555d8f98d0582da9f6743d9e"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:5fd20110d2c7706dfdd95457807acb8c050253be2e272b9f5fb977e87ea44d86"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:4b16244be4cff92408eb82901b883a70f3dd902fb7c7f66e2a368271be84cde4"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-win32.whl", hash = "sha256:d872ba3bbe9e15b43eeb9310dad5edbf490bb3ab0072a46b3a12fed0234eec23"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-win_amd64.whl", hash = "sha256:a2810921218471aab5c8cd20204d3b1886aa8e13b495e882158bb398982cf18e"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:538eb263b9969e866619775df341307ece0b09afce091ede8141c5bb4d7d8933"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9a68c71bb1358f0994fc7d0f0d70a0d419d57507faa25c982145be401f6aca48"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:1bc41d5b36d414bb0940aa50e30d624903a2538f9387ae730953675adcbe1498"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43dcd3ee13418545ea10416f46296ddbc7fb355cf136ddebd3b3f881a383168"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc16f9e6baafed315846e79a746513863e6ecbb89e9c98d872834e44f9e87a5"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3655c96eef8aac2a610bbf4cb9c7839fcff09f07a609b74408b3b0a136e1ef57"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:86d971fc64e63642058ac01ce2e484a8340d60a95ead0dc6697ef2aa18a7b936"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-win32.whl", hash = "sha256:c14db004b28ee2adefc6d36107d7fdf770f7509bd1f1ecd195eecb88cdbe5d96"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-win_amd64.whl", hash = "sha256:c65f12474634195ff5ed91b304412b80008c067d28226c26b4e451ea9da16b24"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:75c6a25a5cf729c4606c388013cf7c59dda99cf3718c24fe4fd52b06c19955d0"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a5146e780ed87348d84b11fc3843741e676b2a84d493363bf0b4ae31c56841b"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c42ba1b24e701544bf08a43bb2d63d56dedd0fd33a5b499c9cf85e15aa154b13"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5daf9807260e172ffcc5dd582c01f60bac820f99f0151a507c8a537f9e6dceb8"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a15a4d0f4eba3773dabe07113b42e018a8fa9a28441483ada111991d5c1468b6"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:cc4f65cd189832676dca16046a4b6247d0bc1fc20648d16ac7fb0b075d1658f4"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ba63dbcbb8ade67e5a04dd3a6c5860efb454bda6d5e8558b17c9a7251339ce36"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-win32.whl", hash = "sha256:c4df0f547f4193dfa6689949b374974f08d81f129174738f0410ba8d45dc63be"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-win_amd64.whl", hash = "sha256:0cad9ffe5df7801201773b91f14923cf3e20ca764e418ae7f8cb75f6045a0aa1"},
+ {file = "grpcio_tools-1.66.2.tar.gz", hash = "sha256:4a36e07913d26ba5ccfd2685ba63ca97f26b08c249d2cc9e74dda37efa49d7e4"},
]
[package.dependencies]
-grpcio = ">=1.66.1"
+grpcio = ">=1.66.2"
protobuf = ">=5.26.1,<6.0dev"
setuptools = "*"
diff --git a/python/examples/minimal/pyproject.toml b/python/examples/simple/pyproject.toml
similarity index 88%
rename from python/examples/minimal/pyproject.toml
rename to python/examples/simple/pyproject.toml
index f01d630..63914e5 100644
--- a/python/examples/minimal/pyproject.toml
+++ b/python/examples/simple/pyproject.toml
@@ -1,5 +1,5 @@
[tool.poetry]
-name = "minimal"
+name = "simple"
version = "0.1.0"
description = ""
authors = ["Felix Nguyen "]
@@ -9,9 +9,10 @@ readme = "README.md"
python = ">=3.10, <3.13"
arflow = { path = "../.." }
+
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[tool.poetry.scripts]
-minimal = "minimal:main"
+simple = "simple:main"
diff --git a/python/examples/simple/simple.py b/python/examples/simple/simple.py
new file mode 100644
index 0000000..80c4555
--- /dev/null
+++ b/python/examples/simple/simple.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python3
+"""A simple example of extending the ARFlow server."""
+
+from pathlib import Path
+
+import arflow
+
+
+class CustomService(arflow.ARFlowServicer):
+ def on_register(self, request: arflow.RegisterClientRequest):
+ """Called when a client registers."""
+ print("Client registered!")
+
+ def on_frame_received(self, decoded_data_frame: arflow.DecodedDataFrame):
+ """Called when a frame is received."""
+ print("Frame received!")
+
+
+def main():
+ arflow.run_server(CustomService, port=8500, path_to_save=Path("./"))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/python/examples/xihe/poetry.lock b/python/examples/xihe/poetry.lock
index 2c6ac83..74960cc 100644
--- a/python/examples/xihe/poetry.lock
+++ b/python/examples/xihe/poetry.lock
@@ -2,8 +2,8 @@
[[package]]
name = "arflow"
-version = "0.2.0"
-description = ""
+version = "0.3.0"
+description = "ARFlow is a data-sharing layer that enables developer-friendly data streaming, storage, and visualization for augmented reality (AR) device data."
optional = false
python-versions = ">=3.9,<3.13"
files = []
@@ -12,7 +12,7 @@ develop = false
[package.dependencies]
grpcio = "^1.60.1"
grpcio-tools = "^1.60.1"
-rerun-sdk = "^0.12.1"
+rerun-sdk = "^0.18.2"
[package.source]
type = "directory"
@@ -39,18 +39,18 @@ tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"]
[[package]]
name = "filelock"
-version = "3.16.0"
+version = "3.16.1"
description = "A platform independent file lock."
optional = false
python-versions = ">=3.8"
files = [
- {file = "filelock-3.16.0-py3-none-any.whl", hash = "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609"},
- {file = "filelock-3.16.0.tar.gz", hash = "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec"},
+ {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"},
+ {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"},
]
[package.extras]
-docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
-testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.1.1)", "pytest (>=8.3.2)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.3)"]
+docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"]
+testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"]
typing = ["typing-extensions (>=4.12.2)"]
[[package]]
@@ -555,40 +555,53 @@ files = [
[[package]]
name = "pandas"
-version = "2.2.2"
+version = "2.2.3"
description = "Powerful data structures for data analysis, time series, and statistics"
optional = false
python-versions = ">=3.9"
files = [
- {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"},
- {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"},
- {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"},
- {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"},
- {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"},
- {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"},
- {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"},
- {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"},
- {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"},
- {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"},
- {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"},
- {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"},
- {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"},
- {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"},
- {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"},
- {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"},
- {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"},
- {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"},
- {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"},
- {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"},
- {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"},
- {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"},
- {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"},
- {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"},
- {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"},
- {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"},
- {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"},
- {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"},
- {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"},
+ {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
+ {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
+ {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"},
+ {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"},
+ {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"},
+ {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"},
+ {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"},
+ {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"},
+ {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"},
+ {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"},
+ {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"},
+ {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"},
+ {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"},
+ {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"},
+ {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"},
+ {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"},
+ {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"},
+ {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"},
+ {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"},
+ {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"},
+ {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"},
+ {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"},
+ {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"},
+ {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"},
+ {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"},
+ {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"},
+ {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"},
+ {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"},
+ {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"},
+ {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"},
+ {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"},
+ {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"},
+ {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"},
+ {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"},
+ {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"},
+ {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"},
+ {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"},
+ {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"},
+ {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"},
+ {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"},
+ {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"},
+ {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"},
]
[package.dependencies]
@@ -725,72 +738,75 @@ xmp = ["defusedxml"]
[[package]]
name = "protobuf"
-version = "5.28.1"
+version = "5.28.2"
description = ""
optional = false
python-versions = ">=3.8"
files = [
- {file = "protobuf-5.28.1-cp310-abi3-win32.whl", hash = "sha256:fc063acaf7a3d9ca13146fefb5b42ac94ab943ec6e978f543cd5637da2d57957"},
- {file = "protobuf-5.28.1-cp310-abi3-win_amd64.whl", hash = "sha256:4c7f5cb38c640919791c9f74ea80c5b82314c69a8409ea36f2599617d03989af"},
- {file = "protobuf-5.28.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4304e4fceb823d91699e924a1fdf95cde0e066f3b1c28edb665bda762ecde10f"},
- {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:0dfd86d2b5edf03d91ec2a7c15b4e950258150f14f9af5f51c17fa224ee1931f"},
- {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:51f09caab818707ab91cf09cc5c156026599cf05a4520779ccbf53c1b352fb25"},
- {file = "protobuf-5.28.1-cp38-cp38-win32.whl", hash = "sha256:1b04bde117a10ff9d906841a89ec326686c48ececeb65690f15b8cabe7149495"},
- {file = "protobuf-5.28.1-cp38-cp38-win_amd64.whl", hash = "sha256:cabfe43044ee319ad6832b2fda332646f9ef1636b0130186a3ae0a52fc264bb4"},
- {file = "protobuf-5.28.1-cp39-cp39-win32.whl", hash = "sha256:4b4b9a0562a35773ff47a3df823177ab71a1f5eb1ff56d8f842b7432ecfd7fd2"},
- {file = "protobuf-5.28.1-cp39-cp39-win_amd64.whl", hash = "sha256:f24e5d70e6af8ee9672ff605d5503491635f63d5db2fffb6472be78ba62efd8f"},
- {file = "protobuf-5.28.1-py3-none-any.whl", hash = "sha256:c529535e5c0effcf417682563719e5d8ac8d2b93de07a56108b4c2d436d7a29a"},
- {file = "protobuf-5.28.1.tar.gz", hash = "sha256:42597e938f83bb7f3e4b35f03aa45208d49ae8d5bcb4bc10b9fc825e0ab5e423"},
+ {file = "protobuf-5.28.2-cp310-abi3-win32.whl", hash = "sha256:eeea10f3dc0ac7e6b4933d32db20662902b4ab81bf28df12218aa389e9c2102d"},
+ {file = "protobuf-5.28.2-cp310-abi3-win_amd64.whl", hash = "sha256:2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132"},
+ {file = "protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7"},
+ {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f"},
+ {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f"},
+ {file = "protobuf-5.28.2-cp38-cp38-win32.whl", hash = "sha256:87317e9bcda04a32f2ee82089a204d3a2f0d3c8aeed16568c7daf4756e4f1fe0"},
+ {file = "protobuf-5.28.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0ea0123dac3399a2eeb1a1443d82b7afc9ff40241433296769f7da42d142ec3"},
+ {file = "protobuf-5.28.2-cp39-cp39-win32.whl", hash = "sha256:ca53faf29896c526863366a52a8f4d88e69cd04ec9571ed6082fa117fac3ab36"},
+ {file = "protobuf-5.28.2-cp39-cp39-win_amd64.whl", hash = "sha256:8ddc60bf374785fb7cb12510b267f59067fa10087325b8e1855b898a0d81d276"},
+ {file = "protobuf-5.28.2-py3-none-any.whl", hash = "sha256:52235802093bd8a2811abbe8bf0ab9c5f54cca0a751fdd3f6ac2a21438bffece"},
+ {file = "protobuf-5.28.2.tar.gz", hash = "sha256:59379674ff119717404f7454647913787034f03fe7049cbef1d74a97bb4593f0"},
]
[[package]]
name = "pyarrow"
-version = "14.0.2"
+version = "17.0.0"
description = "Python library for Apache Arrow"
optional = false
python-versions = ">=3.8"
files = [
- {file = "pyarrow-14.0.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:ba9fe808596c5dbd08b3aeffe901e5f81095baaa28e7d5118e01354c64f22807"},
- {file = "pyarrow-14.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:22a768987a16bb46220cef490c56c671993fbee8fd0475febac0b3e16b00a10e"},
- {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dbba05e98f247f17e64303eb876f4a80fcd32f73c7e9ad975a83834d81f3fda"},
- {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a898d134d00b1eca04998e9d286e19653f9d0fcb99587310cd10270907452a6b"},
- {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:87e879323f256cb04267bb365add7208f302df942eb943c93a9dfeb8f44840b1"},
- {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:76fc257559404ea5f1306ea9a3ff0541bf996ff3f7b9209fc517b5e83811fa8e"},
- {file = "pyarrow-14.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0c4a18e00f3a32398a7f31da47fefcd7a927545b396e1f15d0c85c2f2c778cd"},
- {file = "pyarrow-14.0.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:87482af32e5a0c0cce2d12eb3c039dd1d853bd905b04f3f953f147c7a196915b"},
- {file = "pyarrow-14.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:059bd8f12a70519e46cd64e1ba40e97eae55e0cbe1695edd95384653d7626b23"},
- {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f16111f9ab27e60b391c5f6d197510e3ad6654e73857b4e394861fc79c37200"},
- {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06ff1264fe4448e8d02073f5ce45a9f934c0f3db0a04460d0b01ff28befc3696"},
- {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6dd4f4b472ccf4042f1eab77e6c8bce574543f54d2135c7e396f413046397d5a"},
- {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:32356bfb58b36059773f49e4e214996888eeea3a08893e7dbde44753799b2a02"},
- {file = "pyarrow-14.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:52809ee69d4dbf2241c0e4366d949ba035cbcf48409bf404f071f624ed313a2b"},
- {file = "pyarrow-14.0.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:c87824a5ac52be210d32906c715f4ed7053d0180c1060ae3ff9b7e560f53f944"},
- {file = "pyarrow-14.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a25eb2421a58e861f6ca91f43339d215476f4fe159eca603c55950c14f378cc5"},
- {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c1da70d668af5620b8ba0a23f229030a4cd6c5f24a616a146f30d2386fec422"},
- {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cc61593c8e66194c7cdfae594503e91b926a228fba40b5cf25cc593563bcd07"},
- {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:78ea56f62fb7c0ae8ecb9afdd7893e3a7dbeb0b04106f5c08dbb23f9c0157591"},
- {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:37c233ddbce0c67a76c0985612fef27c0c92aef9413cf5aa56952f359fcb7379"},
- {file = "pyarrow-14.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:e4b123ad0f6add92de898214d404e488167b87b5dd86e9a434126bc2b7a5578d"},
- {file = "pyarrow-14.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e354fba8490de258be7687f341bc04aba181fc8aa1f71e4584f9890d9cb2dec2"},
- {file = "pyarrow-14.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:20e003a23a13da963f43e2b432483fdd8c38dc8882cd145f09f21792e1cf22a1"},
- {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc0de7575e841f1595ac07e5bc631084fd06ca8b03c0f2ecece733d23cd5102a"},
- {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e986dc859712acb0bd45601229021f3ffcdfc49044b64c6d071aaf4fa49e98"},
- {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:f7d029f20ef56673a9730766023459ece397a05001f4e4d13805111d7c2108c0"},
- {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:209bac546942b0d8edc8debda248364f7f668e4aad4741bae58e67d40e5fcf75"},
- {file = "pyarrow-14.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:1e6987c5274fb87d66bb36816afb6f65707546b3c45c44c28e3c4133c010a881"},
- {file = "pyarrow-14.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a01d0052d2a294a5f56cc1862933014e696aa08cc7b620e8c0cce5a5d362e976"},
- {file = "pyarrow-14.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a51fee3a7db4d37f8cda3ea96f32530620d43b0489d169b285d774da48ca9785"},
- {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64df2bf1ef2ef14cee531e2dfe03dd924017650ffaa6f9513d7a1bb291e59c15"},
- {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c0fa3bfdb0305ffe09810f9d3e2e50a2787e3a07063001dcd7adae0cee3601a"},
- {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c65bf4fd06584f058420238bc47a316e80dda01ec0dfb3044594128a6c2db794"},
- {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:63ac901baec9369d6aae1cbe6cca11178fb018a8d45068aaf5bb54f94804a866"},
- {file = "pyarrow-14.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:75ee0efe7a87a687ae303d63037d08a48ef9ea0127064df18267252cfe2e9541"},
- {file = "pyarrow-14.0.2.tar.gz", hash = "sha256:36cef6ba12b499d864d1def3e990f97949e0b79400d08b7cf74504ffbd3eb025"},
+ {file = "pyarrow-17.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a5c8b238d47e48812ee577ee20c9a2779e6a5904f1708ae240f53ecbee7c9f07"},
+ {file = "pyarrow-17.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db023dc4c6cae1015de9e198d41250688383c3f9af8f565370ab2b4cb5f62655"},
+ {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da1e060b3876faa11cee287839f9cc7cdc00649f475714b8680a05fd9071d545"},
+ {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c06d4624c0ad6674364bb46ef38c3132768139ddec1c56582dbac54f2663e2"},
+ {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:fa3c246cc58cb5a4a5cb407a18f193354ea47dd0648194e6265bd24177982fe8"},
+ {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:f7ae2de664e0b158d1607699a16a488de3d008ba99b3a7aa5de1cbc13574d047"},
+ {file = "pyarrow-17.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5984f416552eea15fd9cee03da53542bf4cddaef5afecefb9aa8d1010c335087"},
+ {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"},
+ {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"},
+ {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"},
+ {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"},
+ {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"},
+ {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"},
+ {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"},
+ {file = "pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22"},
+ {file = "pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053"},
+ {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a"},
+ {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc"},
+ {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a"},
+ {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b"},
+ {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"},
+ {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"},
+ {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"},
+ {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155"},
+ {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145"},
+ {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c"},
+ {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c"},
+ {file = "pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca"},
+ {file = "pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb"},
+ {file = "pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df"},
+ {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687"},
+ {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b"},
+ {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5"},
+ {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda"},
+ {file = "pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204"},
+ {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"},
]
[package.dependencies]
numpy = ">=1.16.6"
+[package.extras]
+test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"]
+
[[package]]
name = "python-dateutil"
version = "2.9.0.post0"
@@ -818,41 +834,43 @@ files = [
[[package]]
name = "rerun-sdk"
-version = "0.12.1"
+version = "0.18.2"
description = "The Rerun Logging SDK"
optional = false
-python-versions = ">=3.8, <3.13"
+python-versions = "<3.13,>=3.8"
files = [
- {file = "rerun_sdk-0.12.1-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:00b02adabe1ecf380d4c1fd3ddbfd5347c2eab912e15b5394977f8deff4955f2"},
- {file = "rerun_sdk-0.12.1-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec010caeddba99ab55498680d44d81eb0bab3180db4837b40d0e93519151161b"},
- {file = "rerun_sdk-0.12.1-cp38-abi3-manylinux_2_31_x86_64.whl", hash = "sha256:cebe96871222a433eebd30f46d19ee29dc7f0fe4243e1a271f8fd67fda1dcb0e"},
- {file = "rerun_sdk-0.12.1-cp38-abi3-win_amd64.whl", hash = "sha256:12072ee880cdddbd111b53aac312b5ab61d6deb26e25095adf2caed9d1d0ae60"},
+ {file = "rerun_sdk-0.18.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bc4e73275f428e4e9feb8e85f88db7a9fd18b997b1570de62f949a926978f1b2"},
+ {file = "rerun_sdk-0.18.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:efbba40a59710ae83607cb0dc140398a35979c2d2acf5190c9def2ac4697f6a8"},
+ {file = "rerun_sdk-0.18.2-cp38-abi3-manylinux_2_31_aarch64.whl", hash = "sha256:2a5e3b618b6d1bfde09bd5614a898995f3c318cc69d8f6d569924a2cd41536ce"},
+ {file = "rerun_sdk-0.18.2-cp38-abi3-manylinux_2_31_x86_64.whl", hash = "sha256:8fdfc4c51ef2e75cb68d39e56f0d7c196eff250cb9a0260c07d5e2d6736e31b0"},
+ {file = "rerun_sdk-0.18.2-cp38-abi3-win_amd64.whl", hash = "sha256:c929ade91d3be301b26671b25e70fb529524ced915523d266641c6fc667a1eb5"},
]
[package.dependencies]
attrs = ">=23.1.0"
numpy = ">=1.23,<2"
-pillow = "*"
-pyarrow = "14.0.2"
-typing_extensions = ">=4.5"
+pillow = ">=8.0.0"
+pyarrow = ">=14.0.2"
+typing-extensions = ">=4.5"
[package.extras]
+notebook = ["rerun-notebook (==0.18.2)"]
tests = ["pytest (==7.1.2)"]
[[package]]
name = "setuptools"
-version = "74.1.2"
+version = "75.1.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
optional = false
python-versions = ">=3.8"
files = [
- {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"},
- {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"},
+ {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"},
+ {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"},
]
[package.extras]
check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"]
-core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"]
+core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"]
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"]
enabler = ["pytest-enabler (>=2.2)"]
@@ -872,13 +890,13 @@ files = [
[[package]]
name = "sympy"
-version = "1.13.2"
+version = "1.13.3"
description = "Computer algebra system (CAS) in Python"
optional = false
python-versions = ">=3.8"
files = [
- {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"},
- {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"},
+ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"},
+ {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"},
]
[package.dependencies]
@@ -976,13 +994,13 @@ files = [
[[package]]
name = "tzdata"
-version = "2024.1"
+version = "2024.2"
description = "Provider of IANA time zone data"
optional = false
python-versions = ">=2"
files = [
- {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"},
- {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"},
+ {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"},
+ {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"},
]
[metadata]
diff --git a/python/examples/xihe/utils3d/utils/cli.py b/python/examples/xihe/utils3d/utils/cli.py
index f35377a..a7e8df9 100644
--- a/python/examples/xihe/utils3d/utils/cli.py
+++ b/python/examples/xihe/utils3d/utils/cli.py
@@ -13,6 +13,6 @@ def pretty_print_matrix(mat):
res_rows.append(res_cols)
- df = pd.DataFrame(res_rows)
+ df = pd.ProcessFrameRequest(res_rows)
print(df)
diff --git a/python/examples/xihe/xihe.py b/python/examples/xihe/xihe.py
old mode 100755
new mode 100644
index 66c1d78..0826e13
--- a/python/examples/xihe/xihe.py
+++ b/python/examples/xihe/xihe.py
@@ -1,6 +1,10 @@
#!/usr/bin/env python3
+# type: ignore
"""A demo integration with Xihe.
+Note: `# type: ignore` is added to the first line to suppress typecheck errors.
+In case you want to copy this code, please remove the first line if you are using typecheck.
+
Reference:
- Yiqin Zhao and Tian Guo. 2021. Xihe: A 3D Vision-Based Lighting
Estimation Framework for Mobile Augmented Reality. In Proceedings of
@@ -9,25 +13,24 @@
"""
from threading import Thread
-from typing import Any, Dict
import numpy as np
+import numpy.typing as npt
import pandas as pd
import torch
-import utils3d as u3d
-import xihenet_utils
# This import is necessary to avoid an "operator not found" error when loading
# DO NOT REMOVE (please)
# To install this (workaround currently), enter "poetry shell" and run:
# pip install wheel
# pip install torch-cluster -f https://data.pyg.org/whl/torch-2.4.0+${CUDA}.html (this will take very long).
-import torch_cluster
+import utils3d as u3d
+import xihenet_utils
import arflow
-class XiheService(arflow.ARFlowService):
+class XiheService(arflow.ARFlowServicer):
def __init__(self, *args, **kwargs) -> None:
super().__init__()
@@ -39,25 +42,28 @@ def __init__(self, *args, **kwargs) -> None:
self.calculator = xihenet_utils.JointEntropyCalculator()
- def on_register(self, request: arflow.RegisterRequest):
+ def on_register(self, request: arflow.RegisterClientRequest):
self.num_frame = 0
- def on_frame_received(self, frame_data: Dict[str, Any]):
+ def on_frame_received(self, decoded_data_frame: arflow.DecodedDataFrame):
# Run XiheNet inference.
- pcd = frame_data["point_cloud_pcd"]
- clr = frame_data["point_cloud_clr"]
if self.num_frame % 100 == 0:
thread = Thread(
- target=self.run_xihenet_inference, args=(pcd.copy(), clr.copy())
+ target=self.run_xihenet_inference, args=(decoded_data_frame.point_cloud_pcd.copy(), decoded_data_frame.point_cloud_clr.copy())
)
thread.start()
self.num_frame = self.num_frame + 1
- def run_xihenet_inference(self, xyz: np.ndarray, rgb: np.ndarray):
+ def run_xihenet_inference(self, xyz: npt.NDArray[np.float32], rgb: npt.NDArray[np.uint8]):
# Log input entropy.
entropy = self.calculator.forward(torch.from_numpy(xyz).float())
- self.recorder.log("Xihe/input_entropy", self.recorder.TimeSeriesScalar(entropy))
+
+ # TODO: FIX THIS https://rerun.io/docs/reference/migration/migration-0-13#timeseriesscalar-deprecated-in-favor-of-scalartypesarchetypesscalarmd--serieslinetypesarchetypesserieslinemdseriespointtypesarchetypesseriespointmd
+ # self.recorder.log("Xihe/input_entropy", self.recorder.TimeSeriesScalar(entropy))
+ self.recorder.log("Xihe/input_entropy", self.recorder.Scalar(entropy))
+ # self.recorder.log("Xihe/input_entropy", self.recorder.SeriesPoint(entropy))
+ # self.recorder.log("Xihe/input_entropy", self.recorder.SeriesLine(entropy))
# Inference preprocessing code copied from previous
# lighting estimation visualization code.
@@ -99,7 +105,7 @@ def run_xihenet_inference(self, xyz: np.ndarray, rgb: np.ndarray):
def main():
- arflow.create_server(XiheService, port=8500, path_to_save=None)
+ arflow.run_server(XiheService, port=8500, path_to_save=None)
if __name__ == "__main__":
diff --git a/python/poetry.lock b/python/poetry.lock
index 5893cb5..5fa5fbd 100644
--- a/python/poetry.lock
+++ b/python/poetry.lock
@@ -41,6 +41,93 @@ files = [
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
+[[package]]
+name = "coverage"
+version = "7.6.1"
+description = "Code coverage measurement for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"},
+ {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"},
+ {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"},
+ {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"},
+ {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"},
+ {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"},
+ {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"},
+ {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"},
+ {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"},
+ {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"},
+ {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"},
+ {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"},
+ {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"},
+ {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"},
+ {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"},
+ {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"},
+ {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"},
+ {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"},
+ {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"},
+ {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"},
+ {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"},
+ {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"},
+ {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"},
+ {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"},
+ {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"},
+ {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"},
+ {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"},
+ {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"},
+ {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"},
+ {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"},
+ {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"},
+ {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"},
+ {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"},
+ {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"},
+ {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"},
+ {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"},
+ {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"},
+ {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"},
+ {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"},
+ {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"},
+ {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"},
+ {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"},
+ {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"},
+ {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"},
+ {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"},
+ {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"},
+ {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"},
+ {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"},
+ {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"},
+ {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"},
+ {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"},
+ {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"},
+ {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"},
+ {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"},
+ {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"},
+ {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"},
+ {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"},
+ {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"},
+ {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"},
+ {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"},
+ {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"},
+ {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"},
+ {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"},
+ {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"},
+ {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"},
+ {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"},
+ {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"},
+ {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"},
+ {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"},
+ {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"},
+ {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"},
+ {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"},
+]
+
+[package.dependencies]
+tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
+
+[package.extras]
+toml = ["tomli"]
+
[[package]]
name = "distlib"
version = "0.3.8"
@@ -52,6 +139,51 @@ files = [
{file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"},
]
+[[package]]
+name = "dracopy"
+version = "1.4.0"
+description = "Python wrapper for Google's Draco Mesh Compression Library"
+optional = false
+python-versions = "*"
+files = [
+ {file = "DracoPy-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bffde5eda803f8a2c76ee4fab0e0d40ee7f5939df5f8eed22bdc4e5c6d9f405"},
+ {file = "DracoPy-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9d3a00c20f829ea2f2a7355b35bd02f62bbafebb39f742929aa498c66c4ae4ef"},
+ {file = "DracoPy-1.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf2e0f15145a23a94794272fce2a373ab953fdc75967c0e46ed7ac2687bdcba4"},
+ {file = "DracoPy-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f204151f4ca8a10a0945eb9cd86d99746e2fbd6e8cb21511028e9054d9ee6a1"},
+ {file = "DracoPy-1.4.0-cp310-cp310-win32.whl", hash = "sha256:004aeb2e24324f7a0e77424ba1116f03c16120a610ebeb8fea5f88077b8330a1"},
+ {file = "DracoPy-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b3142f77670530ae219a591f97db7589a9a47b0bac836da0ce88221555187a1b"},
+ {file = "DracoPy-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:934e7927e26a80cef5d7f57de42aa19deefddfe08e3b64e88225d7b4546e8398"},
+ {file = "DracoPy-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bef6e752b80a5dec169185784ac47dfa4e6418b547410c1be9af5ccbe614e7cf"},
+ {file = "DracoPy-1.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ec3586416a716f03bd78fecb64d77a2be0fd7c08d5e1bf30c3d9633915e7cc9"},
+ {file = "DracoPy-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9e0581f6e5bd064ce642e1e1a7850a91a640790e9b9d27834c0d897992192ab"},
+ {file = "DracoPy-1.4.0-cp311-cp311-win32.whl", hash = "sha256:f85a7686f31e076d20a36e10d1ad9035bed3ac523bce2274257eb93f17276a5c"},
+ {file = "DracoPy-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f95d66b69332ad643a6b86fc40f38ff23fa5db9c366842c00eaeb6ca76ed0ec"},
+ {file = "DracoPy-1.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c1b1025a012763ab97291b0863e2d7ba5f3c7301102c06ab1ec3c513ca0a9984"},
+ {file = "DracoPy-1.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7d132f7469c782337d84034c3808d8bcb7ab4c28a4fef1b12f717620e18a2ab"},
+ {file = "DracoPy-1.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45efeb617d68beac1712f6ff1aa1a9a86bd110192f1d688ad9cda46f7c8830c7"},
+ {file = "DracoPy-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc15e5ff9d070d07632dd897fedd8136cd429cb40a838606cc594b9cbdcb8c43"},
+ {file = "DracoPy-1.4.0-cp312-cp312-win32.whl", hash = "sha256:7d5bbae855f8ba16148d6de07ca9367ea8960d65cc6911f4069e407193411eb7"},
+ {file = "DracoPy-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:ef6e894922c0596374f160d082fdae6d3639466ca4f528a08a145f445b180ee7"},
+ {file = "DracoPy-1.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae51f031af22f5b0a5626b30c7e68576166057b901da3b822c8f75420aa96b25"},
+ {file = "DracoPy-1.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b217267bf05a4ba8e90d5fd85577b958d8dbd133cde1ad1c0c1dba9b712be16f"},
+ {file = "DracoPy-1.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6776c773074bfe492d976cd17c25e46ca622e501153d616fec9455ac03f9651"},
+ {file = "DracoPy-1.4.0-cp37-cp37m-win32.whl", hash = "sha256:c0b6f8f2c5539c850c6132b2879afe865b3c9754de93e8060b6868b284d556aa"},
+ {file = "DracoPy-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:571f783c32f39fb68a7d02fa599330bcfc4bcc2bcac86128ae10539b6fdcb29a"},
+ {file = "DracoPy-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fabd1e79e24488e9e7aa187594ca043854b516dc5a3c2736c4d13f31057f51bf"},
+ {file = "DracoPy-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3f3cbba5a534dc3d8427351130f974d7a4782f21b5289097f72bfb37009bb52c"},
+ {file = "DracoPy-1.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f27505392dddd01cdd66b5cfd96646104dc9afe49f2e7338235cb39b8204963"},
+ {file = "DracoPy-1.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c64f09c886ce9f2e5dba214602d5249a26ae4f478a4cc0ff61b203df407848"},
+ {file = "DracoPy-1.4.0-cp38-cp38-win32.whl", hash = "sha256:8ffbb3ccf09920eb103b6d9bbec96105d7b161b06a448c8549952f0b2188fab6"},
+ {file = "DracoPy-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5694c18a500d26798bc37baa38a748308a8f497d1e1538e6a48424ee198d25f2"},
+ {file = "DracoPy-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a89b07dca2b1c17a68cadf418a5718ad1b4a4c5ffa6d00f5d3c332e0933bef49"},
+ {file = "DracoPy-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6071ec96ce833a52fbf7d6e491a2aa6bd6d27a11ccdf2c54250dfeaea1c0311c"},
+ {file = "DracoPy-1.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eaeff76a0b7e7b7c5015970eaaf021b8cfe2df2b15aed9a63be925bad60a67fe"},
+ {file = "DracoPy-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63c9f4a86d320393e698e0aaaa90477fa40b96de799672f15f7b4d784f9a5b4"},
+ {file = "DracoPy-1.4.0-cp39-cp39-win32.whl", hash = "sha256:3bc04aeb05dd3925841d5370c620a5537a27f22fce9506e6d9146a86ac4be246"},
+ {file = "DracoPy-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:2b1e6527b163ff6d87b619bf430089b888ac2fd61b9833992feb850cb334bb26"},
+ {file = "DracoPy-1.4.0.tar.gz", hash = "sha256:a889015283e2f74d62912e4b5c9be29947a0be9fb30f9c8ba635c5124966d5a2"},
+]
+
[[package]]
name = "exceptiongroup"
version = "1.2.2"
@@ -82,121 +214,170 @@ docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.
testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"]
typing = ["typing-extensions (>=4.12.2)"]
+[[package]]
+name = "grpc-interceptor"
+version = "0.15.4"
+description = "Simplifies gRPC interceptors"
+optional = false
+python-versions = ">=3.7,<4.0"
+files = [
+ {file = "grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926"},
+ {file = "grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d"},
+]
+
+[package.dependencies]
+grpcio = ">=1.49.1,<2.0.0"
+
+[package.extras]
+testing = ["protobuf (>=4.21.9)"]
+
+[[package]]
+name = "grpc-stubs"
+version = "1.53.0.5"
+description = "Mypy stubs for gRPC"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "grpc-stubs-1.53.0.5.tar.gz", hash = "sha256:3e1b642775cbc3e0c6332cfcedfccb022176db87e518757bef3a1241397be406"},
+ {file = "grpc_stubs-1.53.0.5-py3-none-any.whl", hash = "sha256:04183fb65a1b166a1febb9627e3d9647d3926ccc2dfe049fe7b6af243428dbe1"},
+]
+
+[package.dependencies]
+grpcio = "*"
+
[[package]]
name = "grpcio"
-version = "1.66.1"
+version = "1.66.2"
description = "HTTP/2-based RPC framework"
optional = false
python-versions = ">=3.8"
files = [
- {file = "grpcio-1.66.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492"},
- {file = "grpcio-1.66.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac"},
- {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60"},
- {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f"},
- {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083"},
- {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a"},
- {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d"},
- {file = "grpcio-1.66.1-cp310-cp310-win32.whl", hash = "sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c"},
- {file = "grpcio-1.66.1-cp310-cp310-win_amd64.whl", hash = "sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858"},
- {file = "grpcio-1.66.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a"},
- {file = "grpcio-1.66.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26"},
- {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df"},
- {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22"},
- {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1"},
- {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e"},
- {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd"},
- {file = "grpcio-1.66.1-cp311-cp311-win32.whl", hash = "sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791"},
- {file = "grpcio-1.66.1-cp311-cp311-win_amd64.whl", hash = "sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb"},
- {file = "grpcio-1.66.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a"},
- {file = "grpcio-1.66.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9"},
- {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d"},
- {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0"},
- {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761"},
- {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815"},
- {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524"},
- {file = "grpcio-1.66.1-cp312-cp312-win32.whl", hash = "sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759"},
- {file = "grpcio-1.66.1-cp312-cp312-win_amd64.whl", hash = "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734"},
- {file = "grpcio-1.66.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2"},
- {file = "grpcio-1.66.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce"},
- {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c"},
- {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b"},
- {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef"},
- {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb"},
- {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d"},
- {file = "grpcio-1.66.1-cp38-cp38-win32.whl", hash = "sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3"},
- {file = "grpcio-1.66.1-cp38-cp38-win_amd64.whl", hash = "sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce"},
- {file = "grpcio-1.66.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503"},
- {file = "grpcio-1.66.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e"},
- {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0"},
- {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44"},
- {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e"},
- {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb"},
- {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c"},
- {file = "grpcio-1.66.1-cp39-cp39-win32.whl", hash = "sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45"},
- {file = "grpcio-1.66.1-cp39-cp39-win_amd64.whl", hash = "sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8"},
- {file = "grpcio-1.66.1.tar.gz", hash = "sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2"},
+ {file = "grpcio-1.66.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:fe96281713168a3270878255983d2cb1a97e034325c8c2c25169a69289d3ecfa"},
+ {file = "grpcio-1.66.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:73fc8f8b9b5c4a03e802b3cd0c18b2b06b410d3c1dcbef989fdeb943bd44aff7"},
+ {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:03b0b307ba26fae695e067b94cbb014e27390f8bc5ac7a3a39b7723fed085604"},
+ {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d69ce1f324dc2d71e40c9261d3fdbe7d4c9d60f332069ff9b2a4d8a257c7b2b"},
+ {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05bc2ceadc2529ab0b227b1310d249d95d9001cd106aa4d31e8871ad3c428d73"},
+ {file = "grpcio-1.66.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ac475e8da31484efa25abb774674d837b343afb78bb3bcdef10f81a93e3d6bf"},
+ {file = "grpcio-1.66.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0be4e0490c28da5377283861bed2941d1d20ec017ca397a5df4394d1c31a9b50"},
+ {file = "grpcio-1.66.2-cp310-cp310-win32.whl", hash = "sha256:4e504572433f4e72b12394977679161d495c4c9581ba34a88d843eaf0f2fbd39"},
+ {file = "grpcio-1.66.2-cp310-cp310-win_amd64.whl", hash = "sha256:2018b053aa15782db2541ca01a7edb56a0bf18c77efed975392583725974b249"},
+ {file = "grpcio-1.66.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:2335c58560a9e92ac58ff2bc5649952f9b37d0735608242973c7a8b94a6437d8"},
+ {file = "grpcio-1.66.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45a3d462826f4868b442a6b8fdbe8b87b45eb4f5b5308168c156b21eca43f61c"},
+ {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a9539f01cb04950fd4b5ab458e64a15f84c2acc273670072abe49a3f29bbad54"},
+ {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce89f5876662f146d4c1f695dda29d4433a5d01c8681fbd2539afff535da14d4"},
+ {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25a14af966438cddf498b2e338f88d1c9706f3493b1d73b93f695c99c5f0e2a"},
+ {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6001e575b8bbd89eee11960bb640b6da6ae110cf08113a075f1e2051cc596cae"},
+ {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ea1d062c9230278793820146c95d038dc0f468cbdd172eec3363e42ff1c7d01"},
+ {file = "grpcio-1.66.2-cp311-cp311-win32.whl", hash = "sha256:38b68498ff579a3b1ee8f93a05eb48dc2595795f2f62716e797dc24774c1aaa8"},
+ {file = "grpcio-1.66.2-cp311-cp311-win_amd64.whl", hash = "sha256:6851de821249340bdb100df5eacfecfc4e6075fa85c6df7ee0eb213170ec8e5d"},
+ {file = "grpcio-1.66.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:802d84fd3d50614170649853d121baaaa305de7b65b3e01759247e768d691ddf"},
+ {file = "grpcio-1.66.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80fd702ba7e432994df208f27514280b4b5c6843e12a48759c9255679ad38db8"},
+ {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:12fda97ffae55e6526825daf25ad0fa37483685952b5d0f910d6405c87e3adb6"},
+ {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:950da58d7d80abd0ea68757769c9db0a95b31163e53e5bb60438d263f4bed7b7"},
+ {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e636ce23273683b00410f1971d209bf3689238cf5538d960adc3cdfe80dd0dbd"},
+ {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a917d26e0fe980b0ac7bfcc1a3c4ad6a9a4612c911d33efb55ed7833c749b0ee"},
+ {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49f0ca7ae850f59f828a723a9064cadbed90f1ece179d375966546499b8a2c9c"},
+ {file = "grpcio-1.66.2-cp312-cp312-win32.whl", hash = "sha256:31fd163105464797a72d901a06472860845ac157389e10f12631025b3e4d0453"},
+ {file = "grpcio-1.66.2-cp312-cp312-win_amd64.whl", hash = "sha256:ff1f7882e56c40b0d33c4922c15dfa30612f05fb785074a012f7cda74d1c3679"},
+ {file = "grpcio-1.66.2-cp313-cp313-linux_armv7l.whl", hash = "sha256:3b00efc473b20d8bf83e0e1ae661b98951ca56111feb9b9611df8efc4fe5d55d"},
+ {file = "grpcio-1.66.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1caa38fb22a8578ab8393da99d4b8641e3a80abc8fd52646f1ecc92bcb8dee34"},
+ {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c408f5ef75cfffa113cacd8b0c0e3611cbfd47701ca3cdc090594109b9fcbaed"},
+ {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c806852deaedee9ce8280fe98955c9103f62912a5b2d5ee7e3eaa284a6d8d8e7"},
+ {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f145cc21836c332c67baa6fc81099d1d27e266401565bf481948010d6ea32d46"},
+ {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:73e3b425c1e155730273f73e419de3074aa5c5e936771ee0e4af0814631fb30a"},
+ {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c509a4f78114cbc5f0740eb3d7a74985fd2eff022971bc9bc31f8bc93e66a3b"},
+ {file = "grpcio-1.66.2-cp313-cp313-win32.whl", hash = "sha256:20657d6b8cfed7db5e11b62ff7dfe2e12064ea78e93f1434d61888834bc86d75"},
+ {file = "grpcio-1.66.2-cp313-cp313-win_amd64.whl", hash = "sha256:fb70487c95786e345af5e854ffec8cb8cc781bcc5df7930c4fbb7feaa72e1cdf"},
+ {file = "grpcio-1.66.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:a18e20d8321c6400185b4263e27982488cb5cdd62da69147087a76a24ef4e7e3"},
+ {file = "grpcio-1.66.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:02697eb4a5cbe5a9639f57323b4c37bcb3ab2d48cec5da3dc2f13334d72790dd"},
+ {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:99a641995a6bc4287a6315989ee591ff58507aa1cbe4c2e70d88411c4dcc0839"},
+ {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ed71e81782966ffead60268bbda31ea3f725ebf8aa73634d5dda44f2cf3fb9c"},
+ {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd27c24a4cc5e195a7f56cfd9312e366d5d61b86e36d46bbe538457ea6eb8dd"},
+ {file = "grpcio-1.66.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d9a9724a156c8ec6a379869b23ba3323b7ea3600851c91489b871e375f710bc8"},
+ {file = "grpcio-1.66.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d8d4732cc5052e92cea2f78b233c2e2a52998ac40cd651f40e398893ad0d06ec"},
+ {file = "grpcio-1.66.2-cp38-cp38-win32.whl", hash = "sha256:7b2c86457145ce14c38e5bf6bdc19ef88e66c5fee2c3d83285c5aef026ba93b3"},
+ {file = "grpcio-1.66.2-cp38-cp38-win_amd64.whl", hash = "sha256:e88264caad6d8d00e7913996030bac8ad5f26b7411495848cc218bd3a9040b6c"},
+ {file = "grpcio-1.66.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:c400ba5675b67025c8a9f48aa846f12a39cf0c44df5cd060e23fda5b30e9359d"},
+ {file = "grpcio-1.66.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:66a0cd8ba6512b401d7ed46bb03f4ee455839957f28b8d61e7708056a806ba6a"},
+ {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:06de8ec0bd71be123eec15b0e0d457474931c2c407869b6c349bd9bed4adbac3"},
+ {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb57870449dfcfac428afbb5a877829fcb0d6db9d9baa1148705739e9083880e"},
+ {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b672abf90a964bfde2d0ecbce30f2329a47498ba75ce6f4da35a2f4532b7acbc"},
+ {file = "grpcio-1.66.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ad2efdbe90c73b0434cbe64ed372e12414ad03c06262279b104a029d1889d13e"},
+ {file = "grpcio-1.66.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c3a99c519f4638e700e9e3f83952e27e2ea10873eecd7935823dab0c1c9250e"},
+ {file = "grpcio-1.66.2-cp39-cp39-win32.whl", hash = "sha256:78fa51ebc2d9242c0fc5db0feecc57a9943303b46664ad89921f5079e2e4ada7"},
+ {file = "grpcio-1.66.2-cp39-cp39-win_amd64.whl", hash = "sha256:728bdf36a186e7f51da73be7f8d09457a03061be848718d0edf000e709418987"},
+ {file = "grpcio-1.66.2.tar.gz", hash = "sha256:563588c587b75c34b928bc428548e5b00ea38c46972181a4d8b75ba7e3f24231"},
]
[package.extras]
-protobuf = ["grpcio-tools (>=1.66.1)"]
+protobuf = ["grpcio-tools (>=1.66.2)"]
[[package]]
name = "grpcio-tools"
-version = "1.66.1"
+version = "1.66.2"
description = "Protobuf code generator for gRPC"
optional = false
python-versions = ">=3.8"
files = [
- {file = "grpcio_tools-1.66.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:e0c71405399ef59782600b1f0bdebc69ba12d7c9527cd268162a86273971d294"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:df1a174a6f9d3b4c380f005f33352d2e95464f33f021fb08084735a2eb6e23b1"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:7d789bfe53fce9e87aa80c3694a366258ce4c41b706258e9228ed4994832b780"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95c44a265ff01fd05166edae9350bc2e7d1d9a95e8f53b8cd04d2ae0a588c583"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b962a8767c3c0f9afe92e0dd6bb0b2305d35195a1053f84d4d31f585b87557ed"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d8616773126ec3cdf747b06a12e957b43ac15c34e4728def91fa67249a7c689a"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0067e79b6001560ac6acc78cca11fd3504fa27f8af46e3cdbac2f4998505e597"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-win32.whl", hash = "sha256:fa4f95a79a34afc3b5464895d091cd1911227fc3ab0441b9a37cd1817cf7db86"},
- {file = "grpcio_tools-1.66.1-cp310-cp310-win_amd64.whl", hash = "sha256:3acce426f5e643de63019311171f4d31131da8149de518716a95c29a2c12dd38"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:9a07e24feb7472419cf70ebbb38dd4299aea696f91f191b62a99b3ee9ff03f89"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:097a069e7c640043921ecaf3e88d7af78ccd40c25dbddc91db2a4a2adbd0393d"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:016fa273dc696c9d8045091ac50e000bce766183a6b150801f51c2946e33dbe3"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ec9f4f964f8e8ed5e9cc13deb678c83d5597074c256805373220627833bc5ad"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3198815814cdd12bdb69b7580d7770a4ad4c8b2093e0bd6b987bc817618e3eec"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:796620fc41d3fbb566d9614ef22bc55df67fac1f1e19c1e0fb6ec48bc9b6a44b"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:222d8dc218560698e1abf652fb47e4015994ec7a265ef46e012fd9c9e77a4d6b"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-win32.whl", hash = "sha256:56e17a11f34df252b4c6fb8aa8cd7b44d162dba9f3333be87ddf7c8bf496622a"},
- {file = "grpcio_tools-1.66.1-cp311-cp311-win_amd64.whl", hash = "sha256:edd52d667f2aa3c73233be0a821596937f24536647c12d96bfc54aa4cb04747d"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:869b6960d5daffda0dac1a474b44144f0dace0d4336394e499c4f400c5e2f8d9"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:68d9390bf9ba863ac147fc722d6548caa587235e887cac1bc2438212e89d1de7"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:b8660401beca7e3af28722439e07b0bcdca80b4a68f5a5a1138ae7b7780a6abf"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb67b9aa9cd69468bceb933e8e0f89fd13695746c018c4d2e6b3b84e73f3ad97"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5daceb9716e31edc0e1ba0f93303785211438c43502edddad7a919fc4cb3d664"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0a86398a4cd0665bc7f09fa90b89bac592c959d2c895bf3cf5d47a98c0f2d24c"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1b4acb53338072ab3023e418a5c7059cb15686abd1607516fa1453406dd5f69d"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-win32.whl", hash = "sha256:88e04b7546101bc79c868c941777efd5088063a9e4f03b4d7263dde796fbabf7"},
- {file = "grpcio_tools-1.66.1-cp312-cp312-win_amd64.whl", hash = "sha256:5b4fc56abeafae74140f5da29af1093e88ce64811d77f1a81c3146e9e996fb6a"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:d4dd2ff982c1aa328ef47ce34f07af82f1f13599912fb1618ebc5fe1e14dddb8"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:066648543f786cb74b1fef5652359952455dbba37e832642026fd9fd8a219b5f"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d19d47744c30e6bafa76b3113740e71f382d75ebb2918c1efd62ebe6ba7e20f9"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:739c53571130b359b738ac7d6d0a1f772e15779b66df7e6764bee4071cd38689"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2226ff8d3ecba83b7622946df19d6e8e15cb52f761b8d9e2f807b228db5f1b1e"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f4b1498cb8b422fbae32a491c9154e8d47650caf5852fbe6b3b34253e824343"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:93d2d9e14e81affdc63d67c42eb16a8da1b6fecc16442a703ca60eb0e7591691"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-win32.whl", hash = "sha256:d761dfd97a10e4aae73628b5120c64e56f0cded88651d0003d2d80e678c3e7c9"},
- {file = "grpcio_tools-1.66.1-cp38-cp38-win_amd64.whl", hash = "sha256:e1c2ac0955f5fb87b8444316e475242d194c3f3cd0b7b6e54b889a7b6f05156f"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:5f1f04578b72c281e39274348a61d240c48d5321ba8d7a8838e194099ecbc322"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:da9b0c08dbbf07535ee1b75a22d0acc5675a808a3a3df9f9b21e0e73ddfbb3a9"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:e302b4e1fa856d74ff65c65888b3a37153287ce6ad5bad80b2fdf95130accec2"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fc3f62494f238774755ff90f0e66a93ac7972ea1eb7180c45acf4fd53b25cca"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cad65ff22459aa387f543d293f54834c9aac8f76fb7416a7046556df75b567"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3d17a27c567a5e4d18f487368215cb51b43e2499059fd6113b92f7ae1fee48be"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4df167e67b083f96bc277032a526f6186e98662aaa49baea1dfb8ecfe26ce117"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-win32.whl", hash = "sha256:f94d5193b2f2a9595795b83e7978b2bee1c0399da66f2f24d179c388f81fb99c"},
- {file = "grpcio_tools-1.66.1-cp39-cp39-win_amd64.whl", hash = "sha256:66f527a1e3f063065e29cf6f3e55892434d13a5a51e3b22402e09da9521e98a3"},
- {file = "grpcio_tools-1.66.1.tar.gz", hash = "sha256:5055ffe840ea8f505c30378be02afb4dbecb33480e554debe10b63d6b2f641c3"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:40b7ad804ff78490408177cfe87427d5a67224f82a2bdfabe9d8d6ac6239733b"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:a886fa2ff9e897b35489557d1c61cbc0e4efc42c4dc0d120a9516f294fefb107"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:1d5e22b2c7f5b453462c85aa66f99961d5c7b275d1c60b84fe847c06c73c9400"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a425b2600ad4fcf887107ee975a9b7c20478c2959c58b12af7f36577d7a7f7b3"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef979af76b0cd3f5235d3ec30e86a4f0acc0eab179e796ddbb481aa351a1e6ca"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:99638043e1a78b8617f31b676f1ecf248d75a45b318776af3acc48a85c8e10a2"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0a465850c7e5c4ab588c7b7275d47781e9c0ee397a8faf4977262592f95e1831"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-win32.whl", hash = "sha256:48997b704d2fcf59d922228c7a79fcd35d52ca8b2202e5cfe193962643b8354f"},
+ {file = "grpcio_tools-1.66.2-cp310-cp310-win_amd64.whl", hash = "sha256:ab4eda584ba2e647e9bb5098f5e4e8d370a333761bf33924e9a7c14f069c8b08"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:007750b4db62018e441f8401fa567aa11174ae0173826cbbe54982fdf2383067"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18554bc91640b2f1ce18aa5c6bebd51500ca0b43b5df4e700e6f76522e2b0e94"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:3fe2fc2e4a16d745cae01e1348b401378e58ced920ff759a6b4b85a7ad507896"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0933420362621d8792fea9350f0c82c514da5f93888d1476c37d9e3722d260b0"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3aef5abd34bea8ea98448cd58a938992238c4717df93d12f84fa5f56efb11d0"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7afd9eb9be413a731cff7ad638081795a7ed0fec4b23af5cec2099fbd9d742f9"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fd1fa95188ae7d5460a8c4a2abcb2777fdf9c3b80d592a2e8434c52a6eb48e8d"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-win32.whl", hash = "sha256:80c233215cf0f08353b7aac4e86cdedf4d545ed368a7491ccc9996e5a317dce4"},
+ {file = "grpcio_tools-1.66.2-cp311-cp311-win_amd64.whl", hash = "sha256:2a9a376b300aa2b4da8e6c4f6f746e824d3f24eefeac2753ffffe2b9f37d156d"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:d8ca76fc40a7d35ddf1229afd04408e2ff94caf4385068c8b147e064e951e0ba"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6cc3da6994d575c425c74ce33e34b86a975ea7e78bb9c3525e8439a3af3c508f"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:89e437ced43275e7427cc82a837f5cd43ebe18a1080b0e50a47627895b44b0e6"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d95f030e708266d7fd6d3e5d56e30a9bbbe230604856b1fe93edd892e4389aab"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b3cf9ae67f8bb431ab3ff60db75c3586dc5aa993be4b15bd7cad651362563cd"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b4896a0853fc402273e908c0a0710d25242f1ae907efb9d22ba6d82d4ba00ad8"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d31aad10f90fccb0073bc03b4d1b67690ef4f0cd9af96e82944b9cc655d12b6f"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-win32.whl", hash = "sha256:d8f976f35683e49467d0bf2b90c170ac5443cd162d48d8d868801fd0d87a5fa8"},
+ {file = "grpcio_tools-1.66.2-cp312-cp312-win_amd64.whl", hash = "sha256:b2c19e5a888a6ee48ba699581a90c04806b2a93f574f37449c359ec17a793669"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-linux_armv7l.whl", hash = "sha256:7e8c9aa91a9e51199048202e3c54491e0a89fb3ac47dde36ff2964fbcee143a3"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0eaedd3c77824c3762b728c485f91097a58116fa135f3bbc24703621476cd866"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:a14007902fb6565c21815da4177105ec905ef37f0550190c4d1bbeb2928c6560"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8f098bb92d192230f3b23df514b139f3549e2a4390d1f0f0d8ff89de458c54"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68642829368f4f83929e0df571dbbc99f1f1553555d8f98d0582da9f6743d9e"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:5fd20110d2c7706dfdd95457807acb8c050253be2e272b9f5fb977e87ea44d86"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:4b16244be4cff92408eb82901b883a70f3dd902fb7c7f66e2a368271be84cde4"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-win32.whl", hash = "sha256:d872ba3bbe9e15b43eeb9310dad5edbf490bb3ab0072a46b3a12fed0234eec23"},
+ {file = "grpcio_tools-1.66.2-cp313-cp313-win_amd64.whl", hash = "sha256:a2810921218471aab5c8cd20204d3b1886aa8e13b495e882158bb398982cf18e"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:538eb263b9969e866619775df341307ece0b09afce091ede8141c5bb4d7d8933"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9a68c71bb1358f0994fc7d0f0d70a0d419d57507faa25c982145be401f6aca48"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:1bc41d5b36d414bb0940aa50e30d624903a2538f9387ae730953675adcbe1498"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43dcd3ee13418545ea10416f46296ddbc7fb355cf136ddebd3b3f881a383168"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc16f9e6baafed315846e79a746513863e6ecbb89e9c98d872834e44f9e87a5"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3655c96eef8aac2a610bbf4cb9c7839fcff09f07a609b74408b3b0a136e1ef57"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:86d971fc64e63642058ac01ce2e484a8340d60a95ead0dc6697ef2aa18a7b936"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-win32.whl", hash = "sha256:c14db004b28ee2adefc6d36107d7fdf770f7509bd1f1ecd195eecb88cdbe5d96"},
+ {file = "grpcio_tools-1.66.2-cp38-cp38-win_amd64.whl", hash = "sha256:c65f12474634195ff5ed91b304412b80008c067d28226c26b4e451ea9da16b24"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:75c6a25a5cf729c4606c388013cf7c59dda99cf3718c24fe4fd52b06c19955d0"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a5146e780ed87348d84b11fc3843741e676b2a84d493363bf0b4ae31c56841b"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c42ba1b24e701544bf08a43bb2d63d56dedd0fd33a5b499c9cf85e15aa154b13"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5daf9807260e172ffcc5dd582c01f60bac820f99f0151a507c8a537f9e6dceb8"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a15a4d0f4eba3773dabe07113b42e018a8fa9a28441483ada111991d5c1468b6"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:cc4f65cd189832676dca16046a4b6247d0bc1fc20648d16ac7fb0b075d1658f4"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ba63dbcbb8ade67e5a04dd3a6c5860efb454bda6d5e8558b17c9a7251339ce36"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-win32.whl", hash = "sha256:c4df0f547f4193dfa6689949b374974f08d81f129174738f0410ba8d45dc63be"},
+ {file = "grpcio_tools-1.66.2-cp39-cp39-win_amd64.whl", hash = "sha256:0cad9ffe5df7801201773b91f14923cf3e20ca764e418ae7f8cb75f6045a0aa1"},
+ {file = "grpcio_tools-1.66.2.tar.gz", hash = "sha256:4a36e07913d26ba5ccfd2685ba63ca97f26b08c249d2cc9e74dda37efa49d7e4"},
]
[package.dependencies]
-grpcio = ">=1.66.1"
+grpcio = ">=1.66.2"
protobuf = ">=5.26.1,<6.0dev"
setuptools = "*"
@@ -214,6 +395,29 @@ files = [
[package.extras]
license = ["ukkonen"]
+[[package]]
+name = "importlib-metadata"
+version = "8.5.0"
+description = "Read metadata from Python packages"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"},
+ {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"},
+]
+
+[package.dependencies]
+zipp = ">=3.20"
+
+[package.extras]
+check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
+cover = ["pytest-cov"]
+doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+enabler = ["pytest-enabler (>=2.2)"]
+perf = ["ipython"]
+test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"]
+type = ["pytest-mypy"]
+
[[package]]
name = "iniconfig"
version = "2.0.0"
@@ -545,22 +749,22 @@ virtualenv = ">=20.10.0"
[[package]]
name = "protobuf"
-version = "5.28.1"
+version = "5.28.2"
description = ""
optional = false
python-versions = ">=3.8"
files = [
- {file = "protobuf-5.28.1-cp310-abi3-win32.whl", hash = "sha256:fc063acaf7a3d9ca13146fefb5b42ac94ab943ec6e978f543cd5637da2d57957"},
- {file = "protobuf-5.28.1-cp310-abi3-win_amd64.whl", hash = "sha256:4c7f5cb38c640919791c9f74ea80c5b82314c69a8409ea36f2599617d03989af"},
- {file = "protobuf-5.28.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4304e4fceb823d91699e924a1fdf95cde0e066f3b1c28edb665bda762ecde10f"},
- {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:0dfd86d2b5edf03d91ec2a7c15b4e950258150f14f9af5f51c17fa224ee1931f"},
- {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:51f09caab818707ab91cf09cc5c156026599cf05a4520779ccbf53c1b352fb25"},
- {file = "protobuf-5.28.1-cp38-cp38-win32.whl", hash = "sha256:1b04bde117a10ff9d906841a89ec326686c48ececeb65690f15b8cabe7149495"},
- {file = "protobuf-5.28.1-cp38-cp38-win_amd64.whl", hash = "sha256:cabfe43044ee319ad6832b2fda332646f9ef1636b0130186a3ae0a52fc264bb4"},
- {file = "protobuf-5.28.1-cp39-cp39-win32.whl", hash = "sha256:4b4b9a0562a35773ff47a3df823177ab71a1f5eb1ff56d8f842b7432ecfd7fd2"},
- {file = "protobuf-5.28.1-cp39-cp39-win_amd64.whl", hash = "sha256:f24e5d70e6af8ee9672ff605d5503491635f63d5db2fffb6472be78ba62efd8f"},
- {file = "protobuf-5.28.1-py3-none-any.whl", hash = "sha256:c529535e5c0effcf417682563719e5d8ac8d2b93de07a56108b4c2d436d7a29a"},
- {file = "protobuf-5.28.1.tar.gz", hash = "sha256:42597e938f83bb7f3e4b35f03aa45208d49ae8d5bcb4bc10b9fc825e0ab5e423"},
+ {file = "protobuf-5.28.2-cp310-abi3-win32.whl", hash = "sha256:eeea10f3dc0ac7e6b4933d32db20662902b4ab81bf28df12218aa389e9c2102d"},
+ {file = "protobuf-5.28.2-cp310-abi3-win_amd64.whl", hash = "sha256:2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132"},
+ {file = "protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7"},
+ {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f"},
+ {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f"},
+ {file = "protobuf-5.28.2-cp38-cp38-win32.whl", hash = "sha256:87317e9bcda04a32f2ee82089a204d3a2f0d3c8aeed16568c7daf4756e4f1fe0"},
+ {file = "protobuf-5.28.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0ea0123dac3399a2eeb1a1443d82b7afc9ff40241433296769f7da42d142ec3"},
+ {file = "protobuf-5.28.2-cp39-cp39-win32.whl", hash = "sha256:ca53faf29896c526863366a52a8f4d88e69cd04ec9571ed6082fa117fac3ab36"},
+ {file = "protobuf-5.28.2-cp39-cp39-win_amd64.whl", hash = "sha256:8ddc60bf374785fb7cb12510b267f59067fa10087325b8e1855b898a0d81d276"},
+ {file = "protobuf-5.28.2-py3-none-any.whl", hash = "sha256:52235802093bd8a2811abbe8bf0ab9c5f54cca0a751fdd3f6ac2a21438bffece"},
+ {file = "protobuf-5.28.2.tar.gz", hash = "sha256:59379674ff119717404f7454647913787034f03fe7049cbef1d74a97bb4593f0"},
]
[[package]]
@@ -630,21 +834,23 @@ windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "pyright"
-version = "1.1.381"
+version = "1.1.382.post1"
description = "Command line wrapper for pyright"
optional = false
python-versions = ">=3.7"
files = [
- {file = "pyright-1.1.381-py3-none-any.whl", hash = "sha256:5dc0aa80a265675d36abab59c674ae01dbe476714f91845b61b841d34aa99081"},
- {file = "pyright-1.1.381.tar.gz", hash = "sha256:314cf0c1351c189524fb10c7ac20688ecd470e8cc505c394d642c9c80bf7c3a5"},
+ {file = "pyright-1.1.382.post1-py3-none-any.whl", hash = "sha256:21a4749dd1740e209f88d3a601e9f40748670d39481ea32b9d77edf7f3f1fb2e"},
+ {file = "pyright-1.1.382.post1.tar.gz", hash = "sha256:66a5d4e83be9452853d73e9dd9e95ba0ac3061845270e4e331d0070a597d3445"},
]
[package.dependencies]
nodeenv = ">=1.6.0"
+typing-extensions = ">=4.1"
[package.extras]
-all = ["twine (>=3.4.1)"]
+all = ["nodejs-wheel-binaries", "twine (>=3.4.1)"]
dev = ["twine (>=3.4.1)"]
+nodejs = ["nodejs-wheel-binaries"]
[[package]]
name = "pytest"
@@ -668,6 +874,39 @@ tomli = {version = ">=1", markers = "python_version < \"3.11\""}
[package.extras]
dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+[[package]]
+name = "pytest-cov"
+version = "5.0.0"
+description = "Pytest plugin for measuring coverage."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"},
+ {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"},
+]
+
+[package.dependencies]
+coverage = {version = ">=5.2.1", extras = ["toml"]}
+pytest = ">=4.6"
+
+[package.extras]
+testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"]
+
+[[package]]
+name = "pytest-randomly"
+version = "3.15.0"
+description = "Pytest plugin to randomly order tests and control random.seed."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pytest_randomly-3.15.0-py3-none-any.whl", hash = "sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6"},
+ {file = "pytest_randomly-3.15.0.tar.gz", hash = "sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047"},
+]
+
+[package.dependencies]
+importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""}
+pytest = "*"
+
[[package]]
name = "pyyaml"
version = "6.0.2"
@@ -757,29 +996,29 @@ tests = ["pytest (==7.1.2)"]
[[package]]
name = "ruff"
-version = "0.6.5"
+version = "0.6.8"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
files = [
- {file = "ruff-0.6.5-py3-none-linux_armv6l.whl", hash = "sha256:7e4e308f16e07c95fc7753fc1aaac690a323b2bb9f4ec5e844a97bb7fbebd748"},
- {file = "ruff-0.6.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:932cd69eefe4daf8c7d92bd6689f7e8182571cb934ea720af218929da7bd7d69"},
- {file = "ruff-0.6.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3a8d42d11fff8d3143ff4da41742a98f8f233bf8890e9fe23077826818f8d680"},
- {file = "ruff-0.6.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a50af6e828ee692fb10ff2dfe53f05caecf077f4210fae9677e06a808275754f"},
- {file = "ruff-0.6.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:794ada3400a0d0b89e3015f1a7e01f4c97320ac665b7bc3ade24b50b54cb2972"},
- {file = "ruff-0.6.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:381413ec47f71ce1d1c614f7779d88886f406f1fd53d289c77e4e533dc6ea200"},
- {file = "ruff-0.6.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:52e75a82bbc9b42e63c08d22ad0ac525117e72aee9729a069d7c4f235fc4d276"},
- {file = "ruff-0.6.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09c72a833fd3551135ceddcba5ebdb68ff89225d30758027280968c9acdc7810"},
- {file = "ruff-0.6.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:800c50371bdcb99b3c1551d5691e14d16d6f07063a518770254227f7f6e8c178"},
- {file = "ruff-0.6.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e25ddd9cd63ba1f3bd51c1f09903904a6adf8429df34f17d728a8fa11174253"},
- {file = "ruff-0.6.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7291e64d7129f24d1b0c947ec3ec4c0076e958d1475c61202497c6aced35dd19"},
- {file = "ruff-0.6.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9ad7dfbd138d09d9a7e6931e6a7e797651ce29becd688be8a0d4d5f8177b4b0c"},
- {file = "ruff-0.6.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:005256d977021790cc52aa23d78f06bb5090dc0bfbd42de46d49c201533982ae"},
- {file = "ruff-0.6.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:482c1e6bfeb615eafc5899127b805d28e387bd87db38b2c0c41d271f5e58d8cc"},
- {file = "ruff-0.6.5-py3-none-win32.whl", hash = "sha256:cf4d3fa53644137f6a4a27a2b397381d16454a1566ae5335855c187fbf67e4f5"},
- {file = "ruff-0.6.5-py3-none-win_amd64.whl", hash = "sha256:3e42a57b58e3612051a636bc1ac4e6b838679530235520e8f095f7c44f706ff9"},
- {file = "ruff-0.6.5-py3-none-win_arm64.whl", hash = "sha256:51935067740773afdf97493ba9b8231279e9beef0f2a8079188c4776c25688e0"},
- {file = "ruff-0.6.5.tar.gz", hash = "sha256:4d32d87fab433c0cf285c3683dd4dae63be05fd7a1d65b3f5bf7cdd05a6b96fb"},
+ {file = "ruff-0.6.8-py3-none-linux_armv6l.whl", hash = "sha256:77944bca110ff0a43b768f05a529fecd0706aac7bcce36d7f1eeb4cbfca5f0f2"},
+ {file = "ruff-0.6.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:27b87e1801e786cd6ede4ada3faa5e254ce774de835e6723fd94551464c56b8c"},
+ {file = "ruff-0.6.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd48f945da2a6334f1793d7f701725a76ba93bf3d73c36f6b21fb04d5338dcf5"},
+ {file = "ruff-0.6.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:677e03c00f37c66cea033274295a983c7c546edea5043d0c798833adf4cf4c6f"},
+ {file = "ruff-0.6.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f1476236b3eacfacfc0f66aa9e6cd39f2a624cb73ea99189556015f27c0bdeb"},
+ {file = "ruff-0.6.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f5a2f17c7d32991169195d52a04c95b256378bbf0de8cb98478351eb70d526f"},
+ {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5fd0d4b7b1457c49e435ee1e437900ced9b35cb8dc5178921dfb7d98d65a08d0"},
+ {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8034b19b993e9601f2ddf2c517451e17a6ab5cdb1c13fdff50c1442a7171d87"},
+ {file = "ruff-0.6.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cfb227b932ba8ef6e56c9f875d987973cd5e35bc5d05f5abf045af78ad8e098"},
+ {file = "ruff-0.6.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef0411eccfc3909269fed47c61ffebdcb84a04504bafa6b6df9b85c27e813b0"},
+ {file = "ruff-0.6.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:007dee844738c3d2e6c24ab5bc7d43c99ba3e1943bd2d95d598582e9c1b27750"},
+ {file = "ruff-0.6.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ce60058d3cdd8490e5e5471ef086b3f1e90ab872b548814e35930e21d848c9ce"},
+ {file = "ruff-0.6.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1085c455d1b3fdb8021ad534379c60353b81ba079712bce7a900e834859182fa"},
+ {file = "ruff-0.6.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:70edf6a93b19481affd287d696d9e311388d808671bc209fb8907b46a8c3af44"},
+ {file = "ruff-0.6.8-py3-none-win32.whl", hash = "sha256:792213f7be25316f9b46b854df80a77e0da87ec66691e8f012f887b4a671ab5a"},
+ {file = "ruff-0.6.8-py3-none-win_amd64.whl", hash = "sha256:ec0517dc0f37cad14a5319ba7bba6e7e339d03fbf967a6d69b0907d61be7a263"},
+ {file = "ruff-0.6.8-py3-none-win_arm64.whl", hash = "sha256:8d3bb2e3fbb9875172119021a13eed38849e762499e3cfde9588e4b4d70968dc"},
+ {file = "ruff-0.6.8.tar.gz", hash = "sha256:a5bf44b1aa0adaf6d9d20f86162b34f7c593bfedabc51239953e446aefc8ce18"},
]
[[package]]
@@ -826,13 +1065,13 @@ files = [
[[package]]
name = "virtualenv"
-version = "20.26.5"
+version = "20.26.6"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.7"
files = [
- {file = "virtualenv-20.26.5-py3-none-any.whl", hash = "sha256:4f3ac17b81fba3ce3bd6f4ead2749a72da5929c01774948e243db9ba41df4ff6"},
- {file = "virtualenv-20.26.5.tar.gz", hash = "sha256:ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4"},
+ {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"},
+ {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"},
]
[package.dependencies]
@@ -844,7 +1083,26 @@ platformdirs = ">=3.9.1,<5"
docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"]
+[[package]]
+name = "zipp"
+version = "3.20.2"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"},
+ {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"},
+]
+
+[package.extras]
+check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
+cover = ["pytest-cov"]
+doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+enabler = ["pytest-enabler (>=2.2)"]
+test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
+type = ["pytest-mypy"]
+
[metadata]
lock-version = "2.0"
python-versions = ">=3.9,<3.13"
-content-hash = "daf08d3009c99686f52960089c3d16ff858d9784ad0f065d0473eeca935098bc"
+content-hash = "6e12dc20875296cfeff66e245bdabef8dd7569537cfadb4a5c1b5e5634e22e21"
diff --git a/python/pyproject.toml b/python/pyproject.toml
index 9d16759..b131aa2 100644
--- a/python/pyproject.toml
+++ b/python/pyproject.toml
@@ -4,7 +4,7 @@ version = "0.3.0"
description = "ARFlow is a data-sharing layer that enables developer-friendly data streaming, storage, and visualization for augmented reality (AR) device data."
authors = ["Yiqin Zhao "]
readme = "README.md"
-packages = [{ include = "arflow" }]
+packages = [{ include = "arflow" }, { include = "arflow_grpc" }]
license = "GPL-3.0"
homepage = "https://cake.wpi.edu/ARFlow/"
repository = "https://github.com/cake-lab/ARFlow"
@@ -15,15 +15,20 @@ repository = "https://github.com/cake-lab/ARFlow"
[tool.poetry.dependencies]
python = ">=3.9,<3.13"
+rerun-sdk = "^0.18.2"
grpcio = "^1.60.1"
grpcio-tools = "^1.60.1"
-rerun-sdk = "^0.18.2"
+grpc-interceptor = "^0.15.4"
+dracopy = "^1.4.0"
[tool.poetry.group.dev.dependencies]
-ruff = "^0.6.4"
-pyright = "^1.1.379"
+ruff = "^0.6.4" # Sync with `.github/ci.yml` if changed
pytest = "^8.3.2"
+pytest-randomly = "^3.15.0"
+pytest-cov = "^5.0.0"
pre-commit = "^3.8.0"
+pyright = "^1.1.382" # Sync with `.github/ci.yml` if changed
+grpc-stubs = "^1.53.0.5"
[tool.poetry.group.docs.dependencies]
pdoc = "^14.6.1"
@@ -33,30 +38,30 @@ requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[tool.poetry.scripts]
-serve = "arflow.serve:serve"
+arflow = "arflow._cli:main"
[tool.ruff]
# gRPC generated files
-extend-exclude = [
- "arflow/service_pb2.py",
- "arflow/service_pb2_grpc.py",
- "arflow/service_pb2.pyi",
-]
+extend-exclude = ["examples", "arflow_grpc/**.py", "arflow_grpc/**.pyi"]
[tool.ruff.lint]
# https://github.com/astral-sh/ruff-vscode/blob/main/README.md#configuring-vs-code
extend-select = ["I"]
+# Enable all `pydocstyle` rules, limiting to those that adhere to the
+# Google convention via `convention = "google"`, below.
+select = ["D", "T"]
+
+# On top of the Google convention, disable `D417`, which requires
+# documentation for every function parameter.
+ignore = ["D417"]
[tool.ruff.lint.pydocstyle]
convention = "google"
[tool.pyright]
-typeCheckingMode = "off" # TODO: Enable strict type checking
-ignore = [
- "arflow/service_pb2.py",
- "arflow/service_pb2_grpc.py",
- "arflow/service_pb2.pyi",
-]
-# https://github.com/RobertCraigie/pyright-python#pre-commit
-venvPath = "."
-venv = ".venv"
+typeCheckingMode = "strict"
+exclude = ["examples", "arflow_grpc/**.py", "arflow_grpc/**.pyi"]
+
+[tool.pytest.ini_options]
+# coverage report for only `arflow` package with missing lines
+addopts = "--cov arflow --cov-report term-missing"
diff --git a/python/tests/__init__.py b/python/tests/__init__.py
index e69de29..6e0e580 100644
--- a/python/tests/__init__.py
+++ b/python/tests/__init__.py
@@ -0,0 +1 @@
+"""ARFlow tests."""
diff --git a/python/tests/bunny.drc b/python/tests/bunny.drc
new file mode 100644
index 0000000..1e80a75
Binary files /dev/null and b/python/tests/bunny.drc differ
diff --git a/python/tests/test_cli.py b/python/tests/test_cli.py
new file mode 100644
index 0000000..ceaa866
--- /dev/null
+++ b/python/tests/test_cli.py
@@ -0,0 +1,177 @@
+"""Command line interface tests."""
+
+# ruff:noqa: D103
+# pyright: reportPrivateUsage=false
+
+import argparse
+import logging
+import shlex
+import tempfile
+from pathlib import Path
+from typing import Literal
+from unittest.mock import MagicMock, patch
+
+import pytest
+
+from arflow._cli import (
+ _validate_dir_path,
+ _validate_file_path,
+ parse_args,
+ replay,
+ serve,
+)
+
+
+@pytest.fixture
+def temp_dir():
+ with tempfile.TemporaryDirectory() as td:
+ yield td
+
+
+@pytest.fixture
+def temp_file():
+ with tempfile.NamedTemporaryFile() as tf:
+ yield tf.name
+
+
+def test_validate_dir_path_valid(temp_dir: str):
+ assert _validate_dir_path(temp_dir) == temp_dir
+
+
+def test_validate_dir_path_invalid():
+ with pytest.raises(argparse.ArgumentTypeError):
+ _validate_dir_path("/path/to/nonexistent/directory")
+
+
+def test_validate_dir_path_none():
+ assert _validate_dir_path(None) is None
+
+
+def test_validate_file_path_valid(temp_file: str):
+ assert _validate_file_path(temp_file) == temp_file
+
+
+def test_validate_file_path_invalid():
+ with pytest.raises(argparse.ArgumentTypeError):
+ _validate_file_path("/path/to/nonexistent/file.txt")
+
+
+def test_serve():
+ with patch("arflow._cli.run_server") as mock_run_server, patch(
+ "arflow._cli.ARFlowServicer"
+ ) as mock_servicer:
+ args = MagicMock()
+ args.port = 1234
+ args.save_path = "/tmp/save_path"
+
+ serve(args)
+
+ mock_run_server.assert_called_once_with(
+ mock_servicer, port=1234, path_to_save=Path("/tmp/save_path")
+ )
+
+
+def test_replay():
+ with patch("arflow._cli.ARFlowPlayer") as mock_player_class, patch(
+ "arflow._cli.ARFlowServicer"
+ ) as mock_servicer:
+ mock_player_instance = MagicMock()
+ mock_player_class.return_value = mock_player_instance
+
+ args = MagicMock()
+ args.file_path = "/path/to/data.file"
+
+ replay(args)
+
+ mock_player_class.assert_called_once_with(
+ mock_servicer, Path("/path/to/data.file")
+ )
+ mock_player_instance.run.assert_called_once()
+
+
+@pytest.mark.parametrize(
+ "command, subcommand, debug, verbose, port, save_path, file_path",
+ [
+ ("", None, False, False, None, None, None),
+ ("-d", None, True, False, None, None, None),
+ ("-v", None, False, True, None, None, None),
+ ("-d -v", None, True, True, None, None, None),
+ ("serve", "serve", False, False, 8500, None, None),
+ ("-d serve", "serve", True, False, 8500, None, None),
+ ("-d serve -p 1234", "serve", True, False, 1234, None, None),
+ (
+ "-d serve -s /tmp/save_path",
+ "serve",
+ True,
+ False,
+ 8500,
+ "/tmp/save_path",
+ None,
+ ),
+ (
+ "-d serve -p 1234 -s /tmp/save_path",
+ "serve",
+ True,
+ False,
+ 1234,
+ "/tmp/save_path",
+ None,
+ ),
+ (
+ "replay /path/to/data.file",
+ "replay",
+ False,
+ False,
+ None,
+ None,
+ "/path/to/data.file",
+ ),
+ (
+ "-d replay /path/to/data.file",
+ "replay",
+ True,
+ False,
+ None,
+ None,
+ "/path/to/data.file",
+ ),
+ ],
+)
+def test_parse_args(
+ command: str,
+ subcommand: Literal["serve", "replay"] | None,
+ debug: bool,
+ verbose: bool,
+ port: int | None,
+ save_path: str | None,
+ file_path: str | None,
+):
+ with patch(
+ "arflow._cli._validate_file_path", return_value="/path/to/data.file"
+ ), patch("arflow._cli._validate_dir_path", return_value="/tmp/save_path"):
+ if debug and verbose:
+ with pytest.raises(SystemExit):
+ parse_args(shlex.split(command))
+ return
+
+ _, args = parse_args(shlex.split(command))
+
+ if not debug and not verbose:
+ assert args.loglevel == logging.WARNING
+ elif debug:
+ assert args.loglevel == logging.DEBUG
+ elif verbose:
+ assert args.loglevel == logging.INFO
+
+ if subcommand == "serve":
+ assert args.func == serve
+ assert args.port == port
+ assert args.save_path == save_path
+ elif subcommand == "replay":
+ assert args.func == replay
+ assert args.file_path == file_path
+ else:
+ assert not hasattr(args, "port")
+ assert not hasattr(args, "save_path")
+ assert not hasattr(args, "file_path")
+ assert not hasattr(args, "func")
diff --git a/python/tests/test_decoding.py b/python/tests/test_decoding.py
new file mode 100644
index 0000000..20363f5
--- /dev/null
+++ b/python/tests/test_decoding.py
@@ -0,0 +1,285 @@
+"""Data deserialization tests."""
+
+# ruff:noqa: D103,D107
+# pyright: reportPrivateUsage=false
+
+from typing import Literal
+
+import numpy as np
+import pytest
+
+from arflow._decoding import (
+ convert_2d_to_3d_boundary_points,
+ decode_depth_image,
+ decode_intrinsic,
+ decode_point_cloud,
+ decode_rgb_image,
+ decode_transform,
+)
+from arflow._types import (
+ PlaneBoundaryPoints2D,
+ PlaneCenter,
+ PlaneNormal,
+)
+
+
+@pytest.mark.parametrize(
+ "resolution_y,resolution_x,resize_factor_y,resize_factor_x,data_type,buffer_length,should_pass",
+ [
+ (4, 4, 1.0, 1.0, "RGB24", 4 * 4 * 3, True), # Valid RGB24 case
+ (4, 4, 1.0, 1.0, "YCbCr420", 4 * 4 * 3 // 2, True), # Valid YCbCr420 case
+ (4, 4, 1.0, 1.0, "Invalid", 4 * 4 * 3, False), # Invalid data type
+ (4, 4, 1.0, 1.0, "RGB24", 1, False), # Buffer too small
+ ],
+)
+def test_decode_rgb_image(
+ resolution_y: int,
+ resolution_x: int,
+ resize_factor_y: float,
+ resize_factor_x: float,
+ data_type: Literal["RGB24", "YCbCr420"],
+ buffer_length: int,
+ should_pass: bool,
+):
+ buffer = np.random.randint(0, 255, buffer_length, dtype=np.uint8).tobytes() # pyright: ignore [reportUnknownMemberType]
+ if should_pass:
+ assert decode_rgb_image(
+ resolution_y,
+ resolution_x,
+ resize_factor_y,
+ resize_factor_x,
+ data_type,
+ buffer,
+ ).shape == (
+ resolution_y,
+ resolution_x,
+ 3,
+ )
+ assert (
+ decode_rgb_image(
+ resolution_y,
+ resolution_x,
+ resize_factor_y,
+ resize_factor_x,
+ data_type,
+ buffer,
+ ).dtype
+ == np.uint8
+ )
+ else:
+ with pytest.raises(ValueError):
+ decode_rgb_image(
+ resolution_y,
+ resolution_x,
+ resize_factor_y,
+ resize_factor_x,
+ data_type,
+ buffer,
+ )
+
+
+@pytest.mark.parametrize(
+ "resolution_y,resolution_x,data_type,buffer_dtype,should_pass",
+ [
+ (4, 4, "f32", np.float32, True), # Valid float32 depth case
+ (4, 4, "u16", np.uint16, True), # Valid uint16 depth case
+ (4, 4, "Invalid", np.uint16, False), # Invalid data type
+ (4, 4, "f32", np.float32, False), # Buffer too small
+ ],
+)
+def test_decode_depth_image(
+ resolution_y: int,
+ resolution_x: int,
+ data_type: Literal["f32", "u16"],
+ buffer_dtype: np.float32 | np.uint16,
+ should_pass: bool,
+):
+ buffer = np.random.rand(resolution_y * resolution_x).astype(buffer_dtype).tobytes()
+
+ if should_pass:
+ result = decode_depth_image(resolution_y, resolution_x, data_type, buffer)
+ assert result.shape == (resolution_y, resolution_x)
+ assert result.dtype == np.float32
+ else:
+ with pytest.raises(ValueError):
+ decode_depth_image(resolution_y, resolution_x, data_type, buffer[:1])
+
+
+@pytest.mark.parametrize(
+ "buffer_length,should_pass",
+ [
+ (12 * 4, True), # Correct size for 3x4 matrix
+ (8, False), # Incorrect buffer size
+ ],
+)
+def test_decode_transform(buffer_length: int, should_pass: bool):
+ buffer = np.random.rand(buffer_length // 4).astype(np.float32).tobytes()
+
+ if should_pass:
+ result = decode_transform(buffer)
+ assert result.shape == (4, 4)
+ assert result.dtype == np.float32
+ else:
+ with pytest.raises(ValueError):
+ decode_transform(buffer)
+
+
+@pytest.mark.parametrize(
+ "resize_factor_y,resize_factor_x,focal_length_y,focal_length_x,principal_point_y,principal_point_x,should_pass",
+ [
+ (1.0, 1.0, 2.0, 2.0, 1.0, 1.0, True), # Valid intrinsic matrix
+ # TODO: Really no error cases?
+ ],
+)
+def test_decode_intrinsic(
+ resize_factor_y: float,
+ resize_factor_x: float,
+ focal_length_y: float,
+ focal_length_x: float,
+ principal_point_y: float,
+ principal_point_x: float,
+ should_pass: bool,
+):
+ if should_pass:
+ result = decode_intrinsic(
+ resize_factor_y,
+ resize_factor_x,
+ focal_length_y,
+ focal_length_x,
+ principal_point_y,
+ principal_point_x,
+ )
+ assert result.shape == (3, 3)
+ assert result.dtype == np.float32
+ else:
+ with pytest.raises(ValueError):
+ decode_intrinsic(
+ resize_factor_y,
+ resize_factor_x,
+ focal_length_y,
+ focal_length_x,
+ principal_point_y,
+ principal_point_x,
+ )
+
+
+@pytest.mark.parametrize(
+ "resolution_y,resolution_x,resize_factor_y,resize_factor_x,should_pass",
+ [
+ (4, 4, 1.0, 1.0, True), # Valid point cloud case
+ # TODO: Really no error cases? Because we can assume color_rgb, depth_img, and k are valid
+ ],
+)
+def test_decode_point_cloud(
+ resolution_y: int,
+ resolution_x: int,
+ resize_factor_y: float,
+ resize_factor_x: float,
+ should_pass: bool,
+):
+ color_rgb = np.random.randint( # pyright: ignore [reportUnknownMemberType]
+ 0, 255, (resolution_y, resolution_x, 3), dtype=np.uint8
+ )
+ depth_img = np.random.rand(resolution_y, resolution_x).astype(np.float32)
+ k = np.array([[2.0, 0, 1.0], [0, 2.0, 1.0], [0, 0, 1.0]], dtype=np.float32)
+ transform = np.eye(4, dtype=np.float32)
+
+ if should_pass:
+ pcd, clr = decode_point_cloud(
+ resolution_y,
+ resolution_x,
+ resize_factor_y,
+ resize_factor_x,
+ k,
+ color_rgb,
+ depth_img,
+ transform,
+ )
+ assert pcd.shape == (resolution_y * resolution_x, 3)
+ assert pcd.dtype == np.float32
+ assert clr.shape == (resolution_y * resolution_x, 3)
+ assert clr.dtype == np.uint8
+ else:
+ with pytest.raises(ValueError):
+ decode_point_cloud(
+ resolution_y,
+ resolution_x,
+ resize_factor_y,
+ resize_factor_x,
+ k,
+ color_rgb,
+ depth_img,
+ transform,
+ )
+
+
+@pytest.mark.parametrize(
+ "boundary_points_2d,normal,center,should_pass",
+ [
+ (
+ np.array([[1, 2], [2, 3], [1, 3]]),
+ np.array([4, 5, 6]),
+ np.array([2, 3, 4]),
+ True,
+ ), # Valid 2D points, normal, and center
+ (
+ np.array([[1, 2, 3], [2, 3, 4], [1, 3, 4]]),
+ np.array([4, 5, 6]),
+ np.array([2, 3, 4]),
+ False,
+ ), # Boundary points not in 2D
+ (
+ np.array([[1, 2], [2, 3]]),
+ np.array([4, 5, 6]),
+ np.array([2, 3, 4]),
+ False,
+ ), # Only 2 boundary points
+ (
+ np.array([[1, 2], [2, 3], [1, 3]]),
+ np.array([[2, 3, 4], [4, 5, 6]]),
+ np.array([2, 3, 4]),
+ False,
+ ), # More than 1 normal
+ (
+ np.array([[1, 2], [2, 3], [1, 3]]),
+ np.array([2, 3]),
+ np.array([2, 3, 4]),
+ False,
+ ), # Normal not in 3D
+ (
+ np.array([[1, 2], [2, 3], [1, 3]]),
+ np.array([0, 0, 0]),
+ np.array([2, 3, 4]),
+ False,
+ ), # Normal is zero
+ (
+ np.array([[1, 2], [2, 3], [1, 3]]),
+ np.array([4, 5, 6]),
+ np.array([[2, 3, 4], [2, 3, 4]]),
+ False,
+ ), # More than 1 center
+ (
+ np.array([[1, 2], [2, 3], [1, 3]]),
+ np.array([4, 5, 6]),
+ np.array([2, 3, 4, 5]),
+ False,
+ ), # Center not in 3D
+ ],
+)
+def test_convert_2d_to_3d_boundary_points(
+ boundary_points_2d: PlaneBoundaryPoints2D,
+ normal: PlaneNormal,
+ center: PlaneCenter,
+ should_pass: bool,
+):
+ if should_pass:
+ result = convert_2d_to_3d_boundary_points(boundary_points_2d, normal, center)
+ assert result.shape[0] == (boundary_points_2d.shape[0])
+ assert result.shape[1] == 3
+ assert result.dtype == np.float32
+
+ else:
+ with pytest.raises(ValueError):
+ result = convert_2d_to_3d_boundary_points(
+ boundary_points_2d, normal, center
+ )
diff --git a/python/tests/test_hooks.py b/python/tests/test_hooks.py
new file mode 100644
index 0000000..990abde
--- /dev/null
+++ b/python/tests/test_hooks.py
@@ -0,0 +1,72 @@
+"""User-extension hooks tests."""
+
+# ruff:noqa: D101,D102,D103,D107
+# pyright: reportPrivateUsage=false
+
+import tempfile
+from pathlib import Path
+
+import pytest
+
+from arflow import ARFlowServicer, DecodedDataFrame, RegisterClientRequest
+from arflow._types import EnrichedARFlowRequest, HashableClientIdentifier
+from arflow_grpc.service_pb2 import ProcessFrameRequest
+
+
+class UserExtendedService(ARFlowServicer):
+ def __init__(self):
+ super().__init__()
+ self.num_clients = 0
+ self.num_frames = 0
+
+ def on_register(self, request: RegisterClientRequest) -> None:
+ self.num_clients += 1
+
+ def on_frame_received(self, decoded_data_frame: DecodedDataFrame) -> None:
+ self.num_frames += 1
+
+
+@pytest.fixture
+def user_service():
+ """A user-extended ARFlow service that can be shared across tests."""
+ return UserExtendedService()
+
+
+def test_on_register(user_service: UserExtendedService):
+ request = RegisterClientRequest()
+ for i in range(3):
+ assert user_service.num_clients == i
+ user_service.RegisterClient(request)
+
+
+def test_on_frame_received(user_service: UserExtendedService):
+ config = RegisterClientRequest()
+ response = user_service.RegisterClient(config)
+ request = ProcessFrameRequest(uid=response.uid)
+ for i in range(3):
+ assert user_service.num_frames == i
+ user_service.ProcessFrame(request)
+
+
+def test_on_program_exit(user_service: UserExtendedService):
+ # Add some mock data to the service
+ enriched_request = EnrichedARFlowRequest(timestamp=1, data=ProcessFrameRequest())
+ user_service._requests_history.append(enriched_request)
+ client_id = HashableClientIdentifier("test_client")
+ user_service._client_configurations[client_id] = RegisterClientRequest()
+
+ # Use tempfile to create a temporary directory
+ with tempfile.TemporaryDirectory() as temp_dir:
+ temp_path = Path(temp_dir)
+
+ # Call on_program_exit
+ user_service.on_program_exit(temp_path)
+
+ # Check the results
+ pkl_files = list(temp_path.glob("*.pkl"))
+ assert len(pkl_files) == 1
+ pkl_file = pkl_files[0]
+ assert pkl_file.exists()
+ assert pkl_file.stat().st_size > 0
+
+ # No need for manual cleanup - the TemporaryDirectory context manager handles it
diff --git a/python/tests/test_interceptor.py b/python/tests/test_interceptor.py
new file mode 100644
index 0000000..c8b0d22
--- /dev/null
+++ b/python/tests/test_interceptor.py
@@ -0,0 +1,71 @@
+"""Server-side interceptors tests."""
+
+# ruff:noqa: D102,D103,D107
+
+from typing import Any
+
+import grpc
+import pytest
+from grpc_interceptor.testing import (
+ DummyRequest,
+ dummy_client, # pyright: ignore [reportUnknownVariableType]
+ raises, # pyright: ignore [reportUnknownVariableType]
+)
+
+from arflow._error_interceptor import ErrorInterceptor
+
+
+class MockErrorLogger(ErrorInterceptor):
+ """Mock error logger that stores the last exception.
+
+ You don’t actually want the logging side effect to happen. You just want to make sure it’s called.
+ """
+
+ def __init__(self):
+ self.logged_exception = None
+
+ def log_error(self, e: Exception) -> None:
+ self.logged_exception = e
+
+
+def test_log_error():
+ """Test that the error logger catches exceptions.
+
+ Use the `dummy_client()` context manager to create a client that’s connected to a real gRPC
+ microservice. You send `DummyRequest` to the microservice, and it replies with `DummyResponse`.
+ By default, the input of `DummyRequest` is echoed to the output of `DummyResponse`. However, you can
+ pass `dummy_client()` a dictionary of special cases, and if input matches one of them, then it will
+ call a function you provide and return the result.
+ """
+ mock = MockErrorLogger()
+ ex = Exception()
+ special_cases: dict[str, Any] = {"error": raises(ex)}
+
+ with dummy_client(special_cases=special_cases, interceptors=[mock]) as client:
+ # Test no exception
+ assert client.Execute(DummyRequest(input="foo")).output == "foo" # pyright: ignore [reportUnknownMemberType]
+ assert mock.logged_exception is None
+
+ # Test exception
+ with pytest.raises(grpc.RpcError):
+ client.Execute(DummyRequest(input="error")) # pyright: ignore [reportUnknownMemberType]
+ assert mock.logged_exception is ex
+
+
+def test_log_error_multiple_cases():
+ mock = MockErrorLogger()
+ ex1 = Exception("Error 1")
+ ex2 = Exception("Error 2")
+ special_cases: dict[str, Any] = {
+ "error1": raises(ex1),
+ "error2": raises(ex2),
+ }
+
+ with dummy_client(special_cases=special_cases, interceptors=[mock]) as client:
+ with pytest.raises(grpc.RpcError):
+ client.Execute(DummyRequest(input="error1")) # pyright: ignore [reportUnknownMemberType]
+ assert mock.logged_exception is ex1
+
+ with pytest.raises(grpc.RpcError):
+ client.Execute(DummyRequest(input="error2")) # pyright: ignore [reportUnknownMemberType]
+ assert mock.logged_exception is ex2
diff --git a/python/tests/test_replay.py b/python/tests/test_replay.py
new file mode 100644
index 0000000..a45870a
--- /dev/null
+++ b/python/tests/test_replay.py
@@ -0,0 +1,25 @@
+"""Replay tests."""
+
+# ruff:noqa: D103
+
+# from unittest.mock import MagicMock, patch
+
+# from arflow import ARFlowPlayer, RegisterClientRequest
+# from arflow._types import EnrichedARFlowRequest
+
+
+# def test_replay_data():
+# mock_service = MagicMock()
+
+# # Mock the pickle load to simulate the requests history
+# mock_requests_history = [
+# EnrichedARFlowRequest(timestamp=1, data=RegisterClientRequest()),
+# EnrichedARFlowRequest(timestamp=2, data=RegisterClientRequest()),
+# ]
+
+# with patch("pickle.load", return_value=mock_requests_history):
+# player = ARFlowPlayer(mock_service, "dummy_path")
+# player.run()
+
+# # Verify the service processes the requests correctly
+# assert mock_service.RegisterClient.call_count == 2
diff --git a/python/tests/test_server.py b/python/tests/test_server.py
new file mode 100644
index 0000000..7d40d8c
--- /dev/null
+++ b/python/tests/test_server.py
@@ -0,0 +1,258 @@
+"""gRPC server tests with an end-to-end fashion."""
+
+# ruff:noqa: D103
+# pyright: reportUnknownMemberType=false, reportUnknownVariableType=false, reportUnknownArgumentType=false
+# We have to do the above because of the typelessness of the grpc stub
+from concurrent import futures
+from typing import Any, Generator
+
+import grpc
+import numpy as np
+import pytest
+
+from arflow import ARFlowServicer
+from arflow._error_interceptor import ErrorInterceptor
+from arflow_grpc import service_pb2, service_pb2_grpc
+from arflow_grpc.service_pb2 import (
+ ProcessFrameRequest,
+ RegisterClientRequest,
+ RegisterClientResponse,
+)
+from arflow_grpc.service_pb2_grpc import ARFlowServiceStub
+
+
+@pytest.fixture(scope="function")
+def stub() -> Generator[ARFlowServiceStub, Any, None]:
+ servicer = ARFlowServicer()
+ interceptors = [ErrorInterceptor()]
+ server = grpc.server(
+ futures.ThreadPoolExecutor(
+ max_workers=10,
+ ),
+ interceptors=interceptors, # pyright: ignore [reportArgumentType]
+ options=[
+ ("grpc.max_send_message_length", -1),
+ ("grpc.max_receive_message_length", -1),
+ ],
+ )
+ service_pb2_grpc.add_ARFlowServiceServicer_to_server(servicer, server)
+ port = server.add_insecure_port("[::]:0")
+ server.start()
+
+ try:
+ with grpc.insecure_channel(f"localhost:{port}") as channel:
+ yield ARFlowServiceStub(channel)
+ finally:
+ server.stop(None)
+
+
+def test_register_client(stub: ARFlowServiceStub):
+ request = RegisterClientRequest()
+
+ response: RegisterClientResponse = stub.RegisterClient(request)
+ assert len(response.uid) == 36
+
+
+# def test_register_client_with_init_uid(stub: ARFlowServiceStub):
+# request = RegisterClientRequest()
+
+# response: RegisterClientResponse = stub.RegisterClient(request, init_uid="1234")
+# assert response.uid == "1234"
+
+
+def test_multiple_clients(stub: ARFlowServiceStub):
+ """Flaky since UUIDs might collide."""
+ uids = []
+ for _ in range(3):
+ request = RegisterClientRequest()
+ response = stub.RegisterClient(request)
+ assert len(response.uid) == 36
+ assert response.uid not in uids
+ uids.append(response.uid)
+ assert len(uids) == 3
+
+
+# def test_register_same_client_twice(stub: ARFlowServiceStub):
+# request = RegisterClientRequest()
+# response = stub.RegisterClient(request)
+# uid = response.uid
+
+# response = stub.RegisterClient(request, init_uid=uid)
+# assert response.uid == uid
+
+
+def test_process_frame(stub: ARFlowServiceStub):
+ client_config = RegisterClientRequest(
+ camera_color=RegisterClientRequest.CameraColor(
+ enabled=True, data_type="RGB24", resize_factor_x=1.0, resize_factor_y=1.0
+ ),
+ camera_depth=RegisterClientRequest.CameraDepth(
+ enabled=True, data_type="f32", resolution_x=4, resolution_y=4
+ ),
+ camera_transform=RegisterClientRequest.CameraTransform(enabled=True),
+ camera_point_cloud=RegisterClientRequest.CameraPointCloud(enabled=True),
+ camera_intrinsics=RegisterClientRequest.CameraIntrinsics(
+ resolution_x=4,
+ resolution_y=4,
+ focal_length_x=1.0,
+ focal_length_y=1.0,
+ principal_point_x=1.0,
+ principal_point_y=1.0,
+ ),
+ )
+ response = stub.RegisterClient(client_config)
+ client_id = response.uid
+
+ frame = ProcessFrameRequest(
+ uid=client_id,
+ color=np.random.randint(0, 255, 4 * 4 * 3, dtype=np.uint8).tobytes(), # pyright: ignore [reportUnknownMemberType]
+ depth=np.random.rand(4, 4).astype(np.float32).tobytes(),
+ transform=np.random.rand(12).astype(np.float32).tobytes(),
+ )
+
+ response = stub.ProcessFrame(frame)
+ assert response.message == "OK"
+
+
+def test_process_frame_with_unregistered_client(stub: ARFlowServiceStub):
+ invalid_frame = ProcessFrameRequest(uid="invalid_id")
+
+ with pytest.raises(grpc.RpcError) as excinfo:
+ stub.ProcessFrame(invalid_frame)
+ assert excinfo.value.code() == grpc.StatusCode.NOT_FOUND
+
+
+@pytest.mark.parametrize(
+ "client_config",
+ [
+ RegisterClientRequest(
+ camera_color=(
+ RegisterClientRequest.CameraColor(
+ enabled=True,
+ data_type="unknown",
+ )
+ )
+ ),
+ RegisterClientRequest(
+ camera_depth=(
+ RegisterClientRequest.CameraDepth(
+ enabled=True,
+ data_type="unknown",
+ )
+ )
+ ),
+ ],
+)
+def test_process_frame_with_invalid_data_types(
+ client_config: RegisterClientRequest, stub: ARFlowServiceStub
+):
+ response = stub.RegisterClient(client_config)
+ client_id = response.uid
+ invalid_frame = ProcessFrameRequest(
+ uid=client_id,
+ )
+ with pytest.raises(grpc.RpcError) as excinfo:
+ stub.ProcessFrame(invalid_frame)
+ assert excinfo.value.code() == grpc.StatusCode.INVALID_ARGUMENT
+
+
+@pytest.mark.parametrize(
+ "client_config, corrupted_frame",
+ [
+ (
+ RegisterClientRequest(
+ camera_color=RegisterClientRequest.CameraColor(
+ enabled=True,
+ data_type="RGB24",
+ resize_factor_x=1.0,
+ resize_factor_y=1.0,
+ ),
+ camera_intrinsics=RegisterClientRequest.CameraIntrinsics(
+ resolution_x=4,
+ resolution_y=4,
+ ),
+ ),
+ ProcessFrameRequest(
+ color=np.random.randint( # pyright: ignore [reportUnknownMemberType]
+ 0, 255, (4, 4, 2), dtype=np.uint8
+ ).tobytes(), # Incorrect size
+ ),
+ ),
+ (
+ RegisterClientRequest(
+ camera_color=RegisterClientRequest.CameraColor(
+ enabled=False,
+ ),
+ camera_depth=RegisterClientRequest.CameraDepth(
+ enabled=True, resolution_x=4, resolution_y=4, data_type="f32"
+ ),
+ ),
+ ProcessFrameRequest(
+ depth=np.random.rand(4 * 4)
+ .astype(np.float32)
+ .tobytes()[:1], # Incorrect size
+ ),
+ ),
+ (
+ RegisterClientRequest(
+ camera_color=RegisterClientRequest.CameraColor(
+ enabled=False,
+ resize_factor_x=1.0,
+ resize_factor_y=1.0,
+ ),
+ camera_transform=RegisterClientRequest.CameraTransform(enabled=True),
+ camera_intrinsics=RegisterClientRequest.CameraIntrinsics(
+ focal_length_x=1.0,
+ focal_length_y=1.0,
+ principal_point_x=1.0,
+ principal_point_y=1.0,
+ ),
+ ),
+ ProcessFrameRequest(
+ transform=np.random.rand(8 // 4)
+ .astype(np.float32)
+ .tobytes(), # Incorrect size
+ ),
+ ),
+ (
+ RegisterClientRequest(
+ camera_plane_detection=RegisterClientRequest.CameraPlaneDetection(
+ enabled=True
+ ),
+ ),
+ ProcessFrameRequest(
+ plane_detection=[
+ service_pb2.ProcessFrameRequest.Plane(
+ center=service_pb2.ProcessFrameRequest.Vector3(
+ x=1.0, y=2.0, z=3.0
+ ),
+ normal=service_pb2.ProcessFrameRequest.Vector3(
+ x=1.0, y=2.0, z=3.0
+ ),
+ size=service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0),
+ boundary_points=[
+ service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0),
+ service_pb2.ProcessFrameRequest.Vector2(x=2.0, y=3.0),
+ # Missing one point
+ ],
+ )
+ ],
+ ),
+ ),
+ ],
+)
+def test_process_frame_with_corrupted_data(
+ client_config: RegisterClientRequest,
+ corrupted_frame: ProcessFrameRequest,
+ stub: ARFlowServiceStub,
+):
+ response = stub.RegisterClient(
+ client_config,
+ )
+ corrupted_frame.uid = response.uid
+
+ with pytest.raises(grpc.RpcError) as excinfo:
+ stub.ProcessFrame(
+ corrupted_frame,
+ )
+ assert excinfo.value.code() == grpc.StatusCode.INVALID_ARGUMENT
diff --git a/python/tests/test_service.py b/python/tests/test_service.py
new file mode 100644
index 0000000..c49b77e
--- /dev/null
+++ b/python/tests/test_service.py
@@ -0,0 +1,329 @@
+"""gRPC service tests."""
+
+# ruff:noqa: D103
+# pyright: reportPrivateUsage=false
+
+from pathlib import Path
+from unittest.mock import patch
+
+import DracoPy
+import grpc
+import grpc_interceptor
+import grpc_interceptor.exceptions
+import numpy as np
+import pytest
+
+from arflow import ARFlowServicer, DecodedDataFrame, RegisterClientRequest
+from arflow._types import HashableClientIdentifier
+from arflow_grpc import service_pb2
+from arflow_grpc.service_pb2 import ProcessFrameRequest
+
+
+@pytest.fixture
+def default_service():
+ """A default ARFlow service that can be shared across tests."""
+ return ARFlowServicer()
+
+
+def test_save_request(default_service: ARFlowServicer):
+ request = RegisterClientRequest()
+ default_service._save_request(request)
+
+ assert len(default_service._requests_history) == 1
+ enriched_request = default_service._requests_history[0]
+ assert enriched_request.timestamp >= 0
+ assert enriched_request.data == request
+
+ request = ProcessFrameRequest()
+ default_service._save_request(request)
+
+ assert len(default_service._requests_history) == 2
+ enriched_request = default_service._requests_history[1]
+ assert enriched_request.timestamp >= 0
+ assert enriched_request.data == request
+ assert (
+ default_service._requests_history[0].timestamp
+ <= default_service._requests_history[1].timestamp
+ )
+
+
+def test_register_client(default_service: ARFlowServicer):
+ request = RegisterClientRequest()
+
+ response = default_service.RegisterClient(request)
+ assert len(response.uid) == 36
+
+
+def test_register_client_with_init_uid(default_service: ARFlowServicer):
+ request = RegisterClientRequest()
+
+ response = default_service.RegisterClient(request, init_uid="1234")
+ assert response.uid == "1234"
+
+
+def test_multiple_clients(default_service: ARFlowServicer):
+ """Flaky since UUIDs might collide."""
+ # Register multiple clients
+ for _ in range(3):
+ request = RegisterClientRequest()
+ response = default_service.RegisterClient(request)
+ assert len(response.uid) == 36
+
+ assert len(default_service._client_configurations) == 3
+
+
+def test_register_same_client_twice(default_service: ARFlowServicer):
+ request = RegisterClientRequest()
+ response1 = default_service.RegisterClient(request)
+ response2 = default_service.RegisterClient(request, init_uid=response1.uid)
+
+ assert response1.uid == response2.uid
+
+
+@pytest.mark.parametrize(
+ "client_config,expected_enabled",
+ [
+ (
+ RegisterClientRequest(
+ camera_color=RegisterClientRequest.CameraColor(enabled=True)
+ ),
+ True,
+ ),
+ (
+ RegisterClientRequest(
+ camera_color=RegisterClientRequest.CameraColor(enabled=False)
+ ),
+ False,
+ ),
+ ],
+)
+def test_ensure_correct_config(
+ default_service: ARFlowServicer,
+ client_config: RegisterClientRequest,
+ expected_enabled: bool,
+):
+ response = default_service.RegisterClient(client_config)
+ client_id = HashableClientIdentifier(response.uid)
+ assert (
+ default_service._client_configurations[client_id].camera_color.enabled
+ == expected_enabled
+ )
+
+
+def test_process_frame(default_service: ARFlowServicer):
+ client_config = RegisterClientRequest(
+ camera_color=RegisterClientRequest.CameraColor(
+ enabled=True, data_type="RGB24", resize_factor_x=1.0, resize_factor_y=1.0
+ ),
+ camera_depth=RegisterClientRequest.CameraDepth(
+ enabled=True, data_type="f32", resolution_x=4, resolution_y=4
+ ),
+ camera_transform=RegisterClientRequest.CameraTransform(enabled=True),
+ camera_point_cloud=RegisterClientRequest.CameraPointCloud(enabled=True),
+ camera_intrinsics=RegisterClientRequest.CameraIntrinsics(
+ resolution_x=4,
+ resolution_y=4,
+ focal_length_x=1.0,
+ focal_length_y=1.0,
+ principal_point_x=1.0,
+ principal_point_y=1.0,
+ ),
+ camera_plane_detection=RegisterClientRequest.CameraPlaneDetection(enabled=True),
+ gyroscope=RegisterClientRequest.Gyroscope(enabled=True),
+ audio=RegisterClientRequest.Audio(enabled=True),
+ meshing=RegisterClientRequest.Meshing(enabled=True),
+ )
+ response = default_service.RegisterClient(client_config)
+ client_id = response.uid
+
+ with (Path(__file__).parent / "bunny.drc").open("rb") as draco_file:
+ mesh = DracoPy.decode(draco_file.read()) # pyright: ignore [reportUnknownMemberType, reportUnknownVariableType]
+ mock_frame = ProcessFrameRequest(
+ uid=client_id,
+ color=np.random.randint(0, 255, 4 * 4 * 3, dtype=np.uint8).tobytes(), # pyright: ignore [reportUnknownMemberType]
+ depth=np.random.rand(4, 4).astype(np.float32).tobytes(),
+ transform=np.random.rand(12).astype(np.float32).tobytes(),
+ plane_detection=[
+ service_pb2.ProcessFrameRequest.Plane(
+ center=service_pb2.ProcessFrameRequest.Vector3(x=1.0, y=2.0, z=3.0),
+ normal=service_pb2.ProcessFrameRequest.Vector3(x=1.0, y=2.0, z=3.0),
+ size=service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0),
+ boundary_points=[
+ service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0),
+ service_pb2.ProcessFrameRequest.Vector2(x=2.0, y=3.0),
+ service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=3.0),
+ ],
+ )
+ ],
+ gyroscope=service_pb2.ProcessFrameRequest.GyroscopeData(
+ attitude=service_pb2.ProcessFrameRequest.Quaternion(
+ x=1.0, y=2.0, z=3.0, w=4.0
+ ),
+ rotation_rate=service_pb2.ProcessFrameRequest.Vector3(
+ x=1.0, y=2.0, z=3.0
+ ),
+ gravity=service_pb2.ProcessFrameRequest.Vector3(x=1.0, y=2.0, z=3.0),
+ acceleration=service_pb2.ProcessFrameRequest.Vector3(
+ x=1.0, y=2.0, z=3.0
+ ),
+ ),
+ audio_data=np.random.rand(4).astype(np.float32),
+ meshes=[
+ service_pb2.ProcessFrameRequest.Mesh(
+ data=DracoPy.encode( # pyright: ignore [reportUnknownMemberType, reportUnknownArgumentType]
+ mesh.points, # pyright: ignore [reportUnknownMemberType]
+ faces=mesh.faces, # pyright: ignore [reportUnknownMemberType]
+ colors=mesh.colors, # pyright: ignore [reportUnknownMemberType]
+ )
+ )
+ ],
+ )
+
+ with patch.object(default_service, "on_frame_received") as mock_on_frame:
+ response = default_service.ProcessFrame(mock_frame)
+ assert response.message == "OK"
+ mock_on_frame.assert_called_once()
+ assert isinstance(mock_on_frame.call_args[0][0], DecodedDataFrame)
+
+
+def test_process_frame_with_unregistered_client(default_service: ARFlowServicer):
+ invalid_frame = ProcessFrameRequest(uid="invalid_id")
+ with pytest.raises(grpc_interceptor.exceptions.GrpcException) as excinfo:
+ default_service.ProcessFrame(invalid_frame)
+ assert excinfo.value.status_code == grpc.StatusCode.NOT_FOUND
+
+
+@pytest.mark.parametrize(
+ "client_config",
+ [
+ RegisterClientRequest(
+ camera_color=(
+ RegisterClientRequest.CameraColor(
+ enabled=True,
+ data_type="unknown",
+ )
+ )
+ ),
+ RegisterClientRequest(
+ camera_depth=(
+ RegisterClientRequest.CameraDepth(
+ enabled=True,
+ data_type="unknown",
+ )
+ )
+ ),
+ ],
+)
+def test_process_frame_with_invalid_data_types(
+ client_config: RegisterClientRequest, default_service: ARFlowServicer
+):
+ response = default_service.RegisterClient(client_config)
+ client_id = response.uid
+ invalid_frame = ProcessFrameRequest(
+ uid=client_id,
+ )
+ with pytest.raises(grpc_interceptor.exceptions.GrpcException) as excinfo:
+ default_service.ProcessFrame(invalid_frame)
+ assert excinfo.value.status_code == grpc.StatusCode.INVALID_ARGUMENT
+
+
+@pytest.mark.parametrize(
+ "client_config, corrupted_frame",
+ [
+ (
+ RegisterClientRequest(
+ camera_color=RegisterClientRequest.CameraColor(
+ enabled=True,
+ data_type="RGB24",
+ resize_factor_x=1.0,
+ resize_factor_y=1.0,
+ ),
+ camera_intrinsics=RegisterClientRequest.CameraIntrinsics(
+ resolution_x=4,
+ resolution_y=4,
+ ),
+ ),
+ ProcessFrameRequest(
+ uid="1234",
+ color=np.random.randint( # pyright: ignore [reportUnknownMemberType]
+ 0, 255, (4, 4, 2), dtype=np.uint8
+ ).tobytes(), # Incorrect size
+ ),
+ ),
+ (
+ RegisterClientRequest(
+ camera_depth=RegisterClientRequest.CameraDepth(
+ enabled=True, resolution_x=4, resolution_y=4, data_type="f32"
+ ),
+ ),
+ ProcessFrameRequest(
+ uid="1234",
+ depth=np.random.rand(4 * 4)
+ .astype(np.float32)
+ .tobytes()[:1], # Incorrect size
+ ),
+ ),
+ (
+ RegisterClientRequest(
+ camera_color=RegisterClientRequest.CameraColor(
+ resize_factor_x=1.0,
+ resize_factor_y=1.0,
+ ),
+ camera_transform=RegisterClientRequest.CameraTransform(enabled=True),
+ camera_intrinsics=RegisterClientRequest.CameraIntrinsics(
+ focal_length_x=1.0,
+ focal_length_y=1.0,
+ principal_point_x=1.0,
+ principal_point_y=1.0,
+ ),
+ ),
+ ProcessFrameRequest(
+ uid="1234",
+ transform=np.random.rand(8 // 4)
+ .astype(np.float32)
+ .tobytes(), # Incorrect size
+ ),
+ ),
+ (
+ RegisterClientRequest(
+ camera_plane_detection=RegisterClientRequest.CameraPlaneDetection(
+ enabled=True
+ ),
+ ),
+ ProcessFrameRequest(
+ uid="1234",
+ plane_detection=[
+ service_pb2.ProcessFrameRequest.Plane(
+ center=service_pb2.ProcessFrameRequest.Vector3(
+ x=1.0, y=2.0, z=3.0
+ ),
+ normal=service_pb2.ProcessFrameRequest.Vector3(
+ x=1.0, y=2.0, z=3.0
+ ),
+ size=service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0),
+ boundary_points=[
+ service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0),
+ service_pb2.ProcessFrameRequest.Vector2(x=2.0, y=3.0),
+ # Missing one point
+ ],
+ )
+ ],
+ ),
+ ),
+ ],
+)
+def test_process_frame_with_corrupted_data(
+ client_config: RegisterClientRequest,
+ corrupted_frame: ProcessFrameRequest,
+ default_service: ARFlowServicer,
+):
+ default_service.RegisterClient(
+ client_config,
+ init_uid="1234",
+ )
+
+ with pytest.raises(grpc_interceptor.exceptions.InvalidArgument) as excinfo:
+ default_service.ProcessFrame(
+ corrupted_frame,
+ )
+ assert excinfo.value.status_code == grpc.StatusCode.INVALID_ARGUMENT
diff --git a/python/tools/make_docs_cli.py b/python/tools/make_docs_cli.py
index db31143..c335e5c 100644
--- a/python/tools/make_docs_cli.py
+++ b/python/tools/make_docs_cli.py
@@ -6,6 +6,7 @@
def make_docs():
+ """Generate documentation for the `arflow` package and `examples` package."""
pdoc.pdoc(
"arflow", "examples", output_directory=Path(__file__).parent.parent / "docs"
)
diff --git a/scripts/compile.sh b/scripts/compile.sh
new file mode 100644
index 0000000..54946b1
--- /dev/null
+++ b/scripts/compile.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+# Generate Python gRPC files
+python -m grpc_tools.protoc --proto_path=../protos --python_out=../python --pyi_out=../python --grpc_python_out=../python ../protos/arflow_grpc/*.proto
+
+# Generate C# gRPC files
+protoc --csharp_out=../unity/Assets/Scripts/ARFlow --grpc_out=../unity/Assets/Scripts/ARFlow --plugin=protoc-gen-grpc=grpc_csharp_plugin ../protos/arflow_grpc/*.proto
+
+# protoc --csharp_out=unity/Assets/Scripts/ARFlow --grpc_out=unity/Assets/Scripts/ARFlow --plugin=protoc-gen-grpc=./.grpc_tools/grpc_csharp_plugin.exe protos/arflow_grpc/*.proto
\ No newline at end of file
diff --git a/unity/.gitignore b/unity/.gitignore
index 50878a6..c6cf8ce 100644
--- a/unity/.gitignore
+++ b/unity/.gitignore
@@ -1,7 +1,10 @@
+# Created by https://www.toptal.com/developers/gitignore/api/unity
+# Edit at https://www.toptal.com/developers/gitignore?templates=unity
+
+### Unity ###
# This .gitignore file should be placed at the root of your Unity project directory
#
-# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore
-#
+# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
@@ -9,13 +12,14 @@
/[Bb]uilds/
/[Ll]ogs/
/[Uu]ser[Ss]ettings/
+/ContentPackages
# MemoryCaptures can get excessive in size.
# They also could contain extremely sensitive data
/[Mm]emoryCaptures/
-# Asset meta data should only be ignored when the corresponding asset is also ignored
-!/[Aa]ssets/**/*.meta
+# Recordings can get excessive in size
+/[Rr]ecordings/
# Uncomment this line if you wish to ignore the asset store tools plugin
# /[Aa]ssets/AssetStoreTools*
@@ -34,7 +38,6 @@ ExportedObj/
.consulo/
*.csproj
*.unityproj
-# solution file is uploaded for doc building
*.sln
*.suo
*.tmp
@@ -60,6 +63,7 @@ sysinfo.txt
*.apk
*.aab
*.unitypackage
+*.app
# Crashlytics generated file
crashlytics-build.properties
@@ -71,142 +75,13 @@ crashlytics-build.properties
/[Aa]ssets/[Ss]treamingAssets/aa.meta
/[Aa]ssets/[Ss]treamingAssets/aa/*
-# Created by https://www.toptal.com/developers/gitignore/api/macos,visualstudiocode
-# Edit at https://www.toptal.com/developers/gitignore?templates=macos,visualstudiocode
-
-### macOS ###
-# General
-.DS_Store
-.AppleDouble
-.LSOverride
-
-# Icon must end with two \r
-Icon
-
-# Thumbnails
-._*
-
-# Files that might appear in the root of a volume
-.DocumentRevisions-V100
-.fseventsd
-.Spotlight-V100
-.TemporaryItems
-.Trashes
-.VolumeIcon.icns
-.com.apple.timemachine.donotpresent
-
-# Directories potentially created on remote AFP share
-.AppleDB
-.AppleDesktop
-Network Trash Folder
-Temporary Items
-.apdisk
-
-### VisualStudioCode ###
-.vscode/*
-!.vscode/settings.json
-!.vscode/tasks.json
-!.vscode/launch.json
-!.vscode/extensions.json
-*.code-workspace
-
-### VisualStudioCode Patch ###
-# Ignore all local history of files
-.history
-
-# End of https://www.toptal.com/developers/gitignore/api/macos,visualstudiocode
-
-# Created by https://www.toptal.com/developers/gitignore/api/intellij+all
-# Edit at https://www.toptal.com/developers/gitignore?templates=intellij+all
-
-### Intellij+all ###
-# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
-# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
-
-# User-specific stuff
-.idea/**/workspace.xml
-.idea/**/tasks.xml
-.idea/**/usage.statistics.xml
-.idea/**/dictionaries
-.idea/**/shelf
-
-# AWS User-specific
-.idea/**/aws.xml
-
-# Generated files
-.idea/**/contentModel.xml
-
-# Sensitive or high-churn files
-.idea/**/dataSources/
-.idea/**/dataSources.ids
-.idea/**/dataSources.local.xml
-.idea/**/sqlDataSources.xml
-.idea/**/dynamic.xml
-.idea/**/uiDesigner.xml
-.idea/**/dbnavigator.xml
-
-# Gradle
-.idea/**/gradle.xml
-.idea/**/libraries
-
-# Gradle and Maven with auto-import
-# When using Gradle or Maven with auto-import, you should exclude module files,
-# since they will be recreated, and may cause churn. Uncomment if using
-# auto-import.
-# .idea/artifacts
-# .idea/compiler.xml
-# .idea/jarRepositories.xml
-# .idea/modules.xml
-# .idea/*.iml
-# .idea/modules
-# *.iml
-# *.ipr
-
-# CMake
-cmake-build-*/
-
-# Mongo Explorer plugin
-.idea/**/mongoSettings.xml
-
-# File-based project format
-*.iws
-
-# IntelliJ
-out/
-
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
-atlassian-ide-plugin.xml
-
-# Cursive Clojure plugin
-.idea/replstate.xml
-
-# SonarLint plugin
-.idea/sonarlint/
-
-# Crashlytics plugin (for Android Studio and IntelliJ)
-com_crashlytics_export_strings.xml
-crashlytics.properties
-crashlytics-build.properties
-fabric.properties
-
-# Editor-based Rest Client
-.idea/httpRequests
-
-# Android studio 3.1+ serialized cache file
-.idea/caches/build_file_checksums.ser
-
-### Intellij+all Patch ###
-# Ignore everything but code style settings and run configurations
-# that are supposed to be shared within teams.
-
-.idea/*
-
-!.idea/codeStyles
-!.idea/runConfigurations
+# End of https://www.toptal.com/developers/gitignore/api/unity
-# End of https://www.toptal.com/developers/gitignore/api/intellij+all
+### ARFlow ###
+# ignore files moved by build script and generated by Docfx
+Documentation/index.md
+Documentation/api
-XcodeBuild
+# Client docs directory inside documentation is for local environment.
+# When running github workflows the files will be moved into the website/docs directory (in root)
+Documentation/clientHTMLOutput
diff --git a/unity/Assets/.gitignore b/unity/Assets/.gitignore
new file mode 100644
index 0000000..b0ceea0
--- /dev/null
+++ b/unity/Assets/.gitignore
@@ -0,0 +1,2 @@
+ARFoundation/SimulationEnvironments
+/UnityXRContent
\ No newline at end of file
diff --git a/unity/Assets/ARFlowPackage.meta b/unity/Assets/ARFlowPackage.meta
new file mode 100644
index 0000000..813315f
--- /dev/null
+++ b/unity/Assets/ARFlowPackage.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cd100aca6d90f7e4c9e9ee9f72bf04fe
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scripts/ARFlow.meta b/unity/Assets/ARFlowPackage/ARFlow.meta
similarity index 100%
rename from unity/Assets/Scripts/ARFlow.meta
rename to unity/Assets/ARFlowPackage/ARFlow.meta
diff --git a/unity/Assets/ARFlowPackage/ARFlow/ARFlow.asmdef b/unity/Assets/ARFlowPackage/ARFlow/ARFlow.asmdef
new file mode 100644
index 0000000..47538ae
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/ARFlow.asmdef
@@ -0,0 +1,22 @@
+{
+ "name": "ARFlow",
+ "rootNamespace": "",
+ "references": [
+ "GUID:a9420e37d7990b54abdef6688edbe313",
+ "GUID:c3bc0afe4a069b54aa23296f3c18a871",
+ "GUID:21b0c8d1703a94250bfac916590cea4f",
+ "GUID:75469ad4d38634e559750d17036d5f7c",
+ "GUID:92703082f92b41ba80f0d6912de66115",
+ "GUID:8a68004c08665e8449ab651ffdc7bee0",
+ "GUID:1504f36c4fe570349afad1ff2291fbd0"
+ ],
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [],
+ "versionDefines": [],
+ "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/unity/Assets/ARFlowPackage/ARFlow/ARFlow.asmdef.meta b/unity/Assets/ARFlowPackage/ARFlow/ARFlow.asmdef.meta
new file mode 100644
index 0000000..60ad30e
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/ARFlow.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 32105e0090382574e9f663b4802eb134
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scripts/ARFlow/ARFlowClient.cs b/unity/Assets/ARFlowPackage/ARFlow/ARFlowClient.cs
similarity index 75%
rename from unity/Assets/Scripts/ARFlow/ARFlowClient.cs
rename to unity/Assets/ARFlowPackage/ARFlow/ARFlowClient.cs
index 232e8cf..826dbe3 100644
--- a/unity/Assets/Scripts/ARFlow/ARFlowClient.cs
+++ b/unity/Assets/ARFlowPackage/ARFlow/ARFlowClient.cs
@@ -3,6 +3,8 @@
using Grpc.Net.Client;
using UnityEngine;
+using static ARFlow.OtherUtils;
+
namespace ARFlow
{
///
@@ -21,7 +23,7 @@ public class ARFlowClient
/// The address (AKA server URL) to connect to
public ARFlowClient(string address)
{
- Debug.Log("Initialize client for " + address);
+ PrintDebug("Initialize client for " + address);
var handler = new YetAnotherHttpHandler() { Http2Only = true };
_channel = GrpcChannel.ForAddress(address, new GrpcChannelOptions()
{
@@ -38,30 +40,22 @@ public ARFlowClient(string address)
///
/// Connect to the server with a request that contain register data of about the camera.
+ /// This will throw an error if the connection is not established.
///
/// Register data (AKA metadata) of the camera. The typing of this is generated by Protobuf.
- public void Connect(RegisterRequest requestData)
+ public void Connect(RegisterClientRequest requestData)
{
- try
- {
- var response = _client.register(requestData);
- _sessionId = response.Uid;
+ var response = _client.RegisterClient(requestData);
+ _sessionId = response.Uid;
- Debug.Log(response.Uid);
- }
- catch (Exception e)
- {
- // Try to catch any exceptions.
- // Network, device image, camera intrinsics
- Debug.LogError(e);
- }
+ PrintDebug(response.Uid);
}
///
/// Send a data of a frame to the server.
///
/// Data of the frame. The typing of this is generated by Protobuf.
- public string SendFrame(DataFrameRequest frameData)
+ public string SendFrame(ProcessFrameRequest frameData)
{
string res = "";
frameData.Uid = _sessionId;
@@ -70,16 +64,16 @@ public string SendFrame(DataFrameRequest frameData)
// _client.data_frameAsync(frameData)
// .ResponseAsync.ContinueWith(response =>
// {
- // Debug.Log(response);
+ // PrintDebug(response);
// });
- var response = _client.data_frame(frameData);
+ var response = _client.ProcessFrame(frameData);
res = response.Message;
}
catch (Exception e)
{
// Try to catch any exceptions.
// Network, device image, camera intrinsics
- Debug.LogError(e);
+ PrintDebug(e.Message);
}
return res;
diff --git a/unity/Assets/Scripts/ARFlow/ARFlowClient.cs.meta b/unity/Assets/ARFlowPackage/ARFlow/ARFlowClient.cs.meta
similarity index 100%
rename from unity/Assets/Scripts/ARFlow/ARFlowClient.cs.meta
rename to unity/Assets/ARFlowPackage/ARFlow/ARFlowClient.cs.meta
diff --git a/unity/Assets/ARFlowPackage/ARFlow/ARFlowClientManager.cs b/unity/Assets/ARFlowPackage/ARFlow/ARFlowClientManager.cs
new file mode 100644
index 0000000..198f350
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/ARFlowClientManager.cs
@@ -0,0 +1,494 @@
+using System;
+using System.Net;
+using System.Runtime.CompilerServices;
+using System.Threading.Tasks;
+using Cysharp.Net.Http;
+using Google.Protobuf;
+using Grpc.Net.Client;
+using Unity.VisualScripting.FullSerializer;
+using UnityEngine;
+using UnityEngine.XR.ARFoundation;
+using System.Collections.Generic;
+using UnityEngine.InputSystem;
+using Google.Protobuf.WellKnownTypes;
+using Unity.Collections;
+using System.Linq;
+using UnityEngine.Android;
+
+using static ARFlow.OtherUtils;
+
+namespace ARFlow
+{
+ ///
+ /// This class represent the implementation for the client manager
+ /// The client manager is an abstraction layer (for hopefully cleaner code) that collects and send data to the client.
+ /// The Unity Scene only needs to input AR managers and modalities options.
+ ///
+ public class ARFlowClientManager
+ {
+ private ARFlowClient _client;
+ private ARCameraManager _cameraManager;
+ private AROcclusionManager _occlusionManager;
+ private Vector2Int _sampleSize;
+ private Dictionary _activatedDataModalities;
+ private ARMeshManager _meshManager;
+ private ARPlaneManager _planeManager;
+
+ private Task oldTask = null;
+
+ private bool _isStreaming = false;
+
+ // Interfaces for implementations using other packages
+ private AudioStreaming _audioStreaming;
+ private MeshEncoder _meshEncoder;
+
+ //TODO
+ //private Dictionary> _modalityConfig
+
+ private readonly Dictionary DEFAULT_MODALITIES = new()
+ {
+ ["CameraColor"] = false,
+ ["CameraDepth"] = false,
+ ["CameraTransform"] = false,
+ ["CameraPointCloud"] = false,
+ ["PlaneDetection"] = false,
+ ["Gyroscope"] = false,
+ ["Audio"] = false,
+ ["Meshing"] = false
+ };
+
+ public static readonly List MODALITIES = new()
+ {
+ "CameraColor",
+ "CameraDepth",
+ "CameraTransform",
+ "CameraPointCloud",
+ "PlaneDetection",
+ "Gyroscope",
+ "Audio",
+ "Meshing"
+ };
+
+ ///
+ /// Initialize the client manager
+ ///
+ public ARFlowClientManager(
+ ARCameraManager cameraManager = null,
+ AROcclusionManager occlusionManager = null,
+ ARPlaneManager planeManager = null,
+ ARMeshManager meshManager = null
+ )
+ {
+ if (UnityEngine.InputSystem.Gyroscope.current != null)
+ {
+ InputSystem.EnableDevice(UnityEngine.InputSystem.Gyroscope.current);
+ }
+ if (AttitudeSensor.current != null)
+ {
+ InputSystem.EnableDevice(AttitudeSensor.current);
+ }
+ if (Accelerometer.current != null)
+ {
+ InputSystem.EnableDevice(Accelerometer.current);
+ }
+ if (GravitySensor.current != null)
+ {
+ InputSystem.EnableDevice(GravitySensor.current);
+ }
+ _cameraManager = cameraManager;
+ _occlusionManager = occlusionManager;
+
+ _planeManager = planeManager;
+ _meshManager = meshManager;
+
+ _audioStreaming = new AudioStreaming();
+ _meshEncoder = new MeshEncoder();
+
+#if UNITY_ANDROID
+ if (!Permission.HasUserAuthorizedPermission(Permission.Microphone))
+ {
+ Permission.RequestUserPermission(Permission.Microphone);
+ }
+#endif
+#if UNITY_IOS
+ if (Application.HasUserAuthorization(UserAuthorization.Microphone))
+ {
+ Application.RequestUserAuthorization(UserAuthorization.Microphone);
+ }
+#endif
+ }
+
+ ///
+ /// A Task wrapper for the connect method, to avoid blocking the main thread.
+ /// Only the connect method is sent to another thread.
+ /// The methods to collect client configurations is required to be in the main thread.
+ ///
+ /// The method will spawn a new task, so the usage of this is only calling "ConnectTask(args)"
+ ///
+ /// Server address
+ /// Dictionary of all data modalities, either activated or not
+ public Task ConnectTask(
+ string address,
+ Dictionary activatedDataModalities = null,
+ Action taskFinishedHook = null
+ )
+ {
+ ResetState();
+ _client = new ARFlowClient(address);
+
+ _activatedDataModalities = activatedDataModalities;
+ if (activatedDataModalities == null)
+ _activatedDataModalities = DEFAULT_MODALITIES;
+
+ // To avoid old method calls to log message
+ oldTask?.ContinueWith(t => { });
+
+ var requestData = GetClientConfiguration();
+ var task = Task.Run(() => _client.Connect(requestData));
+ if (taskFinishedHook is not null)
+ task.ContinueWith(taskFinishedHook);
+
+ oldTask = task;
+
+ return task;
+ }
+
+
+ private void ResetState()
+ {
+ if (_isStreaming)
+ {
+ StopDataStreaming();
+ }
+ }
+
+ private RegisterClientRequest GetClientConfiguration()
+ {
+ _cameraManager.TryGetIntrinsics(out var k);
+ _cameraManager.TryAcquireLatestCpuImage(out var colorImage);
+ _occlusionManager.TryAcquireEnvironmentDepthCpuImage(out var depthImage);
+
+ _sampleSize = depthImage.dimensions;
+
+ var requestData = new RegisterClientRequest()
+ {
+ DeviceName = SystemInfo.deviceName,
+ CameraIntrinsics = new RegisterClientRequest.Types.CameraIntrinsics()
+ {
+ FocalLengthX = k.focalLength.x,
+ FocalLengthY = k.focalLength.y,
+ ResolutionX = k.resolution.x,
+ ResolutionY = k.resolution.y,
+ PrincipalPointX = k.principalPoint.x,
+ PrincipalPointY = k.principalPoint.y,
+ }
+
+ };
+ if (_activatedDataModalities["CameraColor"])
+ {
+ var CameraColor = new RegisterClientRequest.Types.CameraColor()
+ {
+ Enabled = true,
+ DataType = "YCbCr420",
+ ResizeFactorX = depthImage.dimensions.x / (float)colorImage.dimensions.x,
+ ResizeFactorY = depthImage.dimensions.y / (float)colorImage.dimensions.y,
+ };
+ requestData.CameraColor = CameraColor;
+ }
+ if (_activatedDataModalities["CameraDepth"])
+ {
+ var CameraDepth = new RegisterClientRequest.Types.CameraDepth()
+ {
+ Enabled = true,
+#if UNITY_ANDROID
+ DataType = "u16", // f32 for iOS, u16 for Android
+#endif
+#if UNITY_IOS
+ DataType = "f32",
+#endif
+ ConfidenceFilteringLevel = 0,
+ ResolutionX = depthImage.dimensions.x,
+ ResolutionY = depthImage.dimensions.y
+ };
+ requestData.CameraDepth = CameraDepth;
+ }
+
+ if (_activatedDataModalities["CameraTransform"])
+ {
+ var CameraTransform = new RegisterClientRequest.Types.CameraTransform()
+ {
+ Enabled = true
+ };
+ requestData.CameraTransform = CameraTransform;
+ }
+
+ if (_activatedDataModalities["CameraPointCloud"])
+ {
+ var CameraPointCloud = new RegisterClientRequest.Types.CameraPointCloud()
+ {
+ Enabled = true,
+ DepthUpscaleFactor = 1.0f,
+ };
+ requestData.CameraPointCloud = CameraPointCloud;
+ };
+
+ if (_activatedDataModalities["PlaneDetection"])
+ {
+ var CameraPlaneDetection = new RegisterClientRequest.Types.CameraPlaneDetection()
+ {
+ Enabled = true
+ };
+ requestData.CameraPlaneDetection = CameraPlaneDetection;
+ }
+
+ if (_activatedDataModalities["Gyroscope"])
+ {
+ var Gyroscope = new RegisterClientRequest.Types.Gyroscope()
+ {
+ Enabled = true
+ };
+ requestData.Gyroscope = Gyroscope;
+ }
+
+ if (_activatedDataModalities["Audio"])
+ {
+ var Audio = new RegisterClientRequest.Types.Audio()
+ {
+ Enabled = true
+ };
+ requestData.Audio = Audio;
+ }
+
+ if (_activatedDataModalities["Meshing"])
+ {
+ var Meshing = new RegisterClientRequest.Types.Meshing()
+ {
+ Enabled = true
+ };
+ requestData.Meshing = Meshing;
+ }
+
+ colorImage.Dispose();
+ depthImage.Dispose();
+
+ return requestData;
+
+ }
+
+ ///
+ /// Connect to the server at an address, and with data modalities activated or not.
+ ///
+ /// Server address
+ /// Dictionary of all data modalities, either activated or not
+ public void Connect(
+ string address,
+ Dictionary activatedDataModalities = null
+ )
+ {
+ ResetState();
+ _client = new ARFlowClient(address);
+
+ _activatedDataModalities = activatedDataModalities;
+ if (activatedDataModalities == null)
+ _activatedDataModalities = DEFAULT_MODALITIES;
+
+ try
+ {
+ var requestData = GetClientConfiguration();
+ _client.Connect(requestData);
+ }
+ catch (Exception e)
+ {
+ PrintDebug(e.Message);
+ }
+ }
+
+ ///
+ /// Helper function to convert from unity data types to custom proto types
+ ///
+ ///
+ ///
+ ProcessFrameRequest.Types.Vector3 UnityVector3ToProto(Vector3 a)
+ {
+ return new ProcessFrameRequest.Types.Vector3()
+ {
+ X = a.x,
+ Y = a.y,
+ Z = a.z
+ };
+ }
+
+ ProcessFrameRequest.Types.Vector2 UnityVector2ToProto(Vector2 a)
+ {
+ return new ProcessFrameRequest.Types.Vector2()
+ {
+ X = a.x,
+ Y = a.y,
+ };
+ }
+
+ ProcessFrameRequest.Types.Quaternion UnityQuaternionToProto(Quaternion a)
+ {
+ return new ProcessFrameRequest.Types.Quaternion()
+ {
+ X = a.x,
+ Y = a.y,
+ Z = a.z,
+ W = a.w
+ };
+ }
+
+
+ private const int DEFAULT_SAMPLE_RATE = 10000;
+ public const int DEFAULT_FRAME_LENGTH = 2000;
+ ///
+ /// For streaming data: start streaming allow data to be sent periodically until stop streaming.
+ ///
+ public void StartDataStreaming()
+ {
+ _isStreaming = true;
+ if (_activatedDataModalities["Audio"])
+ {
+ _audioStreaming.InitializeAudioRecording(DEFAULT_SAMPLE_RATE, DEFAULT_FRAME_LENGTH);
+ }
+ }
+
+ ///
+ /// For streaming data: stop streaming data so that we don't consume more
+ /// resource after this point.
+ ///
+ public void StopDataStreaming()
+ {
+ _isStreaming = false;
+ if (_activatedDataModalities["Audio"])
+ {
+ _audioStreaming.DisposeAudioRecording();
+ }
+ }
+
+ ///
+ /// Collect data frame's data for sending to server
+ ///
+ ///
+ public ProcessFrameRequest CollectDataFrame()
+ {
+ var dataFrame = new ProcessFrameRequest();
+
+ if (_activatedDataModalities["CameraColor"])
+ {
+ var colorImage = new XRYCbCrColorImage(_cameraManager, _sampleSize);
+ dataFrame.Color = ByteString.CopyFrom(colorImage.Encode());
+
+ colorImage.Dispose();
+ }
+
+ if (_activatedDataModalities["CameraDepth"])
+ {
+ var depthImage = new XRConfidenceFilteredDepthImage(_occlusionManager, 0);
+ dataFrame.Depth = ByteString.CopyFrom(depthImage.Encode());
+
+ depthImage.Dispose();
+ }
+
+ if (_activatedDataModalities["CameraTransform"])
+ {
+ const int transformLength = 3 * 4 * sizeof(float);
+ var m = Camera.main!.transform.localToWorldMatrix;
+ var cameraTransformBytes = new byte[transformLength];
+
+ Buffer.BlockCopy(new[]
+ {
+ m.m00, m.m01, m.m02, m.m03,
+ m.m10, m.m11, m.m12, m.m13,
+ m.m20, m.m21, m.m22, m.m23
+ }, 0, cameraTransformBytes, 0, transformLength);
+
+ dataFrame.Transform = ByteString.CopyFrom(cameraTransformBytes);
+ }
+
+ if (_activatedDataModalities["PlaneDetection"])
+ {
+ foreach (ARPlane plane in _planeManager.trackables)
+ {
+ var protoPlane = new ProcessFrameRequest.Types.Plane();
+ protoPlane.Center = UnityVector3ToProto(plane.center);
+ protoPlane.Normal = UnityVector3ToProto(plane.normal);
+ protoPlane.Size = UnityVector2ToProto(plane.size);
+ protoPlane.BoundaryPoints.Add(plane.boundary.Select(point => UnityVector2ToProto(point)));
+
+ dataFrame.PlaneDetection.Add(protoPlane);
+ }
+ }
+
+ if (_activatedDataModalities["Gyroscope"])
+ {
+ dataFrame.Gyroscope = new ProcessFrameRequest.Types.GyroscopeData();
+ Quaternion attitude = AttitudeSensor.current.attitude.ReadValue();
+ Vector3 rotation_rate = UnityEngine.InputSystem.Gyroscope.current.angularVelocity.ReadValue();
+ Vector3 gravity = GravitySensor.current.gravity.ReadValue();
+ Vector3 acceleration = Accelerometer.current.acceleration.ReadValue();
+
+ dataFrame.Gyroscope.Attitude = UnityQuaternionToProto(attitude);
+ dataFrame.Gyroscope.RotationRate = UnityVector3ToProto(rotation_rate);
+ dataFrame.Gyroscope.Gravity = UnityVector3ToProto(gravity);
+ dataFrame.Gyroscope.Acceleration = UnityVector3ToProto(acceleration);
+ }
+
+ if (_activatedDataModalities["Audio"])
+ {
+ PrintDebug("audio");
+ dataFrame.AudioData.Add(_audioStreaming.GetFrames());
+ _audioStreaming.ClearFrameList();
+ }
+
+ if (_activatedDataModalities["Meshing"])
+ {
+ IList meshFilters = _meshManager.meshes;
+ PrintDebug($"Number of mesh filters: {meshFilters.Count}");
+ foreach (MeshFilter meshFilter in meshFilters)
+ {
+ Mesh mesh = meshFilter.sharedMesh;
+ List> encodedMesh = _meshEncoder.EncodeMesh(mesh);
+
+ foreach (var meshElement in encodedMesh)
+ {
+ var meshProto = new ProcessFrameRequest.Types.Mesh();
+ meshProto.Data = ByteString.CopyFrom(meshElement);
+
+ dataFrame.Meshes.Add(meshProto);
+ }
+ }
+
+ }
+
+ return dataFrame;
+ }
+
+ ///
+ /// This is a Task wrapper for GetAndSendFrame, to avoid blocking in the main thread.
+ /// The method will spawn a new task, so the usage of this is only calling "GetAndSendFrameTask()"
+ ///
+ ///
+ public Task GetAndSendFrameTask()
+ {
+ var dataFrame = CollectDataFrame();
+
+ return Task.Run(() => _client.SendFrame(dataFrame));
+ }
+
+ ///
+ /// Send a data of a frame to the server.
+ ///
+ /// Data of the frame. The typing of this is generated by Protobuf.
+ /// A message from the server.
+ public string GetAndSendFrame()
+ {
+ var dataFrame = CollectDataFrame();
+
+ string serverMessage = _client.SendFrame(dataFrame);
+ return serverMessage;
+ }
+ }
+}
+
+
diff --git a/unity/Assets/Scripts/ARFlow/ARFlowClientManager.cs.meta b/unity/Assets/ARFlowPackage/ARFlow/ARFlowClientManager.cs.meta
similarity index 100%
rename from unity/Assets/Scripts/ARFlow/ARFlowClientManager.cs.meta
rename to unity/Assets/ARFlowPackage/ARFlow/ARFlowClientManager.cs.meta
diff --git a/unity/Assets/ARFlowPackage/ARFlow/AudioStreaming.cs b/unity/Assets/ARFlowPackage/ARFlow/AudioStreaming.cs
new file mode 100644
index 0000000..8418e0a
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/AudioStreaming.cs
@@ -0,0 +1,54 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+using Pv.Unity;
+
+namespace ARFlow
+{
+ public class AudioStreaming
+ {
+ private List _unsentFrames;
+
+ public List GetFrames()
+ {
+ return _unsentFrames;
+ }
+
+ public AudioStreaming()
+ {
+ _unsentFrames = new List();
+ }
+
+ ///
+ /// Since Unity's microphone implementation requires calling "start" and "end", we need
+ /// a call to start microphone recording
+ ///
+ public void InitializeAudioRecording(int sampleRate, int frameLength)
+ {
+ VoiceProcessor.Instance.StartRecording(frameLength, sampleRate);
+ VoiceProcessor.Instance.AddFrameListener(UpdateCurrentAudioFrame);
+ }
+
+ ///
+ /// Our point is that we only want to send the current frame, not all frames that might be sent.
+ ///
+ ///
+ private void UpdateCurrentAudioFrame(float[] frame)
+ {
+ _unsentFrames.AddRange(frame);
+ }
+
+ public void ClearFrameList()
+ {
+ _unsentFrames.Clear();
+ }
+
+ public void DisposeAudioRecording()
+ {
+ VoiceProcessor.Instance.StopRecording();
+ }
+ }
+
+
+}
diff --git a/unity/Assets/ARFlowPackage/ARFlow/AudioStreaming.cs.meta b/unity/Assets/ARFlowPackage/ARFlow/AudioStreaming.cs.meta
new file mode 100644
index 0000000..3b2d2aa
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/AudioStreaming.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 35e7c7b9e1e3a9d42ad3d1a461e6e49c
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/ARFlowPackage/ARFlow/Interfaces.meta b/unity/Assets/ARFlowPackage/ARFlow/Interfaces.meta
new file mode 100644
index 0000000..485afa5
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/Interfaces.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: dc0cea679e23cf242b22104342c95441
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode.meta b/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode.meta
new file mode 100644
index 0000000..50e877f
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6a6145503248911438db7b7a49fa5304
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.asmdef b/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.asmdef
new file mode 100644
index 0000000..590b365
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.asmdef
@@ -0,0 +1,16 @@
+{
+ "name": "MeshingEncoderAssembly",
+ "rootNamespace": "",
+ "references": [
+ "GUID:411961ebab96043d8a061c656d3a461c"
+ ],
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": true,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [],
+ "versionDefines": [],
+ "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.asmdef.meta b/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.asmdef.meta
new file mode 100644
index 0000000..0bab74e
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8a68004c08665e8449ab651ffdc7bee0
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.cs b/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.cs
new file mode 100644
index 0000000..a406969
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.cs
@@ -0,0 +1,25 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+using Draco.Encoder;
+using Unity.Collections;
+
+namespace ARFlow
+{
+ public class MeshEncoder
+ {
+ public List> EncodeMesh(Mesh mesh)
+ {
+ EncodeResult[] result = DracoEncoder.EncodeMesh(mesh);
+ List> ret = new();
+ foreach (EncodeResult item in result)
+ {
+ ret.Add(item.data);
+ }
+ return ret;
+ }
+ }
+
+}
+
diff --git a/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.cs.meta b/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.cs.meta
new file mode 100644
index 0000000..eaee770
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/MeshingEncode/MeshEncoder.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5c9dd96908350bc4db80d334d0807274
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/ARFlowPackage/ARFlow/OtherUtils.cs b/unity/Assets/ARFlowPackage/ARFlow/OtherUtils.cs
new file mode 100644
index 0000000..f493ace
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/OtherUtils.cs
@@ -0,0 +1,26 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace ARFlow
+{
+ public static class OtherUtils
+ {
+ public static void PrintDebug(object message)
+ {
+ try
+ {
+ if (Debug.isDebugBuild)
+ {
+ Debug.Log(message);
+ }
+ }
+ catch
+ {
+ //Debug.isDebugBuild throws error
+ //not on main thread --> skip logging
+ }
+ }
+ }
+
+}
diff --git a/unity/Assets/ARFlowPackage/ARFlow/OtherUtils.cs.meta b/unity/Assets/ARFlowPackage/ARFlow/OtherUtils.cs.meta
new file mode 100644
index 0000000..344774c
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/OtherUtils.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 52f248f840d6b094cb738b670a322491
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scripts/ARFlow/Service.cs b/unity/Assets/ARFlowPackage/ARFlow/Service.cs
similarity index 84%
rename from unity/Assets/Scripts/ARFlow/Service.cs
rename to unity/Assets/ARFlowPackage/ARFlow/Service.cs
index a212bc1..d597ad3 100644
--- a/unity/Assets/Scripts/ARFlow/Service.cs
+++ b/unity/Assets/ARFlowPackage/ARFlow/Service.cs
@@ -1,6 +1,6 @@
//
// Generated by the protocol buffer compiler. DO NOT EDIT!
-// source: protos/arflow/service.proto
+// source: protos/arflow_grpc/service.proto
//
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@@ -11,11 +11,11 @@
using scg = global::System.Collections.Generic;
namespace ARFlow {
- /// Holder for reflection information generated from protos/arflow/service.proto
+ /// Holder for reflection information generated from protos/arflow_grpc/service.proto
public static partial class ServiceReflection {
#region Descriptor
- /// File descriptor for protos/arflow/service.proto
+ /// File descriptor for protos/arflow_grpc/service.proto
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@@ -24,72 +24,84 @@ public static partial class ServiceReflection {
static ServiceReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
- "Chtwcm90b3MvYXJmbG93L3NlcnZpY2UucHJvdG8igwkKD1JlZ2lzdGVyUmVx",
- "dWVzdBITCgtkZXZpY2VfbmFtZRgBIAEoCRI8ChFjYW1lcmFfaW50cmluc2lj",
- "cxgCIAEoCzIhLlJlZ2lzdGVyUmVxdWVzdC5DYW1lcmFJbnRyaW5zaWNzEjIK",
- "DGNhbWVyYV9jb2xvchgDIAEoCzIcLlJlZ2lzdGVyUmVxdWVzdC5DYW1lcmFD",
- "b2xvchIyCgxjYW1lcmFfZGVwdGgYBCABKAsyHC5SZWdpc3RlclJlcXVlc3Qu",
- "Q2FtZXJhRGVwdGgSOgoQY2FtZXJhX3RyYW5zZm9ybRgFIAEoCzIgLlJlZ2lz",
- "dGVyUmVxdWVzdC5DYW1lcmFUcmFuc2Zvcm0SPQoSY2FtZXJhX3BvaW50X2Ns",
- "b3VkGAYgASgLMiEuUmVnaXN0ZXJSZXF1ZXN0LkNhbWVyYVBvaW50Q2xvdWQS",
- "RQoWY2FtZXJhX3BsYW5lX2RldGVjdGlvbhgHIAEoCzIlLlJlZ2lzdGVyUmVx",
- "dWVzdC5DYW1lcmFQbGFuZURldGVjdGlvbhItCglneXJvc2NvcGUYCCABKAsy",
- "Gi5SZWdpc3RlclJlcXVlc3QuR3lyb3Njb3BlEiUKBWF1ZGlvGAkgASgLMhYu",
- "UmVnaXN0ZXJSZXF1ZXN0LkF1ZGlvEikKB21lc2hpbmcYCiABKAsyGC5SZWdp",
- "c3RlclJlcXVlc3QuTWVzaGluZxqkAQoQQ2FtZXJhSW50cmluc2ljcxIWCg5m",
- "b2NhbF9sZW5ndGhfeBgBIAEoAhIWCg5mb2NhbF9sZW5ndGhfeRgCIAEoAhIZ",
- "ChFwcmluY2lwYWxfcG9pbnRfeBgDIAEoAhIZChFwcmluY2lwYWxfcG9pbnRf",
- "eRgEIAEoAhIUCgxyZXNvbHV0aW9uX3gYBSABKAUSFAoMcmVzb2x1dGlvbl95",
- "GAYgASgFGmMKC0NhbWVyYUNvbG9yEg8KB2VuYWJsZWQYASABKAgSEQoJZGF0",
- "YV90eXBlGAIgASgJEhcKD3Jlc2l6ZV9mYWN0b3JfeBgDIAEoAhIXCg9yZXNp",
- "emVfZmFjdG9yX3kYBCABKAIagQEKC0NhbWVyYURlcHRoEg8KB2VuYWJsZWQY",
- "ASABKAgSEQoJZGF0YV90eXBlGAIgASgJEiIKGmNvbmZpZGVuY2VfZmlsdGVy",
- "aW5nX2xldmVsGAMgASgFEhQKDHJlc29sdXRpb25feBgEIAEoBRIUCgxyZXNv",
- "bHV0aW9uX3kYBSABKAUaIgoPQ2FtZXJhVHJhbnNmb3JtEg8KB2VuYWJsZWQY",
- "ASABKAgaQQoQQ2FtZXJhUG9pbnRDbG91ZBIPCgdlbmFibGVkGAEgASgIEhwK",
- "FGRlcHRoX3Vwc2NhbGVfZmFjdG9yGAIgASgCGicKFENhbWVyYVBsYW5lRGV0",
- "ZWN0aW9uEg8KB2VuYWJsZWQYASABKAgaHAoJR3lyb3Njb3BlEg8KB2VuYWJs",
- "ZWQYASABKAgaGAoFQXVkaW8SDwoHZW5hYmxlZBgBIAEoCBoaCgdNZXNoaW5n",
- "Eg8KB2VuYWJsZWQYASABKAgiHwoQUmVnaXN0ZXJSZXNwb25zZRILCgN1aWQY",
- "ASABKAkiuwUKEERhdGFGcmFtZVJlcXVlc3QSCwoDdWlkGAEgASgJEg0KBWNv",
- "bG9yGAIgASgMEg0KBWRlcHRoGAMgASgMEhEKCXRyYW5zZm9ybRgEIAEoDBIx",
- "Cg9wbGFuZV9kZXRlY3Rpb24YBSADKAsyGC5EYXRhRnJhbWVSZXF1ZXN0LlBs",
- "YW5lcxIzCglneXJvc2NvcGUYBiABKAsyIC5EYXRhRnJhbWVSZXF1ZXN0Lmd5",
- "cm9zY29wZV9kYXRhEg0KBWF1ZGlvGAggASgMEg8KB21lc2hpbmcYCSABKAwa",
- "KgoHVmVjdG9yMxIJCgF4GAEgASgCEgkKAXkYAiABKAISCQoBehgDIAEoAhof",
- "CgdWZWN0b3IyEgkKAXgYASABKAISCQoBeRgCIAEoAhqHAQoGUGxhbmVzEikK",
- "BmNlbnRlchgBIAEoCzIZLkRhdGFGcmFtZVJlcXVlc3QuVmVjdG9yMxIpCgZu",
- "b3JtYWwYAiABKAsyGS5EYXRhRnJhbWVSZXF1ZXN0LlZlY3RvcjMSJwoEc2l6",
- "ZRgDIAEoCzIZLkRhdGFGcmFtZVJlcXVlc3QuVmVjdG9yMho4CgpRdWF0ZXJu",
- "aW9uEgkKAXgYASABKAISCQoBeRgCIAEoAhIJCgF6GAMgASgCEgkKAXcYBCAB",
- "KAIazwEKDmd5cm9zY29wZV9kYXRhEi4KCGF0dGl0dWRlGAEgASgLMhwuRGF0",
- "YUZyYW1lUmVxdWVzdC5RdWF0ZXJuaW9uEjAKDXJvdGF0aW9uX3JhdGUYAiAB",
- "KAsyGS5EYXRhRnJhbWVSZXF1ZXN0LlZlY3RvcjMSKgoHZ3Jhdml0eRgDIAEo",
- "CzIZLkRhdGFGcmFtZVJlcXVlc3QuVmVjdG9yMxIvCgxhY2NlbGVyYXRpb24Y",
- "BCABKAsyGS5EYXRhRnJhbWVSZXF1ZXN0LlZlY3RvcjMiJAoRRGF0YUZyYW1l",
- "UmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCTJ1Cg1BUkZsb3dTZXJ2aWNlEi8K",
- "CHJlZ2lzdGVyEhAuUmVnaXN0ZXJSZXF1ZXN0GhEuUmVnaXN0ZXJSZXNwb25z",
- "ZRIzCgpkYXRhX2ZyYW1lEhEuRGF0YUZyYW1lUmVxdWVzdBoSLkRhdGFGcmFt",
- "ZVJlc3BvbnNlQgmqAgZBUkZsb3diBnByb3RvMw=="));
+ "CiBwcm90b3MvYXJmbG93X2dycGMvc2VydmljZS5wcm90bxIJYXJmbG93LnYx",
+ "IpkKChVSZWdpc3RlckNsaWVudFJlcXVlc3QSEwoLZGV2aWNlX25hbWUYASAB",
+ "KAkSTAoRY2FtZXJhX2ludHJpbnNpY3MYAiABKAsyMS5hcmZsb3cudjEuUmVn",
+ "aXN0ZXJDbGllbnRSZXF1ZXN0LkNhbWVyYUludHJpbnNpY3MSQgoMY2FtZXJh",
+ "X2NvbG9yGAMgASgLMiwuYXJmbG93LnYxLlJlZ2lzdGVyQ2xpZW50UmVxdWVz",
+ "dC5DYW1lcmFDb2xvchJCCgxjYW1lcmFfZGVwdGgYBCABKAsyLC5hcmZsb3cu",
+ "djEuUmVnaXN0ZXJDbGllbnRSZXF1ZXN0LkNhbWVyYURlcHRoEkoKEGNhbWVy",
+ "YV90cmFuc2Zvcm0YBSABKAsyMC5hcmZsb3cudjEuUmVnaXN0ZXJDbGllbnRS",
+ "ZXF1ZXN0LkNhbWVyYVRyYW5zZm9ybRJNChJjYW1lcmFfcG9pbnRfY2xvdWQY",
+ "BiABKAsyMS5hcmZsb3cudjEuUmVnaXN0ZXJDbGllbnRSZXF1ZXN0LkNhbWVy",
+ "YVBvaW50Q2xvdWQSVQoWY2FtZXJhX3BsYW5lX2RldGVjdGlvbhgHIAEoCzI1",
+ "LmFyZmxvdy52MS5SZWdpc3RlckNsaWVudFJlcXVlc3QuQ2FtZXJhUGxhbmVE",
+ "ZXRlY3Rpb24SPQoJZ3lyb3Njb3BlGAggASgLMiouYXJmbG93LnYxLlJlZ2lz",
+ "dGVyQ2xpZW50UmVxdWVzdC5HeXJvc2NvcGUSNQoFYXVkaW8YCSABKAsyJi5h",
+ "cmZsb3cudjEuUmVnaXN0ZXJDbGllbnRSZXF1ZXN0LkF1ZGlvEjkKB21lc2hp",
+ "bmcYCiABKAsyKC5hcmZsb3cudjEuUmVnaXN0ZXJDbGllbnRSZXF1ZXN0Lk1l",
+ "c2hpbmcapAEKEENhbWVyYUludHJpbnNpY3MSFgoOZm9jYWxfbGVuZ3RoX3gY",
+ "ASABKAISFgoOZm9jYWxfbGVuZ3RoX3kYAiABKAISGQoRcHJpbmNpcGFsX3Bv",
+ "aW50X3gYAyABKAISGQoRcHJpbmNpcGFsX3BvaW50X3kYBCABKAISFAoMcmVz",
+ "b2x1dGlvbl94GAUgASgFEhQKDHJlc29sdXRpb25feRgGIAEoBRpjCgtDYW1l",
+ "cmFDb2xvchIPCgdlbmFibGVkGAEgASgIEhEKCWRhdGFfdHlwZRgCIAEoCRIX",
+ "Cg9yZXNpemVfZmFjdG9yX3gYAyABKAISFwoPcmVzaXplX2ZhY3Rvcl95GAQg",
+ "ASgCGoEBCgtDYW1lcmFEZXB0aBIPCgdlbmFibGVkGAEgASgIEhEKCWRhdGFf",
+ "dHlwZRgCIAEoCRIiChpjb25maWRlbmNlX2ZpbHRlcmluZ19sZXZlbBgDIAEo",
+ "BRIUCgxyZXNvbHV0aW9uX3gYBCABKAUSFAoMcmVzb2x1dGlvbl95GAUgASgF",
+ "GiIKD0NhbWVyYVRyYW5zZm9ybRIPCgdlbmFibGVkGAEgASgIGkEKEENhbWVy",
+ "YVBvaW50Q2xvdWQSDwoHZW5hYmxlZBgBIAEoCBIcChRkZXB0aF91cHNjYWxl",
+ "X2ZhY3RvchgCIAEoAhonChRDYW1lcmFQbGFuZURldGVjdGlvbhIPCgdlbmFi",
+ "bGVkGAEgASgIGhwKCUd5cm9zY29wZRIPCgdlbmFibGVkGAEgASgIGhgKBUF1",
+ "ZGlvEg8KB2VuYWJsZWQYASABKAgaGgoHTWVzaGluZxIPCgdlbmFibGVkGAEg",
+ "ASgIIiUKFlJlZ2lzdGVyQ2xpZW50UmVzcG9uc2USCwoDdWlkGAEgASgJIq8H",
+ "ChNQcm9jZXNzRnJhbWVSZXF1ZXN0EgsKA3VpZBgBIAEoCRINCgVjb2xvchgC",
+ "IAEoDBINCgVkZXB0aBgDIAEoDBIRCgl0cmFuc2Zvcm0YBCABKAwSPQoPcGxh",
+ "bmVfZGV0ZWN0aW9uGAUgAygLMiQuYXJmbG93LnYxLlByb2Nlc3NGcmFtZVJl",
+ "cXVlc3QuUGxhbmUSPwoJZ3lyb3Njb3BlGAYgASgLMiwuYXJmbG93LnYxLlBy",
+ "b2Nlc3NGcmFtZVJlcXVlc3QuR3lyb3Njb3BlRGF0YRISCgphdWRpb19kYXRh",
+ "GAggAygCEjMKBm1lc2hlcxgJIAMoCzIjLmFyZmxvdy52MS5Qcm9jZXNzRnJh",
+ "bWVSZXF1ZXN0Lk1lc2gaKgoHVmVjdG9yMxIJCgF4GAEgASgCEgkKAXkYAiAB",
+ "KAISCQoBehgDIAEoAhofCgdWZWN0b3IyEgkKAXgYASABKAISCQoBeRgCIAEo",
+ "AhruAQoFUGxhbmUSNgoGY2VudGVyGAEgASgLMiYuYXJmbG93LnYxLlByb2Nl",
+ "c3NGcmFtZVJlcXVlc3QuVmVjdG9yMxI2CgZub3JtYWwYAiABKAsyJi5hcmZs",
+ "b3cudjEuUHJvY2Vzc0ZyYW1lUmVxdWVzdC5WZWN0b3IzEjQKBHNpemUYAyAB",
+ "KAsyJi5hcmZsb3cudjEuUHJvY2Vzc0ZyYW1lUmVxdWVzdC5WZWN0b3IyEj8K",
+ "D2JvdW5kYXJ5X3BvaW50cxgEIAMoCzImLmFyZmxvdy52MS5Qcm9jZXNzRnJh",
+ "bWVSZXF1ZXN0LlZlY3RvcjIaOAoKUXVhdGVybmlvbhIJCgF4GAEgASgCEgkK",
+ "AXkYAiABKAISCQoBehgDIAEoAhIJCgF3GAQgASgCGoICCg1HeXJvc2NvcGVE",
+ "YXRhEjsKCGF0dGl0dWRlGAEgASgLMikuYXJmbG93LnYxLlByb2Nlc3NGcmFt",
+ "ZVJlcXVlc3QuUXVhdGVybmlvbhI9Cg1yb3RhdGlvbl9yYXRlGAIgASgLMiYu",
+ "YXJmbG93LnYxLlByb2Nlc3NGcmFtZVJlcXVlc3QuVmVjdG9yMxI3CgdncmF2",
+ "aXR5GAMgASgLMiYuYXJmbG93LnYxLlByb2Nlc3NGcmFtZVJlcXVlc3QuVmVj",
+ "dG9yMxI8CgxhY2NlbGVyYXRpb24YBCABKAsyJi5hcmZsb3cudjEuUHJvY2Vz",
+ "c0ZyYW1lUmVxdWVzdC5WZWN0b3IzGhQKBE1lc2gSDAoEZGF0YRgBIAEoDCIn",
+ "ChRQcm9jZXNzRnJhbWVSZXNwb25zZRIPCgdtZXNzYWdlGAEgASgJMrcBCg1B",
+ "UkZsb3dTZXJ2aWNlElUKDlJlZ2lzdGVyQ2xpZW50EiAuYXJmbG93LnYxLlJl",
+ "Z2lzdGVyQ2xpZW50UmVxdWVzdBohLmFyZmxvdy52MS5SZWdpc3RlckNsaWVu",
+ "dFJlc3BvbnNlEk8KDFByb2Nlc3NGcmFtZRIeLmFyZmxvdy52MS5Qcm9jZXNz",
+ "RnJhbWVSZXF1ZXN0Gh8uYXJmbG93LnYxLlByb2Nlc3NGcmFtZVJlc3BvbnNl",
+ "QgmqAgZBUkZsb3diBnByb3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterRequest), global::ARFlow.RegisterRequest.Parser, new[]{ "DeviceName", "CameraIntrinsics", "CameraColor", "CameraDepth", "CameraTransform", "CameraPointCloud", "CameraPlaneDetection", "Gyroscope", "Audio", "Meshing" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterRequest.Types.CameraIntrinsics), global::ARFlow.RegisterRequest.Types.CameraIntrinsics.Parser, new[]{ "FocalLengthX", "FocalLengthY", "PrincipalPointX", "PrincipalPointY", "ResolutionX", "ResolutionY" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterRequest.Types.CameraColor), global::ARFlow.RegisterRequest.Types.CameraColor.Parser, new[]{ "Enabled", "DataType", "ResizeFactorX", "ResizeFactorY" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterRequest.Types.CameraDepth), global::ARFlow.RegisterRequest.Types.CameraDepth.Parser, new[]{ "Enabled", "DataType", "ConfidenceFilteringLevel", "ResolutionX", "ResolutionY" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterRequest.Types.CameraTransform), global::ARFlow.RegisterRequest.Types.CameraTransform.Parser, new[]{ "Enabled" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterRequest.Types.CameraPointCloud), global::ARFlow.RegisterRequest.Types.CameraPointCloud.Parser, new[]{ "Enabled", "DepthUpscaleFactor" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterRequest.Types.CameraPlaneDetection), global::ARFlow.RegisterRequest.Types.CameraPlaneDetection.Parser, new[]{ "Enabled" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterRequest.Types.Gyroscope), global::ARFlow.RegisterRequest.Types.Gyroscope.Parser, new[]{ "Enabled" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterRequest.Types.Audio), global::ARFlow.RegisterRequest.Types.Audio.Parser, new[]{ "Enabled" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterRequest.Types.Meshing), global::ARFlow.RegisterRequest.Types.Meshing.Parser, new[]{ "Enabled" }, null, null, null, null)}),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterResponse), global::ARFlow.RegisterResponse.Parser, new[]{ "Uid" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.DataFrameRequest), global::ARFlow.DataFrameRequest.Parser, new[]{ "Uid", "Color", "Depth", "Transform", "PlaneDetection", "Gyroscope", "Audio", "Meshing" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.DataFrameRequest.Types.Vector3), global::ARFlow.DataFrameRequest.Types.Vector3.Parser, new[]{ "X", "Y", "Z" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.DataFrameRequest.Types.Vector2), global::ARFlow.DataFrameRequest.Types.Vector2.Parser, new[]{ "X", "Y" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.DataFrameRequest.Types.Planes), global::ARFlow.DataFrameRequest.Types.Planes.Parser, new[]{ "Center", "Normal", "Size" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.DataFrameRequest.Types.Quaternion), global::ARFlow.DataFrameRequest.Types.Quaternion.Parser, new[]{ "X", "Y", "Z", "W" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.DataFrameRequest.Types.gyroscope_data), global::ARFlow.DataFrameRequest.Types.gyroscope_data.Parser, new[]{ "Attitude", "RotationRate", "Gravity", "Acceleration" }, null, null, null, null)}),
- new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.DataFrameResponse), global::ARFlow.DataFrameResponse.Parser, new[]{ "Message" }, null, null, null, null)
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientRequest), global::ARFlow.RegisterClientRequest.Parser, new[]{ "DeviceName", "CameraIntrinsics", "CameraColor", "CameraDepth", "CameraTransform", "CameraPointCloud", "CameraPlaneDetection", "Gyroscope", "Audio", "Meshing" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientRequest.Types.CameraIntrinsics), global::ARFlow.RegisterClientRequest.Types.CameraIntrinsics.Parser, new[]{ "FocalLengthX", "FocalLengthY", "PrincipalPointX", "PrincipalPointY", "ResolutionX", "ResolutionY" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientRequest.Types.CameraColor), global::ARFlow.RegisterClientRequest.Types.CameraColor.Parser, new[]{ "Enabled", "DataType", "ResizeFactorX", "ResizeFactorY" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientRequest.Types.CameraDepth), global::ARFlow.RegisterClientRequest.Types.CameraDepth.Parser, new[]{ "Enabled", "DataType", "ConfidenceFilteringLevel", "ResolutionX", "ResolutionY" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientRequest.Types.CameraTransform), global::ARFlow.RegisterClientRequest.Types.CameraTransform.Parser, new[]{ "Enabled" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientRequest.Types.CameraPointCloud), global::ARFlow.RegisterClientRequest.Types.CameraPointCloud.Parser, new[]{ "Enabled", "DepthUpscaleFactor" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientRequest.Types.CameraPlaneDetection), global::ARFlow.RegisterClientRequest.Types.CameraPlaneDetection.Parser, new[]{ "Enabled" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientRequest.Types.Gyroscope), global::ARFlow.RegisterClientRequest.Types.Gyroscope.Parser, new[]{ "Enabled" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientRequest.Types.Audio), global::ARFlow.RegisterClientRequest.Types.Audio.Parser, new[]{ "Enabled" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientRequest.Types.Meshing), global::ARFlow.RegisterClientRequest.Types.Meshing.Parser, new[]{ "Enabled" }, null, null, null, null)}),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.RegisterClientResponse), global::ARFlow.RegisterClientResponse.Parser, new[]{ "Uid" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.ProcessFrameRequest), global::ARFlow.ProcessFrameRequest.Parser, new[]{ "Uid", "Color", "Depth", "Transform", "PlaneDetection", "Gyroscope", "AudioData", "Meshes" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.ProcessFrameRequest.Types.Vector3), global::ARFlow.ProcessFrameRequest.Types.Vector3.Parser, new[]{ "X", "Y", "Z" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.ProcessFrameRequest.Types.Vector2), global::ARFlow.ProcessFrameRequest.Types.Vector2.Parser, new[]{ "X", "Y" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.ProcessFrameRequest.Types.Plane), global::ARFlow.ProcessFrameRequest.Types.Plane.Parser, new[]{ "Center", "Normal", "Size", "BoundaryPoints" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.ProcessFrameRequest.Types.Quaternion), global::ARFlow.ProcessFrameRequest.Types.Quaternion.Parser, new[]{ "X", "Y", "Z", "W" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.ProcessFrameRequest.Types.GyroscopeData), global::ARFlow.ProcessFrameRequest.Types.GyroscopeData.Parser, new[]{ "Attitude", "RotationRate", "Gravity", "Acceleration" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.ProcessFrameRequest.Types.Mesh), global::ARFlow.ProcessFrameRequest.Types.Mesh.Parser, new[]{ "Data" }, null, null, null, null)}),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ARFlow.ProcessFrameResponse), global::ARFlow.ProcessFrameResponse.Parser, new[]{ "Message" }, null, null, null, null)
}));
}
#endregion
@@ -97,16 +109,16 @@ static ServiceReflection() {
}
#region Messages
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
- public sealed partial class RegisterRequest : pb::IMessage
+ public sealed partial class RegisterClientRequest : pb::IMessage
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
- private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new RegisterRequest());
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new RegisterClientRequest());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser Parser { get { return _parser; } }
+ public static pb::MessageParser Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@@ -122,7 +134,7 @@ public sealed partial class RegisterRequest : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public RegisterRequest() {
+ public RegisterClientRequest() {
OnConstruction();
}
@@ -130,7 +142,7 @@ public RegisterRequest() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public RegisterRequest(RegisterRequest other) : this() {
+ public RegisterClientRequest(RegisterClientRequest other) : this() {
deviceName_ = other.deviceName_;
cameraIntrinsics_ = other.cameraIntrinsics_ != null ? other.cameraIntrinsics_.Clone() : null;
cameraColor_ = other.cameraColor_ != null ? other.cameraColor_.Clone() : null;
@@ -146,13 +158,16 @@ public RegisterRequest(RegisterRequest other) : this() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public RegisterRequest Clone() {
- return new RegisterRequest(this);
+ public RegisterClientRequest Clone() {
+ return new RegisterClientRequest(this);
}
/// Field number for the "device_name" field.
public const int DeviceNameFieldNumber = 1;
private string deviceName_ = "";
+ ///
+ /// TODO: Add documentation for each field, units of measurement, etc.
+ ///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string DeviceName {
@@ -164,10 +179,10 @@ public string DeviceName {
/// Field number for the "camera_intrinsics" field.
public const int CameraIntrinsicsFieldNumber = 2;
- private global::ARFlow.RegisterRequest.Types.CameraIntrinsics cameraIntrinsics_;
+ private global::ARFlow.RegisterClientRequest.Types.CameraIntrinsics cameraIntrinsics_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.RegisterRequest.Types.CameraIntrinsics CameraIntrinsics {
+ public global::ARFlow.RegisterClientRequest.Types.CameraIntrinsics CameraIntrinsics {
get { return cameraIntrinsics_; }
set {
cameraIntrinsics_ = value;
@@ -176,10 +191,10 @@ public string DeviceName {
/// Field number for the "camera_color" field.
public const int CameraColorFieldNumber = 3;
- private global::ARFlow.RegisterRequest.Types.CameraColor cameraColor_;
+ private global::ARFlow.RegisterClientRequest.Types.CameraColor cameraColor_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.RegisterRequest.Types.CameraColor CameraColor {
+ public global::ARFlow.RegisterClientRequest.Types.CameraColor CameraColor {
get { return cameraColor_; }
set {
cameraColor_ = value;
@@ -188,10 +203,10 @@ public string DeviceName {
/// Field number for the "camera_depth" field.
public const int CameraDepthFieldNumber = 4;
- private global::ARFlow.RegisterRequest.Types.CameraDepth cameraDepth_;
+ private global::ARFlow.RegisterClientRequest.Types.CameraDepth cameraDepth_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.RegisterRequest.Types.CameraDepth CameraDepth {
+ public global::ARFlow.RegisterClientRequest.Types.CameraDepth CameraDepth {
get { return cameraDepth_; }
set {
cameraDepth_ = value;
@@ -200,10 +215,10 @@ public string DeviceName {
/// Field number for the "camera_transform" field.
public const int CameraTransformFieldNumber = 5;
- private global::ARFlow.RegisterRequest.Types.CameraTransform cameraTransform_;
+ private global::ARFlow.RegisterClientRequest.Types.CameraTransform cameraTransform_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.RegisterRequest.Types.CameraTransform CameraTransform {
+ public global::ARFlow.RegisterClientRequest.Types.CameraTransform CameraTransform {
get { return cameraTransform_; }
set {
cameraTransform_ = value;
@@ -212,10 +227,10 @@ public string DeviceName {
/// Field number for the "camera_point_cloud" field.
public const int CameraPointCloudFieldNumber = 6;
- private global::ARFlow.RegisterRequest.Types.CameraPointCloud cameraPointCloud_;
+ private global::ARFlow.RegisterClientRequest.Types.CameraPointCloud cameraPointCloud_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.RegisterRequest.Types.CameraPointCloud CameraPointCloud {
+ public global::ARFlow.RegisterClientRequest.Types.CameraPointCloud CameraPointCloud {
get { return cameraPointCloud_; }
set {
cameraPointCloud_ = value;
@@ -224,10 +239,10 @@ public string DeviceName {
/// Field number for the "camera_plane_detection" field.
public const int CameraPlaneDetectionFieldNumber = 7;
- private global::ARFlow.RegisterRequest.Types.CameraPlaneDetection cameraPlaneDetection_;
+ private global::ARFlow.RegisterClientRequest.Types.CameraPlaneDetection cameraPlaneDetection_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.RegisterRequest.Types.CameraPlaneDetection CameraPlaneDetection {
+ public global::ARFlow.RegisterClientRequest.Types.CameraPlaneDetection CameraPlaneDetection {
get { return cameraPlaneDetection_; }
set {
cameraPlaneDetection_ = value;
@@ -236,10 +251,10 @@ public string DeviceName {
/// Field number for the "gyroscope" field.
public const int GyroscopeFieldNumber = 8;
- private global::ARFlow.RegisterRequest.Types.Gyroscope gyroscope_;
+ private global::ARFlow.RegisterClientRequest.Types.Gyroscope gyroscope_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.RegisterRequest.Types.Gyroscope Gyroscope {
+ public global::ARFlow.RegisterClientRequest.Types.Gyroscope Gyroscope {
get { return gyroscope_; }
set {
gyroscope_ = value;
@@ -248,10 +263,10 @@ public string DeviceName {
/// Field number for the "audio" field.
public const int AudioFieldNumber = 9;
- private global::ARFlow.RegisterRequest.Types.Audio audio_;
+ private global::ARFlow.RegisterClientRequest.Types.Audio audio_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.RegisterRequest.Types.Audio Audio {
+ public global::ARFlow.RegisterClientRequest.Types.Audio Audio {
get { return audio_; }
set {
audio_ = value;
@@ -260,10 +275,10 @@ public string DeviceName {
/// Field number for the "meshing" field.
public const int MeshingFieldNumber = 10;
- private global::ARFlow.RegisterRequest.Types.Meshing meshing_;
+ private global::ARFlow.RegisterClientRequest.Types.Meshing meshing_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.RegisterRequest.Types.Meshing Meshing {
+ public global::ARFlow.RegisterClientRequest.Types.Meshing Meshing {
get { return meshing_; }
set {
meshing_ = value;
@@ -273,12 +288,12 @@ public string DeviceName {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
- return Equals(other as RegisterRequest);
+ return Equals(other as RegisterClientRequest);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(RegisterRequest other) {
+ public bool Equals(RegisterClientRequest other) {
if (ReferenceEquals(other, null)) {
return false;
}
@@ -468,7 +483,7 @@ public int CalculateSize() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(RegisterRequest other) {
+ public void MergeFrom(RegisterClientRequest other) {
if (other == null) {
return;
}
@@ -477,55 +492,55 @@ public void MergeFrom(RegisterRequest other) {
}
if (other.cameraIntrinsics_ != null) {
if (cameraIntrinsics_ == null) {
- CameraIntrinsics = new global::ARFlow.RegisterRequest.Types.CameraIntrinsics();
+ CameraIntrinsics = new global::ARFlow.RegisterClientRequest.Types.CameraIntrinsics();
}
CameraIntrinsics.MergeFrom(other.CameraIntrinsics);
}
if (other.cameraColor_ != null) {
if (cameraColor_ == null) {
- CameraColor = new global::ARFlow.RegisterRequest.Types.CameraColor();
+ CameraColor = new global::ARFlow.RegisterClientRequest.Types.CameraColor();
}
CameraColor.MergeFrom(other.CameraColor);
}
if (other.cameraDepth_ != null) {
if (cameraDepth_ == null) {
- CameraDepth = new global::ARFlow.RegisterRequest.Types.CameraDepth();
+ CameraDepth = new global::ARFlow.RegisterClientRequest.Types.CameraDepth();
}
CameraDepth.MergeFrom(other.CameraDepth);
}
if (other.cameraTransform_ != null) {
if (cameraTransform_ == null) {
- CameraTransform = new global::ARFlow.RegisterRequest.Types.CameraTransform();
+ CameraTransform = new global::ARFlow.RegisterClientRequest.Types.CameraTransform();
}
CameraTransform.MergeFrom(other.CameraTransform);
}
if (other.cameraPointCloud_ != null) {
if (cameraPointCloud_ == null) {
- CameraPointCloud = new global::ARFlow.RegisterRequest.Types.CameraPointCloud();
+ CameraPointCloud = new global::ARFlow.RegisterClientRequest.Types.CameraPointCloud();
}
CameraPointCloud.MergeFrom(other.CameraPointCloud);
}
if (other.cameraPlaneDetection_ != null) {
if (cameraPlaneDetection_ == null) {
- CameraPlaneDetection = new global::ARFlow.RegisterRequest.Types.CameraPlaneDetection();
+ CameraPlaneDetection = new global::ARFlow.RegisterClientRequest.Types.CameraPlaneDetection();
}
CameraPlaneDetection.MergeFrom(other.CameraPlaneDetection);
}
if (other.gyroscope_ != null) {
if (gyroscope_ == null) {
- Gyroscope = new global::ARFlow.RegisterRequest.Types.Gyroscope();
+ Gyroscope = new global::ARFlow.RegisterClientRequest.Types.Gyroscope();
}
Gyroscope.MergeFrom(other.Gyroscope);
}
if (other.audio_ != null) {
if (audio_ == null) {
- Audio = new global::ARFlow.RegisterRequest.Types.Audio();
+ Audio = new global::ARFlow.RegisterClientRequest.Types.Audio();
}
Audio.MergeFrom(other.Audio);
}
if (other.meshing_ != null) {
if (meshing_ == null) {
- Meshing = new global::ARFlow.RegisterRequest.Types.Meshing();
+ Meshing = new global::ARFlow.RegisterClientRequest.Types.Meshing();
}
Meshing.MergeFrom(other.Meshing);
}
@@ -550,63 +565,63 @@ public void MergeFrom(pb::CodedInputStream input) {
}
case 18: {
if (cameraIntrinsics_ == null) {
- CameraIntrinsics = new global::ARFlow.RegisterRequest.Types.CameraIntrinsics();
+ CameraIntrinsics = new global::ARFlow.RegisterClientRequest.Types.CameraIntrinsics();
}
input.ReadMessage(CameraIntrinsics);
break;
}
case 26: {
if (cameraColor_ == null) {
- CameraColor = new global::ARFlow.RegisterRequest.Types.CameraColor();
+ CameraColor = new global::ARFlow.RegisterClientRequest.Types.CameraColor();
}
input.ReadMessage(CameraColor);
break;
}
case 34: {
if (cameraDepth_ == null) {
- CameraDepth = new global::ARFlow.RegisterRequest.Types.CameraDepth();
+ CameraDepth = new global::ARFlow.RegisterClientRequest.Types.CameraDepth();
}
input.ReadMessage(CameraDepth);
break;
}
case 42: {
if (cameraTransform_ == null) {
- CameraTransform = new global::ARFlow.RegisterRequest.Types.CameraTransform();
+ CameraTransform = new global::ARFlow.RegisterClientRequest.Types.CameraTransform();
}
input.ReadMessage(CameraTransform);
break;
}
case 50: {
if (cameraPointCloud_ == null) {
- CameraPointCloud = new global::ARFlow.RegisterRequest.Types.CameraPointCloud();
+ CameraPointCloud = new global::ARFlow.RegisterClientRequest.Types.CameraPointCloud();
}
input.ReadMessage(CameraPointCloud);
break;
}
case 58: {
if (cameraPlaneDetection_ == null) {
- CameraPlaneDetection = new global::ARFlow.RegisterRequest.Types.CameraPlaneDetection();
+ CameraPlaneDetection = new global::ARFlow.RegisterClientRequest.Types.CameraPlaneDetection();
}
input.ReadMessage(CameraPlaneDetection);
break;
}
case 66: {
if (gyroscope_ == null) {
- Gyroscope = new global::ARFlow.RegisterRequest.Types.Gyroscope();
+ Gyroscope = new global::ARFlow.RegisterClientRequest.Types.Gyroscope();
}
input.ReadMessage(Gyroscope);
break;
}
case 74: {
if (audio_ == null) {
- Audio = new global::ARFlow.RegisterRequest.Types.Audio();
+ Audio = new global::ARFlow.RegisterClientRequest.Types.Audio();
}
input.ReadMessage(Audio);
break;
}
case 82: {
if (meshing_ == null) {
- Meshing = new global::ARFlow.RegisterRequest.Types.Meshing();
+ Meshing = new global::ARFlow.RegisterClientRequest.Types.Meshing();
}
input.ReadMessage(Meshing);
break;
@@ -632,63 +647,63 @@ public void MergeFrom(pb::CodedInputStream input) {
}
case 18: {
if (cameraIntrinsics_ == null) {
- CameraIntrinsics = new global::ARFlow.RegisterRequest.Types.CameraIntrinsics();
+ CameraIntrinsics = new global::ARFlow.RegisterClientRequest.Types.CameraIntrinsics();
}
input.ReadMessage(CameraIntrinsics);
break;
}
case 26: {
if (cameraColor_ == null) {
- CameraColor = new global::ARFlow.RegisterRequest.Types.CameraColor();
+ CameraColor = new global::ARFlow.RegisterClientRequest.Types.CameraColor();
}
input.ReadMessage(CameraColor);
break;
}
case 34: {
if (cameraDepth_ == null) {
- CameraDepth = new global::ARFlow.RegisterRequest.Types.CameraDepth();
+ CameraDepth = new global::ARFlow.RegisterClientRequest.Types.CameraDepth();
}
input.ReadMessage(CameraDepth);
break;
}
case 42: {
if (cameraTransform_ == null) {
- CameraTransform = new global::ARFlow.RegisterRequest.Types.CameraTransform();
+ CameraTransform = new global::ARFlow.RegisterClientRequest.Types.CameraTransform();
}
input.ReadMessage(CameraTransform);
break;
}
case 50: {
if (cameraPointCloud_ == null) {
- CameraPointCloud = new global::ARFlow.RegisterRequest.Types.CameraPointCloud();
+ CameraPointCloud = new global::ARFlow.RegisterClientRequest.Types.CameraPointCloud();
}
input.ReadMessage(CameraPointCloud);
break;
}
case 58: {
if (cameraPlaneDetection_ == null) {
- CameraPlaneDetection = new global::ARFlow.RegisterRequest.Types.CameraPlaneDetection();
+ CameraPlaneDetection = new global::ARFlow.RegisterClientRequest.Types.CameraPlaneDetection();
}
input.ReadMessage(CameraPlaneDetection);
break;
}
case 66: {
if (gyroscope_ == null) {
- Gyroscope = new global::ARFlow.RegisterRequest.Types.Gyroscope();
+ Gyroscope = new global::ARFlow.RegisterClientRequest.Types.Gyroscope();
}
input.ReadMessage(Gyroscope);
break;
}
case 74: {
if (audio_ == null) {
- Audio = new global::ARFlow.RegisterRequest.Types.Audio();
+ Audio = new global::ARFlow.RegisterClientRequest.Types.Audio();
}
input.ReadMessage(Audio);
break;
}
case 82: {
if (meshing_ == null) {
- Meshing = new global::ARFlow.RegisterRequest.Types.Meshing();
+ Meshing = new global::ARFlow.RegisterClientRequest.Types.Meshing();
}
input.ReadMessage(Meshing);
break;
@@ -699,7 +714,7 @@ public void MergeFrom(pb::CodedInputStream input) {
#endif
#region Nested types
- /// Container for nested types declared in the RegisterRequest message type.
+ /// Container for nested types declared in the RegisterClientRequest message type.
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static partial class Types {
@@ -718,7 +733,7 @@ public sealed partial class CameraIntrinsics : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.RegisterRequest.Descriptor.NestedTypes[0]; }
+ get { return global::ARFlow.RegisterClientRequest.Descriptor.NestedTypes[0]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -1093,7 +1108,7 @@ public sealed partial class CameraColor : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.RegisterRequest.Descriptor.NestedTypes[1]; }
+ get { return global::ARFlow.RegisterClientRequest.Descriptor.NestedTypes[1]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -1394,7 +1409,7 @@ public sealed partial class CameraDepth : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.RegisterRequest.Descriptor.NestedTypes[2]; }
+ get { return global::ARFlow.RegisterClientRequest.Descriptor.NestedTypes[2]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -1732,7 +1747,7 @@ public sealed partial class CameraTransform : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.RegisterRequest.Descriptor.NestedTypes[3]; }
+ get { return global::ARFlow.RegisterClientRequest.Descriptor.NestedTypes[3]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -1922,7 +1937,7 @@ public sealed partial class CameraPointCloud : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.RegisterRequest.Descriptor.NestedTypes[4]; }
+ get { return global::ARFlow.RegisterClientRequest.Descriptor.NestedTypes[4]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -2149,7 +2164,7 @@ public sealed partial class CameraPlaneDetection : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.RegisterRequest.Descriptor.NestedTypes[6]; }
+ get { return global::ARFlow.RegisterClientRequest.Descriptor.NestedTypes[6]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -2529,7 +2544,7 @@ public sealed partial class Audio : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.RegisterRequest.Descriptor.NestedTypes[7]; }
+ get { return global::ARFlow.RegisterClientRequest.Descriptor.NestedTypes[7]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -2719,7 +2734,7 @@ public sealed partial class Meshing : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.RegisterRequest.Descriptor.NestedTypes[8]; }
+ get { return global::ARFlow.RegisterClientRequest.Descriptor.NestedTypes[8]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -2900,16 +2915,16 @@ public void MergeFrom(pb::CodedInputStream input) {
}
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
- public sealed partial class RegisterResponse : pb::IMessage
+ public sealed partial class RegisterClientResponse : pb::IMessage
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
- private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new RegisterResponse());
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new RegisterClientResponse());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser Parser { get { return _parser; } }
+ public static pb::MessageParser Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@@ -2925,7 +2940,7 @@ public sealed partial class RegisterResponse : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public RegisterResponse() {
+ public RegisterClientResponse() {
OnConstruction();
}
@@ -2933,15 +2948,15 @@ public RegisterResponse() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public RegisterResponse(RegisterResponse other) : this() {
+ public RegisterClientResponse(RegisterClientResponse other) : this() {
uid_ = other.uid_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public RegisterResponse Clone() {
- return new RegisterResponse(this);
+ public RegisterClientResponse Clone() {
+ return new RegisterClientResponse(this);
}
/// Field number for the "uid" field.
@@ -2959,12 +2974,12 @@ public string Uid {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
- return Equals(other as RegisterResponse);
+ return Equals(other as RegisterClientResponse);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(RegisterResponse other) {
+ public bool Equals(RegisterClientResponse other) {
if (ReferenceEquals(other, null)) {
return false;
}
@@ -3037,7 +3052,7 @@ public int CalculateSize() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(RegisterResponse other) {
+ public void MergeFrom(RegisterClientResponse other) {
if (other == null) {
return;
}
@@ -3090,16 +3105,16 @@ public void MergeFrom(pb::CodedInputStream input) {
}
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
- public sealed partial class DataFrameRequest : pb::IMessage
+ public sealed partial class ProcessFrameRequest : pb::IMessage
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
- private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new DataFrameRequest());
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ProcessFrameRequest());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser Parser { get { return _parser; } }
+ public static pb::MessageParser Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@@ -3115,7 +3130,7 @@ public sealed partial class DataFrameRequest : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public DataFrameRequest() {
+ public ProcessFrameRequest() {
OnConstruction();
}
@@ -3123,22 +3138,22 @@ public DataFrameRequest() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public DataFrameRequest(DataFrameRequest other) : this() {
+ public ProcessFrameRequest(ProcessFrameRequest other) : this() {
uid_ = other.uid_;
color_ = other.color_;
depth_ = other.depth_;
transform_ = other.transform_;
planeDetection_ = other.planeDetection_.Clone();
gyroscope_ = other.gyroscope_ != null ? other.gyroscope_.Clone() : null;
- audio_ = other.audio_;
- meshing_ = other.meshing_;
+ audioData_ = other.audioData_.Clone();
+ meshes_ = other.meshes_.Clone();
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public DataFrameRequest Clone() {
- return new DataFrameRequest(this);
+ public ProcessFrameRequest Clone() {
+ return new ProcessFrameRequest(this);
}
/// Field number for the "uid" field.
@@ -3191,60 +3206,61 @@ public string Uid {
/// Field number for the "plane_detection" field.
public const int PlaneDetectionFieldNumber = 5;
- private static readonly pb::FieldCodec _repeated_planeDetection_codec
- = pb::FieldCodec.ForMessage(42, global::ARFlow.DataFrameRequest.Types.Planes.Parser);
- private readonly pbc::RepeatedField planeDetection_ = new pbc::RepeatedField();
+ private static readonly pb::FieldCodec _repeated_planeDetection_codec
+ = pb::FieldCodec.ForMessage(42, global::ARFlow.ProcessFrameRequest.Types.Plane.Parser);
+ private readonly pbc::RepeatedField planeDetection_ = new pbc::RepeatedField();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public pbc::RepeatedField PlaneDetection {
+ public pbc::RepeatedField PlaneDetection {
get { return planeDetection_; }
}
/// Field number for the "gyroscope" field.
public const int GyroscopeFieldNumber = 6;
- private global::ARFlow.DataFrameRequest.Types.gyroscope_data gyroscope_;
+ private global::ARFlow.ProcessFrameRequest.Types.GyroscopeData gyroscope_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.DataFrameRequest.Types.gyroscope_data Gyroscope {
+ public global::ARFlow.ProcessFrameRequest.Types.GyroscopeData Gyroscope {
get { return gyroscope_; }
set {
gyroscope_ = value;
}
}
- /// Field number for the "audio" field.
- public const int AudioFieldNumber = 8;
- private pb::ByteString audio_ = pb::ByteString.Empty;
+ /// Field number for the "audio_data" field.
+ public const int AudioDataFieldNumber = 8;
+ private static readonly pb::FieldCodec _repeated_audioData_codec
+ = pb::FieldCodec.ForFloat(66);
+ private readonly pbc::RepeatedField audioData_ = new pbc::RepeatedField();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public pb::ByteString Audio {
- get { return audio_; }
- set {
- audio_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
+ public pbc::RepeatedField AudioData {
+ get { return audioData_; }
}
- /// Field number for the "meshing" field.
- public const int MeshingFieldNumber = 9;
- private pb::ByteString meshing_ = pb::ByteString.Empty;
+ /// Field number for the "meshes" field.
+ public const int MeshesFieldNumber = 9;
+ private static readonly pb::FieldCodec _repeated_meshes_codec
+ = pb::FieldCodec.ForMessage(74, global::ARFlow.ProcessFrameRequest.Types.Mesh.Parser);
+ private readonly pbc::RepeatedField meshes_ = new pbc::RepeatedField();
+ ///
+ /// Multiple meshes can be sent in a single frame
+ ///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public pb::ByteString Meshing {
- get { return meshing_; }
- set {
- meshing_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
+ public pbc::RepeatedField Meshes {
+ get { return meshes_; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
- return Equals(other as DataFrameRequest);
+ return Equals(other as ProcessFrameRequest);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(DataFrameRequest other) {
+ public bool Equals(ProcessFrameRequest other) {
if (ReferenceEquals(other, null)) {
return false;
}
@@ -3257,8 +3273,8 @@ public bool Equals(DataFrameRequest other) {
if (Transform != other.Transform) return false;
if(!planeDetection_.Equals(other.planeDetection_)) return false;
if (!object.Equals(Gyroscope, other.Gyroscope)) return false;
- if (Audio != other.Audio) return false;
- if (Meshing != other.Meshing) return false;
+ if(!audioData_.Equals(other.audioData_)) return false;
+ if(!meshes_.Equals(other.meshes_)) return false;
return Equals(_unknownFields, other._unknownFields);
}
@@ -3272,8 +3288,8 @@ public override int GetHashCode() {
if (Transform.Length != 0) hash ^= Transform.GetHashCode();
hash ^= planeDetection_.GetHashCode();
if (gyroscope_ != null) hash ^= Gyroscope.GetHashCode();
- if (Audio.Length != 0) hash ^= Audio.GetHashCode();
- if (Meshing.Length != 0) hash ^= Meshing.GetHashCode();
+ hash ^= audioData_.GetHashCode();
+ hash ^= meshes_.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
@@ -3313,14 +3329,8 @@ public void WriteTo(pb::CodedOutputStream output) {
output.WriteRawTag(50);
output.WriteMessage(Gyroscope);
}
- if (Audio.Length != 0) {
- output.WriteRawTag(66);
- output.WriteBytes(Audio);
- }
- if (Meshing.Length != 0) {
- output.WriteRawTag(74);
- output.WriteBytes(Meshing);
- }
+ audioData_.WriteTo(output, _repeated_audioData_codec);
+ meshes_.WriteTo(output, _repeated_meshes_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
@@ -3352,14 +3362,8 @@ public void WriteTo(pb::CodedOutputStream output) {
output.WriteRawTag(50);
output.WriteMessage(Gyroscope);
}
- if (Audio.Length != 0) {
- output.WriteRawTag(66);
- output.WriteBytes(Audio);
- }
- if (Meshing.Length != 0) {
- output.WriteRawTag(74);
- output.WriteBytes(Meshing);
- }
+ audioData_.WriteTo(ref output, _repeated_audioData_codec);
+ meshes_.WriteTo(ref output, _repeated_meshes_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
@@ -3386,12 +3390,8 @@ public int CalculateSize() {
if (gyroscope_ != null) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(Gyroscope);
}
- if (Audio.Length != 0) {
- size += 1 + pb::CodedOutputStream.ComputeBytesSize(Audio);
- }
- if (Meshing.Length != 0) {
- size += 1 + pb::CodedOutputStream.ComputeBytesSize(Meshing);
- }
+ size += audioData_.CalculateSize(_repeated_audioData_codec);
+ size += meshes_.CalculateSize(_repeated_meshes_codec);
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
@@ -3400,7 +3400,7 @@ public int CalculateSize() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(DataFrameRequest other) {
+ public void MergeFrom(ProcessFrameRequest other) {
if (other == null) {
return;
}
@@ -3419,16 +3419,12 @@ public void MergeFrom(DataFrameRequest other) {
planeDetection_.Add(other.planeDetection_);
if (other.gyroscope_ != null) {
if (gyroscope_ == null) {
- Gyroscope = new global::ARFlow.DataFrameRequest.Types.gyroscope_data();
+ Gyroscope = new global::ARFlow.ProcessFrameRequest.Types.GyroscopeData();
}
Gyroscope.MergeFrom(other.Gyroscope);
}
- if (other.Audio.Length != 0) {
- Audio = other.Audio;
- }
- if (other.Meshing.Length != 0) {
- Meshing = other.Meshing;
- }
+ audioData_.Add(other.audioData_);
+ meshes_.Add(other.meshes_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@@ -3466,17 +3462,18 @@ public void MergeFrom(pb::CodedInputStream input) {
}
case 50: {
if (gyroscope_ == null) {
- Gyroscope = new global::ARFlow.DataFrameRequest.Types.gyroscope_data();
+ Gyroscope = new global::ARFlow.ProcessFrameRequest.Types.GyroscopeData();
}
input.ReadMessage(Gyroscope);
break;
}
- case 66: {
- Audio = input.ReadBytes();
+ case 66:
+ case 69: {
+ audioData_.AddEntriesFrom(input, _repeated_audioData_codec);
break;
}
case 74: {
- Meshing = input.ReadBytes();
+ meshes_.AddEntriesFrom(input, _repeated_meshes_codec);
break;
}
}
@@ -3516,17 +3513,18 @@ public void MergeFrom(pb::CodedInputStream input) {
}
case 50: {
if (gyroscope_ == null) {
- Gyroscope = new global::ARFlow.DataFrameRequest.Types.gyroscope_data();
+ Gyroscope = new global::ARFlow.ProcessFrameRequest.Types.GyroscopeData();
}
input.ReadMessage(Gyroscope);
break;
}
- case 66: {
- Audio = input.ReadBytes();
+ case 66:
+ case 69: {
+ audioData_.AddEntriesFrom(ref input, _repeated_audioData_codec);
break;
}
case 74: {
- Meshing = input.ReadBytes();
+ meshes_.AddEntriesFrom(ref input, _repeated_meshes_codec);
break;
}
}
@@ -3535,7 +3533,7 @@ public void MergeFrom(pb::CodedInputStream input) {
#endif
#region Nested types
- /// Container for nested types declared in the DataFrameRequest message type.
+ /// Container for nested types declared in the ProcessFrameRequest message type.
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static partial class Types {
@@ -3554,7 +3552,7 @@ public sealed partial class Vector3 : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.DataFrameRequest.Descriptor.NestedTypes[0]; }
+ get { return global::ARFlow.ProcessFrameRequest.Descriptor.NestedTypes[0]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -3818,7 +3816,7 @@ public sealed partial class Vector2 : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.DataFrameRequest.Descriptor.NestedTypes[1]; }
+ get { return global::ARFlow.ProcessFrameRequest.Descriptor.NestedTypes[1]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -4031,21 +4029,21 @@ public void MergeFrom(pb::CodedInputStream input) {
}
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
- public sealed partial class Planes : pb::IMessage
+ public sealed partial class Plane : pb::IMessage
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
- private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Planes());
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Plane());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser Parser { get { return _parser; } }
+ public static pb::MessageParser Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.DataFrameRequest.Descriptor.NestedTypes[2]; }
+ get { return global::ARFlow.ProcessFrameRequest.Descriptor.NestedTypes[2]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -4056,7 +4054,7 @@ public sealed partial class Planes : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public Planes() {
+ public Plane() {
OnConstruction();
}
@@ -4064,25 +4062,26 @@ public Planes() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public Planes(Planes other) : this() {
+ public Plane(Plane other) : this() {
center_ = other.center_ != null ? other.center_.Clone() : null;
normal_ = other.normal_ != null ? other.normal_.Clone() : null;
size_ = other.size_ != null ? other.size_.Clone() : null;
+ boundaryPoints_ = other.boundaryPoints_.Clone();
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public Planes Clone() {
- return new Planes(this);
+ public Plane Clone() {
+ return new Plane(this);
}
/// Field number for the "center" field.
public const int CenterFieldNumber = 1;
- private global::ARFlow.DataFrameRequest.Types.Vector3 center_;
+ private global::ARFlow.ProcessFrameRequest.Types.Vector3 center_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.DataFrameRequest.Types.Vector3 Center {
+ public global::ARFlow.ProcessFrameRequest.Types.Vector3 Center {
get { return center_; }
set {
center_ = value;
@@ -4091,10 +4090,10 @@ public Planes Clone() {
/// Field number for the "normal" field.
public const int NormalFieldNumber = 2;
- private global::ARFlow.DataFrameRequest.Types.Vector3 normal_;
+ private global::ARFlow.ProcessFrameRequest.Types.Vector3 normal_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.DataFrameRequest.Types.Vector3 Normal {
+ public global::ARFlow.ProcessFrameRequest.Types.Vector3 Normal {
get { return normal_; }
set {
normal_ = value;
@@ -4103,25 +4102,36 @@ public Planes Clone() {
/// Field number for the "size" field.
public const int SizeFieldNumber = 3;
- private global::ARFlow.DataFrameRequest.Types.Vector2 size_;
+ private global::ARFlow.ProcessFrameRequest.Types.Vector2 size_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.DataFrameRequest.Types.Vector2 Size {
+ public global::ARFlow.ProcessFrameRequest.Types.Vector2 Size {
get { return size_; }
set {
size_ = value;
}
}
+ /// Field number for the "boundary_points" field.
+ public const int BoundaryPointsFieldNumber = 4;
+ private static readonly pb::FieldCodec _repeated_boundaryPoints_codec
+ = pb::FieldCodec.ForMessage(34, global::ARFlow.ProcessFrameRequest.Types.Vector2.Parser);
+ private readonly pbc::RepeatedField boundaryPoints_ = new pbc::RepeatedField();
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public pbc::RepeatedField BoundaryPoints {
+ get { return boundaryPoints_; }
+ }
+
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
- return Equals(other as Planes);
+ return Equals(other as Plane);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(Planes other) {
+ public bool Equals(Plane other) {
if (ReferenceEquals(other, null)) {
return false;
}
@@ -4131,6 +4141,7 @@ public bool Equals(Planes other) {
if (!object.Equals(Center, other.Center)) return false;
if (!object.Equals(Normal, other.Normal)) return false;
if (!object.Equals(Size, other.Size)) return false;
+ if(!boundaryPoints_.Equals(other.boundaryPoints_)) return false;
return Equals(_unknownFields, other._unknownFields);
}
@@ -4141,6 +4152,7 @@ public override int GetHashCode() {
if (center_ != null) hash ^= Center.GetHashCode();
if (normal_ != null) hash ^= Normal.GetHashCode();
if (size_ != null) hash ^= Size.GetHashCode();
+ hash ^= boundaryPoints_.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
@@ -4171,6 +4183,7 @@ public void WriteTo(pb::CodedOutputStream output) {
output.WriteRawTag(26);
output.WriteMessage(Size);
}
+ boundaryPoints_.WriteTo(output, _repeated_boundaryPoints_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
@@ -4193,6 +4206,7 @@ public void WriteTo(pb::CodedOutputStream output) {
output.WriteRawTag(26);
output.WriteMessage(Size);
}
+ boundaryPoints_.WriteTo(ref output, _repeated_boundaryPoints_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
@@ -4212,6 +4226,7 @@ public int CalculateSize() {
if (size_ != null) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(Size);
}
+ size += boundaryPoints_.CalculateSize(_repeated_boundaryPoints_codec);
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
@@ -4220,28 +4235,29 @@ public int CalculateSize() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(Planes other) {
+ public void MergeFrom(Plane other) {
if (other == null) {
return;
}
if (other.center_ != null) {
if (center_ == null) {
- Center = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Center = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
Center.MergeFrom(other.Center);
}
if (other.normal_ != null) {
if (normal_ == null) {
- Normal = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Normal = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
Normal.MergeFrom(other.Normal);
}
if (other.size_ != null) {
if (size_ == null) {
- Size = new global::ARFlow.DataFrameRequest.Types.Vector2();
+ Size = new global::ARFlow.ProcessFrameRequest.Types.Vector2();
}
Size.MergeFrom(other.Size);
}
+ boundaryPoints_.Add(other.boundaryPoints_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@@ -4259,25 +4275,29 @@ public void MergeFrom(pb::CodedInputStream input) {
break;
case 10: {
if (center_ == null) {
- Center = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Center = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
input.ReadMessage(Center);
break;
}
case 18: {
if (normal_ == null) {
- Normal = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Normal = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
input.ReadMessage(Normal);
break;
}
case 26: {
if (size_ == null) {
- Size = new global::ARFlow.DataFrameRequest.Types.Vector2();
+ Size = new global::ARFlow.ProcessFrameRequest.Types.Vector2();
}
input.ReadMessage(Size);
break;
}
+ case 34: {
+ boundaryPoints_.AddEntriesFrom(input, _repeated_boundaryPoints_codec);
+ break;
+ }
}
}
#endif
@@ -4295,25 +4315,29 @@ public void MergeFrom(pb::CodedInputStream input) {
break;
case 10: {
if (center_ == null) {
- Center = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Center = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
input.ReadMessage(Center);
break;
}
case 18: {
if (normal_ == null) {
- Normal = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Normal = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
input.ReadMessage(Normal);
break;
}
case 26: {
if (size_ == null) {
- Size = new global::ARFlow.DataFrameRequest.Types.Vector2();
+ Size = new global::ARFlow.ProcessFrameRequest.Types.Vector2();
}
input.ReadMessage(Size);
break;
}
+ case 34: {
+ boundaryPoints_.AddEntriesFrom(ref input, _repeated_boundaryPoints_codec);
+ break;
+ }
}
}
}
@@ -4336,7 +4360,7 @@ public sealed partial class Quaternion : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.DataFrameRequest.Descriptor.NestedTypes[3]; }
+ get { return global::ARFlow.ProcessFrameRequest.Descriptor.NestedTypes[3]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -4623,21 +4647,21 @@ public void MergeFrom(pb::CodedInputStream input) {
}
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
- public sealed partial class gyroscope_data : pb::IMessage
+ public sealed partial class GyroscopeData : pb::IMessage
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
- private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new gyroscope_data());
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new GyroscopeData());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser Parser { get { return _parser; } }
+ public static pb::MessageParser Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
- get { return global::ARFlow.DataFrameRequest.Descriptor.NestedTypes[4]; }
+ get { return global::ARFlow.ProcessFrameRequest.Descriptor.NestedTypes[4]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -4648,7 +4672,7 @@ public sealed partial class gyroscope_data : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public gyroscope_data() {
+ public GyroscopeData() {
OnConstruction();
}
@@ -4656,7 +4680,7 @@ public gyroscope_data() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public gyroscope_data(gyroscope_data other) : this() {
+ public GyroscopeData(GyroscopeData other) : this() {
attitude_ = other.attitude_ != null ? other.attitude_.Clone() : null;
rotationRate_ = other.rotationRate_ != null ? other.rotationRate_.Clone() : null;
gravity_ = other.gravity_ != null ? other.gravity_.Clone() : null;
@@ -4666,16 +4690,16 @@ public gyroscope_data(gyroscope_data other) : this() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public gyroscope_data Clone() {
- return new gyroscope_data(this);
+ public GyroscopeData Clone() {
+ return new GyroscopeData(this);
}
/// Field number for the "attitude" field.
public const int AttitudeFieldNumber = 1;
- private global::ARFlow.DataFrameRequest.Types.Quaternion attitude_;
+ private global::ARFlow.ProcessFrameRequest.Types.Quaternion attitude_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.DataFrameRequest.Types.Quaternion Attitude {
+ public global::ARFlow.ProcessFrameRequest.Types.Quaternion Attitude {
get { return attitude_; }
set {
attitude_ = value;
@@ -4684,10 +4708,10 @@ public gyroscope_data Clone() {
/// Field number for the "rotation_rate" field.
public const int RotationRateFieldNumber = 2;
- private global::ARFlow.DataFrameRequest.Types.Vector3 rotationRate_;
+ private global::ARFlow.ProcessFrameRequest.Types.Vector3 rotationRate_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.DataFrameRequest.Types.Vector3 RotationRate {
+ public global::ARFlow.ProcessFrameRequest.Types.Vector3 RotationRate {
get { return rotationRate_; }
set {
rotationRate_ = value;
@@ -4696,10 +4720,10 @@ public gyroscope_data Clone() {
/// Field number for the "gravity" field.
public const int GravityFieldNumber = 3;
- private global::ARFlow.DataFrameRequest.Types.Vector3 gravity_;
+ private global::ARFlow.ProcessFrameRequest.Types.Vector3 gravity_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.DataFrameRequest.Types.Vector3 Gravity {
+ public global::ARFlow.ProcessFrameRequest.Types.Vector3 Gravity {
get { return gravity_; }
set {
gravity_ = value;
@@ -4708,10 +4732,10 @@ public gyroscope_data Clone() {
/// Field number for the "acceleration" field.
public const int AccelerationFieldNumber = 4;
- private global::ARFlow.DataFrameRequest.Types.Vector3 acceleration_;
+ private global::ARFlow.ProcessFrameRequest.Types.Vector3 acceleration_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::ARFlow.DataFrameRequest.Types.Vector3 Acceleration {
+ public global::ARFlow.ProcessFrameRequest.Types.Vector3 Acceleration {
get { return acceleration_; }
set {
acceleration_ = value;
@@ -4721,12 +4745,12 @@ public gyroscope_data Clone() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
- return Equals(other as gyroscope_data);
+ return Equals(other as GyroscopeData);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(gyroscope_data other) {
+ public bool Equals(GyroscopeData other) {
if (ReferenceEquals(other, null)) {
return false;
}
@@ -4838,31 +4862,31 @@ public int CalculateSize() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(gyroscope_data other) {
+ public void MergeFrom(GyroscopeData other) {
if (other == null) {
return;
}
if (other.attitude_ != null) {
if (attitude_ == null) {
- Attitude = new global::ARFlow.DataFrameRequest.Types.Quaternion();
+ Attitude = new global::ARFlow.ProcessFrameRequest.Types.Quaternion();
}
Attitude.MergeFrom(other.Attitude);
}
if (other.rotationRate_ != null) {
if (rotationRate_ == null) {
- RotationRate = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ RotationRate = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
RotationRate.MergeFrom(other.RotationRate);
}
if (other.gravity_ != null) {
if (gravity_ == null) {
- Gravity = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Gravity = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
Gravity.MergeFrom(other.Gravity);
}
if (other.acceleration_ != null) {
if (acceleration_ == null) {
- Acceleration = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Acceleration = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
Acceleration.MergeFrom(other.Acceleration);
}
@@ -4883,28 +4907,28 @@ public void MergeFrom(pb::CodedInputStream input) {
break;
case 10: {
if (attitude_ == null) {
- Attitude = new global::ARFlow.DataFrameRequest.Types.Quaternion();
+ Attitude = new global::ARFlow.ProcessFrameRequest.Types.Quaternion();
}
input.ReadMessage(Attitude);
break;
}
case 18: {
if (rotationRate_ == null) {
- RotationRate = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ RotationRate = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
input.ReadMessage(RotationRate);
break;
}
case 26: {
if (gravity_ == null) {
- Gravity = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Gravity = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
input.ReadMessage(Gravity);
break;
}
case 34: {
if (acceleration_ == null) {
- Acceleration = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Acceleration = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
input.ReadMessage(Acceleration);
break;
@@ -4926,28 +4950,28 @@ public void MergeFrom(pb::CodedInputStream input) {
break;
case 10: {
if (attitude_ == null) {
- Attitude = new global::ARFlow.DataFrameRequest.Types.Quaternion();
+ Attitude = new global::ARFlow.ProcessFrameRequest.Types.Quaternion();
}
input.ReadMessage(Attitude);
break;
}
case 18: {
if (rotationRate_ == null) {
- RotationRate = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ RotationRate = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
input.ReadMessage(RotationRate);
break;
}
case 26: {
if (gravity_ == null) {
- Gravity = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Gravity = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
input.ReadMessage(Gravity);
break;
}
case 34: {
if (acceleration_ == null) {
- Acceleration = new global::ARFlow.DataFrameRequest.Types.Vector3();
+ Acceleration = new global::ARFlow.ProcessFrameRequest.Types.Vector3();
}
input.ReadMessage(Acceleration);
break;
@@ -4959,22 +4983,215 @@ public void MergeFrom(pb::CodedInputStream input) {
}
+ ///
+ /// Represent a mesh
+ ///
+ [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
+ public sealed partial class Mesh : pb::IMessage
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Mesh());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::ARFlow.ProcessFrameRequest.Descriptor.NestedTypes[5]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public Mesh() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public Mesh(Mesh other) : this() {
+ data_ = other.data_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public Mesh Clone() {
+ return new Mesh(this);
+ }
+
+ /// Field number for the "data" field.
+ public const int DataFieldNumber = 1;
+ private pb::ByteString data_ = pb::ByteString.Empty;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public pb::ByteString Data {
+ get { return data_; }
+ set {
+ data_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override bool Equals(object other) {
+ return Equals(other as Mesh);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool Equals(Mesh other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Data != other.Data) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (Data.Length != 0) hash ^= Data.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (Data.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteBytes(Data);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (Data.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteBytes(Data);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int CalculateSize() {
+ int size = 0;
+ if (Data.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeBytesSize(Data);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(Mesh other) {
+ if (other == null) {
+ return;
+ }
+ if (other.Data.Length != 0) {
+ Data = other.Data;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 10: {
+ Data = input.ReadBytes();
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 10: {
+ Data = input.ReadBytes();
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
}
#endregion
}
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
- public sealed partial class DataFrameResponse : pb::IMessage
+ public sealed partial class ProcessFrameResponse : pb::IMessage
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
- private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new DataFrameResponse());
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ProcessFrameResponse());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser Parser { get { return _parser; } }
+ public static pb::MessageParser Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@@ -4990,7 +5207,7 @@ public sealed partial class DataFrameResponse : pb::IMessage
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public DataFrameResponse() {
+ public ProcessFrameResponse() {
OnConstruction();
}
@@ -4998,15 +5215,15 @@ public DataFrameResponse() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public DataFrameResponse(DataFrameResponse other) : this() {
+ public ProcessFrameResponse(ProcessFrameResponse other) : this() {
message_ = other.message_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public DataFrameResponse Clone() {
- return new DataFrameResponse(this);
+ public ProcessFrameResponse Clone() {
+ return new ProcessFrameResponse(this);
}
/// Field number for the "message" field.
@@ -5024,12 +5241,12 @@ public string Message {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
- return Equals(other as DataFrameResponse);
+ return Equals(other as ProcessFrameResponse);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(DataFrameResponse other) {
+ public bool Equals(ProcessFrameResponse other) {
if (ReferenceEquals(other, null)) {
return false;
}
@@ -5102,7 +5319,7 @@ public int CalculateSize() {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(DataFrameResponse other) {
+ public void MergeFrom(ProcessFrameResponse other) {
if (other == null) {
return;
}
diff --git a/unity/Assets/Scripts/ARFlow/Service.cs.meta b/unity/Assets/ARFlowPackage/ARFlow/Service.cs.meta
similarity index 100%
rename from unity/Assets/Scripts/ARFlow/Service.cs.meta
rename to unity/Assets/ARFlowPackage/ARFlow/Service.cs.meta
diff --git a/unity/Assets/Scripts/ARFlow/ServiceGrpc.cs b/unity/Assets/ARFlowPackage/ARFlow/ServiceGrpc.cs
similarity index 56%
rename from unity/Assets/Scripts/ARFlow/ServiceGrpc.cs
rename to unity/Assets/ARFlowPackage/ARFlow/ServiceGrpc.cs
index 9673caf..54d8019 100644
--- a/unity/Assets/Scripts/ARFlow/ServiceGrpc.cs
+++ b/unity/Assets/ARFlowPackage/ARFlow/ServiceGrpc.cs
@@ -1,6 +1,6 @@
//
// Generated by the protocol buffer compiler. DO NOT EDIT!
-// source: protos/arflow/service.proto
+// source: protos/arflow_grpc/service.proto
//
#pragma warning disable 0414, 1591, 8981, 0612
#region Designer generated code
@@ -9,11 +9,11 @@
namespace ARFlow {
///
- /// The ARFlowService service definition.
+ /// The ARFlow service definition.
///
public static partial class ARFlowService
{
- static readonly string __ServiceName = "ARFlowService";
+ static readonly string __ServiceName = "arflow.v1.ARFlowService";
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static void __Helper_SerializeMessage(global::Google.Protobuf.IMessage message, grpc::SerializationContext context)
@@ -49,29 +49,29 @@ static T __Helper_DeserializeMessage(grpc::DeserializationContext context, gl
}
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- static readonly grpc::Marshaller __Marshaller_RegisterRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::ARFlow.RegisterRequest.Parser));
+ static readonly grpc::Marshaller __Marshaller_arflow_v1_RegisterClientRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::ARFlow.RegisterClientRequest.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- static readonly grpc::Marshaller __Marshaller_RegisterResponse = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::ARFlow.RegisterResponse.Parser));
+ static readonly grpc::Marshaller __Marshaller_arflow_v1_RegisterClientResponse = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::ARFlow.RegisterClientResponse.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- static readonly grpc::Marshaller __Marshaller_DataFrameRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::ARFlow.DataFrameRequest.Parser));
+ static readonly grpc::Marshaller __Marshaller_arflow_v1_ProcessFrameRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::ARFlow.ProcessFrameRequest.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- static readonly grpc::Marshaller __Marshaller_DataFrameResponse = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::ARFlow.DataFrameResponse.Parser));
+ static readonly grpc::Marshaller __Marshaller_arflow_v1_ProcessFrameResponse = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::ARFlow.ProcessFrameResponse.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- static readonly grpc::Method __Method_register = new grpc::Method(
+ static readonly grpc::Method __Method_RegisterClient = new grpc::Method(
grpc::MethodType.Unary,
__ServiceName,
- "register",
- __Marshaller_RegisterRequest,
- __Marshaller_RegisterResponse);
+ "RegisterClient",
+ __Marshaller_arflow_v1_RegisterClientRequest,
+ __Marshaller_arflow_v1_RegisterClientResponse);
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- static readonly grpc::Method __Method_data_frame = new grpc::Method(
+ static readonly grpc::Method __Method_ProcessFrame = new grpc::Method(
grpc::MethodType.Unary,
__ServiceName,
- "data_frame",
- __Marshaller_DataFrameRequest,
- __Marshaller_DataFrameResponse);
+ "ProcessFrame",
+ __Marshaller_arflow_v1_ProcessFrameRequest,
+ __Marshaller_arflow_v1_ProcessFrameResponse);
/// Service descriptor
public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
@@ -84,25 +84,33 @@ static T __Helper_DeserializeMessage(grpc::DeserializationContext context, gl
public abstract partial class ARFlowServiceBase
{
///
- /// Registers a device with the given specifications.
+ /// Registers a client with the given specifications.
+ ///
+ /// The client is registered with the server and is assigned a unique identifier.
+ /// The client can then send data frames to the server using the assigned identifier.
///
/// The request received from the client.
/// The context of the server-side call handler being invoked.
/// The response to send back to the client (wrapped by a task).
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- public virtual global::System.Threading.Tasks.Task register(global::ARFlow.RegisterRequest request, grpc::ServerCallContext context)
+ public virtual global::System.Threading.Tasks.Task RegisterClient(global::ARFlow.RegisterClientRequest request, grpc::ServerCallContext context)
{
throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
///
- /// Sends a data frame from a device.
+ /// Accepts a data frame from a client, returning an acknowledgment.
+ ///
+ /// Errors:
+ /// - NOT_FOUND: If the client configuration is not found.
+ /// - INVALID_ARGUMENT: If the color data type is not recognized or the depth data type
+ /// is not recognized or if the request's data cannot be decoded (e.g., corrupted or invalid data).
///
/// The request received from the client.
/// The context of the server-side call handler being invoked.
/// The response to send back to the client (wrapped by a task).
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- public virtual global::System.Threading.Tasks.Task data_frame(global::ARFlow.DataFrameRequest request, grpc::ServerCallContext context)
+ public virtual global::System.Threading.Tasks.Task ProcessFrame(global::ARFlow.ProcessFrameRequest request, grpc::ServerCallContext context)
{
throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
@@ -137,7 +145,10 @@ protected ARFlowServiceClient(ClientBaseConfiguration configuration) : base(conf
}
///
- /// Registers a device with the given specifications.
+ /// Registers a client with the given specifications.
+ ///
+ /// The client is registered with the server and is assigned a unique identifier.
+ /// The client can then send data frames to the server using the assigned identifier.
///
/// The request to send to the server.
/// The initial metadata to send with the call. This parameter is optional.
@@ -145,23 +156,29 @@ protected ARFlowServiceClient(ClientBaseConfiguration configuration) : base(conf
/// An optional token for canceling the call.
/// The response received from the server.
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- public virtual global::ARFlow.RegisterResponse register(global::ARFlow.RegisterRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+ public virtual global::ARFlow.RegisterClientResponse RegisterClient(global::ARFlow.RegisterClientRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
- return register(request, new grpc::CallOptions(headers, deadline, cancellationToken));
+ return RegisterClient(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// Registers a device with the given specifications.
+ /// Registers a client with the given specifications.
+ ///
+ /// The client is registered with the server and is assigned a unique identifier.
+ /// The client can then send data frames to the server using the assigned identifier.
///
/// The request to send to the server.
/// The options for the call.
/// The response received from the server.
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- public virtual global::ARFlow.RegisterResponse register(global::ARFlow.RegisterRequest request, grpc::CallOptions options)
+ public virtual global::ARFlow.RegisterClientResponse RegisterClient(global::ARFlow.RegisterClientRequest request, grpc::CallOptions options)
{
- return CallInvoker.BlockingUnaryCall(__Method_register, null, options, request);
+ return CallInvoker.BlockingUnaryCall(__Method_RegisterClient, null, options, request);
}
///
- /// Registers a device with the given specifications.
+ /// Registers a client with the given specifications.
+ ///
+ /// The client is registered with the server and is assigned a unique identifier.
+ /// The client can then send data frames to the server using the assigned identifier.
///
/// The request to send to the server.
/// The initial metadata to send with the call. This parameter is optional.
@@ -169,23 +186,31 @@ protected ARFlowServiceClient(ClientBaseConfiguration configuration) : base(conf
/// An optional token for canceling the call.
/// The call object.
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- public virtual grpc::AsyncUnaryCall registerAsync(global::ARFlow.RegisterRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+ public virtual grpc::AsyncUnaryCall RegisterClientAsync(global::ARFlow.RegisterClientRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
- return registerAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
+ return RegisterClientAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// Registers a device with the given specifications.
+ /// Registers a client with the given specifications.
+ ///
+ /// The client is registered with the server and is assigned a unique identifier.
+ /// The client can then send data frames to the server using the assigned identifier.
///
/// The request to send to the server.
/// The options for the call.
/// The call object.
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- public virtual grpc::AsyncUnaryCall registerAsync(global::ARFlow.RegisterRequest request, grpc::CallOptions options)
+ public virtual grpc::AsyncUnaryCall RegisterClientAsync(global::ARFlow.RegisterClientRequest request, grpc::CallOptions options)
{
- return CallInvoker.AsyncUnaryCall(__Method_register, null, options, request);
+ return CallInvoker.AsyncUnaryCall(__Method_RegisterClient, null, options, request);
}
///
- /// Sends a data frame from a device.
+ /// Accepts a data frame from a client, returning an acknowledgment.
+ ///
+ /// Errors:
+ /// - NOT_FOUND: If the client configuration is not found.
+ /// - INVALID_ARGUMENT: If the color data type is not recognized or the depth data type
+ /// is not recognized or if the request's data cannot be decoded (e.g., corrupted or invalid data).
///
/// The request to send to the server.
/// The initial metadata to send with the call. This parameter is optional.
@@ -193,23 +218,33 @@ protected ARFlowServiceClient(ClientBaseConfiguration configuration) : base(conf
/// An optional token for canceling the call.
/// The response received from the server.
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- public virtual global::ARFlow.DataFrameResponse data_frame(global::ARFlow.DataFrameRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+ public virtual global::ARFlow.ProcessFrameResponse ProcessFrame(global::ARFlow.ProcessFrameRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
- return data_frame(request, new grpc::CallOptions(headers, deadline, cancellationToken));
+ return ProcessFrame(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// Sends a data frame from a device.
+ /// Accepts a data frame from a client, returning an acknowledgment.
+ ///
+ /// Errors:
+ /// - NOT_FOUND: If the client configuration is not found.
+ /// - INVALID_ARGUMENT: If the color data type is not recognized or the depth data type
+ /// is not recognized or if the request's data cannot be decoded (e.g., corrupted or invalid data).
///
/// The request to send to the server.
/// The options for the call.
/// The response received from the server.
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- public virtual global::ARFlow.DataFrameResponse data_frame(global::ARFlow.DataFrameRequest request, grpc::CallOptions options)
+ public virtual global::ARFlow.ProcessFrameResponse ProcessFrame(global::ARFlow.ProcessFrameRequest request, grpc::CallOptions options)
{
- return CallInvoker.BlockingUnaryCall(__Method_data_frame, null, options, request);
+ return CallInvoker.BlockingUnaryCall(__Method_ProcessFrame, null, options, request);
}
///
- /// Sends a data frame from a device.
+ /// Accepts a data frame from a client, returning an acknowledgment.
+ ///
+ /// Errors:
+ /// - NOT_FOUND: If the client configuration is not found.
+ /// - INVALID_ARGUMENT: If the color data type is not recognized or the depth data type
+ /// is not recognized or if the request's data cannot be decoded (e.g., corrupted or invalid data).
///
/// The request to send to the server.
/// The initial metadata to send with the call. This parameter is optional.
@@ -217,20 +252,25 @@ protected ARFlowServiceClient(ClientBaseConfiguration configuration) : base(conf
/// An optional token for canceling the call.
/// The call object.
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- public virtual grpc::AsyncUnaryCall data_frameAsync(global::ARFlow.DataFrameRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+ public virtual grpc::AsyncUnaryCall ProcessFrameAsync(global::ARFlow.ProcessFrameRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
- return data_frameAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
+ return ProcessFrameAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// Sends a data frame from a device.
+ /// Accepts a data frame from a client, returning an acknowledgment.
+ ///
+ /// Errors:
+ /// - NOT_FOUND: If the client configuration is not found.
+ /// - INVALID_ARGUMENT: If the color data type is not recognized or the depth data type
+ /// is not recognized or if the request's data cannot be decoded (e.g., corrupted or invalid data).
///
/// The request to send to the server.
/// The options for the call.
/// The call object.
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
- public virtual grpc::AsyncUnaryCall data_frameAsync(global::ARFlow.DataFrameRequest request, grpc::CallOptions options)
+ public virtual grpc::AsyncUnaryCall ProcessFrameAsync(global::ARFlow.ProcessFrameRequest request, grpc::CallOptions options)
{
- return CallInvoker.AsyncUnaryCall(__Method_data_frame, null, options, request);
+ return CallInvoker.AsyncUnaryCall(__Method_ProcessFrame, null, options, request);
}
/// Creates a new instance of client from given ClientBaseConfiguration .
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
@@ -246,8 +286,8 @@ protected override ARFlowServiceClient NewInstance(ClientBaseConfiguration confi
public static grpc::ServerServiceDefinition BindService(ARFlowServiceBase serviceImpl)
{
return grpc::ServerServiceDefinition.CreateBuilder()
- .AddMethod(__Method_register, serviceImpl.register)
- .AddMethod(__Method_data_frame, serviceImpl.data_frame).Build();
+ .AddMethod(__Method_RegisterClient, serviceImpl.RegisterClient)
+ .AddMethod(__Method_ProcessFrame, serviceImpl.ProcessFrame).Build();
}
/// Register service method with a service binder with or without implementation. Useful when customizing the service binding logic.
@@ -257,8 +297,8 @@ protected override ARFlowServiceClient NewInstance(ClientBaseConfiguration confi
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public static void BindService(grpc::ServiceBinderBase serviceBinder, ARFlowServiceBase serviceImpl)
{
- serviceBinder.AddMethod(__Method_register, serviceImpl == null ? null : new grpc::UnaryServerMethod(serviceImpl.register));
- serviceBinder.AddMethod(__Method_data_frame, serviceImpl == null ? null : new grpc::UnaryServerMethod(serviceImpl.data_frame));
+ serviceBinder.AddMethod(__Method_RegisterClient, serviceImpl == null ? null : new grpc::UnaryServerMethod(serviceImpl.RegisterClient));
+ serviceBinder.AddMethod(__Method_ProcessFrame, serviceImpl == null ? null : new grpc::UnaryServerMethod(serviceImpl.ProcessFrame));
}
}
diff --git a/unity/Assets/Scripts/ARFlow/ServiceGrpc.cs.meta b/unity/Assets/ARFlowPackage/ARFlow/ServiceGrpc.cs.meta
similarity index 100%
rename from unity/Assets/Scripts/ARFlow/ServiceGrpc.cs.meta
rename to unity/Assets/ARFlowPackage/ARFlow/ServiceGrpc.cs.meta
diff --git a/unity/Assets/Scripts/ARFlow/XRCpuImageExt.cs b/unity/Assets/ARFlowPackage/ARFlow/XRCpuImageExt.cs
similarity index 100%
rename from unity/Assets/Scripts/ARFlow/XRCpuImageExt.cs
rename to unity/Assets/ARFlowPackage/ARFlow/XRCpuImageExt.cs
diff --git a/unity/Assets/Scripts/ARFlow/XRCpuImageExt.cs.meta b/unity/Assets/ARFlowPackage/ARFlow/XRCpuImageExt.cs.meta
similarity index 100%
rename from unity/Assets/Scripts/ARFlow/XRCpuImageExt.cs.meta
rename to unity/Assets/ARFlowPackage/ARFlow/XRCpuImageExt.cs.meta
diff --git a/unity/Assets/ARFlowPackage/ARFlow/package.json b/unity/Assets/ARFlowPackage/ARFlow/package.json
new file mode 100644
index 0000000..e09b506
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "com.cakelab.arflow",
+ "version": "0.0.4",
+ "displayName": "ARFlow Client",
+ "description": "The ARFlow client is responsible for on-device AR data collection and high-performance AR data streaming. We implement the ARFlow client as a Unity application that can be easily ported to different platforms and devices.",
+ "unity": "2022.3",
+ "documentationUrl": "https://cake.wpi.edu/ARFlow/",
+ "changelogUrl": "https://github.com/cake-lab/ARFlow",
+ "keywords": [
+ "AR",
+ "ARFoundation",
+ "Client"
+ ],
+ "author": {
+ "name": "Cake lab",
+ "url": "https://cake.wpi.edu/"
+ }
+}
diff --git a/unity/Assets/ARFlowPackage/ARFlow/package.json.meta b/unity/Assets/ARFlowPackage/ARFlow/package.json.meta
new file mode 100644
index 0000000..79c25d2
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/ARFlow/package.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ba3c344018f7b03479c6d356798b997b
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/ARFlowPackage/LICENSE.md b/unity/Assets/ARFlowPackage/LICENSE.md
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/LICENSE.md
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+ .
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/unity/Assets/ARFlowPackage/LICENSE.md.meta b/unity/Assets/ARFlowPackage/LICENSE.md.meta
new file mode 100644
index 0000000..9d63477
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/LICENSE.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c02948bcc795db041b123e58f4ad685a
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/ARFlowPackage/Third Party Notices.md b/unity/Assets/ARFlowPackage/Third Party Notices.md
new file mode 100644
index 0000000..39aa845
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/Third Party Notices.md
@@ -0,0 +1,10 @@
+This package contains third-party software components governed by the license(s) indicated below:
+
+Component Name: YetAnotherHttpHandler
+License Type: "MIT"
+[YetAnotherHttpHandler License](https://opensource.org/license/mit)
+
+Component Name: DracoUnity
+License Type: "Apache-2.0"
+[DracoUnity License](https://www.apache.org/licenses/LICENSE-2.0)
+
diff --git a/unity/Assets/ARFlowPackage/Third Party Notices.md.meta b/unity/Assets/ARFlowPackage/Third Party Notices.md.meta
new file mode 100644
index 0000000..e014d3b
--- /dev/null
+++ b/unity/Assets/ARFlowPackage/Third Party Notices.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d620952f90800d54da11a5b1f4ca5cc4
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/ARFlowTests.meta b/unity/Assets/ARFlowTests.meta
new file mode 100644
index 0000000..7282650
--- /dev/null
+++ b/unity/Assets/ARFlowTests.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6a36289ec25cace4ab3d829cf166aaf2
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/ARFlowTests/ARFlowTests.asmdef b/unity/Assets/ARFlowTests/ARFlowTests.asmdef
new file mode 100644
index 0000000..85c09ee
--- /dev/null
+++ b/unity/Assets/ARFlowTests/ARFlowTests.asmdef
@@ -0,0 +1,22 @@
+{
+ "name": "ARFlowTests",
+ "rootNamespace": "",
+ "references": [
+ "UnityEngine.TestRunner",
+ "UnityEditor.TestRunner",
+ "ARFlow"
+ ],
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": true,
+ "precompiledReferences": [
+ "nunit.framework.dll"
+ ],
+ "autoReferenced": false,
+ "defineConstraints": [
+ "UNITY_INCLUDE_TESTS"
+ ],
+ "versionDefines": [],
+ "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/unity/Assets/ARFlowTests/ARFlowTests.asmdef.meta b/unity/Assets/ARFlowTests/ARFlowTests.asmdef.meta
new file mode 100644
index 0000000..5a0ae8c
--- /dev/null
+++ b/unity/Assets/ARFlowTests/ARFlowTests.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5c7d58c7c43542d4ab4fa4c8f2c39b45
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/ARFlowTests/TestClient.cs b/unity/Assets/ARFlowTests/TestClient.cs
new file mode 100644
index 0000000..31196f9
--- /dev/null
+++ b/unity/Assets/ARFlowTests/TestClient.cs
@@ -0,0 +1,28 @@
+using System.Collections;
+using System.Collections.Generic;
+using NUnit.Framework;
+using UnityEngine;
+using UnityEngine.TestTools;
+
+using ARFlow;
+
+public class TestClient
+{
+ // A Test behaves as an ordinary method
+ [Test]
+ public void TestInitializeCient()
+ {
+ var testAddress = "https://127.0.0.1:8500";
+
+ }
+
+ // A UnityTest behaves like a coroutine in Play Mode. In Edit Mode you can use
+ // `yield return null;` to skip a frame.
+ [UnityTest]
+ public IEnumerator TestClientWithEnumeratorPasses()
+ {
+ // Use the Assert class to test conditions.
+ // Use yield to skip a frame.
+ yield return null;
+ }
+}
diff --git a/unity/Assets/ARFlowTests/TestClient.cs.meta b/unity/Assets/ARFlowTests/TestClient.cs.meta
new file mode 100644
index 0000000..7442460
--- /dev/null
+++ b/unity/Assets/ARFlowTests/TestClient.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 15b29c7bd2d108342b7aa7c0d8a84142
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Images/stanford-bunny.obj.meta b/unity/Assets/Images/stanford-bunny.obj.meta
index 60dd5ce..138913d 100644
--- a/unity/Assets/Images/stanford-bunny.obj.meta
+++ b/unity/Assets/Images/stanford-bunny.obj.meta
@@ -32,7 +32,7 @@ ModelImporter:
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
- isReadable: 0
+ isReadable: 1
meshes:
lODScreenPercentages: []
globalScale: 1
diff --git a/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/LICENSE.TXT b/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/LICENSE.TXT
index fa3121d..984713a 100644
--- a/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/LICENSE.TXT
+++ b/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/LICENSE.TXT
@@ -1,23 +1,23 @@
-The MIT License (MIT)
-
-Copyright (c) .NET Foundation and Contributors
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+The MIT License (MIT)
+
+Copyright (c) .NET Foundation and Contributors
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/Microsoft.Extensions.Logging.Abstractions.nuspec b/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/Microsoft.Extensions.Logging.Abstractions.nuspec
index 2fb9a88..7768083 100644
--- a/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/Microsoft.Extensions.Logging.Abstractions.nuspec
+++ b/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/Microsoft.Extensions.Logging.Abstractions.nuspec
@@ -1,37 +1,37 @@
-
-
-
- Microsoft.Extensions.Logging.Abstractions
- 6.0.0
- Microsoft
- MIT
- https://licenses.nuget.org/MIT
- Icon.png
- https://dot.net/
- Logging abstractions for Microsoft.Extensions.Logging.
-
-Commonly Used Types:
-Microsoft.Extensions.Logging.ILogger
-Microsoft.Extensions.Logging.ILoggerFactory
-Microsoft.Extensions.Logging.ILogger<TCategoryName>
-Microsoft.Extensions.Logging.LogLevel
-Microsoft.Extensions.Logging.Logger<T>
-Microsoft.Extensions.Logging.LoggerMessage
-Microsoft.Extensions.Logging.Abstractions.NullLogger
- https://go.microsoft.com/fwlink/?LinkID=799421
- © Microsoft Corporation. All rights reserved.
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Microsoft.Extensions.Logging.Abstractions
+ 6.0.0
+ Microsoft
+ MIT
+ https://licenses.nuget.org/MIT
+ Icon.png
+ https://dot.net/
+ Logging abstractions for Microsoft.Extensions.Logging.
+
+Commonly Used Types:
+Microsoft.Extensions.Logging.ILogger
+Microsoft.Extensions.Logging.ILoggerFactory
+Microsoft.Extensions.Logging.ILogger<TCategoryName>
+Microsoft.Extensions.Logging.LogLevel
+Microsoft.Extensions.Logging.Logger<T>
+Microsoft.Extensions.Logging.LoggerMessage
+Microsoft.Extensions.Logging.Abstractions.NullLogger
+ https://go.microsoft.com/fwlink/?LinkID=799421
+ © Microsoft Corporation. All rights reserved.
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/THIRD-PARTY-NOTICES.TXT b/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/THIRD-PARTY-NOTICES.TXT
index 1fe4ad6..89c59b2 100644
--- a/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/THIRD-PARTY-NOTICES.TXT
+++ b/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/THIRD-PARTY-NOTICES.TXT
@@ -1,939 +1,939 @@
-.NET Runtime uses third-party libraries or other resources that may be
-distributed under licenses different than the .NET Runtime software.
-
-In the event that we accidentally failed to list a required notice, please
-bring it to our attention. Post an issue or email us:
-
- dotnet@microsoft.com
-
-The attached notices are provided for information only.
-
-License notice for ASP.NET
--------------------------------
-
-Copyright (c) .NET Foundation. All rights reserved.
-Licensed under the Apache License, Version 2.0.
-
-Available at
-https://github.com/dotnet/aspnetcore/blob/main/LICENSE.txt
-
-License notice for Slicing-by-8
--------------------------------
-
-http://sourceforge.net/projects/slicing-by-8/
-
-Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
-
-
-This software program is licensed subject to the BSD License, available at
-http://www.opensource.org/licenses/bsd-license.html.
-
-
-License notice for Unicode data
--------------------------------
-
-https://www.unicode.org/license.html
-
-Copyright © 1991-2020 Unicode, Inc. All rights reserved.
-Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Unicode data files and any associated documentation
-(the "Data Files") or Unicode software and any associated documentation
-(the "Software") to deal in the Data Files or Software
-without restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, and/or sell copies of
-the Data Files or Software, and to permit persons to whom the Data Files
-or Software are furnished to do so, provided that either
-(a) this copyright and permission notice appear with all copies
-of the Data Files or Software, or
-(b) this copyright and permission notice appear in associated
-Documentation.
-
-THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT OF THIRD PARTY RIGHTS.
-IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
-NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THE DATA FILES OR SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder
-shall not be used in advertising or otherwise to promote the sale,
-use or other dealings in these Data Files or Software without prior
-written authorization of the copyright holder.
-
-License notice for Zlib
------------------------
-
-https://github.com/madler/zlib
-http://zlib.net/zlib_license.html
-
-/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.11, January 15th, 2017
-
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
-*/
-
-License notice for Mono
--------------------------------
-
-http://www.mono-project.com/docs/about-mono/
-
-Copyright (c) .NET Foundation Contributors
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the Software), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for International Organization for Standardization
------------------------------------------------------------------
-
-Portions (C) International Organization for Standardization 1986:
- Permission to copy in any form is granted for use with
- conforming SGML systems and applications as defined in
- ISO 8879, provided this notice is included in all copies.
-
-License notice for Intel
-------------------------
-
-"Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Xamarin and Novell
--------------------------------------
-
-Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-Copyright (c) 2011 Novell, Inc (http://www.novell.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-Third party notice for W3C
---------------------------
-
-"W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE
-Status: This license takes effect 13 May, 2015.
-This work is being provided by the copyright holders under the following license.
-License
-By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
-Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
-The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
-Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
-Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)."
-Disclaimers
-THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
-The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders."
-
-License notice for Bit Twiddling Hacks
---------------------------------------
-
-Bit Twiddling Hacks
-
-By Sean Eron Anderson
-seander@cs.stanford.edu
-
-Individually, the code snippets here are in the public domain (unless otherwise
-noted) — feel free to use them however you please. The aggregate collection and
-descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are
-distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and
-without even the implied warranty of merchantability or fitness for a particular
-purpose.
-
-License notice for Brotli
---------------------------------------
-
-Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-compress_fragment.c:
-Copyright (c) 2011, Google Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-decode_fuzzer.c:
-Copyright (c) 2015 The Chromium Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-
-License notice for Json.NET
--------------------------------
-
-https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md
-
-The MIT License (MIT)
-
-Copyright (c) 2007 James Newton-King
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for vectorized base64 encoding / decoding
---------------------------------------------------------
-
-Copyright (c) 2005-2007, Nick Galbreath
-Copyright (c) 2013-2017, Alfred Klomp
-Copyright (c) 2015-2017, Wojciech Mula
-Copyright (c) 2016-2017, Matthieu Darbois
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
-- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for RFC 3492
----------------------------
-
-The punycode implementation is based on the sample code in RFC 3492
-
-Copyright (C) The Internet Society (2003). All Rights Reserved.
-
-This document and translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it
-or assist in its implementation may be prepared, copied, published
-and distributed, in whole or in part, without restriction of any
-kind, provided that the above copyright notice and this paragraph are
-included on all such copies and derivative works. However, this
-document itself may not be modified in any way, such as by removing
-the copyright notice or references to the Internet Society or other
-Internet organizations, except as needed for the purpose of
-developing Internet standards in which case the procedures for
-copyrights defined in the Internet Standards process must be
-followed, or as required to translate it into languages other than
-English.
-
-The limited permissions granted above are perpetual and will not be
-revoked by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an
-"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
-TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
-BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
-HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-License notice for Algorithm from Internet Draft document "UUIDs and GUIDs"
----------------------------------------------------------------------------
-
-Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
-Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
-Digital Equipment Corporation, Maynard, Mass.
-To anyone who acknowledges that this file is provided "AS IS"
-without any express or implied warranty: permission to use, copy,
-modify, and distribute this file for any purpose is hereby
-granted without fee, provided that the above copyright notices and
-this notice appears in all source code copies, and that none of
-the names of Open Software Foundation, Inc., Hewlett-Packard
-Company, or Digital Equipment Corporation be used in advertising
-or publicity pertaining to distribution of the software without
-specific, written prior permission. Neither Open Software
-Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment
-Corporation makes any representations about the suitability of
-this software for any purpose.
-
-Copyright(C) The Internet Society 1997. All Rights Reserved.
-
-This document and translations of it may be copied and furnished to others,
-and derivative works that comment on or otherwise explain it or assist in
-its implementation may be prepared, copied, published and distributed, in
-whole or in part, without restriction of any kind, provided that the above
-copyright notice and this paragraph are included on all such copies and
-derivative works.However, this document itself may not be modified in any
-way, such as by removing the copyright notice or references to the Internet
-Society or other Internet organizations, except as needed for the purpose of
-developing Internet standards in which case the procedures for copyrights
-defined in the Internet Standards process must be followed, or as required
-to translate it into languages other than English.
-
-The limited permissions granted above are perpetual and will not be revoked
-by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an "AS IS"
-basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
-DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
-ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
-RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
-PARTICULAR PURPOSE.
-
-License notice for Algorithm from RFC 4122 -
-A Universally Unique IDentifier (UUID) URN Namespace
-----------------------------------------------------
-
-Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
-Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
-Digital Equipment Corporation, Maynard, Mass.
-Copyright (c) 1998 Microsoft.
-To anyone who acknowledges that this file is provided "AS IS"
-without any express or implied warranty: permission to use, copy,
-modify, and distribute this file for any purpose is hereby
-granted without fee, provided that the above copyright notices and
-this notice appears in all source code copies, and that none of
-the names of Open Software Foundation, Inc., Hewlett-Packard
-Company, Microsoft, or Digital Equipment Corporation be used in
-advertising or publicity pertaining to distribution of the software
-without specific, written prior permission. Neither Open Software
-Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
-Equipment Corporation makes any representations about the
-suitability of this software for any purpose."
-
-License notice for The LLVM Compiler Infrastructure
----------------------------------------------------
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-License notice for Bob Jenkins
-------------------------------
-
-By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
-code any way you wish, private, educational, or commercial. It's free.
-
-License notice for Greg Parker
-------------------------------
-
-Greg Parker gparker@cs.stanford.edu December 2000
-This code is in the public domain and may be copied or modified without
-permission.
-
-License notice for libunwind based code
-----------------------------------------
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for Printing Floating-Point Numbers (Dragon4)
-------------------------------------------------------------
-
-/******************************************************************************
- Copyright (c) 2014 Ryan Juckett
- http://www.ryanjuckett.com/
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
- 3. This notice may not be removed or altered from any source
- distribution.
-******************************************************************************/
-
-License notice for Printing Floating-point Numbers (Grisu3)
------------------------------------------------------------
-
-Copyright 2012 the V8 project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for xxHash
--------------------------
-
-xxHash Library
-Copyright (c) 2012-2014, Yann Collet
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Berkeley SoftFloat Release 3e
-------------------------------------------------
-
-https://github.com/ucb-bar/berkeley-softfloat-3
-https://github.com/ucb-bar/berkeley-softfloat-3/blob/master/COPYING.txt
-
-License for Berkeley SoftFloat Release 3e
-
-John R. Hauser
-2018 January 20
-
-The following applies to the whole of SoftFloat Release 3e as well as to
-each source file individually.
-
-Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
-University of California. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions, and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions, and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for xoshiro RNGs
---------------------------------
-
-Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
-
-To the extent possible under law, the author has dedicated all copyright
-and related and neighboring rights to this software to the public domain
-worldwide. This software is distributed without any warranty.
-
-See .
-
-License for fastmod (https://github.com/lemire/fastmod) and ibm-fpgen (https://github.com/nigeltao/parse-number-fxx-test-data)
---------------------------------------
-
- Copyright 2018 Daniel Lemire
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-License notice for The C++ REST SDK
------------------------------------
-
-C++ REST SDK
-
-The MIT License (MIT)
-
-Copyright (c) Microsoft Corporation
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for MessagePack-CSharp
--------------------------------------
-
-MessagePack for C#
-
-MIT License
-
-Copyright (c) 2017 Yoshifumi Kawai
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for lz4net
--------------------------------------
-
-lz4net
-
-Copyright (c) 2013-2017, Milosz Krajewski
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Nerdbank.Streams
------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) Andrew Arnott
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for RapidJSON
-----------------------------
-
-Tencent is pleased to support the open source community by making RapidJSON available.
-
-Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
-
-Licensed under the MIT License (the "License"); you may not use this file except
-in compliance with the License. You may obtain a copy of the License at
-
-http://opensource.org/licenses/MIT
-
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
-
-License notice for DirectX Math Library
----------------------------------------
-
-https://github.com/microsoft/DirectXMath/blob/master/LICENSE
-
- The MIT License (MIT)
-
-Copyright (c) 2011-2020 Microsoft Corp
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this
-software and associated documentation files (the "Software"), to deal in the Software
-without restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be included in all copies
-or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
-CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
-OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for ldap4net
----------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2018 Alexander Chermyanin
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for vectorized sorting code
-------------------------------------------
-
-MIT License
-
-Copyright (c) 2020 Dan Shechter
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for musl
------------------------
-
-musl as a whole is licensed under the following standard MIT license:
-
-Copyright © 2005-2020 Rich Felker, et al.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-License notice for "Faster Unsigned Division by Constants"
-------------------------------
-
-Reference implementations of computing and using the "magic number" approach to dividing
-by constants, including codegen instructions. The unsigned division incorporates the
-"round down" optimization per ridiculous_fish.
-
-This is free and unencumbered software. Any copyright is dedicated to the Public Domain.
-
-
-License notice for mimalloc
------------------------------------
-
-MIT License
-
-Copyright (c) 2019 Microsoft Corporation, Daan Leijen
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+.NET Runtime uses third-party libraries or other resources that may be
+distributed under licenses different than the .NET Runtime software.
+
+In the event that we accidentally failed to list a required notice, please
+bring it to our attention. Post an issue or email us:
+
+ dotnet@microsoft.com
+
+The attached notices are provided for information only.
+
+License notice for ASP.NET
+-------------------------------
+
+Copyright (c) .NET Foundation. All rights reserved.
+Licensed under the Apache License, Version 2.0.
+
+Available at
+https://github.com/dotnet/aspnetcore/blob/main/LICENSE.txt
+
+License notice for Slicing-by-8
+-------------------------------
+
+http://sourceforge.net/projects/slicing-by-8/
+
+Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
+
+
+This software program is licensed subject to the BSD License, available at
+http://www.opensource.org/licenses/bsd-license.html.
+
+
+License notice for Unicode data
+-------------------------------
+
+https://www.unicode.org/license.html
+
+Copyright © 1991-2020 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+
+License notice for Zlib
+-----------------------
+
+https://github.com/madler/zlib
+http://zlib.net/zlib_license.html
+
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.11, January 15th, 2017
+
+ Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+*/
+
+License notice for Mono
+-------------------------------
+
+http://www.mono-project.com/docs/about-mono/
+
+Copyright (c) .NET Foundation Contributors
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the Software), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for International Organization for Standardization
+-----------------------------------------------------------------
+
+Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+
+License notice for Intel
+------------------------
+
+"Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Xamarin and Novell
+-------------------------------------
+
+Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Copyright (c) 2011 Novell, Inc (http://www.novell.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Third party notice for W3C
+--------------------------
+
+"W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE
+Status: This license takes effect 13 May, 2015.
+This work is being provided by the copyright holders under the following license.
+License
+By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
+Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
+The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
+Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
+Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)."
+Disclaimers
+THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
+The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders."
+
+License notice for Bit Twiddling Hacks
+--------------------------------------
+
+Bit Twiddling Hacks
+
+By Sean Eron Anderson
+seander@cs.stanford.edu
+
+Individually, the code snippets here are in the public domain (unless otherwise
+noted) — feel free to use them however you please. The aggregate collection and
+descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are
+distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and
+without even the implied warranty of merchantability or fitness for a particular
+purpose.
+
+License notice for Brotli
+--------------------------------------
+
+Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+compress_fragment.c:
+Copyright (c) 2011, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+decode_fuzzer.c:
+Copyright (c) 2015 The Chromium Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+
+License notice for Json.NET
+-------------------------------
+
+https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md
+
+The MIT License (MIT)
+
+Copyright (c) 2007 James Newton-King
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for vectorized base64 encoding / decoding
+--------------------------------------------------------
+
+Copyright (c) 2005-2007, Nick Galbreath
+Copyright (c) 2013-2017, Alfred Klomp
+Copyright (c) 2015-2017, Wojciech Mula
+Copyright (c) 2016-2017, Matthieu Darbois
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+- Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for RFC 3492
+---------------------------
+
+The punycode implementation is based on the sample code in RFC 3492
+
+Copyright (C) The Internet Society (2003). All Rights Reserved.
+
+This document and translations of it may be copied and furnished to
+others, and derivative works that comment on or otherwise explain it
+or assist in its implementation may be prepared, copied, published
+and distributed, in whole or in part, without restriction of any
+kind, provided that the above copyright notice and this paragraph are
+included on all such copies and derivative works. However, this
+document itself may not be modified in any way, such as by removing
+the copyright notice or references to the Internet Society or other
+Internet organizations, except as needed for the purpose of
+developing Internet standards in which case the procedures for
+copyrights defined in the Internet Standards process must be
+followed, or as required to translate it into languages other than
+English.
+
+The limited permissions granted above are perpetual and will not be
+revoked by the Internet Society or its successors or assigns.
+
+This document and the information contained herein is provided on an
+"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+License notice for Algorithm from Internet Draft document "UUIDs and GUIDs"
+---------------------------------------------------------------------------
+
+Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
+Digital Equipment Corporation, Maynard, Mass.
+To anyone who acknowledges that this file is provided "AS IS"
+without any express or implied warranty: permission to use, copy,
+modify, and distribute this file for any purpose is hereby
+granted without fee, provided that the above copyright notices and
+this notice appears in all source code copies, and that none of
+the names of Open Software Foundation, Inc., Hewlett-Packard
+Company, or Digital Equipment Corporation be used in advertising
+or publicity pertaining to distribution of the software without
+specific, written prior permission. Neither Open Software
+Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment
+Corporation makes any representations about the suitability of
+this software for any purpose.
+
+Copyright(C) The Internet Society 1997. All Rights Reserved.
+
+This document and translations of it may be copied and furnished to others,
+and derivative works that comment on or otherwise explain it or assist in
+its implementation may be prepared, copied, published and distributed, in
+whole or in part, without restriction of any kind, provided that the above
+copyright notice and this paragraph are included on all such copies and
+derivative works.However, this document itself may not be modified in any
+way, such as by removing the copyright notice or references to the Internet
+Society or other Internet organizations, except as needed for the purpose of
+developing Internet standards in which case the procedures for copyrights
+defined in the Internet Standards process must be followed, or as required
+to translate it into languages other than English.
+
+The limited permissions granted above are perpetual and will not be revoked
+by the Internet Society or its successors or assigns.
+
+This document and the information contained herein is provided on an "AS IS"
+basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
+DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
+RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
+PARTICULAR PURPOSE.
+
+License notice for Algorithm from RFC 4122 -
+A Universally Unique IDentifier (UUID) URN Namespace
+----------------------------------------------------
+
+Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
+Digital Equipment Corporation, Maynard, Mass.
+Copyright (c) 1998 Microsoft.
+To anyone who acknowledges that this file is provided "AS IS"
+without any express or implied warranty: permission to use, copy,
+modify, and distribute this file for any purpose is hereby
+granted without fee, provided that the above copyright notices and
+this notice appears in all source code copies, and that none of
+the names of Open Software Foundation, Inc., Hewlett-Packard
+Company, Microsoft, or Digital Equipment Corporation be used in
+advertising or publicity pertaining to distribution of the software
+without specific, written prior permission. Neither Open Software
+Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
+Equipment Corporation makes any representations about the
+suitability of this software for any purpose."
+
+License notice for The LLVM Compiler Infrastructure
+---------------------------------------------------
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+License notice for Bob Jenkins
+------------------------------
+
+By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
+code any way you wish, private, educational, or commercial. It's free.
+
+License notice for Greg Parker
+------------------------------
+
+Greg Parker gparker@cs.stanford.edu December 2000
+This code is in the public domain and may be copied or modified without
+permission.
+
+License notice for libunwind based code
+----------------------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for Printing Floating-Point Numbers (Dragon4)
+------------------------------------------------------------
+
+/******************************************************************************
+ Copyright (c) 2014 Ryan Juckett
+ http://www.ryanjuckett.com/
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+******************************************************************************/
+
+License notice for Printing Floating-point Numbers (Grisu3)
+-----------------------------------------------------------
+
+Copyright 2012 the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for xxHash
+-------------------------
+
+xxHash Library
+Copyright (c) 2012-2014, Yann Collet
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice, this
+ list of conditions and the following disclaimer in the documentation and/or
+ other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Berkeley SoftFloat Release 3e
+------------------------------------------------
+
+https://github.com/ucb-bar/berkeley-softfloat-3
+https://github.com/ucb-bar/berkeley-softfloat-3/blob/master/COPYING.txt
+
+License for Berkeley SoftFloat Release 3e
+
+John R. Hauser
+2018 January 20
+
+The following applies to the whole of SoftFloat Release 3e as well as to
+each source file individually.
+
+Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
+University of California. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions, and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for xoshiro RNGs
+--------------------------------
+
+Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
+
+To the extent possible under law, the author has dedicated all copyright
+and related and neighboring rights to this software to the public domain
+worldwide. This software is distributed without any warranty.
+
+See .
+
+License for fastmod (https://github.com/lemire/fastmod) and ibm-fpgen (https://github.com/nigeltao/parse-number-fxx-test-data)
+--------------------------------------
+
+ Copyright 2018 Daniel Lemire
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+License notice for The C++ REST SDK
+-----------------------------------
+
+C++ REST SDK
+
+The MIT License (MIT)
+
+Copyright (c) Microsoft Corporation
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for MessagePack-CSharp
+-------------------------------------
+
+MessagePack for C#
+
+MIT License
+
+Copyright (c) 2017 Yoshifumi Kawai
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for lz4net
+-------------------------------------
+
+lz4net
+
+Copyright (c) 2013-2017, Milosz Krajewski
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Nerdbank.Streams
+-----------------------------------
+
+The MIT License (MIT)
+
+Copyright (c) Andrew Arnott
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for RapidJSON
+----------------------------
+
+Tencent is pleased to support the open source community by making RapidJSON available.
+
+Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
+
+Licensed under the MIT License (the "License"); you may not use this file except
+in compliance with the License. You may obtain a copy of the License at
+
+http://opensource.org/licenses/MIT
+
+Unless required by applicable law or agreed to in writing, software distributed
+under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied. See the License for the
+specific language governing permissions and limitations under the License.
+
+License notice for DirectX Math Library
+---------------------------------------
+
+https://github.com/microsoft/DirectXMath/blob/master/LICENSE
+
+ The MIT License (MIT)
+
+Copyright (c) 2011-2020 Microsoft Corp
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be included in all copies
+or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for ldap4net
+---------------------------
+
+The MIT License (MIT)
+
+Copyright (c) 2018 Alexander Chermyanin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for vectorized sorting code
+------------------------------------------
+
+MIT License
+
+Copyright (c) 2020 Dan Shechter
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for musl
+-----------------------
+
+musl as a whole is licensed under the following standard MIT license:
+
+Copyright © 2005-2020 Rich Felker, et al.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+License notice for "Faster Unsigned Division by Constants"
+------------------------------
+
+Reference implementations of computing and using the "magic number" approach to dividing
+by constants, including codegen instructions. The unsigned division incorporates the
+"round down" optimization per ridiculous_fish.
+
+This is free and unencumbered software. Any copyright is dedicated to the Public Domain.
+
+
+License notice for mimalloc
+-----------------------------------
+
+MIT License
+
+Copyright (c) 2019 Microsoft Corporation, Daan Leijen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets b/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets
index 135a9a8..a04cc2a 100644
--- a/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets
+++ b/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets
@@ -1,6 +1,6 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml b/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml
index 6f3f6bb..07d86f0 100644
--- a/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml
+++ b/unity/Assets/Packages/Microsoft.Extensions.Logging.Abstractions.6.0.0/lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml
@@ -1,1228 +1,1228 @@
-
-
-
- Microsoft.Extensions.Logging.Abstractions
-
-
-
-
- Identifies a logging event. The primary identifier is the "Id" property, with the "Name" property providing a short description of this type of event.
-
-
-
-
- Implicitly creates an EventId from the given .
-
- The to convert to an EventId.
-
-
-
- Checks if two specified instances have the same value. They are equal if they have the same Id.
-
- The first .
- The second .
- if the objects are equal.
-
-
-
- Checks if two specified instances have different values.
-
- The first .
- The second .
- if the objects are not equal.
-
-
-
- Initializes an instance of the struct.
-
- The numeric identifier for this event.
- The name of this event.
-
-
-
- Gets the numeric identifier for this event.
-
-
-
-
- Gets the name of this event.
-
-
-
-
-
-
-
- Indicates whether the current object is equal to another object of the same type. Two events are equal if they have the same id.
-
- An object to compare with this object.
- if the current object is equal to the other parameter; otherwise, .
-
-
-
-
-
-
-
-
-
- LogValues to enable formatting options supported by .
- This also enables using {NamedformatItem} in the format string.
-
-
-
-
- Represents a storage of common scope data.
-
-
-
-
- Executes callback for each currently active scope objects in order of creation.
- All callbacks are guaranteed to be called inline from this method.
-
- The callback to be executed for every scope object
- The state object to be passed into the callback
- The type of state to accept.
-
-
-
- Adds scope object to the list
-
- The scope object
- The token that removes scope on dispose.
-
-
-
- Represents a type used to perform logging.
-
- Aggregates most logging patterns to a single method.
-
-
-
- Writes a log entry.
-
- Entry will be written on this level.
- Id of the event.
- The entry to be written. Can be also an object.
- The exception related to this entry.
- Function to create a message of the and .
- The type of the object to be written.
-
-
-
- Checks if the given is enabled.
-
- Level to be checked.
- true if enabled.
-
-
-
- Begins a logical operation scope.
-
- The identifier for the scope.
- The type of the state to begin scope for.
- An that ends the logical operation scope on dispose.
-
-
-
- Represents a type used to configure the logging system and create instances of from
- the registered s.
-
-
-
-
- Creates a new instance.
-
- The category name for messages produced by the logger.
- The .
-
-
-
- Adds an to the logging system.
-
- The .
-
-
-
- Represents a type that can create instances of .
-
-
-
-
- Creates a new instance.
-
- The category name for messages produced by the logger.
- The instance of that was created.
-
-
-
- A generic interface for logging where the category name is derived from the specified
- type name.
- Generally used to enable activation of a named from dependency injection.
-
- The type whose name is used for the logger category name.
-
-
-
- Represents a that is able to consume external scope information.
-
-
-
-
- Sets external scope information source for logger provider.
-
- The provider of scope data.
-
-
-
- Options for and its overloads
-
-
-
-
- Gets or sets the flag to skip IsEnabled check for the logging method.
-
-
-
-
- Holds the information for a single log entry.
-
-
-
-
- Initializes an instance of the LogEntry struct.
-
- The log level.
- The category name for the log.
- The log event Id.
- The state for which log is being written.
- The log exception.
- The formatter.
-
-
-
- Gets the LogLevel
-
-
-
-
- Gets the log category
-
-
-
-
- Gets the log EventId
-
-
-
-
- Gets the TState
-
-
-
-
- Gets the log exception
-
-
-
-
- Gets the formatter
-
-
-
-
- Minimalistic logger that does nothing.
-
-
-
-
- Returns the shared instance of .
-
-
-
-
-
-
-
-
-
-
-
-
-
- An used to create instance of
- that logs nothing.
-
-
-
-
- Creates a new instance.
-
-
-
-
- Returns the shared instance of .
-
-
-
-
-
- This returns a instance which logs nothing.
-
-
-
-
-
- This method ignores the parameter and does nothing.
-
-
-
-
-
-
-
- Provider for the .
-
-
-
-
- Returns an instance of .
-
-
-
-
-
-
-
-
-
-
- Minimalistic logger that does nothing.
-
-
-
-
- Returns an instance of .
-
- An instance of .
-
-
-
-
-
-
-
- This method ignores the parameters and does nothing.
-
-
-
-
-
-
-
- ILogger extension methods for common scenarios.
-
-
-
-
- Formats and writes a debug log message.
-
- The to write to.
- The event id associated with the log.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogDebug(0, exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes a debug log message.
-
- The to write to.
- The event id associated with the log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogDebug(0, "Processing request from {Address}", address)
-
-
-
- Formats and writes a debug log message.
-
- The to write to.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogDebug(exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes a debug log message.
-
- The to write to.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogDebug("Processing request from {Address}", address)
-
-
-
- Formats and writes a trace log message.
-
- The to write to.
- The event id associated with the log.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogTrace(0, exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes a trace log message.
-
- The to write to.
- The event id associated with the log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogTrace(0, "Processing request from {Address}", address)
-
-
-
- Formats and writes a trace log message.
-
- The to write to.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogTrace(exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes a trace log message.
-
- The to write to.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogTrace("Processing request from {Address}", address)
-
-
-
- Formats and writes an informational log message.
-
- The to write to.
- The event id associated with the log.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogInformation(0, exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes an informational log message.
-
- The to write to.
- The event id associated with the log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogInformation(0, "Processing request from {Address}", address)
-
-
-
- Formats and writes an informational log message.
-
- The to write to.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogInformation(exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes an informational log message.
-
- The to write to.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogInformation("Processing request from {Address}", address)
-
-
-
- Formats and writes a warning log message.
-
- The to write to.
- The event id associated with the log.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogWarning(0, exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes a warning log message.
-
- The to write to.
- The event id associated with the log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogWarning(0, "Processing request from {Address}", address)
-
-
-
- Formats and writes a warning log message.
-
- The to write to.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogWarning(exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes a warning log message.
-
- The to write to.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogWarning("Processing request from {Address}", address)
-
-
-
- Formats and writes an error log message.
-
- The to write to.
- The event id associated with the log.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogError(0, exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes an error log message.
-
- The to write to.
- The event id associated with the log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogError(0, "Processing request from {Address}", address)
-
-
-
- Formats and writes an error log message.
-
- The to write to.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogError(exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes an error log message.
-
- The to write to.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogError("Processing request from {Address}", address)
-
-
-
- Formats and writes a critical log message.
-
- The to write to.
- The event id associated with the log.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogCritical(0, exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes a critical log message.
-
- The to write to.
- The event id associated with the log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogCritical(0, "Processing request from {Address}", address)
-
-
-
- Formats and writes a critical log message.
-
- The to write to.
- The exception to log.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogCritical(exception, "Error while processing request from {Address}", address)
-
-
-
- Formats and writes a critical log message.
-
- The to write to.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- logger.LogCritical("Processing request from {Address}", address)
-
-
-
- Formats and writes a log message at the specified log level.
-
- The to write to.
- Entry will be written on this level.
- Format string of the log message.
- An object array that contains zero or more objects to format.
-
-
-
- Formats and writes a log message at the specified log level.
-
- The to write to.
- Entry will be written on this level.
- The event id associated with the log.
- Format string of the log message.
- An object array that contains zero or more objects to format.
-
-
-
- Formats and writes a log message at the specified log level.
-
- The to write to.
- Entry will be written on this level.
- The exception to log.
- Format string of the log message.
- An object array that contains zero or more objects to format.
-
-
-
- Formats and writes a log message at the specified log level.
-
- The to write to.
- Entry will be written on this level.
- The event id associated with the log.
- The exception to log.
- Format string of the log message.
- An object array that contains zero or more objects to format.
-
-
-
- Formats the message and creates a scope.
-
- The to create the scope in.
- Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
- An object array that contains zero or more objects to format.
- A disposable scope object. Can be null.
-
- using(logger.BeginScope("Processing request from {Address}", address))
- {
- }
-
-
-
-
- Default implementation of
-
-
-
-
- Creates a new .
-
-
-
-
-
-
-
-
-
-
- ILoggerFactory extension methods for common scenarios.
-
-
-
-
- Creates a new instance using the full name of the given type.
-
- The factory.
- The type.
- The that was created.
-
-
-
- Creates a new instance using the full name of the given .
-
- The factory.
- The type.
- The that was created.
-
-
-
- Creates delegates which can be later cached to log messages in a performant way.
-
-
-
-
- Creates a delegate which can be invoked to create a log scope.
-
- The named format string
- A delegate which when invoked creates a log scope.
-
-
-
- Creates a delegate which can be invoked to create a log scope.
-
- The type of the first parameter passed to the named format string.
- The named format string
- A delegate which when invoked creates a log scope.
-
-
-
- Creates a delegate which can be invoked to create a log scope.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The named format string
- A delegate which when invoked creates a log scope.
-
-
-
- Creates a delegate which can be invoked to create a log scope.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The named format string
- A delegate which when invoked creates a log scope.
-
-
-
- Creates a delegate which can be invoked to create a log scope.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The type of the fourth parameter passed to the named format string.
- The named format string
- A delegate which when invoked creates a log scope.
-
-
-
- Creates a delegate which can be invoked to create a log scope.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The type of the fourth parameter passed to the named format string.
- The type of the fifth parameter passed to the named format string.
- The named format string
- A delegate which when invoked creates a log scope.
-
-
-
- Creates a delegate which can be invoked to create a log scope.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The type of the fourth parameter passed to the named format string.
- The type of the fifth parameter passed to the named format string.
- The type of the sixth parameter passed to the named format string.
- The named format string
- A delegate which when invoked creates a log scope.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The
- The event id
- The named format string
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The
- The event id
- The named format string
- The
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The
- The event id
- The named format string
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The
- The event id
- The named format string
- The
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The
- The event id
- The named format string
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The
- The event id
- The named format string
- The
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The
- The event id
- The named format string
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The
- The event id
- The named format string
- The
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The type of the fourth parameter passed to the named format string.
- The
- The event id
- The named format string
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The type of the fourth parameter passed to the named format string.
- The
- The event id
- The named format string
- The
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The type of the fourth parameter passed to the named format string.
- The type of the fifth parameter passed to the named format string.
- The
- The event id
- The named format string
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The type of the fourth parameter passed to the named format string.
- The type of the fifth parameter passed to the named format string.
- The
- The event id
- The named format string
- The
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The type of the fourth parameter passed to the named format string.
- The type of the fifth parameter passed to the named format string.
- The type of the sixth parameter passed to the named format string.
- The
- The event id
- The named format string
- A delegate which when invoked creates a log message.
-
-
-
- Creates a delegate which can be invoked for logging a message.
-
- The type of the first parameter passed to the named format string.
- The type of the second parameter passed to the named format string.
- The type of the third parameter passed to the named format string.
- The type of the fourth parameter passed to the named format string.
- The type of the fifth parameter passed to the named format string.
- The type of the sixth parameter passed to the named format string.
- The
- The event id
- The named format string
- The
- A delegate which when invoked creates a log message.
-
-
-
- Provides information to guide the production of a strongly-typed logging method.
-
-
- The method this attribute is applied to:
- - Must be a partial method.
- - Must return void .
- - Must not be generic.
- - Must have an as one of its parameters.
- - Must have a as one of its parameters.
- - None of the parameters can be generic.
-
-
-
-
-
-
-
- Initializes a new instance of the class
- which is used to guide the production of a strongly-typed logging method.
-
-
-
-
- Initializes a new instance of the class
- which is used to guide the production of a strongly-typed logging method.
-
- The log event Id.
- The log level.
- Format string of the log message.
-
-
-
- Gets the logging event id for the logging method.
-
-
-
-
- Gets or sets the logging event name for the logging method.
-
-
- This will equal the method name if not specified.
-
-
-
-
- Gets the logging level for the logging method.
-
-
-
-
- Gets the message text for the logging method.
-
-
-
-
- Gets the flag to skip IsEnabled check for the logging method.
-
-
-
-
- Delegates to a new instance using the full name of the given type, created by the
- provided .
-
- The type.
-
-
-
- Creates a new .
-
- The factory.
-
-
-
-
-
-
-
-
-
-
-
-
- Defines logging severity levels.
-
-
-
-
- Logs that contain the most detailed messages. These messages may contain sensitive application data.
- These messages are disabled by default and should never be enabled in a production environment.
-
-
-
-
- Logs that are used for interactive investigation during development. These logs should primarily contain
- information useful for debugging and have no long-term value.
-
-
-
-
- Logs that track the general flow of the application. These logs should have long-term value.
-
-
-
-
- Logs that highlight an abnormal or unexpected event in the application flow, but do not otherwise cause the
- application execution to stop.
-
-
-
-
- Logs that highlight when the current flow of execution is stopped due to a failure. These should indicate a
- failure in the current activity, not an application-wide failure.
-
-
-
-
- Logs that describe an unrecoverable application or system crash, or a catastrophic failure that requires
- immediate attention.
-
-
-
-
- Not used for writing log messages. Specifies that a logging category should not write any messages.
-
-
-
-
- Formatter to convert the named format items like {NamedformatItem} to format.
-
-
-
-
- Scope provider that does nothing.
-
-
-
-
- Returns a cached instance of .
-
-
-
-
-
-
-
-
-
-
- An empty scope without any logic
-
-
-
-
-
-
-
- Pretty print a type name.
-
- The .
- true to print a fully qualified name.
- true to include generic parameter names.
- true to include generic parameters.
- Character to use as a delimiter in nested type names
- The pretty printed type name.
-
-
-
- Get a pinnable reference to the builder.
- Does not ensure there is a null char after
- This overload is pattern matched in the C# 7.3+ compiler so you can omit
- the explicit method call, and write eg "fixed (char* c = builder)"
-
-
-
-
- Get a pinnable reference to the builder.
-
- Ensures that the builder has a null char after
-
-
- Returns the underlying storage of the builder.
-
-
-
- Returns a span around the contents of the builder.
-
- Ensures that the builder has a null char after
-
-
-
- Resize the internal buffer either by doubling current buffer size or
- by adding to
- whichever is greater.
-
-
- Number of chars requested beyond current position.
-
-
-
- The format string '{0}' does not have the expected number of named parameters. Expected {1} parameter(s) but found {2} parameter(s).
-
-
- Specifies that null is allowed as an input even if the corresponding type disallows it.
-
-
- Specifies that null is disallowed as an input even if the corresponding type allows it.
-
-
- Specifies that an output may be null even if the corresponding type disallows it.
-
-
- Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.
-
-
- Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it.
-
-
- Initializes the attribute with the specified return value condition.
-
- The return value condition. If the method returns this value, the associated parameter may be null.
-
-
-
- Gets the return value condition.
-
-
- Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it.
-
-
- Initializes the attribute with the specified return value condition.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
-
-
-
- Gets the return value condition.
-
-
- Specifies that the output will be non-null if the named parameter is non-null.
-
-
- Initializes the attribute with the associated parameter name.
-
- The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
-
-
-
- Gets the associated parameter name.
-
-
- Applied to a method that will never return under any circumstance.
-
-
- Specifies that the method will not return if the associated Boolean parameter is passed the specified value.
-
-
- Initializes the attribute with the specified parameter value.
-
- The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
- the associated parameter matches this value.
-
-
-
- Gets the condition parameter value.
-
-
- Specifies that the method or property will ensure that the listed field and property members have not-null values.
-
-
- Initializes the attribute with a field or property member.
-
- The field or property member that is promised to be not-null.
-
-
-
- Initializes the attribute with the list of field and property members.
-
- The list of field and property members that are promised to be not-null.
-
-
-
- Gets field or property member names.
-
-
- Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.
-
-
- Initializes the attribute with the specified return value condition and a field or property member.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
-
-
- The field or property member that is promised to be not-null.
-
-
-
- Initializes the attribute with the specified return value condition and list of field and property members.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
-
-
- The list of field and property members that are promised to be not-null.
-
-
-
- Gets the return value condition.
-
-
- Gets field or property member names.
-
-
-
+
+
+
+ Microsoft.Extensions.Logging.Abstractions
+
+
+
+
+ Identifies a logging event. The primary identifier is the "Id" property, with the "Name" property providing a short description of this type of event.
+
+
+
+
+ Implicitly creates an EventId from the given .
+
+ The to convert to an EventId.
+
+
+
+ Checks if two specified instances have the same value. They are equal if they have the same Id.
+
+ The first .
+ The second .
+ if the objects are equal.
+
+
+
+ Checks if two specified instances have different values.
+
+ The first .
+ The second .
+ if the objects are not equal.
+
+
+
+ Initializes an instance of the struct.
+
+ The numeric identifier for this event.
+ The name of this event.
+
+
+
+ Gets the numeric identifier for this event.
+
+
+
+
+ Gets the name of this event.
+
+
+
+
+
+
+
+ Indicates whether the current object is equal to another object of the same type. Two events are equal if they have the same id.
+
+ An object to compare with this object.
+ if the current object is equal to the other parameter; otherwise, .
+
+
+
+
+
+
+
+
+
+ LogValues to enable formatting options supported by .
+ This also enables using {NamedformatItem} in the format string.
+
+
+
+
+ Represents a storage of common scope data.
+
+
+
+
+ Executes callback for each currently active scope objects in order of creation.
+ All callbacks are guaranteed to be called inline from this method.
+
+ The callback to be executed for every scope object
+ The state object to be passed into the callback
+ The type of state to accept.
+
+
+
+ Adds scope object to the list
+
+ The scope object
+ The token that removes scope on dispose.
+
+
+
+ Represents a type used to perform logging.
+
+ Aggregates most logging patterns to a single method.
+
+
+
+ Writes a log entry.
+
+ Entry will be written on this level.
+ Id of the event.
+ The entry to be written. Can be also an object.
+ The exception related to this entry.
+ Function to create a message of the and .
+ The type of the object to be written.
+
+
+
+ Checks if the given is enabled.
+
+ Level to be checked.
+ true if enabled.
+
+
+
+ Begins a logical operation scope.
+
+ The identifier for the scope.
+ The type of the state to begin scope for.
+ An that ends the logical operation scope on dispose.
+
+
+
+ Represents a type used to configure the logging system and create instances of from
+ the registered s.
+
+
+
+
+ Creates a new instance.
+
+ The category name for messages produced by the logger.
+ The .
+
+
+
+ Adds an to the logging system.
+
+ The .
+
+
+
+ Represents a type that can create instances of .
+
+
+
+
+ Creates a new instance.
+
+ The category name for messages produced by the logger.
+ The instance of that was created.
+
+
+
+ A generic interface for logging where the category name is derived from the specified
+ type name.
+ Generally used to enable activation of a named from dependency injection.
+
+ The type whose name is used for the logger category name.
+
+
+
+ Represents a that is able to consume external scope information.
+
+
+
+
+ Sets external scope information source for logger provider.
+
+ The provider of scope data.
+
+
+
+ Options for and its overloads
+
+
+
+
+ Gets or sets the flag to skip IsEnabled check for the logging method.
+
+
+
+
+ Holds the information for a single log entry.
+
+
+
+
+ Initializes an instance of the LogEntry struct.
+
+ The log level.
+ The category name for the log.
+ The log event Id.
+ The state for which log is being written.
+ The log exception.
+ The formatter.
+
+
+
+ Gets the LogLevel
+
+
+
+
+ Gets the log category
+
+
+
+
+ Gets the log EventId
+
+
+
+
+ Gets the TState
+
+
+
+
+ Gets the log exception
+
+
+
+
+ Gets the formatter
+
+
+
+
+ Minimalistic logger that does nothing.
+
+
+
+
+ Returns the shared instance of .
+
+
+
+
+
+
+
+
+
+
+
+
+
+ An used to create instance of
+ that logs nothing.
+
+
+
+
+ Creates a new instance.
+
+
+
+
+ Returns the shared instance of .
+
+
+
+
+
+ This returns a instance which logs nothing.
+
+
+
+
+
+ This method ignores the parameter and does nothing.
+
+
+
+
+
+
+
+ Provider for the .
+
+
+
+
+ Returns an instance of .
+
+
+
+
+
+
+
+
+
+
+ Minimalistic logger that does nothing.
+
+
+
+
+ Returns an instance of .
+
+ An instance of .
+
+
+
+
+
+
+
+ This method ignores the parameters and does nothing.
+
+
+
+
+
+
+
+ ILogger extension methods for common scenarios.
+
+
+
+
+ Formats and writes a debug log message.
+
+ The to write to.
+ The event id associated with the log.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogDebug(0, exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes a debug log message.
+
+ The to write to.
+ The event id associated with the log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogDebug(0, "Processing request from {Address}", address)
+
+
+
+ Formats and writes a debug log message.
+
+ The to write to.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogDebug(exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes a debug log message.
+
+ The to write to.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogDebug("Processing request from {Address}", address)
+
+
+
+ Formats and writes a trace log message.
+
+ The to write to.
+ The event id associated with the log.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogTrace(0, exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes a trace log message.
+
+ The to write to.
+ The event id associated with the log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogTrace(0, "Processing request from {Address}", address)
+
+
+
+ Formats and writes a trace log message.
+
+ The to write to.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogTrace(exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes a trace log message.
+
+ The to write to.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogTrace("Processing request from {Address}", address)
+
+
+
+ Formats and writes an informational log message.
+
+ The to write to.
+ The event id associated with the log.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogInformation(0, exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes an informational log message.
+
+ The to write to.
+ The event id associated with the log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogInformation(0, "Processing request from {Address}", address)
+
+
+
+ Formats and writes an informational log message.
+
+ The to write to.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogInformation(exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes an informational log message.
+
+ The to write to.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogInformation("Processing request from {Address}", address)
+
+
+
+ Formats and writes a warning log message.
+
+ The to write to.
+ The event id associated with the log.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogWarning(0, exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes a warning log message.
+
+ The to write to.
+ The event id associated with the log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogWarning(0, "Processing request from {Address}", address)
+
+
+
+ Formats and writes a warning log message.
+
+ The to write to.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogWarning(exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes a warning log message.
+
+ The to write to.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogWarning("Processing request from {Address}", address)
+
+
+
+ Formats and writes an error log message.
+
+ The to write to.
+ The event id associated with the log.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogError(0, exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes an error log message.
+
+ The to write to.
+ The event id associated with the log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogError(0, "Processing request from {Address}", address)
+
+
+
+ Formats and writes an error log message.
+
+ The to write to.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogError(exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes an error log message.
+
+ The to write to.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogError("Processing request from {Address}", address)
+
+
+
+ Formats and writes a critical log message.
+
+ The to write to.
+ The event id associated with the log.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogCritical(0, exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes a critical log message.
+
+ The to write to.
+ The event id associated with the log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogCritical(0, "Processing request from {Address}", address)
+
+
+
+ Formats and writes a critical log message.
+
+ The to write to.
+ The exception to log.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogCritical(exception, "Error while processing request from {Address}", address)
+
+
+
+ Formats and writes a critical log message.
+
+ The to write to.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ logger.LogCritical("Processing request from {Address}", address)
+
+
+
+ Formats and writes a log message at the specified log level.
+
+ The to write to.
+ Entry will be written on this level.
+ Format string of the log message.
+ An object array that contains zero or more objects to format.
+
+
+
+ Formats and writes a log message at the specified log level.
+
+ The to write to.
+ Entry will be written on this level.
+ The event id associated with the log.
+ Format string of the log message.
+ An object array that contains zero or more objects to format.
+
+
+
+ Formats and writes a log message at the specified log level.
+
+ The to write to.
+ Entry will be written on this level.
+ The exception to log.
+ Format string of the log message.
+ An object array that contains zero or more objects to format.
+
+
+
+ Formats and writes a log message at the specified log level.
+
+ The to write to.
+ Entry will be written on this level.
+ The event id associated with the log.
+ The exception to log.
+ Format string of the log message.
+ An object array that contains zero or more objects to format.
+
+
+
+ Formats the message and creates a scope.
+
+ The to create the scope in.
+ Format string of the log message in message template format. Example: "User {User} logged in from {Address}"
+ An object array that contains zero or more objects to format.
+ A disposable scope object. Can be null.
+
+ using(logger.BeginScope("Processing request from {Address}", address))
+ {
+ }
+
+
+
+
+ Default implementation of
+
+
+
+
+ Creates a new .
+
+
+
+
+
+
+
+
+
+
+ ILoggerFactory extension methods for common scenarios.
+
+
+
+
+ Creates a new instance using the full name of the given type.
+
+ The factory.
+ The type.
+ The that was created.
+
+
+
+ Creates a new instance using the full name of the given .
+
+ The factory.
+ The type.
+ The that was created.
+
+
+
+ Creates delegates which can be later cached to log messages in a performant way.
+
+
+
+
+ Creates a delegate which can be invoked to create a log scope.
+
+ The named format string
+ A delegate which when invoked creates a log scope.
+
+
+
+ Creates a delegate which can be invoked to create a log scope.
+
+ The type of the first parameter passed to the named format string.
+ The named format string
+ A delegate which when invoked creates a log scope.
+
+
+
+ Creates a delegate which can be invoked to create a log scope.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The named format string
+ A delegate which when invoked creates a log scope.
+
+
+
+ Creates a delegate which can be invoked to create a log scope.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The named format string
+ A delegate which when invoked creates a log scope.
+
+
+
+ Creates a delegate which can be invoked to create a log scope.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The type of the fourth parameter passed to the named format string.
+ The named format string
+ A delegate which when invoked creates a log scope.
+
+
+
+ Creates a delegate which can be invoked to create a log scope.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The type of the fourth parameter passed to the named format string.
+ The type of the fifth parameter passed to the named format string.
+ The named format string
+ A delegate which when invoked creates a log scope.
+
+
+
+ Creates a delegate which can be invoked to create a log scope.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The type of the fourth parameter passed to the named format string.
+ The type of the fifth parameter passed to the named format string.
+ The type of the sixth parameter passed to the named format string.
+ The named format string
+ A delegate which when invoked creates a log scope.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The
+ The event id
+ The named format string
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The
+ The event id
+ The named format string
+ The
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ The
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ The
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ The
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The type of the fourth parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The type of the fourth parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ The
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The type of the fourth parameter passed to the named format string.
+ The type of the fifth parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The type of the fourth parameter passed to the named format string.
+ The type of the fifth parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ The
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The type of the fourth parameter passed to the named format string.
+ The type of the fifth parameter passed to the named format string.
+ The type of the sixth parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ A delegate which when invoked creates a log message.
+
+
+
+ Creates a delegate which can be invoked for logging a message.
+
+ The type of the first parameter passed to the named format string.
+ The type of the second parameter passed to the named format string.
+ The type of the third parameter passed to the named format string.
+ The type of the fourth parameter passed to the named format string.
+ The type of the fifth parameter passed to the named format string.
+ The type of the sixth parameter passed to the named format string.
+ The
+ The event id
+ The named format string
+ The
+ A delegate which when invoked creates a log message.
+
+
+
+ Provides information to guide the production of a strongly-typed logging method.
+
+
+ The method this attribute is applied to:
+ - Must be a partial method.
+ - Must return void .
+ - Must not be generic.
+ - Must have an as one of its parameters.
+ - Must have a as one of its parameters.
+ - None of the parameters can be generic.
+
+
+
+
+
+
+
+ Initializes a new instance of the class
+ which is used to guide the production of a strongly-typed logging method.
+
+
+
+
+ Initializes a new instance of the class
+ which is used to guide the production of a strongly-typed logging method.
+
+ The log event Id.
+ The log level.
+ Format string of the log message.
+
+
+
+ Gets the logging event id for the logging method.
+
+
+
+
+ Gets or sets the logging event name for the logging method.
+
+
+ This will equal the method name if not specified.
+
+
+
+
+ Gets the logging level for the logging method.
+
+
+
+
+ Gets the message text for the logging method.
+
+
+
+
+ Gets the flag to skip IsEnabled check for the logging method.
+
+
+
+
+ Delegates to a new instance using the full name of the given type, created by the
+ provided .
+
+ The type.
+
+
+
+ Creates a new .
+
+ The factory.
+
+
+
+
+
+
+
+
+
+
+
+
+ Defines logging severity levels.
+
+
+
+
+ Logs that contain the most detailed messages. These messages may contain sensitive application data.
+ These messages are disabled by default and should never be enabled in a production environment.
+
+
+
+
+ Logs that are used for interactive investigation during development. These logs should primarily contain
+ information useful for debugging and have no long-term value.
+
+
+
+
+ Logs that track the general flow of the application. These logs should have long-term value.
+
+
+
+
+ Logs that highlight an abnormal or unexpected event in the application flow, but do not otherwise cause the
+ application execution to stop.
+
+
+
+
+ Logs that highlight when the current flow of execution is stopped due to a failure. These should indicate a
+ failure in the current activity, not an application-wide failure.
+
+
+
+
+ Logs that describe an unrecoverable application or system crash, or a catastrophic failure that requires
+ immediate attention.
+
+
+
+
+ Not used for writing log messages. Specifies that a logging category should not write any messages.
+
+
+
+
+ Formatter to convert the named format items like {NamedformatItem} to format.
+
+
+
+
+ Scope provider that does nothing.
+
+
+
+
+ Returns a cached instance of .
+
+
+
+
+
+
+
+
+
+
+ An empty scope without any logic
+
+
+
+
+
+
+
+ Pretty print a type name.
+
+ The .
+ true to print a fully qualified name.
+ true to include generic parameter names.
+ true to include generic parameters.
+ Character to use as a delimiter in nested type names
+ The pretty printed type name.
+
+
+
+ Get a pinnable reference to the builder.
+ Does not ensure there is a null char after
+ This overload is pattern matched in the C# 7.3+ compiler so you can omit
+ the explicit method call, and write eg "fixed (char* c = builder)"
+
+
+
+
+ Get a pinnable reference to the builder.
+
+ Ensures that the builder has a null char after
+
+
+ Returns the underlying storage of the builder.
+
+
+
+ Returns a span around the contents of the builder.
+
+ Ensures that the builder has a null char after
+
+
+
+ Resize the internal buffer either by doubling current buffer size or
+ by adding to
+ whichever is greater.
+
+
+ Number of chars requested beyond current position.
+
+
+
+ The format string '{0}' does not have the expected number of named parameters. Expected {1} parameter(s) but found {2} parameter(s).
+
+
+ Specifies that null is allowed as an input even if the corresponding type disallows it.
+
+
+ Specifies that null is disallowed as an input even if the corresponding type allows it.
+
+
+ Specifies that an output may be null even if the corresponding type disallows it.
+
+
+ Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.
+
+
+ Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it.
+
+
+ Initializes the attribute with the specified return value condition.
+
+ The return value condition. If the method returns this value, the associated parameter may be null.
+
+
+
+ Gets the return value condition.
+
+
+ Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it.
+
+
+ Initializes the attribute with the specified return value condition.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+
+
+
+ Gets the return value condition.
+
+
+ Specifies that the output will be non-null if the named parameter is non-null.
+
+
+ Initializes the attribute with the associated parameter name.
+
+ The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
+
+
+
+ Gets the associated parameter name.
+
+
+ Applied to a method that will never return under any circumstance.
+
+
+ Specifies that the method will not return if the associated Boolean parameter is passed the specified value.
+
+
+ Initializes the attribute with the specified parameter value.
+
+ The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
+ the associated parameter matches this value.
+
+
+
+ Gets the condition parameter value.
+
+
+ Specifies that the method or property will ensure that the listed field and property members have not-null values.
+
+
+ Initializes the attribute with a field or property member.
+
+ The field or property member that is promised to be not-null.
+
+
+
+ Initializes the attribute with the list of field and property members.
+
+ The list of field and property members that are promised to be not-null.
+
+
+
+ Gets field or property member names.
+
+
+ Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.
+
+
+ Initializes the attribute with the specified return value condition and a field or property member.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+
+
+ The field or property member that is promised to be not-null.
+
+
+
+ Initializes the attribute with the specified return value condition and list of field and property members.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+
+
+ The list of field and property members that are promised to be not-null.
+
+
+
+ Gets the return value condition.
+
+
+ Gets field or property member names.
+
+
+
diff --git a/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/LICENSE.TXT b/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/LICENSE.TXT
index fa3121d..984713a 100644
--- a/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/LICENSE.TXT
+++ b/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/LICENSE.TXT
@@ -1,23 +1,23 @@
-The MIT License (MIT)
-
-Copyright (c) .NET Foundation and Contributors
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+The MIT License (MIT)
+
+Copyright (c) .NET Foundation and Contributors
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/System.Diagnostics.DiagnosticSource.nuspec b/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/System.Diagnostics.DiagnosticSource.nuspec
index 7514854..8e8eb55 100644
--- a/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/System.Diagnostics.DiagnosticSource.nuspec
+++ b/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/System.Diagnostics.DiagnosticSource.nuspec
@@ -1,37 +1,37 @@
-
-
-
- System.Diagnostics.DiagnosticSource
- 6.0.1
- Microsoft
- MIT
- https://licenses.nuget.org/MIT
- Icon.png
- https://dot.net/
- Provides Classes that allow you to decouple code logging rich (unserializable) diagnostics/telemetry (e.g. framework) from code that consumes it (e.g. tools)
-
-Commonly Used Types:
-System.Diagnostics.DiagnosticListener
-System.Diagnostics.DiagnosticSource
- https://go.microsoft.com/fwlink/?LinkID=799421
- © Microsoft Corporation. All rights reserved.
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ System.Diagnostics.DiagnosticSource
+ 6.0.1
+ Microsoft
+ MIT
+ https://licenses.nuget.org/MIT
+ Icon.png
+ https://dot.net/
+ Provides Classes that allow you to decouple code logging rich (unserializable) diagnostics/telemetry (e.g. framework) from code that consumes it (e.g. tools)
+
+Commonly Used Types:
+System.Diagnostics.DiagnosticListener
+System.Diagnostics.DiagnosticSource
+ https://go.microsoft.com/fwlink/?LinkID=799421
+ © Microsoft Corporation. All rights reserved.
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/THIRD-PARTY-NOTICES.TXT b/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/THIRD-PARTY-NOTICES.TXT
index ef06c0f..e8185f3 100644
--- a/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/THIRD-PARTY-NOTICES.TXT
+++ b/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/THIRD-PARTY-NOTICES.TXT
@@ -1,957 +1,957 @@
-.NET Runtime uses third-party libraries or other resources that may be
-distributed under licenses different than the .NET Runtime software.
-
-In the event that we accidentally failed to list a required notice, please
-bring it to our attention. Post an issue or email us:
-
- dotnet@microsoft.com
-
-The attached notices are provided for information only.
-
-License notice for ASP.NET
--------------------------------
-
-Copyright (c) .NET Foundation. All rights reserved.
-Licensed under the Apache License, Version 2.0.
-
-Available at
-https://github.com/dotnet/aspnetcore/blob/main/LICENSE.txt
-
-License notice for Slicing-by-8
--------------------------------
-
-http://sourceforge.net/projects/slicing-by-8/
-
-Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
-
-
-This software program is licensed subject to the BSD License, available at
-http://www.opensource.org/licenses/bsd-license.html.
-
-
-License notice for Unicode data
--------------------------------
-
-https://www.unicode.org/license.html
-
-Copyright © 1991-2020 Unicode, Inc. All rights reserved.
-Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Unicode data files and any associated documentation
-(the "Data Files") or Unicode software and any associated documentation
-(the "Software") to deal in the Data Files or Software
-without restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, and/or sell copies of
-the Data Files or Software, and to permit persons to whom the Data Files
-or Software are furnished to do so, provided that either
-(a) this copyright and permission notice appear with all copies
-of the Data Files or Software, or
-(b) this copyright and permission notice appear in associated
-Documentation.
-
-THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT OF THIRD PARTY RIGHTS.
-IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
-NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THE DATA FILES OR SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder
-shall not be used in advertising or otherwise to promote the sale,
-use or other dealings in these Data Files or Software without prior
-written authorization of the copyright holder.
-
-License notice for Zlib
------------------------
-
-https://github.com/madler/zlib
-http://zlib.net/zlib_license.html
-
-/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.11, January 15th, 2017
-
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
-*/
-
-License notice for Mono
--------------------------------
-
-http://www.mono-project.com/docs/about-mono/
-
-Copyright (c) .NET Foundation Contributors
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the Software), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for International Organization for Standardization
------------------------------------------------------------------
-
-Portions (C) International Organization for Standardization 1986:
- Permission to copy in any form is granted for use with
- conforming SGML systems and applications as defined in
- ISO 8879, provided this notice is included in all copies.
-
-License notice for Intel
-------------------------
-
-"Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Xamarin and Novell
--------------------------------------
-
-Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-Copyright (c) 2011 Novell, Inc (http://www.novell.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-Third party notice for W3C
---------------------------
-
-"W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE
-Status: This license takes effect 13 May, 2015.
-This work is being provided by the copyright holders under the following license.
-License
-By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
-Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
-The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
-Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
-Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)."
-Disclaimers
-THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
-The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders."
-
-License notice for Bit Twiddling Hacks
---------------------------------------
-
-Bit Twiddling Hacks
-
-By Sean Eron Anderson
-seander@cs.stanford.edu
-
-Individually, the code snippets here are in the public domain (unless otherwise
-noted) — feel free to use them however you please. The aggregate collection and
-descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are
-distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and
-without even the implied warranty of merchantability or fitness for a particular
-purpose.
-
-License notice for Brotli
---------------------------------------
-
-Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-compress_fragment.c:
-Copyright (c) 2011, Google Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-decode_fuzzer.c:
-Copyright (c) 2015 The Chromium Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-
-License notice for Json.NET
--------------------------------
-
-https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md
-
-The MIT License (MIT)
-
-Copyright (c) 2007 James Newton-King
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for vectorized base64 encoding / decoding
---------------------------------------------------------
-
-Copyright (c) 2005-2007, Nick Galbreath
-Copyright (c) 2013-2017, Alfred Klomp
-Copyright (c) 2015-2017, Wojciech Mula
-Copyright (c) 2016-2017, Matthieu Darbois
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
-- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for RFC 3492
----------------------------
-
-The punycode implementation is based on the sample code in RFC 3492
-
-Copyright (C) The Internet Society (2003). All Rights Reserved.
-
-This document and translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it
-or assist in its implementation may be prepared, copied, published
-and distributed, in whole or in part, without restriction of any
-kind, provided that the above copyright notice and this paragraph are
-included on all such copies and derivative works. However, this
-document itself may not be modified in any way, such as by removing
-the copyright notice or references to the Internet Society or other
-Internet organizations, except as needed for the purpose of
-developing Internet standards in which case the procedures for
-copyrights defined in the Internet Standards process must be
-followed, or as required to translate it into languages other than
-English.
-
-The limited permissions granted above are perpetual and will not be
-revoked by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an
-"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
-TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
-BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
-HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-License notice for Algorithm from Internet Draft document "UUIDs and GUIDs"
----------------------------------------------------------------------------
-
-Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
-Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
-Digital Equipment Corporation, Maynard, Mass.
-To anyone who acknowledges that this file is provided "AS IS"
-without any express or implied warranty: permission to use, copy,
-modify, and distribute this file for any purpose is hereby
-granted without fee, provided that the above copyright notices and
-this notice appears in all source code copies, and that none of
-the names of Open Software Foundation, Inc., Hewlett-Packard
-Company, or Digital Equipment Corporation be used in advertising
-or publicity pertaining to distribution of the software without
-specific, written prior permission. Neither Open Software
-Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment
-Corporation makes any representations about the suitability of
-this software for any purpose.
-
-Copyright(C) The Internet Society 1997. All Rights Reserved.
-
-This document and translations of it may be copied and furnished to others,
-and derivative works that comment on or otherwise explain it or assist in
-its implementation may be prepared, copied, published and distributed, in
-whole or in part, without restriction of any kind, provided that the above
-copyright notice and this paragraph are included on all such copies and
-derivative works.However, this document itself may not be modified in any
-way, such as by removing the copyright notice or references to the Internet
-Society or other Internet organizations, except as needed for the purpose of
-developing Internet standards in which case the procedures for copyrights
-defined in the Internet Standards process must be followed, or as required
-to translate it into languages other than English.
-
-The limited permissions granted above are perpetual and will not be revoked
-by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an "AS IS"
-basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
-DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
-ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
-RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
-PARTICULAR PURPOSE.
-
-License notice for Algorithm from RFC 4122 -
-A Universally Unique IDentifier (UUID) URN Namespace
-----------------------------------------------------
-
-Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
-Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
-Digital Equipment Corporation, Maynard, Mass.
-Copyright (c) 1998 Microsoft.
-To anyone who acknowledges that this file is provided "AS IS"
-without any express or implied warranty: permission to use, copy,
-modify, and distribute this file for any purpose is hereby
-granted without fee, provided that the above copyright notices and
-this notice appears in all source code copies, and that none of
-the names of Open Software Foundation, Inc., Hewlett-Packard
-Company, Microsoft, or Digital Equipment Corporation be used in
-advertising or publicity pertaining to distribution of the software
-without specific, written prior permission. Neither Open Software
-Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
-Equipment Corporation makes any representations about the
-suitability of this software for any purpose."
-
-License notice for The LLVM Compiler Infrastructure
----------------------------------------------------
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-License notice for Bob Jenkins
-------------------------------
-
-By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
-code any way you wish, private, educational, or commercial. It's free.
-
-License notice for Greg Parker
-------------------------------
-
-Greg Parker gparker@cs.stanford.edu December 2000
-This code is in the public domain and may be copied or modified without
-permission.
-
-License notice for libunwind based code
-----------------------------------------
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for Printing Floating-Point Numbers (Dragon4)
-------------------------------------------------------------
-
-/******************************************************************************
- Copyright (c) 2014 Ryan Juckett
- http://www.ryanjuckett.com/
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
- 3. This notice may not be removed or altered from any source
- distribution.
-******************************************************************************/
-
-License notice for Printing Floating-point Numbers (Grisu3)
------------------------------------------------------------
-
-Copyright 2012 the V8 project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for xxHash
--------------------------
-
-xxHash Library
-Copyright (c) 2012-2014, Yann Collet
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Berkeley SoftFloat Release 3e
-------------------------------------------------
-
-https://github.com/ucb-bar/berkeley-softfloat-3
-https://github.com/ucb-bar/berkeley-softfloat-3/blob/master/COPYING.txt
-
-License for Berkeley SoftFloat Release 3e
-
-John R. Hauser
-2018 January 20
-
-The following applies to the whole of SoftFloat Release 3e as well as to
-each source file individually.
-
-Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
-University of California. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions, and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions, and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for xoshiro RNGs
---------------------------------
-
-Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
-
-To the extent possible under law, the author has dedicated all copyright
-and related and neighboring rights to this software to the public domain
-worldwide. This software is distributed without any warranty.
-
-See .
-
-License for fastmod (https://github.com/lemire/fastmod) and ibm-fpgen (https://github.com/nigeltao/parse-number-fxx-test-data)
---------------------------------------
-
- Copyright 2018 Daniel Lemire
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-License notice for The C++ REST SDK
------------------------------------
-
-C++ REST SDK
-
-The MIT License (MIT)
-
-Copyright (c) Microsoft Corporation
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for MessagePack-CSharp
--------------------------------------
-
-MessagePack for C#
-
-MIT License
-
-Copyright (c) 2017 Yoshifumi Kawai
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for lz4net
--------------------------------------
-
-lz4net
-
-Copyright (c) 2013-2017, Milosz Krajewski
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Nerdbank.Streams
------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) Andrew Arnott
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for RapidJSON
-----------------------------
-
-Tencent is pleased to support the open source community by making RapidJSON available.
-
-Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
-
-Licensed under the MIT License (the "License"); you may not use this file except
-in compliance with the License. You may obtain a copy of the License at
-
-http://opensource.org/licenses/MIT
-
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
-
-License notice for DirectX Math Library
----------------------------------------
-
-https://github.com/microsoft/DirectXMath/blob/master/LICENSE
-
- The MIT License (MIT)
-
-Copyright (c) 2011-2020 Microsoft Corp
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this
-software and associated documentation files (the "Software"), to deal in the Software
-without restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be included in all copies
-or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
-CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
-OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for ldap4net
----------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2018 Alexander Chermyanin
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for vectorized sorting code
-------------------------------------------
-
-MIT License
-
-Copyright (c) 2020 Dan Shechter
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for musl
------------------------
-
-musl as a whole is licensed under the following standard MIT license:
-
-Copyright © 2005-2020 Rich Felker, et al.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-License notice for "Faster Unsigned Division by Constants"
-------------------------------
-
-Reference implementations of computing and using the "magic number" approach to dividing
-by constants, including codegen instructions. The unsigned division incorporates the
-"round down" optimization per ridiculous_fish.
-
-This is free and unencumbered software. Any copyright is dedicated to the Public Domain.
-
-
-License notice for mimalloc
------------------------------------
-
-MIT License
-
-Copyright (c) 2019 Microsoft Corporation, Daan Leijen
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License for remote stack unwind (https://github.com/llvm/llvm-project/blob/main/lldb/source/Symbol/CompactUnwindInfo.cpp)
---------------------------------------
-
-Copyright 2019 LLVM Project
-
-Licensed under the Apache License, Version 2.0 (the "License") with LLVM Exceptions;
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-https://llvm.org/LICENSE.txt
-
-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.
-
+.NET Runtime uses third-party libraries or other resources that may be
+distributed under licenses different than the .NET Runtime software.
+
+In the event that we accidentally failed to list a required notice, please
+bring it to our attention. Post an issue or email us:
+
+ dotnet@microsoft.com
+
+The attached notices are provided for information only.
+
+License notice for ASP.NET
+-------------------------------
+
+Copyright (c) .NET Foundation. All rights reserved.
+Licensed under the Apache License, Version 2.0.
+
+Available at
+https://github.com/dotnet/aspnetcore/blob/main/LICENSE.txt
+
+License notice for Slicing-by-8
+-------------------------------
+
+http://sourceforge.net/projects/slicing-by-8/
+
+Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
+
+
+This software program is licensed subject to the BSD License, available at
+http://www.opensource.org/licenses/bsd-license.html.
+
+
+License notice for Unicode data
+-------------------------------
+
+https://www.unicode.org/license.html
+
+Copyright © 1991-2020 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+
+License notice for Zlib
+-----------------------
+
+https://github.com/madler/zlib
+http://zlib.net/zlib_license.html
+
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.11, January 15th, 2017
+
+ Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+*/
+
+License notice for Mono
+-------------------------------
+
+http://www.mono-project.com/docs/about-mono/
+
+Copyright (c) .NET Foundation Contributors
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the Software), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for International Organization for Standardization
+-----------------------------------------------------------------
+
+Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+
+License notice for Intel
+------------------------
+
+"Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Xamarin and Novell
+-------------------------------------
+
+Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Copyright (c) 2011 Novell, Inc (http://www.novell.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Third party notice for W3C
+--------------------------
+
+"W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE
+Status: This license takes effect 13 May, 2015.
+This work is being provided by the copyright holders under the following license.
+License
+By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
+Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
+The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
+Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
+Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)."
+Disclaimers
+THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
+The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders."
+
+License notice for Bit Twiddling Hacks
+--------------------------------------
+
+Bit Twiddling Hacks
+
+By Sean Eron Anderson
+seander@cs.stanford.edu
+
+Individually, the code snippets here are in the public domain (unless otherwise
+noted) — feel free to use them however you please. The aggregate collection and
+descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are
+distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and
+without even the implied warranty of merchantability or fitness for a particular
+purpose.
+
+License notice for Brotli
+--------------------------------------
+
+Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+compress_fragment.c:
+Copyright (c) 2011, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+decode_fuzzer.c:
+Copyright (c) 2015 The Chromium Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+
+License notice for Json.NET
+-------------------------------
+
+https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md
+
+The MIT License (MIT)
+
+Copyright (c) 2007 James Newton-King
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for vectorized base64 encoding / decoding
+--------------------------------------------------------
+
+Copyright (c) 2005-2007, Nick Galbreath
+Copyright (c) 2013-2017, Alfred Klomp
+Copyright (c) 2015-2017, Wojciech Mula
+Copyright (c) 2016-2017, Matthieu Darbois
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+- Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for RFC 3492
+---------------------------
+
+The punycode implementation is based on the sample code in RFC 3492
+
+Copyright (C) The Internet Society (2003). All Rights Reserved.
+
+This document and translations of it may be copied and furnished to
+others, and derivative works that comment on or otherwise explain it
+or assist in its implementation may be prepared, copied, published
+and distributed, in whole or in part, without restriction of any
+kind, provided that the above copyright notice and this paragraph are
+included on all such copies and derivative works. However, this
+document itself may not be modified in any way, such as by removing
+the copyright notice or references to the Internet Society or other
+Internet organizations, except as needed for the purpose of
+developing Internet standards in which case the procedures for
+copyrights defined in the Internet Standards process must be
+followed, or as required to translate it into languages other than
+English.
+
+The limited permissions granted above are perpetual and will not be
+revoked by the Internet Society or its successors or assigns.
+
+This document and the information contained herein is provided on an
+"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+License notice for Algorithm from Internet Draft document "UUIDs and GUIDs"
+---------------------------------------------------------------------------
+
+Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
+Digital Equipment Corporation, Maynard, Mass.
+To anyone who acknowledges that this file is provided "AS IS"
+without any express or implied warranty: permission to use, copy,
+modify, and distribute this file for any purpose is hereby
+granted without fee, provided that the above copyright notices and
+this notice appears in all source code copies, and that none of
+the names of Open Software Foundation, Inc., Hewlett-Packard
+Company, or Digital Equipment Corporation be used in advertising
+or publicity pertaining to distribution of the software without
+specific, written prior permission. Neither Open Software
+Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment
+Corporation makes any representations about the suitability of
+this software for any purpose.
+
+Copyright(C) The Internet Society 1997. All Rights Reserved.
+
+This document and translations of it may be copied and furnished to others,
+and derivative works that comment on or otherwise explain it or assist in
+its implementation may be prepared, copied, published and distributed, in
+whole or in part, without restriction of any kind, provided that the above
+copyright notice and this paragraph are included on all such copies and
+derivative works.However, this document itself may not be modified in any
+way, such as by removing the copyright notice or references to the Internet
+Society or other Internet organizations, except as needed for the purpose of
+developing Internet standards in which case the procedures for copyrights
+defined in the Internet Standards process must be followed, or as required
+to translate it into languages other than English.
+
+The limited permissions granted above are perpetual and will not be revoked
+by the Internet Society or its successors or assigns.
+
+This document and the information contained herein is provided on an "AS IS"
+basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
+DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
+RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
+PARTICULAR PURPOSE.
+
+License notice for Algorithm from RFC 4122 -
+A Universally Unique IDentifier (UUID) URN Namespace
+----------------------------------------------------
+
+Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
+Digital Equipment Corporation, Maynard, Mass.
+Copyright (c) 1998 Microsoft.
+To anyone who acknowledges that this file is provided "AS IS"
+without any express or implied warranty: permission to use, copy,
+modify, and distribute this file for any purpose is hereby
+granted without fee, provided that the above copyright notices and
+this notice appears in all source code copies, and that none of
+the names of Open Software Foundation, Inc., Hewlett-Packard
+Company, Microsoft, or Digital Equipment Corporation be used in
+advertising or publicity pertaining to distribution of the software
+without specific, written prior permission. Neither Open Software
+Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
+Equipment Corporation makes any representations about the
+suitability of this software for any purpose."
+
+License notice for The LLVM Compiler Infrastructure
+---------------------------------------------------
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+License notice for Bob Jenkins
+------------------------------
+
+By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
+code any way you wish, private, educational, or commercial. It's free.
+
+License notice for Greg Parker
+------------------------------
+
+Greg Parker gparker@cs.stanford.edu December 2000
+This code is in the public domain and may be copied or modified without
+permission.
+
+License notice for libunwind based code
+----------------------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for Printing Floating-Point Numbers (Dragon4)
+------------------------------------------------------------
+
+/******************************************************************************
+ Copyright (c) 2014 Ryan Juckett
+ http://www.ryanjuckett.com/
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+******************************************************************************/
+
+License notice for Printing Floating-point Numbers (Grisu3)
+-----------------------------------------------------------
+
+Copyright 2012 the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for xxHash
+-------------------------
+
+xxHash Library
+Copyright (c) 2012-2014, Yann Collet
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice, this
+ list of conditions and the following disclaimer in the documentation and/or
+ other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Berkeley SoftFloat Release 3e
+------------------------------------------------
+
+https://github.com/ucb-bar/berkeley-softfloat-3
+https://github.com/ucb-bar/berkeley-softfloat-3/blob/master/COPYING.txt
+
+License for Berkeley SoftFloat Release 3e
+
+John R. Hauser
+2018 January 20
+
+The following applies to the whole of SoftFloat Release 3e as well as to
+each source file individually.
+
+Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
+University of California. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions, and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for xoshiro RNGs
+--------------------------------
+
+Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
+
+To the extent possible under law, the author has dedicated all copyright
+and related and neighboring rights to this software to the public domain
+worldwide. This software is distributed without any warranty.
+
+See .
+
+License for fastmod (https://github.com/lemire/fastmod) and ibm-fpgen (https://github.com/nigeltao/parse-number-fxx-test-data)
+--------------------------------------
+
+ Copyright 2018 Daniel Lemire
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+License notice for The C++ REST SDK
+-----------------------------------
+
+C++ REST SDK
+
+The MIT License (MIT)
+
+Copyright (c) Microsoft Corporation
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for MessagePack-CSharp
+-------------------------------------
+
+MessagePack for C#
+
+MIT License
+
+Copyright (c) 2017 Yoshifumi Kawai
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for lz4net
+-------------------------------------
+
+lz4net
+
+Copyright (c) 2013-2017, Milosz Krajewski
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Nerdbank.Streams
+-----------------------------------
+
+The MIT License (MIT)
+
+Copyright (c) Andrew Arnott
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for RapidJSON
+----------------------------
+
+Tencent is pleased to support the open source community by making RapidJSON available.
+
+Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
+
+Licensed under the MIT License (the "License"); you may not use this file except
+in compliance with the License. You may obtain a copy of the License at
+
+http://opensource.org/licenses/MIT
+
+Unless required by applicable law or agreed to in writing, software distributed
+under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied. See the License for the
+specific language governing permissions and limitations under the License.
+
+License notice for DirectX Math Library
+---------------------------------------
+
+https://github.com/microsoft/DirectXMath/blob/master/LICENSE
+
+ The MIT License (MIT)
+
+Copyright (c) 2011-2020 Microsoft Corp
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be included in all copies
+or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for ldap4net
+---------------------------
+
+The MIT License (MIT)
+
+Copyright (c) 2018 Alexander Chermyanin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for vectorized sorting code
+------------------------------------------
+
+MIT License
+
+Copyright (c) 2020 Dan Shechter
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for musl
+-----------------------
+
+musl as a whole is licensed under the following standard MIT license:
+
+Copyright © 2005-2020 Rich Felker, et al.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+License notice for "Faster Unsigned Division by Constants"
+------------------------------
+
+Reference implementations of computing and using the "magic number" approach to dividing
+by constants, including codegen instructions. The unsigned division incorporates the
+"round down" optimization per ridiculous_fish.
+
+This is free and unencumbered software. Any copyright is dedicated to the Public Domain.
+
+
+License notice for mimalloc
+-----------------------------------
+
+MIT License
+
+Copyright (c) 2019 Microsoft Corporation, Daan Leijen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License for remote stack unwind (https://github.com/llvm/llvm-project/blob/main/lldb/source/Symbol/CompactUnwindInfo.cpp)
+--------------------------------------
+
+Copyright 2019 LLVM Project
+
+Licensed under the Apache License, Version 2.0 (the "License") with LLVM Exceptions;
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+https://llvm.org/LICENSE.txt
+
+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.
+
diff --git a/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/buildTransitive/netcoreapp2.0/System.Diagnostics.DiagnosticSource.targets b/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/buildTransitive/netcoreapp2.0/System.Diagnostics.DiagnosticSource.targets
index 5e9dba7..c339813 100644
--- a/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/buildTransitive/netcoreapp2.0/System.Diagnostics.DiagnosticSource.targets
+++ b/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/buildTransitive/netcoreapp2.0/System.Diagnostics.DiagnosticSource.targets
@@ -1,6 +1,6 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/lib/netstandard2.0/System.Diagnostics.DiagnosticSource.xml b/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/lib/netstandard2.0/System.Diagnostics.DiagnosticSource.xml
index 5e32abb..20f5e05 100644
--- a/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/lib/netstandard2.0/System.Diagnostics.DiagnosticSource.xml
+++ b/unity/Assets/Packages/System.Diagnostics.DiagnosticSource.6.0.1/lib/netstandard2.0/System.Diagnostics.DiagnosticSource.xml
@@ -1,1568 +1,1568 @@
-
-
-
- System.Diagnostics.DiagnosticSource
-
-
-
- Represents an operation with context to be used for logging.
-
-
- Initializes a new instance of the class.
- The name of the operation.
-
-
- Updates the to have a new baggage item with the specified key and value.
- The baggage key.
- The baggage value.
-
- for convenient chaining.
-
-
- Adds the specified activity event to the events list.
- The activity event to add.
-
- for convenient chaining.
-
-
- Updates the activity to have a tag with an additional and .
- The tag key name.
- The tag value mapped to the input key.
-
- for convenient chaining.
-
-
- Updates the to have a new tag with the provided and .
- The tag key.
- The tag value.
-
- for convenient chaining.
-
-
- Stops the activity if it is already started and notifies any event listeners. Nothing will happen otherwise.
-
-
- When overriden by a derived type, this method releases any allocated resources.
-
- if the method is being called from the finalizer; if calling from user code.
-
-
- Returns the value of a key-value pair added to the activity with .
- The baggage key.
- The value of the key-value-pair item if it exists, or if it does not exist.
-
-
- Returns the object mapped to the specified property name.
- The name associated to the object.
- The object mapped to the property name, if one is found; otherwise, .
-
-
- Returns the value of the Activity tag mapped to the input key/>.
- Returns if that key does not exist.
- The tag key string.
- The tag value mapped to the input key.
-
-
- Add or update the Activity baggage with the input key and value.
- If the input value is - if the collection has any baggage with the same key, then this baggage will get removed from the collection.
- - otherwise, nothing will happen and the collection will not change.
- If the input value is not - if the collection has any baggage with the same key, then the value mapped to this key will get updated with the new input value.
- - otherwise, the key and value will get added as a new baggage to the collection.
- Baggage item will be updated/removed only if it was originaly added to the current activity. Items inherited from the parents will not be changed/removed, new item would be added to current activity baggage instead.
- The baggage key name
- The baggage value mapped to the input key
-
- for convenient chaining.
-
-
- Attaches any custom object to this activity. If the specified was previously associated with another object, the property will be updated to be associated with the new instead. It is recommended to use a unique property name to avoid conflicts with anyone using the same value.
- The name to associate the value with.
- The object to attach and map to the property name.
-
-
- Updates the to set its as the difference between and the specified stop time.
- The UTC stop time.
-
- for convenient chaining.
-
-
- Sets the ID format on this before it is started.
- One of the enumeration values that specifies the format of the property.
-
- for convenient chaining.
-
-
- Sets the parent ID using the W3C convention of a TraceId and a SpanId.
- The parent activity's TraceId.
- The parent activity's SpanId.
- One of the enumeration values that specifies flags defined by the W3C standard that are associated with an activity.
-
- for convenient chaining.
-
-
- Updates this to indicate that the with an ID of caused this .
- The ID of the parent operation.
-
- for convenient chaining.
-
-
- Sets the start time of this .
- The start time in UTC.
-
- for convenient chaining.
-
-
- Sets the status code and description on the current activity object.
- The status code
- The error status description
-
- for convenient chaining.
-
-
- Adds or update the activity tag with the input key and value.
- The tag key name.
- The tag value mapped to the input key.
-
- for convenient chaining.
-
-
- Starts the activity.
-
- for convenient chaining.
-
-
- Stops the activity.
-
-
- Gets or sets the flags (defined by the W3C ID specification) associated with the activity.
- the flags associated with the activity.
-
-
- Gets a collection of key/value pairs that represents information that is passed to children of this .
- Information that's passed to children of this .
-
-
- Gets the context of the activity. Context becomes valid only if the activity has been started.
- The context of the activity, if the activity has been started; otherwise, returns the default context.
-
-
- Gets or sets the current operation ( ) for the current thread. This flows across async calls.
- The current operation for the current thread.
-
-
- Gets or sets the default ID format for the .
-
-
- Gets or sets the display name of the activity.
- A string that represents the activity display name.
-
-
- Gets the duration of the operation.
- The delta between and the end time if the has ended ( or was called), or if the has not ended and was not called.
-
-
- Gets the list of all the activity events attached to this activity.
- An enumeration of activity events attached to this activity. If the activity has no events, returns an empty enumeration.
-
-
- Gets or sets a value that detrmines if the is always used to define the default ID format.
-
- to always use the ; otherwise, .
-
-
- Gets an identifier that is specific to a particular request.
- The activity ID.
-
-
- Gets the format for the .
- The format for the .
-
-
- Gets or sets a value that indicates whether this activity should be populated with all the propagation information, as well as all the other properties, such as links, tags, and events.
-
- if the activity should be populated; otherwise.
-
-
- Gets the relationship between the activity, its parents, and its children in a trace.
- One of the enumeration values that indicate relationship between the activity, its parents, and its children in a trace.
-
-
- Gets the list of all the activity links attached to this activity.
- An enumeration of activity links attached to this activity. If the activity has no links, returns an empty enumeration.
-
-
- Gets the operation name.
- The name of the operation.
-
-
- Gets the parent that created this activity.
- The parent of this , if it is from the same process, or if this instance has no parent (it is a root activity) or if the parent is from outside the process.
-
-
- Gets the ID of this activity's parent.
- The parent ID, if one exists, or if it does not.
-
-
- Gets the parent's .
- The parent's .
-
-
- Gets a value that indicates whether the W3CIdFlags.Recorded flag is set.
-
- if the W3CIdFlags.Recorded flag is set; otherwise, .
-
-
- Gets the root ID of this .
- The root ID, or if the current instance has either a or an .
-
-
- Gets the activity source associated with this activity.
-
-
- Gets the SPAN part of the .
- The ID for the SPAN part of , if the has the W3C format; otherwise, a zero .
-
-
- Gets the time when the operation started.
- The UTC time that the operation started.
-
-
- Gets status code of the current activity object.
-
-
- Gets the status description of the current activity object.
-
-
- Gets the list of tags that represent information to log along with the activity. This information is not passed on to the children of this activity.
- A key-value pair enumeration of tags and objects.
-
-
- Gets a collection of key/value pairs that represent information that will be logged along with the to the logging system.
- Information that will be logged along with the to the logging system.
-
-
- Gets the TraceId part of the .
- The ID for the TraceId part of the , if the ID has the W3C format; otherwise, a zero TraceId.
-
-
- When starting an Activity which does not have a parent context, the Trace Id will automatically be generated using random numbers.
- TraceIdGenerator can be used to override the runtime's default Trace Id generation algorithm.
-
-
- Gets or sets the W3C header.
- The W3C header.
-
-
- A representation that conforms to the W3C TraceContext specification. It contains two identifiers: a TraceId and a SpanId, along with a set of common TraceFlags and system-specific TraceState values.
-
-
- Construct a new activity context instance using the specified arguments.
- A trace identifier.
- A span identifier.
- Contain details about the trace.
- Carries system-specific configuration data.
- Indicates if the context is propagated from a remote parent.
-
-
- Indicates whether the current object is equal to another object of the same type.
- The object to compare to this instance.
-
- if the current object is equal to the parameter; otherwise, .
-
-
- Determines whether this instance and a specified object have the same value.
- The object to compare to this instance.
-
- if the current object is equal to the parameter; otherwise, .
-
-
- Provides a hash function for the current that's suitable for hashing algorithms and data structures, such as hash tables.
- A hash code for the current .
-
-
- Determines whether two specified values are equal.
- The first value to compare.
- The second value to compare.
-
- if and are equal; otherwise, .
-
-
- Determines whether two specified values are not equal.
- The first value to compare.
- The second value to compare.
-
- if and are not equal; otherwise, .
-
-
- Parses a W3C trace context headers to an object.
- The W3C trace parent header.
- The trace state.
- The trace parent is invalid.
- The object created from the parsing operation.
-
-
- Tries to parse the W3C trace context headers to an object.
- The W3C trace parent header.
- The W3C trace state.
- When this method returns , the object created from the parsing operation.
-
- if the parsing was successful; otherwise.
-
-
- Indicates if the activity context was propagated from a remote parent.
-
- if it was propagated from a remote parent; otherwise.
-
-
- The Id of the request as known by the caller.
- The Span Id in the context.
-
-
- The flags defined by the W3C standard along with the ID for the activity.
- The context tracing flags.
-
-
- The trace identifier.
- The tracing identifier in the context.
-
-
- Holds the W3C 'tracestate' header.
- A string representing the W3C 'tracestate' header.
-
-
- Encapsulates all the information that is sent to the activity listener, to make decisions about the creation of the activity instance, as well as its state.
-
-The possible generic type parameters are or .
- The type of the property. Should be either or .
-
-
- Gets the activity kind which the activity will be created with.
- One of the enumeration values that represent an activity kind.
-
-
- Gets the enumeration of activity links that the activity will be created with.
- An enumeration of activity links.
-
-
- Gets the name to use as OperationName of the activity that will get created.
- A string representing the activity name.
-
-
- Gets the parent context or parent Id that the activity will get created with.
- The parent of the activity, represented either as a or as an .
-
-
- Gets the collection that is used to add more tags during the sampling process. The added tags are also added to the created Activity if it is decided that it should be created by the callbacks.
- The Activity tags collection.
-
-
- Gets the activity source that creates the activity.
- An activity source object.
-
-
- Gets the tags that the activity will be created with.
- A key-value pair enumeration of tags associated with the activity.
-
-
- Gets the trace Id to use in the Activity object if it is decided that it should be created by callbacks.
- The trace Id.
-
-
- Represents an event containing a name and a timestamp, as well as an optional list of tags.
-
-
- Initializes a new activity event instance using the specified name and the current time as the event timestamp.
- The event name.
-
-
- Initializes a new activity event instance using the specified name, timestamp and tags.
- The event name.
- The event timestamp. Timestamp must only be used for the events that happened in the past, not at the moment of this call.
- The event tags.
-
-
- Gets the activity event name.
- A string representing the activity event name.
-
-
- Gets the collection of tags associated with the event.
- A key-value pair enumeration containing the tags associated with the event.
-
-
- Gets the activity event timestamp.
- A datetime offset representing the activity event timestamp.
-
-
- Specifies the format of the property.
-
-
- The hierarchical format.
-
-
- An unknown format.
-
-
- The W3C format.
-
-
- Describes the relationship between the activity, its parents and its children in a trace.
-
-
- Outgoing request to the external component.
-
-
- Output received from an external component.
-
-
- Internal operation within an application, as opposed to operations with remote parents or children. This is the default value.
-
-
- Output provided to external components.
-
-
- Requests incoming from external component.
-
-
- Activities may be linked to zero or more activity context instances that are causally related.
-
-Activity links can point to activity contexts inside a single trace or across different traces.
-
-Activity links can be used to represent batched operations where an activity was initiated by multiple initiating activities, each representing a single incoming item being processed in the batch.
-
-
- Constructs a new activity link, which can be linked to an activity.
- The trace activity context.
- The key-value pair list of tags associated to the activity context.
-
-
- Indicates whether the current activity link is equal to another activity link.
- The activity link to compare.
-
- if the current activity link is equal to ; otherwise, .
-
-
- Indicates whether the current activity link is equal to another object.
- The object to compare.
-
- if the current activity link is equal to ; otherwise, .
-
-
- Provides a hash function for the current that's suitable for hashing algorithms and data structures, such as hash tables.
- A hash code for the current .
-
-
- Determines whether two specified values are equal.
- The first value to compare.
- The second value to compare.
-
- if and are equal; otherwise, .
-
-
- Determines whether two specified values are not equal.
- The first value to compare.
- The second value to compare.
-
- if and are not equal; otherwise, .
-
-
- Retrieves the activity context inside this activity link.
-
-
- Retrieves the key-value pair enumeration of tags attached to the activity context.
- An enumeration of tags attached to the activity context.
-
-
- Allows listening to the start and stop activity events and gives the opportunity to decide creating an activity for sampling scenarios.
-
-
- Construct a new activity listener object to start listeneing to the activity events.
-
-
- Unregisters this activity listener object from listening to activity events.
-
-
- Gets or sets the callback used to listen to the activity start event.
- An activity callback instance used to listen to the activity start event.
-
-
- Gets or sets the callback used to listen to the activity stop event.
- An activity callback instance used to listen to the activity stop event.
-
-
- Gets or sets the callback that is used to decide if creating objects with a specific data state is allowed.
- A sample activity instance.
-
-
- Gets or sets the callback that is used to decide if creating objects with a specific data state is allowed.
- A sample activity instance.
-
-
- Gets or sets the callback that allows deciding if activity object events that were created using the activity source object should be listened or not.
-
- to listen events; otherwise.
-
-
- Enumeration values used by to indicate the amount of data to collect for the related . Requesting more data causes a greater performance overhead.
-
-
- The activity object should be populated with all the propagation information and also all other properties such as Links, Tags, and Events. Using this value causes to return .
-
-
- The activity object should be populated the same as the case. Additionally, Activity.Recorded is set to . For activities using the W3C trace ids, this sets a flag bit in the ID that will be propagated downstream requesting that the trace is recorded everywhere.
-
-
- The activity object does not need to be created.
-
-
- The activity object needs to be created. It will have a Name, a Source, an Id and Baggage. Other properties are unnecessary and will be ignored by this listener.
-
-
- Provides APIs to create and start objects and to register objects to listen to the events.
-
-
- Constructs an activity source object with the specified .
- The name of the activity source object.
- The version of the component publishing the tracing info.
-
-
- Adds a listener to the activity starting and stopping events.
- The activity listener object to use for listening to the activity events.
-
-
- Creates a new object if there is any listener to the Activity, returns otherwise.
- The operation name of the Activity
- The
- The created object or if there is no any event listener.
-
-
- Creates a new object if there is any listener to the Activity, returns otherwise.
- If the Activity object is created, it will not automatically start. Callers will need to call to start it.
- The operation name of the Activity.
- The
- The parent object to initialize the created Activity object with.
- The optional tags list to initialize the created Activity object with.
- The optional list to initialize the created Activity object with.
- The default Id format to use.
- The created object or if there is no any listener.
-
-
- Creates a new object if there is any listener to the Activity, returns otherwise.
- The operation name of the Activity.
- The
- The parent Id to initialize the created Activity object with.
- The optional tags list to initialize the created Activity object with.
- The optional list to initialize the created Activity object with.
- The default Id format to use.
- The created object or if there is no any listener.
-
-
- Disposes the activity source object, removes the current instance from the global list, and empties the listeners list.
-
-
- Checks if there are any listeners for this activity source.
-
- if there is a listener registered for this activity source; otherwise, .
-
-
- Creates and starts a new object if there is any listener to the Activity events, returns otherwise.
- The
- The parent object to initialize the created Activity object with.
- The optional tags list to initialize the created Activity object with.
- The optional list to initialize the created Activity object with.
- The optional start timestamp to set on the created Activity object.
- The operation name of the Activity.
- The created object or if there is no any listener.
-
-
- Creates a new activity if there are active listeners for it, using the specified name and activity kind.
- The operation name of the activity.
- The activity kind.
- The created activity object, if it had active listeners, or if it has no event listeners.
-
-
- Creates a new activity if there are active listeners for it, using the specified name, activity kind, parent activity context, tags, optional activity link and optional start time.
- The operation name of the activity.
- The activity kind.
- The parent object to initialize the created activity object with.
- The optional tags list to initialize the created activity object with.
- The optional list to initialize the created activity object with.
- The optional start timestamp to set on the created activity object.
- The created activity object, if it had active listeners, or if it has no event listeners.
-
-
- Creates a new activity if there are active listeners for it, using the specified name, activity kind, parent Id, tags, optional activity links and optional start time.
- The operation name of the activity.
- The activity kind.
- The parent Id to initialize the created activity object with.
- The optional tags list to initialize the created activity object with.
- The optional list to initialize the created activity object with.
- The optional start timestamp to set on the created activity object.
- The created activity object, if it had active listeners, or if it has no event listeners.
-
-
- Returns the activity source name.
- A string that represents the activity source name.
-
-
- Returns the activity source version.
- A string that represents the activity source version.
-
-
- Represents a formatted based on a W3C standard.
-
-
- Copies the 8 bytes of the current to a specified span.
- The span to which the 8 bytes of the SpanID are to be copied.
-
-
- Creates a new value from a read-only span of eight bytes.
- A read-only span of eight bytes.
-
- does not contain eight bytes.
- The new span ID.
-
-
- Creates a new value from a read-only span of 16 hexadecimal characters.
- A span that contains 16 hexadecimal characters.
-
- does not contain 16 hexadecimal characters.
-
--or-
-
-The characters in are not all lower-case hexadecimal characters or all zeros.
- The new span ID.
-
-
- Creates a new value from a read-only span of UTF8-encoded bytes.
- A read-only span of UTF8-encoded bytes.
- The new span ID.
-
-
- Creates a new based on a random number (that is very likely to be unique).
- The new span ID.
-
-
- Determines whether this instance and the specified instance have the same value.
- The instance to compare.
-
- if has the same hex value as the current instance; otherwise, .
-
-
- the current instance and a specified object, which also must be an instance, have the same value.
- The object to compare.
-
- if is an instance of and has the same hex value as the current instance; otherwise, .
-
-
- Returns the hash code of the SpanId.
- The hash code of the SpanId.
-
-
- Determines whether two specified instances have the same value.
- The first instance to compare.
- The second instance to compare.
-
- if the SpanId of is the same as the SpanId of ; otherwise, .
-
-
- Determine whether two specified instances have unequal values.
- The first instance to compare.
- The second instance to compare.
-
- if the SpanId of is different from the SpanId of ; otherwise, .
-
-
- Returns a 16-character hexadecimal string that represents this span ID.
- The 16-character hexadecimal string representation of this span ID.
-
-
- Returns a 16-character hexadecimal string that represents this span ID.
- The 16-character hexadecimal string representation of this span ID.
-
-
- Define the status code of the Activity which indicate the status of the instrumented operation.
-
-
- Status code indicating an error is encountered during the operation.
-
-
- Status code indicating the operation has been validated and completed successfully.
-
-
- Unset status code is the default value indicating the status code is not initialized.
-
-
- ActivityTagsCollection is a collection class used to store tracing tags.
-
-This collection will be used with classes like and .
-
-This collection behaves as follows:
-- The collection items will be ordered according to how they are added.
-- Don't allow duplication of items with the same key.
-- When using the indexer to store an item in the collection:
- - If the item has a key that previously existed in the collection and the value is , the collection item matching the key will be removed from the collection.
- - If the item has a key that previously existed in the collection and the value is not , the new item value will replace the old value stored in the collection.
- - Otherwise, the item will be added to the collection.
-- Add method will add a new item to the collection if an item doesn't already exist with the same key. Otherwise, it will throw an exception.
-
-
- Create a new instance of the collection.
-
-
- Create a new instance of the collection and store the input list items in the collection.
- Initial list to store in the collection.
-
-
- Adds an item to the collection.
- Key and value pair of the tag to add to the collection.
-
- already exists in the list.
-
- is .
-
-
- Adds a tag with the provided key and value to the collection. This collection doesn't allow adding two tags with the same key.
- The tag key.
- The tag value.
-
-
- Removes all items from the collection.
-
-
- Determines whether the contains a specific value.
- The object to locate in the .
-
- if is found in the ; otherwise, .
-
-
- Determines whether the collection contains an element with the specified key.
- The key to locate in the .
-
- if the collection contains tag with that key. otherwise.
-
-
- Copies the elements of the collection to an array, starting at a particular array index.
- The array that is the destination of the elements copied from collection.
- The zero-based index in array at which copying begins.
-
-
- Returns an enumerator that iterates through the collection.
- An enumerator for the .
-
-
- Removes the first occurrence of a specific item from the collection.
- The tag key value pair to remove.
-
- if item was successfully removed from the collection; otherwise, . This method also returns if item is not found in the original collection.
-
-
- Removes the tag with the specified key from the collection.
- The tag key.
-
- if the item existed and removed. otherwise.
-
-
- Returns an enumerator that iterates through the collection.
- An enumerator that can be used to iterate through the collection.
-
-
- Returns an enumerator that iterates through the collection.
- An object that can be used to iterate through the collection.
-
-
- Gets the value associated with the specified key.
- The tag key.
- The tag value.
- When this method returns, the value associated with the specified key, if the key is found; otherwise, the default value for the type of the value parameter. This parameter is passed uninitialized.
-
-
- Gets the number of elements contained in the collection.
-
-
- Gets a value indicating whether the collection is read-only. This always returns .
- Always returns .
-
-
- Gets or sets a specified collection item.
-
- When setting a value to this indexer property, the following behavior is observed:
-- If the key previously existed in the collection and the value is , the collection item matching the key will get removed from the collection.
-- If the key previously existed in the collection and the value is not , the value will replace the old value stored in the collection.
-- Otherwise, a new item will get added to the collection.
- The key of the value to get or set.
- The object mapped to the key.
-
-
- Get the list of the keys of all stored tags.
-
-
- Get the list of the values of all stored tags.
-
-
- Enumerates the elements of an .
-
-
- Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-
-
- Advances the enumerator to the next element of the collection.
-
- if the enumerator was successfully advanced to the next element; if the enumerator has passed the end of the collection.
-
-
- Sets the enumerator to its initial position, which is before the first element in the collection.
-
-
- Gets the element in the collection at the current position of the enumerator.
- The element in the collection at the current position of the enumerator.
-
-
- Gets the element in the collection at the current position of the enumerator.
- The element in the collection at the current position of the enumerator.
-
-
- Specifies flags defined by the W3C standard that are associated with an activity.
-
-
- The activity has not been marked.
-
-
- The activity (or more likely its parents) has been marked as useful to record.
-
-
- Represents a whose format is based on a W3C standard.
-
-
- Copies the 16 bytes of the current to a specified span.
- The span to which the 16 bytes of the trace ID are to be copied.
-
-
- Creates a new value from a read-only span of 16 bytes.
- A read-only span of 16 bytes.
-
- does not contain eight bytes.
- The new trace ID.
-
-
- Creates a new value from a read-only span of 32 hexadecimal characters.
- A span that contains 32 hexadecimal characters.
-
- does not contain 16 hexadecimal characters.
-
--or-
-
-The characters in are not all lower-case hexadecimal characters or all zeros.
- The new trace ID.
-
-
- Creates a new value from a read-only span of UTF8-encoded bytes.
- A read-only span of UTF8-encoded bytes.
- The new trace ID.
-
-
- Creates a new based on a random number (that is very likely to be unique).
- The new .
-
-
- Determines whether the current instance and a specified are equal.
- The instance to compare.
-
- if has the same hex value as the current instance; otherwise, .
-
-
- Determines whether this instance and a specified object, which must also be an instance, have the same value.
- The object to compare.
-
- if is an instance of and has the same hex value as the current instance; otherwise, .
-
-
- Returns the hash code of the TraceId.
- The hash code of the TraceId.
-
-
- Determines whether two specified instances have the same value.
- The first instance to compare.
- The second instance to compare.
-
- if the TraceId of is the same as the TraceId of ; otherwise, .
-
-
- Determines whether two specified instances have the same value.
- The first instance to compare.
- The second instance to compare.
-
- if the TraceId of is different from the TraceId of ; otherwise, .
-
-
- Returns a 16-character hexadecimal string that represents this span ID.
- The 32-character hexadecimal string representation of this trace ID.
-
-
- Returns a 32-character hexadecimal string that represents this trace ID.
- The 32-character hexadecimal string representation of this trace ID.
-
-
- Provides an implementation of the abstract class that represents a named place to which a source sends its information (events).
-
-
- Creates a new .
- The name of this .
-
-
- Disposes the NotificationListeners.
-
-
- Determines whether there are any registered subscribers.
-
- if there are any registered subscribers, otherwise.
-
-
- Checks whether the is enabled.
- The name of the event to check.
-
- if notifications are enabled; otherwise, .
-
-
- Checks if any subscriber to the diagnostic events is interested in receiving events with this name. Subscribers indicate their interest using a delegate provided in .
- The name of the event to check.
- The object that represents a context.
- The object that represents a context.
-
- if it is enabled, otherwise.
-
-
- Invokes the OnActivityExport method of all the subscribers.
- The activity affected by an external event.
- An object that represents the outgoing request.
-
-
- Invokes the OnActivityImport method of all the subscribers.
- The activity affected by an external event.
- An object that represents the incoming request.
-
-
- Adds a subscriber.
- A subscriber.
- A reference to an interface that allows the listener to stop receiving notifications before the has finished sending them.
-
-
- Adds a subscriber, and optionally filters events based on their name and up to two context objects.
- A subscriber.
- A delegate that filters events based on their name and up to two context objects (which can be ), or to if an event filter is not desirable.
- A reference to an interface that allows the listener to stop receiving notifications before the has finished sending them.
-
-
- Adds a subscriber, optionally filters events based on their name and up to two context objects, and specifies methods to call when providers import or export activites from outside the process.
- A subscriber.
- A delegate that filters events based on their name and up to two context objects (which can be ), or if an event filter is not desirable.
- An action delegate that receives the activity affected by an external event and an object that represents the incoming request.
- An action delegate that receives the activity affected by an external event and an object that represents the outgoing request.
- A reference to an interface that allows the listener to stop receiving notifications before the has finished sending them.
-
-
- Adds a subscriber, and optionally filters events based on their name.
- A subscriber.
- A delegate that filters events based on their name ( ). The delegate should return if the event is enabled.
- A reference to an interface that allows the listener to stop receiving notifications before the has finished sending them.
-
-
- Returns a string with the name of this DiagnosticListener.
- The name of this DiagnosticListener.
-
-
- Logs a notification.
- The name of the event to log.
- An object that represents the payload for the event.
-
-
- Gets the collection of listeners for this .
-
-
- Gets the name of this .
- The name of the .
-
-
- An abstract class that allows code to be instrumented for production-time logging of rich data payloads for consumption within the process that was instrumented.
-
-
- Initializes an instance of the class.
-
-
- Verifies if the notification event is enabled.
- The name of the event being written.
-
- if the notification event is enabled, otherwise.
-
-
- Verifies it the notification event is enabled.
- The name of the event being written.
- An object that represents the additional context for IsEnabled. Consumers should expect to receive which may indicate that producer called pure IsEnabled(string) to check if consumer wants to get notifications for such events at all. Based on that, producer may call IsEnabled(string, object, object) again with non- context.
- Optional. An object that represents the additional context for IsEnabled. by default. Consumers should expect to receive which may indicate that producer called pure IsEnabled(string) or producer passed all necessary context in .
-
- if the notification event is enabled, otherwise.
-
-
- Transfers state from an activity to some event or operation, such as an outgoing HTTP request, that will occur outside the process.
- The activity affected by an external event.
- An object that represents the outgoing request.
-
-
- Transfers state to an activity from some event or operation, such as an incoming request, that occurred outside the process.
- The activity affected by an external event.
- A payload that represents the incoming request.
-
-
- Starts an and writes a start event.
- The to be started.
- An object that represent the value being passed as a payload for the event.
- The started activity for convenient chaining.
-
-
- Stops the given , maintains the global activity, and notifies consumers that the was stopped.
- The activity to be stopped.
- An object that represents the value passed as a payload for the event.
-
-
- Provides a generic way of logging complex payloads.
- The name of the event being written.
- An object that represents the value being passed as a payload for the event. This is often an anonymous type which contains several sub-values.
-
-
- An implementation of determines if and how distributed context information is encoded and decoded as it traverses the network.
- The encoding can be transported over any network protocol that supports string key-value pairs. For example, when using HTTP, each key-value pair is an HTTP header.
- injects values into and extracts values from carriers as string key-value pairs.
-
-
- Initializes an instance of the class. This constructor is protected and only meant to be called from parent classes.
-
-
- Returns the default propagator object that will be initialized with.
- An instance of the class.
-
-
- Returns a propagator that does not transmit any distributed context information in outbound network messages.
- An instance of the class.
-
-
- Returns a propagator that attempts to act transparently, emitting the same data on outbound network requests that was received on the inbound request.
- When encoding the outbound message, this propagator uses information from the request's root Activity, ignoring any intermediate Activities that may have been created while processing the request.
- An instance of the class.
-
-
- Extracts the baggage key-value pair list from an incoming request represented by the carrier. For example, from the headers of an HTTP request.
- The medium from which values will be read.
- The callback method to invoke to get the propagation baggage list from the carrier.
- Returns the extracted key-value pair list from the carrier.
-
-
- Extracts the trace ID and trace state from an incoming request represented by the carrier. For example, from the headers of an HTTP request.
- The medium from which values will be read.
- The callback method to invoke to get the propagation trace ID and state from the carrier.
- When this method returns, contains the trace ID extracted from the carrier.
- When this method returns, contains the trace state extracted from the carrier.
-
-
- Injects the trace values stroed in the object into a carrier. For example, into the headers of an HTTP request.
- The Activity object has the distributed context to inject to the carrier.
- The medium in which the distributed context will be stored.
- The callback method to invoke to set a named key-value pair on the carrier.
-
-
- Get or set the process-wide propagator object to use as the current selected propagator.
- The currently selected process-wide propagator object.
-
-
- Gets the set of field names this propagator is likely to read or write.
- The list of fields that will be used by the DistributedContextPropagator
.
-
-
- Represents the callback method that's used in the extract methods of propagators. The callback is invoked to look up the value of a named field.
- The medium used by propagators to read values from.
- The propagation field name.
- When this method returns, contains the value that corresponds to . The value is non- if there is only one value for the input field name.
- When this method returns, contains a collection of values that correspond to . The value is non- if there is more than one value for the input field name.
-
-
- Represents the callback method that's used in propagators' inject methods. This callback is invoked to set the value of a named field.
- Propagators may invoke it multiple times in order to set multiple fields.
- The medium used by propagators to write values to.
- The propagation field name.
- The value corresponding to .
-
-
- Represents an instrument that supports adding non-negative values. For example, you might call counter.Add(1) each time a request is processed to track the total number of requests. Most metric viewers display counters using a rate (requests/sec), by default, but can also display a cumulative total.
- The type that the counter represents.
-
-
- Record the increment value of the measurement.
- The increment measurement.
-
-
- Record the increment value of the measurement.
- The increment measurement.
- A key-value pair tag associated with the measurement.
-
-
- Record the increment value of the measurement.
- The increment measurement.
- A first key-value pair tag associated with the measurement.
- A second key-value pair tag associated with the measurement.
-
-
- Record the increment value of the measurement.
- The increment measurement.
- A first key-value pair tag associated with the measurement.
- A second key-value pair tag associated with the measurement.
- A third key-value pair tag associated with the measurement.
-
-
- Record the increment value of the measurement.
- The increment measurement.
- A list of key-value pair tags associated with the measurement.
-
-
- Adds the increment value of the measurement.
- The measurement value.
- The tags associated with the measurement.
-
-
- Record the increment value of the measurement.
- The increment measurement.
- A span of key-value pair tags associated with the measurement.
-
-
- Represents a metrics Instrument that can be used to report arbitrary values that are likely to be statistically meaningful.
- e.g. the request duration.
- Use method to create the Histogram object.
- The type that the histogram represents.
-
-
- Record a measurement value.
- The measurement value.
-
-
- Record a measurement value.
- The measurement value.
- A key-value pair tag associated with the measurement.
-
-
- Record a measurement value.
- The measurement value.
- A first key-value pair tag associated with the measurement.
- A second key-value pair tag associated with the measurement.
-
-
- Record a measurement value.
- The measurement value.
- A first key-value pair tag associated with the measurement.
- A second key-value pair tag associated with the measurement.
- A third key-value pair tag associated with the measurement.
-
-
- Record a measurement value.
- The measurement value.
- A list of key-value pair tags associated with the measurement.
-
-
- Records a measurement value.
- The measurement value.
- The tags associated with the measurement.
-
-
- Record a measurement value.
- The measurement value.
- A span of key-value pair tags associated with the measurement.
-
-
- Base class of all Metrics Instrument classes
-
-
- Protected constructor to initialize the common instrument properties like the meter, name, description, and unit.
- All classes extending Instrument need to call this constructor when constructing object of the extended class.
- The meter that created the instrument.
- The instrument name. cannot be .
- Optional instrument unit of measurements.
- Optional instrument description.
-
-
- Publish is activating the instrument to start recording measurements and to allow listeners to start listening to such measurements.
-
-
- Gets the instrument description.
-
-
- Checks if there is any listeners for this instrument.
-
-
- A property tells if the instrument is an observable instrument.
-
-
- Gets the Meter which created the instrument.
-
-
- Gets the instrument name.
-
-
- Gets the instrument unit of measurements.
-
-
- The base class for all non-observable instruments.
- The type that the instrument represents.
-
-
- Create the metrics instrument using the properties meter, name, description, and unit.
- All classes extending Instrument{T} need to call this constructor when constructing object of the extended class.
- The meter that created the instrument.
- The instrument name. cannot be .
- Optional instrument unit of measurements.
- Optional instrument description.
-
-
- Record the measurement by notifying all objects which listening to this instrument.
- The measurement value.
-
-
- Record the measurement by notifying all objects which listening to this instrument.
- The measurement value.
- A key-value pair tag associated with the measurement.
-
-
- Record the measurement by notifying all objects which listening to this instrument.
- The measurement value.
- A first key-value pair tag associated with the measurement.
- A second key-value pair tag associated with the measurement.
-
-
- Record the measurement by notifying all objects which listening to this instrument.
- The measurement value.
- A first key-value pair tag associated with the measurement.
- A second key-value pair tag associated with the measurement.
- A third key-value pair tag associated with the measurement.
-
-
- Records a measurement by notifying all objects that are listening to this instrument.
- The measurement value.
- The tags associated with the measurement.
-
-
- Record the measurement by notifying all objects which listening to this instrument.
- The measurement value.
- A span of key-value pair tags associated with the measurement.
-
-
- Stores one observed metrics value and its associated tags. This type is used by an Observable instrument's Observe() method when reporting current measurements.
- with the associated tags.
- The type that the measurement represents.
-
-
- Initializes a new instance of the Measurement using the value and the list of tags.
- The measurement value.
-
-
- Initializes a new instance of the Measurement using the value and the list of tags.
- The measurement value.
- The measurement associated tags list.
-
-
- Initializes a new instance of the Measurement using the value and the list of tags.
- The measurement value.
- The measurement associated tags list.
-
-
- Initializes a new instance of the Measurement using the value and the list of tags.
- The measurement value.
- The measurement associated tags list.
-
-
- Gets the measurement tags list.
-
-
- Gets the measurement value.
-
-
- A delegate to represent the Meterlistener callbacks used in measurements recording operation.
- The that was responsible for sending the measurement.
- The measurement value.
- A span of key-value pair tags associated with the measurement.
- The state object originally passed to method.
- The type that the measurement represents.
-
-
- Meter is the class responsible for creating and tracking the Instruments.
-
-
- Initializes a new instance of the Meter using the meter name.
- The Meter name.
-
-
- Initializes a new instance of the Meter using the meter name and version.
- The Meter name.
- The optional Meter version.
-
-
- Create a metrics Counter object.
- The instrument name. cannot be .
- Optional instrument unit of measurements.
- Optional instrument description.
- The numerical type of the measurement.
- A new counter.
-
-
- Creates a Histogram, which is an instrument that can be used to report arbitrary values that are likely to be statistically meaningful. It is intended for statistics such as histograms, summaries, and percentile.
- The instrument name. cannot be .
- Optional instrument unit of measurements.
- Optional instrument description.
- The numerical type of the measurement.
- A new histogram.
-
-
- Creates an ObservableCounter, which is an instrument that reports monotonically increasing values when the instrument is being observed.
- The instrument name. cannot be .
- The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by .
- Optional instrument unit of measurements.
- Optional instrument description.
- The numerical type of the measurement..
- A new observable counter.
-
-
- Creates an ObservableCounter, which is an instrument that reports monotonically increasing values when the instrument is being observed.
- The instrument name. cannot be .
- The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by .
- Optional instrument unit of measurements.
- Optional instrument description.
- The numerical type of the measurement.
- A new observable counter.
-
-
- Creates an ObservableCounter, which is an instrument that reports monotonically increasing values when the instrument is being observed.
- The instrument name. cannot be .
- The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by
- Optional instrument unit of measurements.
- Optional instrument description.
- The numerical type of the measurement.
- A new observable counter.
-
-
- Creates an ObservableGauge, which is an asynchronous instrument that reports non-additive values when the instrument is being observed. An example of a non-additive value is the room temperature - it makes no sense to report the temperature value from multiple rooms and sum them up.
- The instrument name. cannot be .
- The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by .
- Optional instrument unit of measurements.
- Optional instrument description.
- The numerical type of the measurement.
- A new observable gauge.
-
-
- Creates an ObservableGauge, which is an asynchronous instrument that reports non-additive values when the instrument is being observed. An example of a non-additive value is the room temperature - it makes no sense to report the temperature value from multiple rooms and sum them up.
- The instrument name. cannot be .
- The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by .
- Optional instrument unit of measurements.
- Optional instrument description.
- The numerical type of the measurement.
- A new observable gauge.
-
-
- Creates an ObservableGauge, which is an asynchronous instrument that reports non-additive values when the instrument is being observed. An example of a non-additive value is the room temperature - it makes no sense to report the temperature value from multiple rooms and sum them up.
- The instrument name. cannot be .
- The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by .
- Optional instrument unit of measurements.
- Optional instrument description.
- The numerical type of the measurement.
- A new observable gauge.
-
-
- Dispose the Meter which will disable all instruments created by this meter.
-
-
- Gets the Meter name.
- The Meter name
-
-
- Gets the Meter version.
- The Meter version.
-
-
- MeterListener is class used to listen to the metrics instrument measurements recording.
-
-
- Creates a MeterListener object.
-
-
- Stop listening to a specific instrument measurement recording.
- The instrument to stop listening to.
- The state object originally passed to method.
-
-
- Disposes the listeners which will stop it from listening to any instrument.
-
-
- Start listening to a specific instrument measurement recording.
- The instrument to listen to.
- A state object which will be passed back to the callback getting measurements events.
-
-
- Calls all Observable instruments which the listener is listening to then calls with every collected measurement.
-
-
- Sets a callback for a specific numeric type to get the measurement recording notification from all instruments which enabled listening and was created with the same specified numeric type.
- If a measurement of type T is recorded and a callback of type T is registered, that callback will be used.
- The callback which can be used to get measurement recording of numeric type T.
- The type of the numeric measurement.
-
-
- Enable the listener to start listening to instruments measurement recording.
-
-
- Gets or sets the callback to get notified when an instrument is published.
- The callback to get notified when an instrument is published.
-
-
- Gets or sets the callback to get notified when the measurement is stopped on some instrument.
- This can happen when the Meter or the Listener is disposed or calling on the listener.
- The callback to get notified when the measurement is stopped on some instrument.
-
-
- ObservableCounter is a metrics observable Instrument which reports monotonically increasing value(s) when the instrument is being observed.
- e.g. CPU time (for different processes, threads, user mode or kernel mode).
- Use Meter.CreateObservableCounter methods to create the observable counter object.
- The type that the observable counter represents.
-
-
- ObservableGauge is an observable Instrument that reports non-additive value(s) when the instrument is being observed.
- e.g. the current room temperature Use Meter.CreateObservableGauge methods to create the observable counter object.
-
-
-
- ObservableInstrument{T} is the base class from which all metrics observable instruments will inherit from.
- The type that the observable instrument represents.
-
-
- Create the metrics observable instrument using the properties meter, name, description, and unit.
- All classes extending ObservableInstrument{T} need to call this constructor when constructing object of the extended class.
- The meter that created the instrument.
- The instrument name. cannot be .
- Optional instrument unit of measurements.
- Optional instrument description.
-
-
- Fetches the current measurements being tracked by this instrument. All classes extending ObservableInstrument{T} need to implement this method.
- The current measurements tracked by this instrument.
-
-
- Gets a value that indicates if the instrument is an observable instrument.
-
- if the instrument is metrics-observable; otherwise.
-
-
- A delegate that defines the signature of the callbacks used in the sampling process.
- The Activity creation options used by callbacks to decide creating the Activity object or not.
- The type of the requested parent to create the Activity object with. Should be either a string or an instance.
- An object containing the sampling results, which indicate the amount of data to collect for the related .
-
-
- Represents a list of tags that can be accessed by index. Provides methods to search, sort, and manipulate lists.
-
-
- Initializes a new instance of using the specified .
- A span of tags to initialize the list with.
-
-
- Adds a tag to the list.
- The key-value pair of the tag to add to the list.
-
-
- Adds a tag with the specified and to the list.
- The tag key.
- The tag value.
-
-
- Removes all elements from the .
-
-
- Determines whether a tag is in the .
- The tag to locate in the .
-
- if item is found in the ; otherwise, .
-
-
- Copies the entire to a compatible one-dimensional array, starting at the specified index of the target array.
- The one-dimensional Array that is the destination of the elements copied from . The Array must have zero-based indexing.
- The zero-based index in at which copying begins.
-
- is .
-
- is less than 0 or greater than or equal to the length.
-
-
- Copies the contents of this into a destination span.
- The destination object.
-
- The number of elements in the source is greater than the number of elements that the destination span.
-
-
- Returns an enumerator that iterates through the .
- An enumerator that iterates through the .
-
-
- Searches for the specified tag and returns the zero-based index of the first occurrence within the entire .
- The tag to locate in the .
- The zero-based index of the first ocurrence of in the tag list.
-
-
- Inserts an element into the at the specified index.
- The zero-based index at which the item should be inserted.
- The tag to insert.
-
- is less than 0 or is greater than .
-
-
- Removes the first occurrence of a specific object from the .
- The tag to remove from the .
-
- if is successfully removed; otherwise, . This method also returns if was not found in the .
-
-
- Removes the element at the specified index of the .
- The zero-based index of the element to remove.
-
- index is less than 0 or is greater than .
-
-
- Returns an enumerator that iterates through the .
- An enumerator that iterates through the .
-
-
- Gets the number of tags contained in the .
-
-
- Gets a value indicating whether the is read-only. This property will always return .
-
-
- Gets or sets the tags at the specified index.
- The item index.
-
- is not a valid index in the .
-
-
- An enumerator for traversing a tag list collection.
-
-
- Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-
-
- Advances the enumerator to the next element of the collection.
-
- if the enumerator was successfully advanced to the next element; if the enumerator has passed the end of the collection.
-
-
- Sets the enumerator to its initial position, which is before the first element in the collection.
-
-
- Gets the element in the collection at the current position of the enumerator.
- The element in the collection at the current position of the enumerator.
-
-
- Gets the element in the collection at the current position of the enumerator.
- The element in the collection at the current position of the enumerator.
-
-
+
+
+
+ System.Diagnostics.DiagnosticSource
+
+
+
+ Represents an operation with context to be used for logging.
+
+
+ Initializes a new instance of the class.
+ The name of the operation.
+
+
+ Updates the to have a new baggage item with the specified key and value.
+ The baggage key.
+ The baggage value.
+
+ for convenient chaining.
+
+
+ Adds the specified activity event to the events list.
+ The activity event to add.
+
+ for convenient chaining.
+
+
+ Updates the activity to have a tag with an additional and .
+ The tag key name.
+ The tag value mapped to the input key.
+
+ for convenient chaining.
+
+
+ Updates the to have a new tag with the provided and .
+ The tag key.
+ The tag value.
+
+ for convenient chaining.
+
+
+ Stops the activity if it is already started and notifies any event listeners. Nothing will happen otherwise.
+
+
+ When overriden by a derived type, this method releases any allocated resources.
+
+ if the method is being called from the finalizer; if calling from user code.
+
+
+ Returns the value of a key-value pair added to the activity with .
+ The baggage key.
+ The value of the key-value-pair item if it exists, or if it does not exist.
+
+
+ Returns the object mapped to the specified property name.
+ The name associated to the object.
+ The object mapped to the property name, if one is found; otherwise, .
+
+
+ Returns the value of the Activity tag mapped to the input key/>.
+ Returns if that key does not exist.
+ The tag key string.
+ The tag value mapped to the input key.
+
+
+ Add or update the Activity baggage with the input key and value.
+ If the input value is - if the collection has any baggage with the same key, then this baggage will get removed from the collection.
+ - otherwise, nothing will happen and the collection will not change.
+ If the input value is not - if the collection has any baggage with the same key, then the value mapped to this key will get updated with the new input value.
+ - otherwise, the key and value will get added as a new baggage to the collection.
+ Baggage item will be updated/removed only if it was originaly added to the current activity. Items inherited from the parents will not be changed/removed, new item would be added to current activity baggage instead.
+ The baggage key name
+ The baggage value mapped to the input key
+
+ for convenient chaining.
+
+
+ Attaches any custom object to this activity. If the specified was previously associated with another object, the property will be updated to be associated with the new instead. It is recommended to use a unique property name to avoid conflicts with anyone using the same value.
+ The name to associate the value with.
+ The object to attach and map to the property name.
+
+
+ Updates the to set its as the difference between and the specified stop time.
+ The UTC stop time.
+
+ for convenient chaining.
+
+
+ Sets the ID format on this before it is started.
+ One of the enumeration values that specifies the format of the property.
+
+ for convenient chaining.
+
+
+ Sets the parent ID using the W3C convention of a TraceId and a SpanId.
+ The parent activity's TraceId.
+ The parent activity's SpanId.
+ One of the enumeration values that specifies flags defined by the W3C standard that are associated with an activity.
+
+ for convenient chaining.
+
+
+ Updates this to indicate that the with an ID of caused this .
+ The ID of the parent operation.
+
+ for convenient chaining.
+
+
+ Sets the start time of this .
+ The start time in UTC.
+
+ for convenient chaining.
+
+
+ Sets the status code and description on the current activity object.
+ The status code
+ The error status description
+
+ for convenient chaining.
+
+
+ Adds or update the activity tag with the input key and value.
+ The tag key name.
+ The tag value mapped to the input key.
+
+ for convenient chaining.
+
+
+ Starts the activity.
+
+ for convenient chaining.
+
+
+ Stops the activity.
+
+
+ Gets or sets the flags (defined by the W3C ID specification) associated with the activity.
+ the flags associated with the activity.
+
+
+ Gets a collection of key/value pairs that represents information that is passed to children of this .
+ Information that's passed to children of this .
+
+
+ Gets the context of the activity. Context becomes valid only if the activity has been started.
+ The context of the activity, if the activity has been started; otherwise, returns the default context.
+
+
+ Gets or sets the current operation ( ) for the current thread. This flows across async calls.
+ The current operation for the current thread.
+
+
+ Gets or sets the default ID format for the .
+
+
+ Gets or sets the display name of the activity.
+ A string that represents the activity display name.
+
+
+ Gets the duration of the operation.
+ The delta between and the end time if the has ended ( or was called), or if the has not ended and was not called.
+
+
+ Gets the list of all the activity events attached to this activity.
+ An enumeration of activity events attached to this activity. If the activity has no events, returns an empty enumeration.
+
+
+ Gets or sets a value that detrmines if the is always used to define the default ID format.
+
+ to always use the ; otherwise, .
+
+
+ Gets an identifier that is specific to a particular request.
+ The activity ID.
+
+
+ Gets the format for the .
+ The format for the .
+
+
+ Gets or sets a value that indicates whether this activity should be populated with all the propagation information, as well as all the other properties, such as links, tags, and events.
+
+ if the activity should be populated; otherwise.
+
+
+ Gets the relationship between the activity, its parents, and its children in a trace.
+ One of the enumeration values that indicate relationship between the activity, its parents, and its children in a trace.
+
+
+ Gets the list of all the activity links attached to this activity.
+ An enumeration of activity links attached to this activity. If the activity has no links, returns an empty enumeration.
+
+
+ Gets the operation name.
+ The name of the operation.
+
+
+ Gets the parent that created this activity.
+ The parent of this , if it is from the same process, or if this instance has no parent (it is a root activity) or if the parent is from outside the process.
+
+
+ Gets the ID of this activity's parent.
+ The parent ID, if one exists, or if it does not.
+
+
+ Gets the parent's .
+ The parent's .
+
+
+ Gets a value that indicates whether the W3CIdFlags.Recorded flag is set.
+
+ if the W3CIdFlags.Recorded flag is set; otherwise, .
+
+
+ Gets the root ID of this .
+ The root ID, or if the current instance has either a or an .
+
+
+ Gets the activity source associated with this activity.
+
+
+ Gets the SPAN part of the .
+ The ID for the SPAN part of , if the has the W3C format; otherwise, a zero .
+
+
+ Gets the time when the operation started.
+ The UTC time that the operation started.
+
+
+ Gets status code of the current activity object.
+
+
+ Gets the status description of the current activity object.
+
+
+ Gets the list of tags that represent information to log along with the activity. This information is not passed on to the children of this activity.
+ A key-value pair enumeration of tags and objects.
+
+
+ Gets a collection of key/value pairs that represent information that will be logged along with the to the logging system.
+ Information that will be logged along with the to the logging system.
+
+
+ Gets the TraceId part of the .
+ The ID for the TraceId part of the , if the ID has the W3C format; otherwise, a zero TraceId.
+
+
+ When starting an Activity which does not have a parent context, the Trace Id will automatically be generated using random numbers.
+ TraceIdGenerator can be used to override the runtime's default Trace Id generation algorithm.
+
+
+ Gets or sets the W3C header.
+ The W3C header.
+
+
+ A representation that conforms to the W3C TraceContext specification. It contains two identifiers: a TraceId and a SpanId, along with a set of common TraceFlags and system-specific TraceState values.
+
+
+ Construct a new activity context instance using the specified arguments.
+ A trace identifier.
+ A span identifier.
+ Contain details about the trace.
+ Carries system-specific configuration data.
+ Indicates if the context is propagated from a remote parent.
+
+
+ Indicates whether the current object is equal to another object of the same type.
+ The object to compare to this instance.
+
+ if the current object is equal to the parameter; otherwise, .
+
+
+ Determines whether this instance and a specified object have the same value.
+ The object to compare to this instance.
+
+ if the current object is equal to the parameter; otherwise, .
+
+
+ Provides a hash function for the current that's suitable for hashing algorithms and data structures, such as hash tables.
+ A hash code for the current .
+
+
+ Determines whether two specified values are equal.
+ The first value to compare.
+ The second value to compare.
+
+ if and are equal; otherwise, .
+
+
+ Determines whether two specified values are not equal.
+ The first value to compare.
+ The second value to compare.
+
+ if and are not equal; otherwise, .
+
+
+ Parses a W3C trace context headers to an object.
+ The W3C trace parent header.
+ The trace state.
+ The trace parent is invalid.
+ The object created from the parsing operation.
+
+
+ Tries to parse the W3C trace context headers to an object.
+ The W3C trace parent header.
+ The W3C trace state.
+ When this method returns , the object created from the parsing operation.
+
+ if the parsing was successful; otherwise.
+
+
+ Indicates if the activity context was propagated from a remote parent.
+
+ if it was propagated from a remote parent; otherwise.
+
+
+ The Id of the request as known by the caller.
+ The Span Id in the context.
+
+
+ The flags defined by the W3C standard along with the ID for the activity.
+ The context tracing flags.
+
+
+ The trace identifier.
+ The tracing identifier in the context.
+
+
+ Holds the W3C 'tracestate' header.
+ A string representing the W3C 'tracestate' header.
+
+
+ Encapsulates all the information that is sent to the activity listener, to make decisions about the creation of the activity instance, as well as its state.
+
+The possible generic type parameters are or .
+ The type of the property. Should be either or .
+
+
+ Gets the activity kind which the activity will be created with.
+ One of the enumeration values that represent an activity kind.
+
+
+ Gets the enumeration of activity links that the activity will be created with.
+ An enumeration of activity links.
+
+
+ Gets the name to use as OperationName of the activity that will get created.
+ A string representing the activity name.
+
+
+ Gets the parent context or parent Id that the activity will get created with.
+ The parent of the activity, represented either as a or as an .
+
+
+ Gets the collection that is used to add more tags during the sampling process. The added tags are also added to the created Activity if it is decided that it should be created by the callbacks.
+ The Activity tags collection.
+
+
+ Gets the activity source that creates the activity.
+ An activity source object.
+
+
+ Gets the tags that the activity will be created with.
+ A key-value pair enumeration of tags associated with the activity.
+
+
+ Gets the trace Id to use in the Activity object if it is decided that it should be created by callbacks.
+ The trace Id.
+
+
+ Represents an event containing a name and a timestamp, as well as an optional list of tags.
+
+
+ Initializes a new activity event instance using the specified name and the current time as the event timestamp.
+ The event name.
+
+
+ Initializes a new activity event instance using the specified name, timestamp and tags.
+ The event name.
+ The event timestamp. Timestamp must only be used for the events that happened in the past, not at the moment of this call.
+ The event tags.
+
+
+ Gets the activity event name.
+ A string representing the activity event name.
+
+
+ Gets the collection of tags associated with the event.
+ A key-value pair enumeration containing the tags associated with the event.
+
+
+ Gets the activity event timestamp.
+ A datetime offset representing the activity event timestamp.
+
+
+ Specifies the format of the property.
+
+
+ The hierarchical format.
+
+
+ An unknown format.
+
+
+ The W3C format.
+
+
+ Describes the relationship between the activity, its parents and its children in a trace.
+
+
+ Outgoing request to the external component.
+
+
+ Output received from an external component.
+
+
+ Internal operation within an application, as opposed to operations with remote parents or children. This is the default value.
+
+
+ Output provided to external components.
+
+
+ Requests incoming from external component.
+
+
+ Activities may be linked to zero or more activity context instances that are causally related.
+
+Activity links can point to activity contexts inside a single trace or across different traces.
+
+Activity links can be used to represent batched operations where an activity was initiated by multiple initiating activities, each representing a single incoming item being processed in the batch.
+
+
+ Constructs a new activity link, which can be linked to an activity.
+ The trace activity context.
+ The key-value pair list of tags associated to the activity context.
+
+
+ Indicates whether the current activity link is equal to another activity link.
+ The activity link to compare.
+
+ if the current activity link is equal to ; otherwise, .
+
+
+ Indicates whether the current activity link is equal to another object.
+ The object to compare.
+
+ if the current activity link is equal to ; otherwise, .
+
+
+ Provides a hash function for the current that's suitable for hashing algorithms and data structures, such as hash tables.
+ A hash code for the current .
+
+
+ Determines whether two specified values are equal.
+ The first value to compare.
+ The second value to compare.
+
+ if and are equal; otherwise, .
+
+
+ Determines whether two specified values are not equal.
+ The first value to compare.
+ The second value to compare.
+
+ if and are not equal; otherwise, .
+
+
+ Retrieves the activity context inside this activity link.
+
+
+ Retrieves the key-value pair enumeration of tags attached to the activity context.
+ An enumeration of tags attached to the activity context.
+
+
+ Allows listening to the start and stop activity events and gives the opportunity to decide creating an activity for sampling scenarios.
+
+
+ Construct a new activity listener object to start listeneing to the activity events.
+
+
+ Unregisters this activity listener object from listening to activity events.
+
+
+ Gets or sets the callback used to listen to the activity start event.
+ An activity callback instance used to listen to the activity start event.
+
+
+ Gets or sets the callback used to listen to the activity stop event.
+ An activity callback instance used to listen to the activity stop event.
+
+
+ Gets or sets the callback that is used to decide if creating objects with a specific data state is allowed.
+ A sample activity instance.
+
+
+ Gets or sets the callback that is used to decide if creating objects with a specific data state is allowed.
+ A sample activity instance.
+
+
+ Gets or sets the callback that allows deciding if activity object events that were created using the activity source object should be listened or not.
+
+ to listen events; otherwise.
+
+
+ Enumeration values used by to indicate the amount of data to collect for the related . Requesting more data causes a greater performance overhead.
+
+
+ The activity object should be populated with all the propagation information and also all other properties such as Links, Tags, and Events. Using this value causes to return .
+
+
+ The activity object should be populated the same as the case. Additionally, Activity.Recorded is set to . For activities using the W3C trace ids, this sets a flag bit in the ID that will be propagated downstream requesting that the trace is recorded everywhere.
+
+
+ The activity object does not need to be created.
+
+
+ The activity object needs to be created. It will have a Name, a Source, an Id and Baggage. Other properties are unnecessary and will be ignored by this listener.
+
+
+ Provides APIs to create and start objects and to register objects to listen to the events.
+
+
+ Constructs an activity source object with the specified .
+ The name of the activity source object.
+ The version of the component publishing the tracing info.
+
+
+ Adds a listener to the activity starting and stopping events.
+ The activity listener object to use for listening to the activity events.
+
+
+ Creates a new object if there is any listener to the Activity, returns otherwise.
+ The operation name of the Activity
+ The
+ The created object or if there is no any event listener.
+
+
+ Creates a new object if there is any listener to the Activity, returns otherwise.
+ If the Activity object is created, it will not automatically start. Callers will need to call to start it.
+ The operation name of the Activity.
+ The
+ The parent object to initialize the created Activity object with.
+ The optional tags list to initialize the created Activity object with.
+ The optional list to initialize the created Activity object with.
+ The default Id format to use.
+ The created object or if there is no any listener.
+
+
+ Creates a new object if there is any listener to the Activity, returns otherwise.
+ The operation name of the Activity.
+ The
+ The parent Id to initialize the created Activity object with.
+ The optional tags list to initialize the created Activity object with.
+ The optional list to initialize the created Activity object with.
+ The default Id format to use.
+ The created object or if there is no any listener.
+
+
+ Disposes the activity source object, removes the current instance from the global list, and empties the listeners list.
+
+
+ Checks if there are any listeners for this activity source.
+
+ if there is a listener registered for this activity source; otherwise, .
+
+
+ Creates and starts a new object if there is any listener to the Activity events, returns otherwise.
+ The
+ The parent object to initialize the created Activity object with.
+ The optional tags list to initialize the created Activity object with.
+ The optional list to initialize the created Activity object with.
+ The optional start timestamp to set on the created Activity object.
+ The operation name of the Activity.
+ The created object or if there is no any listener.
+
+
+ Creates a new activity if there are active listeners for it, using the specified name and activity kind.
+ The operation name of the activity.
+ The activity kind.
+ The created activity object, if it had active listeners, or if it has no event listeners.
+
+
+ Creates a new activity if there are active listeners for it, using the specified name, activity kind, parent activity context, tags, optional activity link and optional start time.
+ The operation name of the activity.
+ The activity kind.
+ The parent object to initialize the created activity object with.
+ The optional tags list to initialize the created activity object with.
+ The optional list to initialize the created activity object with.
+ The optional start timestamp to set on the created activity object.
+ The created activity object, if it had active listeners, or if it has no event listeners.
+
+
+ Creates a new activity if there are active listeners for it, using the specified name, activity kind, parent Id, tags, optional activity links and optional start time.
+ The operation name of the activity.
+ The activity kind.
+ The parent Id to initialize the created activity object with.
+ The optional tags list to initialize the created activity object with.
+ The optional list to initialize the created activity object with.
+ The optional start timestamp to set on the created activity object.
+ The created activity object, if it had active listeners, or if it has no event listeners.
+
+
+ Returns the activity source name.
+ A string that represents the activity source name.
+
+
+ Returns the activity source version.
+ A string that represents the activity source version.
+
+
+ Represents a formatted based on a W3C standard.
+
+
+ Copies the 8 bytes of the current to a specified span.
+ The span to which the 8 bytes of the SpanID are to be copied.
+
+
+ Creates a new value from a read-only span of eight bytes.
+ A read-only span of eight bytes.
+
+ does not contain eight bytes.
+ The new span ID.
+
+
+ Creates a new value from a read-only span of 16 hexadecimal characters.
+ A span that contains 16 hexadecimal characters.
+
+ does not contain 16 hexadecimal characters.
+
+-or-
+
+The characters in are not all lower-case hexadecimal characters or all zeros.
+ The new span ID.
+
+
+ Creates a new value from a read-only span of UTF8-encoded bytes.
+ A read-only span of UTF8-encoded bytes.
+ The new span ID.
+
+
+ Creates a new based on a random number (that is very likely to be unique).
+ The new span ID.
+
+
+ Determines whether this instance and the specified instance have the same value.
+ The instance to compare.
+
+ if has the same hex value as the current instance; otherwise, .
+
+
+ the current instance and a specified object, which also must be an instance, have the same value.
+ The object to compare.
+
+ if is an instance of and has the same hex value as the current instance; otherwise, .
+
+
+ Returns the hash code of the SpanId.
+ The hash code of the SpanId.
+
+
+ Determines whether two specified instances have the same value.
+ The first instance to compare.
+ The second instance to compare.
+
+ if the SpanId of is the same as the SpanId of ; otherwise, .
+
+
+ Determine whether two specified instances have unequal values.
+ The first instance to compare.
+ The second instance to compare.
+
+ if the SpanId of is different from the SpanId of ; otherwise, .
+
+
+ Returns a 16-character hexadecimal string that represents this span ID.
+ The 16-character hexadecimal string representation of this span ID.
+
+
+ Returns a 16-character hexadecimal string that represents this span ID.
+ The 16-character hexadecimal string representation of this span ID.
+
+
+ Define the status code of the Activity which indicate the status of the instrumented operation.
+
+
+ Status code indicating an error is encountered during the operation.
+
+
+ Status code indicating the operation has been validated and completed successfully.
+
+
+ Unset status code is the default value indicating the status code is not initialized.
+
+
+ ActivityTagsCollection is a collection class used to store tracing tags.
+
+This collection will be used with classes like and .
+
+This collection behaves as follows:
+- The collection items will be ordered according to how they are added.
+- Don't allow duplication of items with the same key.
+- When using the indexer to store an item in the collection:
+ - If the item has a key that previously existed in the collection and the value is , the collection item matching the key will be removed from the collection.
+ - If the item has a key that previously existed in the collection and the value is not , the new item value will replace the old value stored in the collection.
+ - Otherwise, the item will be added to the collection.
+- Add method will add a new item to the collection if an item doesn't already exist with the same key. Otherwise, it will throw an exception.
+
+
+ Create a new instance of the collection.
+
+
+ Create a new instance of the collection and store the input list items in the collection.
+ Initial list to store in the collection.
+
+
+ Adds an item to the collection.
+ Key and value pair of the tag to add to the collection.
+
+ already exists in the list.
+
+ is .
+
+
+ Adds a tag with the provided key and value to the collection. This collection doesn't allow adding two tags with the same key.
+ The tag key.
+ The tag value.
+
+
+ Removes all items from the collection.
+
+
+ Determines whether the contains a specific value.
+ The object to locate in the .
+
+ if is found in the ; otherwise, .
+
+
+ Determines whether the collection contains an element with the specified key.
+ The key to locate in the .
+
+ if the collection contains tag with that key. otherwise.
+
+
+ Copies the elements of the collection to an array, starting at a particular array index.
+ The array that is the destination of the elements copied from collection.
+ The zero-based index in array at which copying begins.
+
+
+ Returns an enumerator that iterates through the collection.
+ An enumerator for the .
+
+
+ Removes the first occurrence of a specific item from the collection.
+ The tag key value pair to remove.
+
+ if item was successfully removed from the collection; otherwise, . This method also returns if item is not found in the original collection.
+
+
+ Removes the tag with the specified key from the collection.
+ The tag key.
+
+ if the item existed and removed. otherwise.
+
+
+ Returns an enumerator that iterates through the collection.
+ An enumerator that can be used to iterate through the collection.
+
+
+ Returns an enumerator that iterates through the collection.
+ An object that can be used to iterate through the collection.
+
+
+ Gets the value associated with the specified key.
+ The tag key.
+ The tag value.
+ When this method returns, the value associated with the specified key, if the key is found; otherwise, the default value for the type of the value parameter. This parameter is passed uninitialized.
+
+
+ Gets the number of elements contained in the collection.
+
+
+ Gets a value indicating whether the collection is read-only. This always returns .
+ Always returns .
+
+
+ Gets or sets a specified collection item.
+
+ When setting a value to this indexer property, the following behavior is observed:
+- If the key previously existed in the collection and the value is , the collection item matching the key will get removed from the collection.
+- If the key previously existed in the collection and the value is not , the value will replace the old value stored in the collection.
+- Otherwise, a new item will get added to the collection.
+ The key of the value to get or set.
+ The object mapped to the key.
+
+
+ Get the list of the keys of all stored tags.
+
+
+ Get the list of the values of all stored tags.
+
+
+ Enumerates the elements of an .
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+ Advances the enumerator to the next element of the collection.
+
+ if the enumerator was successfully advanced to the next element; if the enumerator has passed the end of the collection.
+
+
+ Sets the enumerator to its initial position, which is before the first element in the collection.
+
+
+ Gets the element in the collection at the current position of the enumerator.
+ The element in the collection at the current position of the enumerator.
+
+
+ Gets the element in the collection at the current position of the enumerator.
+ The element in the collection at the current position of the enumerator.
+
+
+ Specifies flags defined by the W3C standard that are associated with an activity.
+
+
+ The activity has not been marked.
+
+
+ The activity (or more likely its parents) has been marked as useful to record.
+
+
+ Represents a whose format is based on a W3C standard.
+
+
+ Copies the 16 bytes of the current to a specified span.
+ The span to which the 16 bytes of the trace ID are to be copied.
+
+
+ Creates a new value from a read-only span of 16 bytes.
+ A read-only span of 16 bytes.
+
+ does not contain eight bytes.
+ The new trace ID.
+
+
+ Creates a new value from a read-only span of 32 hexadecimal characters.
+ A span that contains 32 hexadecimal characters.
+
+ does not contain 16 hexadecimal characters.
+
+-or-
+
+The characters in are not all lower-case hexadecimal characters or all zeros.
+ The new trace ID.
+
+
+ Creates a new value from a read-only span of UTF8-encoded bytes.
+ A read-only span of UTF8-encoded bytes.
+ The new trace ID.
+
+
+ Creates a new based on a random number (that is very likely to be unique).
+ The new .
+
+
+ Determines whether the current instance and a specified are equal.
+ The instance to compare.
+
+ if has the same hex value as the current instance; otherwise, .
+
+
+ Determines whether this instance and a specified object, which must also be an instance, have the same value.
+ The object to compare.
+
+ if is an instance of and has the same hex value as the current instance; otherwise, .
+
+
+ Returns the hash code of the TraceId.
+ The hash code of the TraceId.
+
+
+ Determines whether two specified instances have the same value.
+ The first instance to compare.
+ The second instance to compare.
+
+ if the TraceId of is the same as the TraceId of ; otherwise, .
+
+
+ Determines whether two specified instances have the same value.
+ The first instance to compare.
+ The second instance to compare.
+
+ if the TraceId of is different from the TraceId of ; otherwise, .
+
+
+ Returns a 16-character hexadecimal string that represents this span ID.
+ The 32-character hexadecimal string representation of this trace ID.
+
+
+ Returns a 32-character hexadecimal string that represents this trace ID.
+ The 32-character hexadecimal string representation of this trace ID.
+
+
+ Provides an implementation of the abstract class that represents a named place to which a source sends its information (events).
+
+
+ Creates a new .
+ The name of this .
+
+
+ Disposes the NotificationListeners.
+
+
+ Determines whether there are any registered subscribers.
+
+ if there are any registered subscribers, otherwise.
+
+
+ Checks whether the is enabled.
+ The name of the event to check.
+
+ if notifications are enabled; otherwise, .
+
+
+ Checks if any subscriber to the diagnostic events is interested in receiving events with this name. Subscribers indicate their interest using a delegate provided in .
+ The name of the event to check.
+ The object that represents a context.
+ The object that represents a context.
+
+ if it is enabled, otherwise.
+
+
+ Invokes the OnActivityExport method of all the subscribers.
+ The activity affected by an external event.
+ An object that represents the outgoing request.
+
+
+ Invokes the OnActivityImport method of all the subscribers.
+ The activity affected by an external event.
+ An object that represents the incoming request.
+
+
+ Adds a subscriber.
+ A subscriber.
+ A reference to an interface that allows the listener to stop receiving notifications before the has finished sending them.
+
+
+ Adds a subscriber, and optionally filters events based on their name and up to two context objects.
+ A subscriber.
+ A delegate that filters events based on their name and up to two context objects (which can be ), or to if an event filter is not desirable.
+ A reference to an interface that allows the listener to stop receiving notifications before the has finished sending them.
+
+
+ Adds a subscriber, optionally filters events based on their name and up to two context objects, and specifies methods to call when providers import or export activites from outside the process.
+ A subscriber.
+ A delegate that filters events based on their name and up to two context objects (which can be ), or if an event filter is not desirable.
+ An action delegate that receives the activity affected by an external event and an object that represents the incoming request.
+ An action delegate that receives the activity affected by an external event and an object that represents the outgoing request.
+ A reference to an interface that allows the listener to stop receiving notifications before the has finished sending them.
+
+
+ Adds a subscriber, and optionally filters events based on their name.
+ A subscriber.
+ A delegate that filters events based on their name ( ). The delegate should return if the event is enabled.
+ A reference to an interface that allows the listener to stop receiving notifications before the has finished sending them.
+
+
+ Returns a string with the name of this DiagnosticListener.
+ The name of this DiagnosticListener.
+
+
+ Logs a notification.
+ The name of the event to log.
+ An object that represents the payload for the event.
+
+
+ Gets the collection of listeners for this .
+
+
+ Gets the name of this .
+ The name of the .
+
+
+ An abstract class that allows code to be instrumented for production-time logging of rich data payloads for consumption within the process that was instrumented.
+
+
+ Initializes an instance of the class.
+
+
+ Verifies if the notification event is enabled.
+ The name of the event being written.
+
+ if the notification event is enabled, otherwise.
+
+
+ Verifies it the notification event is enabled.
+ The name of the event being written.
+ An object that represents the additional context for IsEnabled. Consumers should expect to receive which may indicate that producer called pure IsEnabled(string) to check if consumer wants to get notifications for such events at all. Based on that, producer may call IsEnabled(string, object, object) again with non- context.
+ Optional. An object that represents the additional context for IsEnabled. by default. Consumers should expect to receive which may indicate that producer called pure IsEnabled(string) or producer passed all necessary context in .
+
+ if the notification event is enabled, otherwise.
+
+
+ Transfers state from an activity to some event or operation, such as an outgoing HTTP request, that will occur outside the process.
+ The activity affected by an external event.
+ An object that represents the outgoing request.
+
+
+ Transfers state to an activity from some event or operation, such as an incoming request, that occurred outside the process.
+ The activity affected by an external event.
+ A payload that represents the incoming request.
+
+
+ Starts an and writes a start event.
+ The to be started.
+ An object that represent the value being passed as a payload for the event.
+ The started activity for convenient chaining.
+
+
+ Stops the given , maintains the global activity, and notifies consumers that the was stopped.
+ The activity to be stopped.
+ An object that represents the value passed as a payload for the event.
+
+
+ Provides a generic way of logging complex payloads.
+ The name of the event being written.
+ An object that represents the value being passed as a payload for the event. This is often an anonymous type which contains several sub-values.
+
+
+ An implementation of determines if and how distributed context information is encoded and decoded as it traverses the network.
+ The encoding can be transported over any network protocol that supports string key-value pairs. For example, when using HTTP, each key-value pair is an HTTP header.
+ injects values into and extracts values from carriers as string key-value pairs.
+
+
+ Initializes an instance of the class. This constructor is protected and only meant to be called from parent classes.
+
+
+ Returns the default propagator object that will be initialized with.
+ An instance of the class.
+
+
+ Returns a propagator that does not transmit any distributed context information in outbound network messages.
+ An instance of the class.
+
+
+ Returns a propagator that attempts to act transparently, emitting the same data on outbound network requests that was received on the inbound request.
+ When encoding the outbound message, this propagator uses information from the request's root Activity, ignoring any intermediate Activities that may have been created while processing the request.
+ An instance of the class.
+
+
+ Extracts the baggage key-value pair list from an incoming request represented by the carrier. For example, from the headers of an HTTP request.
+ The medium from which values will be read.
+ The callback method to invoke to get the propagation baggage list from the carrier.
+ Returns the extracted key-value pair list from the carrier.
+
+
+ Extracts the trace ID and trace state from an incoming request represented by the carrier. For example, from the headers of an HTTP request.
+ The medium from which values will be read.
+ The callback method to invoke to get the propagation trace ID and state from the carrier.
+ When this method returns, contains the trace ID extracted from the carrier.
+ When this method returns, contains the trace state extracted from the carrier.
+
+
+ Injects the trace values stroed in the object into a carrier. For example, into the headers of an HTTP request.
+ The Activity object has the distributed context to inject to the carrier.
+ The medium in which the distributed context will be stored.
+ The callback method to invoke to set a named key-value pair on the carrier.
+
+
+ Get or set the process-wide propagator object to use as the current selected propagator.
+ The currently selected process-wide propagator object.
+
+
+ Gets the set of field names this propagator is likely to read or write.
+ The list of fields that will be used by the DistributedContextPropagator
.
+
+
+ Represents the callback method that's used in the extract methods of propagators. The callback is invoked to look up the value of a named field.
+ The medium used by propagators to read values from.
+ The propagation field name.
+ When this method returns, contains the value that corresponds to . The value is non- if there is only one value for the input field name.
+ When this method returns, contains a collection of values that correspond to . The value is non- if there is more than one value for the input field name.
+
+
+ Represents the callback method that's used in propagators' inject methods. This callback is invoked to set the value of a named field.
+ Propagators may invoke it multiple times in order to set multiple fields.
+ The medium used by propagators to write values to.
+ The propagation field name.
+ The value corresponding to .
+
+
+ Represents an instrument that supports adding non-negative values. For example, you might call counter.Add(1) each time a request is processed to track the total number of requests. Most metric viewers display counters using a rate (requests/sec), by default, but can also display a cumulative total.
+ The type that the counter represents.
+
+
+ Record the increment value of the measurement.
+ The increment measurement.
+
+
+ Record the increment value of the measurement.
+ The increment measurement.
+ A key-value pair tag associated with the measurement.
+
+
+ Record the increment value of the measurement.
+ The increment measurement.
+ A first key-value pair tag associated with the measurement.
+ A second key-value pair tag associated with the measurement.
+
+
+ Record the increment value of the measurement.
+ The increment measurement.
+ A first key-value pair tag associated with the measurement.
+ A second key-value pair tag associated with the measurement.
+ A third key-value pair tag associated with the measurement.
+
+
+ Record the increment value of the measurement.
+ The increment measurement.
+ A list of key-value pair tags associated with the measurement.
+
+
+ Adds the increment value of the measurement.
+ The measurement value.
+ The tags associated with the measurement.
+
+
+ Record the increment value of the measurement.
+ The increment measurement.
+ A span of key-value pair tags associated with the measurement.
+
+
+ Represents a metrics Instrument that can be used to report arbitrary values that are likely to be statistically meaningful.
+ e.g. the request duration.
+ Use method to create the Histogram object.
+ The type that the histogram represents.
+
+
+ Record a measurement value.
+ The measurement value.
+
+
+ Record a measurement value.
+ The measurement value.
+ A key-value pair tag associated with the measurement.
+
+
+ Record a measurement value.
+ The measurement value.
+ A first key-value pair tag associated with the measurement.
+ A second key-value pair tag associated with the measurement.
+
+
+ Record a measurement value.
+ The measurement value.
+ A first key-value pair tag associated with the measurement.
+ A second key-value pair tag associated with the measurement.
+ A third key-value pair tag associated with the measurement.
+
+
+ Record a measurement value.
+ The measurement value.
+ A list of key-value pair tags associated with the measurement.
+
+
+ Records a measurement value.
+ The measurement value.
+ The tags associated with the measurement.
+
+
+ Record a measurement value.
+ The measurement value.
+ A span of key-value pair tags associated with the measurement.
+
+
+ Base class of all Metrics Instrument classes
+
+
+ Protected constructor to initialize the common instrument properties like the meter, name, description, and unit.
+ All classes extending Instrument need to call this constructor when constructing object of the extended class.
+ The meter that created the instrument.
+ The instrument name. cannot be .
+ Optional instrument unit of measurements.
+ Optional instrument description.
+
+
+ Publish is activating the instrument to start recording measurements and to allow listeners to start listening to such measurements.
+
+
+ Gets the instrument description.
+
+
+ Checks if there is any listeners for this instrument.
+
+
+ A property tells if the instrument is an observable instrument.
+
+
+ Gets the Meter which created the instrument.
+
+
+ Gets the instrument name.
+
+
+ Gets the instrument unit of measurements.
+
+
+ The base class for all non-observable instruments.
+ The type that the instrument represents.
+
+
+ Create the metrics instrument using the properties meter, name, description, and unit.
+ All classes extending Instrument{T} need to call this constructor when constructing object of the extended class.
+ The meter that created the instrument.
+ The instrument name. cannot be .
+ Optional instrument unit of measurements.
+ Optional instrument description.
+
+
+ Record the measurement by notifying all objects which listening to this instrument.
+ The measurement value.
+
+
+ Record the measurement by notifying all objects which listening to this instrument.
+ The measurement value.
+ A key-value pair tag associated with the measurement.
+
+
+ Record the measurement by notifying all objects which listening to this instrument.
+ The measurement value.
+ A first key-value pair tag associated with the measurement.
+ A second key-value pair tag associated with the measurement.
+
+
+ Record the measurement by notifying all objects which listening to this instrument.
+ The measurement value.
+ A first key-value pair tag associated with the measurement.
+ A second key-value pair tag associated with the measurement.
+ A third key-value pair tag associated with the measurement.
+
+
+ Records a measurement by notifying all objects that are listening to this instrument.
+ The measurement value.
+ The tags associated with the measurement.
+
+
+ Record the measurement by notifying all objects which listening to this instrument.
+ The measurement value.
+ A span of key-value pair tags associated with the measurement.
+
+
+ Stores one observed metrics value and its associated tags. This type is used by an Observable instrument's Observe() method when reporting current measurements.
+ with the associated tags.
+ The type that the measurement represents.
+
+
+ Initializes a new instance of the Measurement using the value and the list of tags.
+ The measurement value.
+
+
+ Initializes a new instance of the Measurement using the value and the list of tags.
+ The measurement value.
+ The measurement associated tags list.
+
+
+ Initializes a new instance of the Measurement using the value and the list of tags.
+ The measurement value.
+ The measurement associated tags list.
+
+
+ Initializes a new instance of the Measurement using the value and the list of tags.
+ The measurement value.
+ The measurement associated tags list.
+
+
+ Gets the measurement tags list.
+
+
+ Gets the measurement value.
+
+
+ A delegate to represent the Meterlistener callbacks used in measurements recording operation.
+ The that was responsible for sending the measurement.
+ The measurement value.
+ A span of key-value pair tags associated with the measurement.
+ The state object originally passed to method.
+ The type that the measurement represents.
+
+
+ Meter is the class responsible for creating and tracking the Instruments.
+
+
+ Initializes a new instance of the Meter using the meter name.
+ The Meter name.
+
+
+ Initializes a new instance of the Meter using the meter name and version.
+ The Meter name.
+ The optional Meter version.
+
+
+ Create a metrics Counter object.
+ The instrument name. cannot be .
+ Optional instrument unit of measurements.
+ Optional instrument description.
+ The numerical type of the measurement.
+ A new counter.
+
+
+ Creates a Histogram, which is an instrument that can be used to report arbitrary values that are likely to be statistically meaningful. It is intended for statistics such as histograms, summaries, and percentile.
+ The instrument name. cannot be .
+ Optional instrument unit of measurements.
+ Optional instrument description.
+ The numerical type of the measurement.
+ A new histogram.
+
+
+ Creates an ObservableCounter, which is an instrument that reports monotonically increasing values when the instrument is being observed.
+ The instrument name. cannot be .
+ The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by .
+ Optional instrument unit of measurements.
+ Optional instrument description.
+ The numerical type of the measurement..
+ A new observable counter.
+
+
+ Creates an ObservableCounter, which is an instrument that reports monotonically increasing values when the instrument is being observed.
+ The instrument name. cannot be .
+ The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by .
+ Optional instrument unit of measurements.
+ Optional instrument description.
+ The numerical type of the measurement.
+ A new observable counter.
+
+
+ Creates an ObservableCounter, which is an instrument that reports monotonically increasing values when the instrument is being observed.
+ The instrument name. cannot be .
+ The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by
+ Optional instrument unit of measurements.
+ Optional instrument description.
+ The numerical type of the measurement.
+ A new observable counter.
+
+
+ Creates an ObservableGauge, which is an asynchronous instrument that reports non-additive values when the instrument is being observed. An example of a non-additive value is the room temperature - it makes no sense to report the temperature value from multiple rooms and sum them up.
+ The instrument name. cannot be .
+ The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by .
+ Optional instrument unit of measurements.
+ Optional instrument description.
+ The numerical type of the measurement.
+ A new observable gauge.
+
+
+ Creates an ObservableGauge, which is an asynchronous instrument that reports non-additive values when the instrument is being observed. An example of a non-additive value is the room temperature - it makes no sense to report the temperature value from multiple rooms and sum them up.
+ The instrument name. cannot be .
+ The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by .
+ Optional instrument unit of measurements.
+ Optional instrument description.
+ The numerical type of the measurement.
+ A new observable gauge.
+
+
+ Creates an ObservableGauge, which is an asynchronous instrument that reports non-additive values when the instrument is being observed. An example of a non-additive value is the room temperature - it makes no sense to report the temperature value from multiple rooms and sum them up.
+ The instrument name. cannot be .
+ The callback to call to get the measurements when ObservableCounter{T}.Observe()
is called by .
+ Optional instrument unit of measurements.
+ Optional instrument description.
+ The numerical type of the measurement.
+ A new observable gauge.
+
+
+ Dispose the Meter which will disable all instruments created by this meter.
+
+
+ Gets the Meter name.
+ The Meter name
+
+
+ Gets the Meter version.
+ The Meter version.
+
+
+ MeterListener is class used to listen to the metrics instrument measurements recording.
+
+
+ Creates a MeterListener object.
+
+
+ Stop listening to a specific instrument measurement recording.
+ The instrument to stop listening to.
+ The state object originally passed to method.
+
+
+ Disposes the listeners which will stop it from listening to any instrument.
+
+
+ Start listening to a specific instrument measurement recording.
+ The instrument to listen to.
+ A state object which will be passed back to the callback getting measurements events.
+
+
+ Calls all Observable instruments which the listener is listening to then calls with every collected measurement.
+
+
+ Sets a callback for a specific numeric type to get the measurement recording notification from all instruments which enabled listening and was created with the same specified numeric type.
+ If a measurement of type T is recorded and a callback of type T is registered, that callback will be used.
+ The callback which can be used to get measurement recording of numeric type T.
+ The type of the numeric measurement.
+
+
+ Enable the listener to start listening to instruments measurement recording.
+
+
+ Gets or sets the callback to get notified when an instrument is published.
+ The callback to get notified when an instrument is published.
+
+
+ Gets or sets the callback to get notified when the measurement is stopped on some instrument.
+ This can happen when the Meter or the Listener is disposed or calling on the listener.
+ The callback to get notified when the measurement is stopped on some instrument.
+
+
+ ObservableCounter is a metrics observable Instrument which reports monotonically increasing value(s) when the instrument is being observed.
+ e.g. CPU time (for different processes, threads, user mode or kernel mode).
+ Use Meter.CreateObservableCounter methods to create the observable counter object.
+ The type that the observable counter represents.
+
+
+ ObservableGauge is an observable Instrument that reports non-additive value(s) when the instrument is being observed.
+ e.g. the current room temperature Use Meter.CreateObservableGauge methods to create the observable counter object.
+
+
+
+ ObservableInstrument{T} is the base class from which all metrics observable instruments will inherit from.
+ The type that the observable instrument represents.
+
+
+ Create the metrics observable instrument using the properties meter, name, description, and unit.
+ All classes extending ObservableInstrument{T} need to call this constructor when constructing object of the extended class.
+ The meter that created the instrument.
+ The instrument name. cannot be .
+ Optional instrument unit of measurements.
+ Optional instrument description.
+
+
+ Fetches the current measurements being tracked by this instrument. All classes extending ObservableInstrument{T} need to implement this method.
+ The current measurements tracked by this instrument.
+
+
+ Gets a value that indicates if the instrument is an observable instrument.
+
+ if the instrument is metrics-observable; otherwise.
+
+
+ A delegate that defines the signature of the callbacks used in the sampling process.
+ The Activity creation options used by callbacks to decide creating the Activity object or not.
+ The type of the requested parent to create the Activity object with. Should be either a string or an instance.
+ An object containing the sampling results, which indicate the amount of data to collect for the related .
+
+
+ Represents a list of tags that can be accessed by index. Provides methods to search, sort, and manipulate lists.
+
+
+ Initializes a new instance of using the specified .
+ A span of tags to initialize the list with.
+
+
+ Adds a tag to the list.
+ The key-value pair of the tag to add to the list.
+
+
+ Adds a tag with the specified and to the list.
+ The tag key.
+ The tag value.
+
+
+ Removes all elements from the .
+
+
+ Determines whether a tag is in the .
+ The tag to locate in the .
+
+ if item is found in the ; otherwise, .
+
+
+ Copies the entire to a compatible one-dimensional array, starting at the specified index of the target array.
+ The one-dimensional Array that is the destination of the elements copied from . The Array must have zero-based indexing.
+ The zero-based index in at which copying begins.
+
+ is .
+
+ is less than 0 or greater than or equal to the length.
+
+
+ Copies the contents of this into a destination span.
+ The destination object.
+
+ The number of elements in the source is greater than the number of elements that the destination span.
+
+
+ Returns an enumerator that iterates through the .
+ An enumerator that iterates through the .
+
+
+ Searches for the specified tag and returns the zero-based index of the first occurrence within the entire .
+ The tag to locate in the .
+ The zero-based index of the first ocurrence of in the tag list.
+
+
+ Inserts an element into the at the specified index.
+ The zero-based index at which the item should be inserted.
+ The tag to insert.
+
+ is less than 0 or is greater than .
+
+
+ Removes the first occurrence of a specific object from the .
+ The tag to remove from the .
+
+ if is successfully removed; otherwise, . This method also returns if was not found in the .
+
+
+ Removes the element at the specified index of the .
+ The zero-based index of the element to remove.
+
+ index is less than 0 or is greater than .
+
+
+ Returns an enumerator that iterates through the .
+ An enumerator that iterates through the .
+
+
+ Gets the number of tags contained in the .
+
+
+ Gets a value indicating whether the is read-only. This property will always return .
+
+
+ Gets or sets the tags at the specified index.
+ The item index.
+
+ is not a valid index in the .
+
+
+ An enumerator for traversing a tag list collection.
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+ Advances the enumerator to the next element of the collection.
+
+ if the enumerator was successfully advanced to the next element; if the enumerator has passed the end of the collection.
+
+
+ Sets the enumerator to its initial position, which is before the first element in the collection.
+
+
+ Gets the element in the collection at the current position of the enumerator.
+ The element in the collection at the current position of the enumerator.
+
+
+ Gets the element in the collection at the current position of the enumerator.
+ The element in the collection at the current position of the enumerator.
+
+
\ No newline at end of file
diff --git a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/LICENSE.TXT b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/LICENSE.TXT
index fa3121d..984713a 100644
--- a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/LICENSE.TXT
+++ b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/LICENSE.TXT
@@ -1,23 +1,23 @@
-The MIT License (MIT)
-
-Copyright (c) .NET Foundation and Contributors
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+The MIT License (MIT)
+
+Copyright (c) .NET Foundation and Contributors
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/System.IO.Pipelines.nuspec b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/System.IO.Pipelines.nuspec
index 67e52be..aa80dc6 100644
--- a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/System.IO.Pipelines.nuspec
+++ b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/System.IO.Pipelines.nuspec
@@ -1,37 +1,37 @@
-
-
-
- System.IO.Pipelines
- 8.0.0
- Microsoft
- MIT
- https://licenses.nuget.org/MIT
- Icon.png
- https://dot.net/
- Single producer single consumer byte buffer management.
-
-Commonly Used Types:
-System.IO.Pipelines.Pipe
-System.IO.Pipelines.PipeWriter
-System.IO.Pipelines.PipeReader
- https://go.microsoft.com/fwlink/?LinkID=799421
- © Microsoft Corporation. All rights reserved.
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ System.IO.Pipelines
+ 8.0.0
+ Microsoft
+ MIT
+ https://licenses.nuget.org/MIT
+ Icon.png
+ https://dot.net/
+ Single producer single consumer byte buffer management.
+
+Commonly Used Types:
+System.IO.Pipelines.Pipe
+System.IO.Pipelines.PipeWriter
+System.IO.Pipelines.PipeReader
+ https://go.microsoft.com/fwlink/?LinkID=799421
+ © Microsoft Corporation. All rights reserved.
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/THIRD-PARTY-NOTICES.TXT b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/THIRD-PARTY-NOTICES.TXT
index f2d7529..4b40333 100644
--- a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/THIRD-PARTY-NOTICES.TXT
+++ b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/THIRD-PARTY-NOTICES.TXT
@@ -1,1272 +1,1272 @@
-.NET Runtime uses third-party libraries or other resources that may be
-distributed under licenses different than the .NET Runtime software.
-
-In the event that we accidentally failed to list a required notice, please
-bring it to our attention. Post an issue or email us:
-
- dotnet@microsoft.com
-
-The attached notices are provided for information only.
-
-License notice for ASP.NET
--------------------------------
-
-Copyright (c) .NET Foundation. All rights reserved.
-Licensed under the Apache License, Version 2.0.
-
-Available at
-https://github.com/dotnet/aspnetcore/blob/main/LICENSE.txt
-
-License notice for Slicing-by-8
--------------------------------
-
-http://sourceforge.net/projects/slicing-by-8/
-
-Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
-
-
-This software program is licensed subject to the BSD License, available at
-http://www.opensource.org/licenses/bsd-license.html.
-
-
-License notice for Unicode data
--------------------------------
-
-https://www.unicode.org/license.html
-
-Copyright © 1991-2022 Unicode, Inc. All rights reserved.
-Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Unicode data files and any associated documentation
-(the "Data Files") or Unicode software and any associated documentation
-(the "Software") to deal in the Data Files or Software
-without restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, and/or sell copies of
-the Data Files or Software, and to permit persons to whom the Data Files
-or Software are furnished to do so, provided that either
-(a) this copyright and permission notice appear with all copies
-of the Data Files or Software, or
-(b) this copyright and permission notice appear in associated
-Documentation.
-
-THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT OF THIRD PARTY RIGHTS.
-IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
-NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THE DATA FILES OR SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder
-shall not be used in advertising or otherwise to promote the sale,
-use or other dealings in these Data Files or Software without prior
-written authorization of the copyright holder.
-
-License notice for Zlib
------------------------
-
-https://github.com/madler/zlib
-https://zlib.net/zlib_license.html
-
-/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.13, October 13th, 2022
-
- Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
-*/
-
-License notice for Mono
--------------------------------
-
-http://www.mono-project.com/docs/about-mono/
-
-Copyright (c) .NET Foundation Contributors
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the Software), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for International Organization for Standardization
------------------------------------------------------------------
-
-Portions (C) International Organization for Standardization 1986:
- Permission to copy in any form is granted for use with
- conforming SGML systems and applications as defined in
- ISO 8879, provided this notice is included in all copies.
-
-License notice for Intel
-------------------------
-
-"Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Xamarin and Novell
--------------------------------------
-
-Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-Copyright (c) 2011 Novell, Inc (http://www.novell.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-Third party notice for W3C
---------------------------
-
-"W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE
-Status: This license takes effect 13 May, 2015.
-This work is being provided by the copyright holders under the following license.
-License
-By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
-Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
-The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
-Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
-Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)."
-Disclaimers
-THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
-The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders."
-
-License notice for Bit Twiddling Hacks
---------------------------------------
-
-Bit Twiddling Hacks
-
-By Sean Eron Anderson
-seander@cs.stanford.edu
-
-Individually, the code snippets here are in the public domain (unless otherwise
-noted) — feel free to use them however you please. The aggregate collection and
-descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are
-distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and
-without even the implied warranty of merchantability or fitness for a particular
-purpose.
-
-License notice for Brotli
---------------------------------------
-
-Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-compress_fragment.c:
-Copyright (c) 2011, Google Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-decode_fuzzer.c:
-Copyright (c) 2015 The Chromium Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-
-License notice for Json.NET
--------------------------------
-
-https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md
-
-The MIT License (MIT)
-
-Copyright (c) 2007 James Newton-King
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for vectorized base64 encoding / decoding
---------------------------------------------------------
-
-Copyright (c) 2005-2007, Nick Galbreath
-Copyright (c) 2013-2017, Alfred Klomp
-Copyright (c) 2015-2017, Wojciech Mula
-Copyright (c) 2016-2017, Matthieu Darbois
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
-- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for vectorized hex parsing
---------------------------------------------------------
-
-Copyright (c) 2022, Geoff Langdale
-Copyright (c) 2022, Wojciech Mula
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
-- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for RFC 3492
----------------------------
-
-The punycode implementation is based on the sample code in RFC 3492
-
-Copyright (C) The Internet Society (2003). All Rights Reserved.
-
-This document and translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it
-or assist in its implementation may be prepared, copied, published
-and distributed, in whole or in part, without restriction of any
-kind, provided that the above copyright notice and this paragraph are
-included on all such copies and derivative works. However, this
-document itself may not be modified in any way, such as by removing
-the copyright notice or references to the Internet Society or other
-Internet organizations, except as needed for the purpose of
-developing Internet standards in which case the procedures for
-copyrights defined in the Internet Standards process must be
-followed, or as required to translate it into languages other than
-English.
-
-The limited permissions granted above are perpetual and will not be
-revoked by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an
-"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
-TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
-BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
-HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-Copyright(C) The Internet Society 1997. All Rights Reserved.
-
-This document and translations of it may be copied and furnished to others,
-and derivative works that comment on or otherwise explain it or assist in
-its implementation may be prepared, copied, published and distributed, in
-whole or in part, without restriction of any kind, provided that the above
-copyright notice and this paragraph are included on all such copies and
-derivative works.However, this document itself may not be modified in any
-way, such as by removing the copyright notice or references to the Internet
-Society or other Internet organizations, except as needed for the purpose of
-developing Internet standards in which case the procedures for copyrights
-defined in the Internet Standards process must be followed, or as required
-to translate it into languages other than English.
-
-The limited permissions granted above are perpetual and will not be revoked
-by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an "AS IS"
-basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
-DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
-ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
-RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
-PARTICULAR PURPOSE.
-
-License notice for Algorithm from RFC 4122 -
-A Universally Unique IDentifier (UUID) URN Namespace
-----------------------------------------------------
-
-Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
-Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
-Digital Equipment Corporation, Maynard, Mass.
-Copyright (c) 1998 Microsoft.
-To anyone who acknowledges that this file is provided "AS IS"
-without any express or implied warranty: permission to use, copy,
-modify, and distribute this file for any purpose is hereby
-granted without fee, provided that the above copyright notices and
-this notice appears in all source code copies, and that none of
-the names of Open Software Foundation, Inc., Hewlett-Packard
-Company, Microsoft, or Digital Equipment Corporation be used in
-advertising or publicity pertaining to distribution of the software
-without specific, written prior permission. Neither Open Software
-Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
-Equipment Corporation makes any representations about the
-suitability of this software for any purpose."
-
-License notice for The LLVM Compiler Infrastructure (Legacy License)
---------------------------------------------------------------------
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-License notice for Bob Jenkins
-------------------------------
-
-By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
-code any way you wish, private, educational, or commercial. It's free.
-
-License notice for Greg Parker
-------------------------------
-
-Greg Parker gparker@cs.stanford.edu December 2000
-This code is in the public domain and may be copied or modified without
-permission.
-
-License notice for libunwind based code
-----------------------------------------
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for Printing Floating-Point Numbers (Dragon4)
-------------------------------------------------------------
-
-/******************************************************************************
- Copyright (c) 2014 Ryan Juckett
- http://www.ryanjuckett.com/
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
- 3. This notice may not be removed or altered from any source
- distribution.
-******************************************************************************/
-
-License notice for Printing Floating-point Numbers (Grisu3)
------------------------------------------------------------
-
-Copyright 2012 the V8 project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for xxHash
--------------------------
-
-xxHash - Extremely Fast Hash algorithm
-Header File
-Copyright (C) 2012-2021 Yann Collet
-
-BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-You can contact the author at:
- - xxHash homepage: https://www.xxhash.com
- - xxHash source repository: https://github.com/Cyan4973/xxHash
-
-License notice for Berkeley SoftFloat Release 3e
-------------------------------------------------
-
-https://github.com/ucb-bar/berkeley-softfloat-3
-https://github.com/ucb-bar/berkeley-softfloat-3/blob/master/COPYING.txt
-
-License for Berkeley SoftFloat Release 3e
-
-John R. Hauser
-2018 January 20
-
-The following applies to the whole of SoftFloat Release 3e as well as to
-each source file individually.
-
-Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
-University of California. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions, and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions, and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for xoshiro RNGs
---------------------------------
-
-Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
-
-To the extent possible under law, the author has dedicated all copyright
-and related and neighboring rights to this software to the public domain
-worldwide. This software is distributed without any warranty.
-
-See .
-
-License for fastmod (https://github.com/lemire/fastmod), ibm-fpgen (https://github.com/nigeltao/parse-number-fxx-test-data) and fastrange (https://github.com/lemire/fastrange)
---------------------------------------
-
- Copyright 2018 Daniel Lemire
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-License for sse4-strstr (https://github.com/WojciechMula/sse4-strstr)
---------------------------------------
-
- Copyright (c) 2008-2016, Wojciech Mula
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for The C++ REST SDK
------------------------------------
-
-C++ REST SDK
-
-The MIT License (MIT)
-
-Copyright (c) Microsoft Corporation
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for MessagePack-CSharp
--------------------------------------
-
-MessagePack for C#
-
-MIT License
-
-Copyright (c) 2017 Yoshifumi Kawai
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for lz4net
--------------------------------------
-
-lz4net
-
-Copyright (c) 2013-2017, Milosz Krajewski
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Nerdbank.Streams
------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) Andrew Arnott
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for RapidJSON
-----------------------------
-
-Tencent is pleased to support the open source community by making RapidJSON available.
-
-Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
-
-Licensed under the MIT License (the "License"); you may not use this file except
-in compliance with the License. You may obtain a copy of the License at
-
-http://opensource.org/licenses/MIT
-
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
-
-License notice for DirectX Math Library
----------------------------------------
-
-https://github.com/microsoft/DirectXMath/blob/master/LICENSE
-
- The MIT License (MIT)
-
-Copyright (c) 2011-2020 Microsoft Corp
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this
-software and associated documentation files (the "Software"), to deal in the Software
-without restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be included in all copies
-or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
-CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
-OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for ldap4net
----------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2018 Alexander Chermyanin
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for vectorized sorting code
-------------------------------------------
-
-MIT License
-
-Copyright (c) 2020 Dan Shechter
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for musl
------------------------
-
-musl as a whole is licensed under the following standard MIT license:
-
-Copyright © 2005-2020 Rich Felker, et al.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-License notice for "Faster Unsigned Division by Constants"
-------------------------------
-
-Reference implementations of computing and using the "magic number" approach to dividing
-by constants, including codegen instructions. The unsigned division incorporates the
-"round down" optimization per ridiculous_fish.
-
-This is free and unencumbered software. Any copyright is dedicated to the Public Domain.
-
-
-License notice for mimalloc
------------------------------------
-
-MIT License
-
-Copyright (c) 2019 Microsoft Corporation, Daan Leijen
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for The LLVM Project
------------------------------------
-
-Copyright 2019 LLVM Project
-
-Licensed under the Apache License, Version 2.0 (the "License") with LLVM Exceptions;
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-https://llvm.org/LICENSE.txt
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-License notice for Apple header files
--------------------------------------
-
-Copyright (c) 1980, 1986, 1993
- The Regents of the University of California. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. All advertising materials mentioning features or use of this software
- must display the following acknowledgement:
- This product includes software developed by the University of
- California, Berkeley and its contributors.
-4. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-License notice for JavaScript queues
--------------------------------------
-
-CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER.
-
-Statement of Purpose
-The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
-Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
-For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
-
-1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
-the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
-moral rights retained by the original author(s) and/or performer(s);
-publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
-rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
-rights protecting the extraction, dissemination, use and reuse of data in a Work;
-database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
-other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
-2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
-3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
-4. Limitations and Disclaimers.
-a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
-b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
-c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
-d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
-
-
-License notice for FastFloat algorithm
--------------------------------------
-MIT License
-Copyright (c) 2021 csFastFloat authors
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for MsQuic
---------------------------------------
-
-Copyright (c) Microsoft Corporation.
-Licensed under the MIT License.
-
-Available at
-https://github.com/microsoft/msquic/blob/main/LICENSE
-
-License notice for m-ou-se/floatconv
--------------------------------
-
-Copyright (c) 2020 Mara Bos
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for code from The Practice of Programming
--------------------------------
-
-Copyright (C) 1999 Lucent Technologies
-
-Excerpted from 'The Practice of Programming
-by Brian W. Kernighan and Rob Pike
-
-You may use this code for any purpose, as long as you leave the copyright notice and book citation attached.
-
-Notice for Euclidean Affine Functions and Applications to Calendar
-Algorithms
--------------------------------
-
-Aspects of Date/Time processing based on algorithm described in "Euclidean Affine Functions and Applications to Calendar
-Algorithms", Cassio Neri and Lorenz Schneider. https://arxiv.org/pdf/2102.06959.pdf
-
-License notice for amd/aocl-libm-ose
--------------------------------
-
-Copyright (C) 2008-2020 Advanced Micro Devices, Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-3. Neither the name of the copyright holder nor the names of its contributors
- may be used to endorse or promote products derived from this software without
- specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-License notice for fmtlib/fmt
--------------------------------
-
-Formatting library for C++
-
-Copyright (c) 2012 - present, Victor Zverovich
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License for Jb Evain
----------------------
-
-Copyright (c) 2006 Jb Evain (jbevain@gmail.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
---- Optional exception to the license ---
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into a machine-executable object form of such
-source code, you may redistribute such embedded portions in such object form
-without including the above copyright and permission notices.
-
-
-License for MurmurHash3
---------------------------------------
-
-https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
-
-MurmurHash3 was written by Austin Appleby, and is placed in the public
-domain. The author hereby disclaims copyright to this source
-
-License for Fast CRC Computation
---------------------------------------
-
-https://github.com/intel/isa-l/blob/33a2d9484595c2d6516c920ce39a694c144ddf69/crc/crc32_ieee_by4.asm
-https://github.com/intel/isa-l/blob/33a2d9484595c2d6516c920ce39a694c144ddf69/crc/crc64_ecma_norm_by8.asm
-
-Copyright(c) 2011-2015 Intel Corporation All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Intel Corporation nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License for C# Implementation of Fast CRC Computation
------------------------------------------------------
-
-https://github.com/SixLabors/ImageSharp/blob/f4f689ce67ecbcc35cebddba5aacb603e6d1068a/src/ImageSharp/Formats/Png/Zlib/Crc32.cs
-
-Copyright (c) Six Labors.
-Licensed under the Apache License, Version 2.0.
-
-Available at
-https://github.com/SixLabors/ImageSharp/blob/f4f689ce67ecbcc35cebddba5aacb603e6d1068a/LICENSE
+.NET Runtime uses third-party libraries or other resources that may be
+distributed under licenses different than the .NET Runtime software.
+
+In the event that we accidentally failed to list a required notice, please
+bring it to our attention. Post an issue or email us:
+
+ dotnet@microsoft.com
+
+The attached notices are provided for information only.
+
+License notice for ASP.NET
+-------------------------------
+
+Copyright (c) .NET Foundation. All rights reserved.
+Licensed under the Apache License, Version 2.0.
+
+Available at
+https://github.com/dotnet/aspnetcore/blob/main/LICENSE.txt
+
+License notice for Slicing-by-8
+-------------------------------
+
+http://sourceforge.net/projects/slicing-by-8/
+
+Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
+
+
+This software program is licensed subject to the BSD License, available at
+http://www.opensource.org/licenses/bsd-license.html.
+
+
+License notice for Unicode data
+-------------------------------
+
+https://www.unicode.org/license.html
+
+Copyright © 1991-2022 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+
+License notice for Zlib
+-----------------------
+
+https://github.com/madler/zlib
+https://zlib.net/zlib_license.html
+
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.13, October 13th, 2022
+
+ Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+*/
+
+License notice for Mono
+-------------------------------
+
+http://www.mono-project.com/docs/about-mono/
+
+Copyright (c) .NET Foundation Contributors
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the Software), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for International Organization for Standardization
+-----------------------------------------------------------------
+
+Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+
+License notice for Intel
+------------------------
+
+"Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Xamarin and Novell
+-------------------------------------
+
+Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Copyright (c) 2011 Novell, Inc (http://www.novell.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Third party notice for W3C
+--------------------------
+
+"W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE
+Status: This license takes effect 13 May, 2015.
+This work is being provided by the copyright holders under the following license.
+License
+By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
+Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
+The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
+Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
+Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)."
+Disclaimers
+THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
+The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders."
+
+License notice for Bit Twiddling Hacks
+--------------------------------------
+
+Bit Twiddling Hacks
+
+By Sean Eron Anderson
+seander@cs.stanford.edu
+
+Individually, the code snippets here are in the public domain (unless otherwise
+noted) — feel free to use them however you please. The aggregate collection and
+descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are
+distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and
+without even the implied warranty of merchantability or fitness for a particular
+purpose.
+
+License notice for Brotli
+--------------------------------------
+
+Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+compress_fragment.c:
+Copyright (c) 2011, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+decode_fuzzer.c:
+Copyright (c) 2015 The Chromium Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+
+License notice for Json.NET
+-------------------------------
+
+https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md
+
+The MIT License (MIT)
+
+Copyright (c) 2007 James Newton-King
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for vectorized base64 encoding / decoding
+--------------------------------------------------------
+
+Copyright (c) 2005-2007, Nick Galbreath
+Copyright (c) 2013-2017, Alfred Klomp
+Copyright (c) 2015-2017, Wojciech Mula
+Copyright (c) 2016-2017, Matthieu Darbois
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+- Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for vectorized hex parsing
+--------------------------------------------------------
+
+Copyright (c) 2022, Geoff Langdale
+Copyright (c) 2022, Wojciech Mula
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+- Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for RFC 3492
+---------------------------
+
+The punycode implementation is based on the sample code in RFC 3492
+
+Copyright (C) The Internet Society (2003). All Rights Reserved.
+
+This document and translations of it may be copied and furnished to
+others, and derivative works that comment on or otherwise explain it
+or assist in its implementation may be prepared, copied, published
+and distributed, in whole or in part, without restriction of any
+kind, provided that the above copyright notice and this paragraph are
+included on all such copies and derivative works. However, this
+document itself may not be modified in any way, such as by removing
+the copyright notice or references to the Internet Society or other
+Internet organizations, except as needed for the purpose of
+developing Internet standards in which case the procedures for
+copyrights defined in the Internet Standards process must be
+followed, or as required to translate it into languages other than
+English.
+
+The limited permissions granted above are perpetual and will not be
+revoked by the Internet Society or its successors or assigns.
+
+This document and the information contained herein is provided on an
+"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Copyright(C) The Internet Society 1997. All Rights Reserved.
+
+This document and translations of it may be copied and furnished to others,
+and derivative works that comment on or otherwise explain it or assist in
+its implementation may be prepared, copied, published and distributed, in
+whole or in part, without restriction of any kind, provided that the above
+copyright notice and this paragraph are included on all such copies and
+derivative works.However, this document itself may not be modified in any
+way, such as by removing the copyright notice or references to the Internet
+Society or other Internet organizations, except as needed for the purpose of
+developing Internet standards in which case the procedures for copyrights
+defined in the Internet Standards process must be followed, or as required
+to translate it into languages other than English.
+
+The limited permissions granted above are perpetual and will not be revoked
+by the Internet Society or its successors or assigns.
+
+This document and the information contained herein is provided on an "AS IS"
+basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
+DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
+RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
+PARTICULAR PURPOSE.
+
+License notice for Algorithm from RFC 4122 -
+A Universally Unique IDentifier (UUID) URN Namespace
+----------------------------------------------------
+
+Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
+Digital Equipment Corporation, Maynard, Mass.
+Copyright (c) 1998 Microsoft.
+To anyone who acknowledges that this file is provided "AS IS"
+without any express or implied warranty: permission to use, copy,
+modify, and distribute this file for any purpose is hereby
+granted without fee, provided that the above copyright notices and
+this notice appears in all source code copies, and that none of
+the names of Open Software Foundation, Inc., Hewlett-Packard
+Company, Microsoft, or Digital Equipment Corporation be used in
+advertising or publicity pertaining to distribution of the software
+without specific, written prior permission. Neither Open Software
+Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
+Equipment Corporation makes any representations about the
+suitability of this software for any purpose."
+
+License notice for The LLVM Compiler Infrastructure (Legacy License)
+--------------------------------------------------------------------
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+License notice for Bob Jenkins
+------------------------------
+
+By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
+code any way you wish, private, educational, or commercial. It's free.
+
+License notice for Greg Parker
+------------------------------
+
+Greg Parker gparker@cs.stanford.edu December 2000
+This code is in the public domain and may be copied or modified without
+permission.
+
+License notice for libunwind based code
+----------------------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for Printing Floating-Point Numbers (Dragon4)
+------------------------------------------------------------
+
+/******************************************************************************
+ Copyright (c) 2014 Ryan Juckett
+ http://www.ryanjuckett.com/
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+******************************************************************************/
+
+License notice for Printing Floating-point Numbers (Grisu3)
+-----------------------------------------------------------
+
+Copyright 2012 the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for xxHash
+-------------------------
+
+xxHash - Extremely Fast Hash algorithm
+Header File
+Copyright (C) 2012-2021 Yann Collet
+
+BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+You can contact the author at:
+ - xxHash homepage: https://www.xxhash.com
+ - xxHash source repository: https://github.com/Cyan4973/xxHash
+
+License notice for Berkeley SoftFloat Release 3e
+------------------------------------------------
+
+https://github.com/ucb-bar/berkeley-softfloat-3
+https://github.com/ucb-bar/berkeley-softfloat-3/blob/master/COPYING.txt
+
+License for Berkeley SoftFloat Release 3e
+
+John R. Hauser
+2018 January 20
+
+The following applies to the whole of SoftFloat Release 3e as well as to
+each source file individually.
+
+Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
+University of California. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions, and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for xoshiro RNGs
+--------------------------------
+
+Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
+
+To the extent possible under law, the author has dedicated all copyright
+and related and neighboring rights to this software to the public domain
+worldwide. This software is distributed without any warranty.
+
+See .
+
+License for fastmod (https://github.com/lemire/fastmod), ibm-fpgen (https://github.com/nigeltao/parse-number-fxx-test-data) and fastrange (https://github.com/lemire/fastrange)
+--------------------------------------
+
+ Copyright 2018 Daniel Lemire
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+License for sse4-strstr (https://github.com/WojciechMula/sse4-strstr)
+--------------------------------------
+
+ Copyright (c) 2008-2016, Wojciech Mula
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for The C++ REST SDK
+-----------------------------------
+
+C++ REST SDK
+
+The MIT License (MIT)
+
+Copyright (c) Microsoft Corporation
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for MessagePack-CSharp
+-------------------------------------
+
+MessagePack for C#
+
+MIT License
+
+Copyright (c) 2017 Yoshifumi Kawai
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for lz4net
+-------------------------------------
+
+lz4net
+
+Copyright (c) 2013-2017, Milosz Krajewski
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Nerdbank.Streams
+-----------------------------------
+
+The MIT License (MIT)
+
+Copyright (c) Andrew Arnott
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for RapidJSON
+----------------------------
+
+Tencent is pleased to support the open source community by making RapidJSON available.
+
+Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
+
+Licensed under the MIT License (the "License"); you may not use this file except
+in compliance with the License. You may obtain a copy of the License at
+
+http://opensource.org/licenses/MIT
+
+Unless required by applicable law or agreed to in writing, software distributed
+under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied. See the License for the
+specific language governing permissions and limitations under the License.
+
+License notice for DirectX Math Library
+---------------------------------------
+
+https://github.com/microsoft/DirectXMath/blob/master/LICENSE
+
+ The MIT License (MIT)
+
+Copyright (c) 2011-2020 Microsoft Corp
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be included in all copies
+or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for ldap4net
+---------------------------
+
+The MIT License (MIT)
+
+Copyright (c) 2018 Alexander Chermyanin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for vectorized sorting code
+------------------------------------------
+
+MIT License
+
+Copyright (c) 2020 Dan Shechter
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for musl
+-----------------------
+
+musl as a whole is licensed under the following standard MIT license:
+
+Copyright © 2005-2020 Rich Felker, et al.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+License notice for "Faster Unsigned Division by Constants"
+------------------------------
+
+Reference implementations of computing and using the "magic number" approach to dividing
+by constants, including codegen instructions. The unsigned division incorporates the
+"round down" optimization per ridiculous_fish.
+
+This is free and unencumbered software. Any copyright is dedicated to the Public Domain.
+
+
+License notice for mimalloc
+-----------------------------------
+
+MIT License
+
+Copyright (c) 2019 Microsoft Corporation, Daan Leijen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for The LLVM Project
+-----------------------------------
+
+Copyright 2019 LLVM Project
+
+Licensed under the Apache License, Version 2.0 (the "License") with LLVM Exceptions;
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+https://llvm.org/LICENSE.txt
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+License notice for Apple header files
+-------------------------------------
+
+Copyright (c) 1980, 1986, 1993
+ The Regents of the University of California. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement:
+ This product includes software developed by the University of
+ California, Berkeley and its contributors.
+4. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+License notice for JavaScript queues
+-------------------------------------
+
+CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER.
+
+Statement of Purpose
+The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
+Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
+For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
+the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
+moral rights retained by the original author(s) and/or performer(s);
+publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
+rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
+rights protecting the extraction, dissemination, use and reuse of data in a Work;
+database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
+other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
+2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
+3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
+4. Limitations and Disclaimers.
+a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
+b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
+c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
+d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
+
+
+License notice for FastFloat algorithm
+-------------------------------------
+MIT License
+Copyright (c) 2021 csFastFloat authors
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for MsQuic
+--------------------------------------
+
+Copyright (c) Microsoft Corporation.
+Licensed under the MIT License.
+
+Available at
+https://github.com/microsoft/msquic/blob/main/LICENSE
+
+License notice for m-ou-se/floatconv
+-------------------------------
+
+Copyright (c) 2020 Mara Bos
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for code from The Practice of Programming
+-------------------------------
+
+Copyright (C) 1999 Lucent Technologies
+
+Excerpted from 'The Practice of Programming
+by Brian W. Kernighan and Rob Pike
+
+You may use this code for any purpose, as long as you leave the copyright notice and book citation attached.
+
+Notice for Euclidean Affine Functions and Applications to Calendar
+Algorithms
+-------------------------------
+
+Aspects of Date/Time processing based on algorithm described in "Euclidean Affine Functions and Applications to Calendar
+Algorithms", Cassio Neri and Lorenz Schneider. https://arxiv.org/pdf/2102.06959.pdf
+
+License notice for amd/aocl-libm-ose
+-------------------------------
+
+Copyright (C) 2008-2020 Advanced Micro Devices, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+3. Neither the name of the copyright holder nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+License notice for fmtlib/fmt
+-------------------------------
+
+Formatting library for C++
+
+Copyright (c) 2012 - present, Victor Zverovich
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License for Jb Evain
+---------------------
+
+Copyright (c) 2006 Jb Evain (jbevain@gmail.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--- Optional exception to the license ---
+
+As an exception, if, as a result of your compiling your source code, portions
+of this Software are embedded into a machine-executable object form of such
+source code, you may redistribute such embedded portions in such object form
+without including the above copyright and permission notices.
+
+
+License for MurmurHash3
+--------------------------------------
+
+https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
+
+MurmurHash3 was written by Austin Appleby, and is placed in the public
+domain. The author hereby disclaims copyright to this source
+
+License for Fast CRC Computation
+--------------------------------------
+
+https://github.com/intel/isa-l/blob/33a2d9484595c2d6516c920ce39a694c144ddf69/crc/crc32_ieee_by4.asm
+https://github.com/intel/isa-l/blob/33a2d9484595c2d6516c920ce39a694c144ddf69/crc/crc64_ecma_norm_by8.asm
+
+Copyright(c) 2011-2015 Intel Corporation All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Intel Corporation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License for C# Implementation of Fast CRC Computation
+-----------------------------------------------------
+
+https://github.com/SixLabors/ImageSharp/blob/f4f689ce67ecbcc35cebddba5aacb603e6d1068a/src/ImageSharp/Formats/Png/Zlib/Crc32.cs
+
+Copyright (c) Six Labors.
+Licensed under the Apache License, Version 2.0.
+
+Available at
+https://github.com/SixLabors/ImageSharp/blob/f4f689ce67ecbcc35cebddba5aacb603e6d1068a/LICENSE
diff --git a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/buildTransitive/net461/System.IO.Pipelines.targets b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/buildTransitive/net461/System.IO.Pipelines.targets
index 4fac1ab..c430832 100644
--- a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/buildTransitive/net461/System.IO.Pipelines.targets
+++ b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/buildTransitive/net461/System.IO.Pipelines.targets
@@ -1,6 +1,6 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/buildTransitive/netcoreapp2.0/System.IO.Pipelines.targets b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/buildTransitive/netcoreapp2.0/System.IO.Pipelines.targets
index 7040963..f4203a2 100644
--- a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/buildTransitive/netcoreapp2.0/System.IO.Pipelines.targets
+++ b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/buildTransitive/netcoreapp2.0/System.IO.Pipelines.targets
@@ -1,6 +1,6 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/lib/netstandard2.0/System.IO.Pipelines.xml b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/lib/netstandard2.0/System.IO.Pipelines.xml
index 6d1e6c1..cf97876 100644
--- a/unity/Assets/Packages/System.IO.Pipelines.8.0.0/lib/netstandard2.0/System.IO.Pipelines.xml
+++ b/unity/Assets/Packages/System.IO.Pipelines.8.0.0/lib/netstandard2.0/System.IO.Pipelines.xml
@@ -1,382 +1,382 @@
-
-
-
- System.IO.Pipelines
-
-
-
- Result returned by call.
-
-
- Initializes a new instance of struct setting the and flags.
-
- to indicate the current operation that produced this was canceled by ; otherwise, .
-
- to indicate the reader is no longer reading data written to the .
-
-
- Gets a value that indicates whether the current operation was canceled by .
-
- if the current operation was canceled by ; otherwise, .
-
-
- Gets a value that indicates the reader is no longer reading data written to the .
-
- if the reader is no longer reading data written to the ; otherwise, .
-
-
- Defines a class that provides a duplex pipe from which data can be read from and written to.
-
-
- Gets the half of the duplex pipe.
-
-
- Gets the half of the duplex pipe.
-
-
- The default and implementation.
-
-
- Initializes a new instance of the class using as options.
-
-
- Initializes a new instance of the class with the specified options.
- The set of options for this pipe.
-
-
- Resets the pipe.
-
-
- Gets the for this pipe.
- A instance for this pipe.
-
-
- Gets the for this pipe.
- A instance for this pipe.
-
-
- Represents a set of options.
-
-
- Initializes a new instance of the class with the specified parameters.
- The pool of memory blocks to be used for buffer management.
- The to be used to execute callbacks and async continuations.
- The used to execute callbacks and async continuations.
- The number of bytes in the before starts blocking. A value of zero prevents from ever blocking, effectively making the number of bytes in the unlimited.
- The number of bytes in the when stops blocking.
- The minimum size of the segment requested from .
-
- if asynchronous continuations should be executed on the they were captured on; otherwise. This takes precedence over the schedulers specified in and .
-
-
- Gets the default instance of .
- A object initialized with default parameters.
-
-
- Gets the minimum size of the segment requested from the .
- The minimum size of the segment requested from the .
-
-
- Gets the number of bytes in the when starts blocking. A value of zero prevents from ever blocking, effectively making the number of bytes in the unlimited.
- The number of bytes in the when starts blocking.
-
-
- Gets the object used for buffer management.
- A pool of memory blocks used for buffer management.
-
-
- Gets the used to execute callbacks and async continuations.
- A that is used to execute callbacks and async continuations.
-
-
- Gets the number of bytes in the when stops blocking.
- The number of bytes in the when stops blocking.
-
-
- Gets a value that determines if asynchronous callbacks and continuations should be executed on the they were captured on. This takes precedence over the schedulers specified in and .
-
- if asynchronous callbacks and continuations should be executed on the they were captured on; otherwise, .
-
-
- Gets the used to execute callbacks and async continuations.
- A object used to execute callbacks and async continuations.
-
-
- Defines a class that provides access to a read side of pipe.
-
-
- Initializes a new instance of the class.
-
-
- Moves forward the pipeline's read cursor to after the consumed data, marking the data as processed.
- Marks the extent of the data that has been successfully processed.
-
-
- Moves forward the pipeline's read cursor to after the consumed data, marking the data as processed, read and examined.
- Marks the extent of the data that has been successfully processed.
- Marks the extent of the data that has been read and examined.
-
-
- Returns a representation of the .
- An optional flag that indicates whether disposing the returned leaves open ( ) or completes ( ).
- A stream that represents the .
-
-
- Cancels the pending operation without causing it to throw and without completing the . If there is no pending operation, this cancels the next operation.
-
-
- Signals to the producer that the consumer is done reading.
- Optional indicating a failure that's causing the pipeline to complete.
-
-
- Marks the current pipe reader instance as being complete, meaning no more data will be read from it.
- An optional exception that indicates the failure that caused the reader to complete.
- A value task that represents the asynchronous complete operation.
-
-
- Asynchronously reads the bytes from the and writes them to the specified , using a specified buffer size and cancellation token.
- The pipe writer to which the contents of the current stream will be copied.
- The token to monitor for cancellation requests. The default value is .
- A task that represents the asynchronous copy operation.
-
-
- Asynchronously reads the bytes from the and writes them to the specified stream, using a specified cancellation token.
- The stream to which the contents of the current stream will be copied.
- The token to monitor for cancellation requests. The default value is .
- A task that represents the asynchronous copy operation.
-
-
- Creates a wrapping the specified .
- The sequence to wrap.
- A that wraps the .
-
-
- Creates a wrapping the specified .
- The stream that the pipe reader will wrap.
- The options to configure the pipe reader.
- A that wraps the .
-
-
- Registers a callback that executes when the side of the pipe is completed.
- The callback to register.
- The state object to pass to when it's invoked.
-
-
- Asynchronously reads a sequence of bytes from the current .
- The token to monitor for cancellation requests. The default value is .
- A representing the asynchronous read operation.
-
-
- Asynchronously reads a sequence of bytes from the current .
- The minimum length that needs to be buffered in order for the call to return.
- The token to monitor for cancellation requests. The default value is .
- A representing the asynchronous read operation.
-
-
- Asynchronously reads a sequence of bytes from the current .
- The minimum length that needs to be buffered in order for the call to return.
- The token to monitor for cancellation requests. The default value is .
- A representing the asynchronous read operation.
-
-
- Attempts to synchronously read data the .
- When this method returns , this value is set to a instance that represents the result of the read call; otherwise, this value is set to .
-
- if data was available, or if the call was canceled or the writer was completed; otherwise, .
-
-
- Abstraction for running and callbacks and continuations.
-
-
- Initializes new a instance.
-
-
- Requests to be run on scheduler with being passed in.
- The single-parameter action delegate to schedule.
- The parameter to pass to the delegate.
-
-
- The implementation that runs callbacks inline.
- A instance that runs callbacks inline.
-
-
- The implementation that queues callbacks to the thread pool.
- A instance that queues callbacks to the thread pool.
-
-
- Defines a class that provides a pipeline to which data can be written.
-
-
- Initializes a new instance of the class.
-
-
- Notifies the that bytes were written to the output or . You must request a new buffer after calling to continue writing more data; you cannot write to a previously acquired buffer.
- The number of bytes written to the or .
-
-
- Returns a representation of the .
- An optional flag that indicates whether disposing the returned leaves open ( ) or completes ( ).
- A stream that represents the .
-
-
- Cancels the pending or operation without causing the operation to throw and without completing the . If there is no pending operation, this cancels the next operation.
-
-
- Marks the as being complete, meaning no more items will be written to it.
- Optional indicating a failure that's causing the pipeline to complete.
-
-
- Marks the current pipe writer instance as being complete, meaning no more data will be written to it.
- An optional exception that indicates the failure that caused the pipeline to complete.
- A value task that represents the asynchronous complete operation.
-
-
- Asynchronously reads the bytes from the specified stream and writes them to the .
- The stream from which the contents will be copied.
- The token to monitor for cancellation requests. The default value is .
- A task that represents the asynchronous copy operation.
-
-
- Creates a wrapping the specified .
- The stream that the pipe writer will wrap.
- The options to configure the pipe writer.
- A that wraps the .
-
-
- Makes bytes written available to and runs continuation.
- The token to monitor for cancellation requests. The default value is .
- A task that represents and wraps the asynchronous flush operation.
-
-
- Returns a to write to that is at least the requested size, as specified by the parameter.
- The minimum length of the returned . If 0, a non-empty memory buffer of arbitrary size is returned.
- The requested buffer size is not available.
- A memory buffer of at least bytes. If is 0, returns a non-empty buffer of arbitrary size.
-
-
- Returns a to write to that is at least the requested size, as specified by the parameter.
- The minimum length of the returned . If 0, a non-empty buffer of arbitrary size is returned.
- The requested buffer size is not available.
- A buffer of at least bytes. If is 0, returns a non-empty buffer of arbitrary size.
-
-
- Registers a callback that executes when the side of the pipe is completed.
- The callback to register.
- The state object to pass to when it's invoked.
-
-
- Writes the specified byte memory range to the pipe and makes data accessible to the .
- The read-only byte memory region to write.
- The token to monitor for cancellation requests. The default value is .
- A task that represents the asynchronous write operation, and wraps the flush asynchronous operation.
-
-
- Gets a value that indicates whether the current supports reporting the count of unflushed bytes.
-
- If a class derived from does not support getting the unflushed bytes, calls to throw .
-
-
- When overridden in a derived class, gets the count of unflushed bytes within the current writer.
- The does not support getting the unflushed byte count.
-
-
- Represents the result of a call.
-
-
- Creates a new instance of setting and flags.
- The read-only sequence containing the bytes of data that were read in the call.
- A flag that indicates if the operation that produced this was canceled by .
- A flag that indicates whether the end of the data stream has been reached.
-
-
- Gets the that was read.
- A read-only sequence containing the bytes of data that were read in the call.
-
-
- Gets a value that indicates whether the current operation was canceled by .
-
- if the operation that produced this was canceled by ; otherwise, .
-
-
- Gets a value that indicates whether the end of the data stream has been reached.
-
- if the end of the data stream has been reached; otherwise, .
-
-
- Provides extension methods for that support read and write operations directly into pipes.
-
-
- Asynchronously reads the bytes from the and writes them to the specified , using a cancellation token.
- The stream from which the contents of the current stream will be copied.
- The writer to which the contents of the source stream will be copied.
- The token to monitor for cancellation requests. The default value is .
- A task that represents the asynchronous copy operation.
-
-
- Represents a set of options for controlling the creation of the .
-
-
- Initializes a instance, optionally specifying a memory pool, a minimum buffer size, a minimum read size, and whether the underlying stream should be left open after the completes.
- The memory pool to use when allocating memory. The default value is .
- The minimum buffer size to use when renting memory from the . The default value is 4096.
- The threshold of remaining bytes in the buffer before a new buffer is allocated. The default value is 1024.
-
- to leave the underlying stream open after the completes; to close it. The default is .
-
-
- Initializes a instance, optionally specifying a memory pool, a minimum buffer size, a minimum read size, and whether the underlying stream should be left open after the completes.
- The memory pool to use when allocating memory. The default value is .
- The minimum buffer size to use when renting memory from the . The default value is 4096.
- The threshold of remaining bytes in the buffer before a new buffer is allocated. The default value is 1024.
-
- to leave the underlying stream open after the completes; to close it. The default is .
-
- if reads with an empty buffer should be issued to the underlying stream before allocating memory; otherwise, .
-
-
- Gets the minimum buffer size to use when renting memory from the .
- The buffer size.
-
-
- Gets the value that indicates if the underlying stream should be left open after the completes.
-
- if the underlying stream should be left open after the completes; otherwise, .
-
-
- Gets the threshold of remaining bytes in the buffer before a new buffer is allocated.
- The minimum read size.
-
-
- Gets the to use when allocating memory.
- A memory pool instance.
-
-
- Gets the value that indicates if reads with an empty buffer should be issued to the underlying stream, in order to wait for data to arrive before allocating memory.
-
- if reads with an empty buffer should be issued to the underlying stream before allocating memory; otherwise, .
-
-
- Represents a set of options for controlling the creation of the .
-
-
- Initializes a instance, optionally specifying a memory pool, a minimum buffer size, and whether the underlying stream should be left open after the completes.
- The memory pool to use when allocating memory. The default value is .
- The minimum buffer size to use when renting memory from the . The default value is 4096.
-
- to leave the underlying stream open after the completes; to close it. The default is .
-
-
- Gets the value that indicates if the underlying stream should be left open after the completes.
-
- if the underlying stream should be left open after the completes; otherwise, .
-
-
- Gets the minimum buffer size to use when renting memory from the .
- An integer representing the minimum buffer size.
-
-
- Gets the to use when allocating memory.
- A memory pool instance.
-
-
+
+
+
+ System.IO.Pipelines
+
+
+
+ Result returned by call.
+
+
+ Initializes a new instance of struct setting the and flags.
+
+ to indicate the current operation that produced this was canceled by ; otherwise, .
+
+ to indicate the reader is no longer reading data written to the .
+
+
+ Gets a value that indicates whether the current operation was canceled by .
+
+ if the current operation was canceled by ; otherwise, .
+
+
+ Gets a value that indicates the reader is no longer reading data written to the .
+
+ if the reader is no longer reading data written to the ; otherwise, .
+
+
+ Defines a class that provides a duplex pipe from which data can be read from and written to.
+
+
+ Gets the half of the duplex pipe.
+
+
+ Gets the half of the duplex pipe.
+
+
+ The default and implementation.
+
+
+ Initializes a new instance of the class using as options.
+
+
+ Initializes a new instance of the class with the specified options.
+ The set of options for this pipe.
+
+
+ Resets the pipe.
+
+
+ Gets the for this pipe.
+ A instance for this pipe.
+
+
+ Gets the for this pipe.
+ A instance for this pipe.
+
+
+ Represents a set of options.
+
+
+ Initializes a new instance of the class with the specified parameters.
+ The pool of memory blocks to be used for buffer management.
+ The to be used to execute callbacks and async continuations.
+ The used to execute callbacks and async continuations.
+ The number of bytes in the before starts blocking. A value of zero prevents from ever blocking, effectively making the number of bytes in the unlimited.
+ The number of bytes in the when stops blocking.
+ The minimum size of the segment requested from .
+
+ if asynchronous continuations should be executed on the they were captured on; otherwise. This takes precedence over the schedulers specified in and .
+
+
+ Gets the default instance of .
+ A object initialized with default parameters.
+
+
+ Gets the minimum size of the segment requested from the .
+ The minimum size of the segment requested from the .
+
+
+ Gets the number of bytes in the when starts blocking. A value of zero prevents from ever blocking, effectively making the number of bytes in the unlimited.
+ The number of bytes in the when starts blocking.
+
+
+ Gets the object used for buffer management.
+ A pool of memory blocks used for buffer management.
+
+
+ Gets the used to execute callbacks and async continuations.
+ A that is used to execute callbacks and async continuations.
+
+
+ Gets the number of bytes in the when stops blocking.
+ The number of bytes in the when stops blocking.
+
+
+ Gets a value that determines if asynchronous callbacks and continuations should be executed on the they were captured on. This takes precedence over the schedulers specified in and .
+
+ if asynchronous callbacks and continuations should be executed on the they were captured on; otherwise, .
+
+
+ Gets the used to execute callbacks and async continuations.
+ A object used to execute callbacks and async continuations.
+
+
+ Defines a class that provides access to a read side of pipe.
+
+
+ Initializes a new instance of the class.
+
+
+ Moves forward the pipeline's read cursor to after the consumed data, marking the data as processed.
+ Marks the extent of the data that has been successfully processed.
+
+
+ Moves forward the pipeline's read cursor to after the consumed data, marking the data as processed, read and examined.
+ Marks the extent of the data that has been successfully processed.
+ Marks the extent of the data that has been read and examined.
+
+
+ Returns a representation of the .
+ An optional flag that indicates whether disposing the returned leaves open ( ) or completes ( ).
+ A stream that represents the .
+
+
+ Cancels the pending operation without causing it to throw and without completing the . If there is no pending operation, this cancels the next operation.
+
+
+ Signals to the producer that the consumer is done reading.
+ Optional indicating a failure that's causing the pipeline to complete.
+
+
+ Marks the current pipe reader instance as being complete, meaning no more data will be read from it.
+ An optional exception that indicates the failure that caused the reader to complete.
+ A value task that represents the asynchronous complete operation.
+
+
+ Asynchronously reads the bytes from the and writes them to the specified , using a specified buffer size and cancellation token.
+ The pipe writer to which the contents of the current stream will be copied.
+ The token to monitor for cancellation requests. The default value is .
+ A task that represents the asynchronous copy operation.
+
+
+ Asynchronously reads the bytes from the and writes them to the specified stream, using a specified cancellation token.
+ The stream to which the contents of the current stream will be copied.
+ The token to monitor for cancellation requests. The default value is .
+ A task that represents the asynchronous copy operation.
+
+
+ Creates a wrapping the specified .
+ The sequence to wrap.
+ A that wraps the .
+
+
+ Creates a wrapping the specified .
+ The stream that the pipe reader will wrap.
+ The options to configure the pipe reader.
+ A that wraps the .
+
+
+ Registers a callback that executes when the side of the pipe is completed.
+ The callback to register.
+ The state object to pass to when it's invoked.
+
+
+ Asynchronously reads a sequence of bytes from the current .
+ The token to monitor for cancellation requests. The default value is .
+ A representing the asynchronous read operation.
+
+
+ Asynchronously reads a sequence of bytes from the current .
+ The minimum length that needs to be buffered in order for the call to return.
+ The token to monitor for cancellation requests. The default value is .
+ A representing the asynchronous read operation.
+
+
+ Asynchronously reads a sequence of bytes from the current .
+ The minimum length that needs to be buffered in order for the call to return.
+ The token to monitor for cancellation requests. The default value is .
+ A representing the asynchronous read operation.
+
+
+ Attempts to synchronously read data the .
+ When this method returns , this value is set to a instance that represents the result of the read call; otherwise, this value is set to .
+
+ if data was available, or if the call was canceled or the writer was completed; otherwise, .
+
+
+ Abstraction for running and callbacks and continuations.
+
+
+ Initializes new a instance.
+
+
+ Requests to be run on scheduler with being passed in.
+ The single-parameter action delegate to schedule.
+ The parameter to pass to the delegate.
+
+
+ The implementation that runs callbacks inline.
+ A instance that runs callbacks inline.
+
+
+ The implementation that queues callbacks to the thread pool.
+ A instance that queues callbacks to the thread pool.
+
+
+ Defines a class that provides a pipeline to which data can be written.
+
+
+ Initializes a new instance of the class.
+
+
+ Notifies the that bytes were written to the output or . You must request a new buffer after calling to continue writing more data; you cannot write to a previously acquired buffer.
+ The number of bytes written to the or .
+
+
+ Returns a representation of the .
+ An optional flag that indicates whether disposing the returned leaves open ( ) or completes ( ).
+ A stream that represents the .
+
+
+ Cancels the pending or operation without causing the operation to throw and without completing the . If there is no pending operation, this cancels the next operation.
+
+
+ Marks the as being complete, meaning no more items will be written to it.
+ Optional indicating a failure that's causing the pipeline to complete.
+
+
+ Marks the current pipe writer instance as being complete, meaning no more data will be written to it.
+ An optional exception that indicates the failure that caused the pipeline to complete.
+ A value task that represents the asynchronous complete operation.
+
+
+ Asynchronously reads the bytes from the specified stream and writes them to the .
+ The stream from which the contents will be copied.
+ The token to monitor for cancellation requests. The default value is .
+ A task that represents the asynchronous copy operation.
+
+
+ Creates a wrapping the specified .
+ The stream that the pipe writer will wrap.
+ The options to configure the pipe writer.
+ A that wraps the .
+
+
+ Makes bytes written available to and runs continuation.
+ The token to monitor for cancellation requests. The default value is .
+ A task that represents and wraps the asynchronous flush operation.
+
+
+ Returns a to write to that is at least the requested size, as specified by the parameter.
+ The minimum length of the returned . If 0, a non-empty memory buffer of arbitrary size is returned.
+ The requested buffer size is not available.
+ A memory buffer of at least bytes. If is 0, returns a non-empty buffer of arbitrary size.
+
+
+ Returns a to write to that is at least the requested size, as specified by the parameter.
+ The minimum length of the returned . If 0, a non-empty buffer of arbitrary size is returned.
+ The requested buffer size is not available.
+ A buffer of at least bytes. If is 0, returns a non-empty buffer of arbitrary size.
+
+
+ Registers a callback that executes when the side of the pipe is completed.
+ The callback to register.
+ The state object to pass to when it's invoked.
+
+
+ Writes the specified byte memory range to the pipe and makes data accessible to the .
+ The read-only byte memory region to write.
+ The token to monitor for cancellation requests. The default value is .
+ A task that represents the asynchronous write operation, and wraps the flush asynchronous operation.
+
+
+ Gets a value that indicates whether the current supports reporting the count of unflushed bytes.
+
+ If a class derived from does not support getting the unflushed bytes, calls to throw .
+
+
+ When overridden in a derived class, gets the count of unflushed bytes within the current writer.
+ The does not support getting the unflushed byte count.
+
+
+ Represents the result of a call.
+
+
+ Creates a new instance of setting and flags.
+ The read-only sequence containing the bytes of data that were read in the call.
+ A flag that indicates if the operation that produced this was canceled by .
+ A flag that indicates whether the end of the data stream has been reached.
+
+
+ Gets the that was read.
+ A read-only sequence containing the bytes of data that were read in the call.
+
+
+ Gets a value that indicates whether the current operation was canceled by .
+
+ if the operation that produced this was canceled by ; otherwise, .
+
+
+ Gets a value that indicates whether the end of the data stream has been reached.
+
+ if the end of the data stream has been reached; otherwise, .
+
+
+ Provides extension methods for that support read and write operations directly into pipes.
+
+
+ Asynchronously reads the bytes from the and writes them to the specified , using a cancellation token.
+ The stream from which the contents of the current stream will be copied.
+ The writer to which the contents of the source stream will be copied.
+ The token to monitor for cancellation requests. The default value is .
+ A task that represents the asynchronous copy operation.
+
+
+ Represents a set of options for controlling the creation of the .
+
+
+ Initializes a instance, optionally specifying a memory pool, a minimum buffer size, a minimum read size, and whether the underlying stream should be left open after the completes.
+ The memory pool to use when allocating memory. The default value is .
+ The minimum buffer size to use when renting memory from the . The default value is 4096.
+ The threshold of remaining bytes in the buffer before a new buffer is allocated. The default value is 1024.
+
+ to leave the underlying stream open after the completes; to close it. The default is .
+
+
+ Initializes a instance, optionally specifying a memory pool, a minimum buffer size, a minimum read size, and whether the underlying stream should be left open after the completes.
+ The memory pool to use when allocating memory. The default value is .
+ The minimum buffer size to use when renting memory from the . The default value is 4096.
+ The threshold of remaining bytes in the buffer before a new buffer is allocated. The default value is 1024.
+
+ to leave the underlying stream open after the completes; to close it. The default is .
+
+ if reads with an empty buffer should be issued to the underlying stream before allocating memory; otherwise, .
+
+
+ Gets the minimum buffer size to use when renting memory from the .
+ The buffer size.
+
+
+ Gets the value that indicates if the underlying stream should be left open after the completes.
+
+ if the underlying stream should be left open after the completes; otherwise, .
+
+
+ Gets the threshold of remaining bytes in the buffer before a new buffer is allocated.
+ The minimum read size.
+
+
+ Gets the to use when allocating memory.
+ A memory pool instance.
+
+
+ Gets the value that indicates if reads with an empty buffer should be issued to the underlying stream, in order to wait for data to arrive before allocating memory.
+
+ if reads with an empty buffer should be issued to the underlying stream before allocating memory; otherwise, .
+
+
+ Represents a set of options for controlling the creation of the .
+
+
+ Initializes a instance, optionally specifying a memory pool, a minimum buffer size, and whether the underlying stream should be left open after the completes.
+ The memory pool to use when allocating memory. The default value is .
+ The minimum buffer size to use when renting memory from the . The default value is 4096.
+
+ to leave the underlying stream open after the completes; to close it. The default is .
+
+
+ Gets the value that indicates if the underlying stream should be left open after the completes.
+
+ if the underlying stream should be left open after the completes; otherwise, .
+
+
+ Gets the minimum buffer size to use when renting memory from the .
+ An integer representing the minimum buffer size.
+
+
+ Gets the to use when allocating memory.
+ A memory pool instance.
+
+
\ No newline at end of file
diff --git a/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/LICENSE.TXT b/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/LICENSE.TXT
index fa3121d..984713a 100644
--- a/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/LICENSE.TXT
+++ b/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/LICENSE.TXT
@@ -1,23 +1,23 @@
-The MIT License (MIT)
-
-Copyright (c) .NET Foundation and Contributors
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+The MIT License (MIT)
+
+Copyright (c) .NET Foundation and Contributors
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/System.Runtime.CompilerServices.Unsafe.nuspec b/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/System.Runtime.CompilerServices.Unsafe.nuspec
index b25bb58..d6590a9 100644
--- a/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/System.Runtime.CompilerServices.Unsafe.nuspec
+++ b/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/System.Runtime.CompilerServices.Unsafe.nuspec
@@ -1,29 +1,29 @@
-
-
-
- System.Runtime.CompilerServices.Unsafe
- 6.0.0
- Microsoft
- MIT
- https://licenses.nuget.org/MIT
- Icon.png
- https://dot.net/
- Provides the System.Runtime.CompilerServices.Unsafe class, which provides generic, low-level functionality for manipulating pointers.
-
-Commonly Used Types:
-System.Runtime.CompilerServices.Unsafe
- https://go.microsoft.com/fwlink/?LinkID=799421
- © Microsoft Corporation. All rights reserved.
- true
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ System.Runtime.CompilerServices.Unsafe
+ 6.0.0
+ Microsoft
+ MIT
+ https://licenses.nuget.org/MIT
+ Icon.png
+ https://dot.net/
+ Provides the System.Runtime.CompilerServices.Unsafe class, which provides generic, low-level functionality for manipulating pointers.
+
+Commonly Used Types:
+System.Runtime.CompilerServices.Unsafe
+ https://go.microsoft.com/fwlink/?LinkID=799421
+ © Microsoft Corporation. All rights reserved.
+ true
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/THIRD-PARTY-NOTICES.TXT b/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/THIRD-PARTY-NOTICES.TXT
index 1fe4ad6..89c59b2 100644
--- a/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/THIRD-PARTY-NOTICES.TXT
+++ b/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/THIRD-PARTY-NOTICES.TXT
@@ -1,939 +1,939 @@
-.NET Runtime uses third-party libraries or other resources that may be
-distributed under licenses different than the .NET Runtime software.
-
-In the event that we accidentally failed to list a required notice, please
-bring it to our attention. Post an issue or email us:
-
- dotnet@microsoft.com
-
-The attached notices are provided for information only.
-
-License notice for ASP.NET
--------------------------------
-
-Copyright (c) .NET Foundation. All rights reserved.
-Licensed under the Apache License, Version 2.0.
-
-Available at
-https://github.com/dotnet/aspnetcore/blob/main/LICENSE.txt
-
-License notice for Slicing-by-8
--------------------------------
-
-http://sourceforge.net/projects/slicing-by-8/
-
-Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
-
-
-This software program is licensed subject to the BSD License, available at
-http://www.opensource.org/licenses/bsd-license.html.
-
-
-License notice for Unicode data
--------------------------------
-
-https://www.unicode.org/license.html
-
-Copyright © 1991-2020 Unicode, Inc. All rights reserved.
-Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Unicode data files and any associated documentation
-(the "Data Files") or Unicode software and any associated documentation
-(the "Software") to deal in the Data Files or Software
-without restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, and/or sell copies of
-the Data Files or Software, and to permit persons to whom the Data Files
-or Software are furnished to do so, provided that either
-(a) this copyright and permission notice appear with all copies
-of the Data Files or Software, or
-(b) this copyright and permission notice appear in associated
-Documentation.
-
-THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT OF THIRD PARTY RIGHTS.
-IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
-NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THE DATA FILES OR SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder
-shall not be used in advertising or otherwise to promote the sale,
-use or other dealings in these Data Files or Software without prior
-written authorization of the copyright holder.
-
-License notice for Zlib
------------------------
-
-https://github.com/madler/zlib
-http://zlib.net/zlib_license.html
-
-/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.11, January 15th, 2017
-
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
-*/
-
-License notice for Mono
--------------------------------
-
-http://www.mono-project.com/docs/about-mono/
-
-Copyright (c) .NET Foundation Contributors
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the Software), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for International Organization for Standardization
------------------------------------------------------------------
-
-Portions (C) International Organization for Standardization 1986:
- Permission to copy in any form is granted for use with
- conforming SGML systems and applications as defined in
- ISO 8879, provided this notice is included in all copies.
-
-License notice for Intel
-------------------------
-
-"Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Xamarin and Novell
--------------------------------------
-
-Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-Copyright (c) 2011 Novell, Inc (http://www.novell.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-Third party notice for W3C
---------------------------
-
-"W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE
-Status: This license takes effect 13 May, 2015.
-This work is being provided by the copyright holders under the following license.
-License
-By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
-Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
-The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
-Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
-Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)."
-Disclaimers
-THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
-The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders."
-
-License notice for Bit Twiddling Hacks
---------------------------------------
-
-Bit Twiddling Hacks
-
-By Sean Eron Anderson
-seander@cs.stanford.edu
-
-Individually, the code snippets here are in the public domain (unless otherwise
-noted) — feel free to use them however you please. The aggregate collection and
-descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are
-distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and
-without even the implied warranty of merchantability or fitness for a particular
-purpose.
-
-License notice for Brotli
---------------------------------------
-
-Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-compress_fragment.c:
-Copyright (c) 2011, Google Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-decode_fuzzer.c:
-Copyright (c) 2015 The Chromium Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-
-License notice for Json.NET
--------------------------------
-
-https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md
-
-The MIT License (MIT)
-
-Copyright (c) 2007 James Newton-King
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for vectorized base64 encoding / decoding
---------------------------------------------------------
-
-Copyright (c) 2005-2007, Nick Galbreath
-Copyright (c) 2013-2017, Alfred Klomp
-Copyright (c) 2015-2017, Wojciech Mula
-Copyright (c) 2016-2017, Matthieu Darbois
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
-- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for RFC 3492
----------------------------
-
-The punycode implementation is based on the sample code in RFC 3492
-
-Copyright (C) The Internet Society (2003). All Rights Reserved.
-
-This document and translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it
-or assist in its implementation may be prepared, copied, published
-and distributed, in whole or in part, without restriction of any
-kind, provided that the above copyright notice and this paragraph are
-included on all such copies and derivative works. However, this
-document itself may not be modified in any way, such as by removing
-the copyright notice or references to the Internet Society or other
-Internet organizations, except as needed for the purpose of
-developing Internet standards in which case the procedures for
-copyrights defined in the Internet Standards process must be
-followed, or as required to translate it into languages other than
-English.
-
-The limited permissions granted above are perpetual and will not be
-revoked by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an
-"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
-TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
-BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
-HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-License notice for Algorithm from Internet Draft document "UUIDs and GUIDs"
----------------------------------------------------------------------------
-
-Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
-Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
-Digital Equipment Corporation, Maynard, Mass.
-To anyone who acknowledges that this file is provided "AS IS"
-without any express or implied warranty: permission to use, copy,
-modify, and distribute this file for any purpose is hereby
-granted without fee, provided that the above copyright notices and
-this notice appears in all source code copies, and that none of
-the names of Open Software Foundation, Inc., Hewlett-Packard
-Company, or Digital Equipment Corporation be used in advertising
-or publicity pertaining to distribution of the software without
-specific, written prior permission. Neither Open Software
-Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment
-Corporation makes any representations about the suitability of
-this software for any purpose.
-
-Copyright(C) The Internet Society 1997. All Rights Reserved.
-
-This document and translations of it may be copied and furnished to others,
-and derivative works that comment on or otherwise explain it or assist in
-its implementation may be prepared, copied, published and distributed, in
-whole or in part, without restriction of any kind, provided that the above
-copyright notice and this paragraph are included on all such copies and
-derivative works.However, this document itself may not be modified in any
-way, such as by removing the copyright notice or references to the Internet
-Society or other Internet organizations, except as needed for the purpose of
-developing Internet standards in which case the procedures for copyrights
-defined in the Internet Standards process must be followed, or as required
-to translate it into languages other than English.
-
-The limited permissions granted above are perpetual and will not be revoked
-by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an "AS IS"
-basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
-DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
-ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
-RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
-PARTICULAR PURPOSE.
-
-License notice for Algorithm from RFC 4122 -
-A Universally Unique IDentifier (UUID) URN Namespace
-----------------------------------------------------
-
-Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
-Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
-Digital Equipment Corporation, Maynard, Mass.
-Copyright (c) 1998 Microsoft.
-To anyone who acknowledges that this file is provided "AS IS"
-without any express or implied warranty: permission to use, copy,
-modify, and distribute this file for any purpose is hereby
-granted without fee, provided that the above copyright notices and
-this notice appears in all source code copies, and that none of
-the names of Open Software Foundation, Inc., Hewlett-Packard
-Company, Microsoft, or Digital Equipment Corporation be used in
-advertising or publicity pertaining to distribution of the software
-without specific, written prior permission. Neither Open Software
-Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
-Equipment Corporation makes any representations about the
-suitability of this software for any purpose."
-
-License notice for The LLVM Compiler Infrastructure
----------------------------------------------------
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-License notice for Bob Jenkins
-------------------------------
-
-By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
-code any way you wish, private, educational, or commercial. It's free.
-
-License notice for Greg Parker
-------------------------------
-
-Greg Parker gparker@cs.stanford.edu December 2000
-This code is in the public domain and may be copied or modified without
-permission.
-
-License notice for libunwind based code
-----------------------------------------
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for Printing Floating-Point Numbers (Dragon4)
-------------------------------------------------------------
-
-/******************************************************************************
- Copyright (c) 2014 Ryan Juckett
- http://www.ryanjuckett.com/
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
- 3. This notice may not be removed or altered from any source
- distribution.
-******************************************************************************/
-
-License notice for Printing Floating-point Numbers (Grisu3)
------------------------------------------------------------
-
-Copyright 2012 the V8 project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for xxHash
--------------------------
-
-xxHash Library
-Copyright (c) 2012-2014, Yann Collet
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Berkeley SoftFloat Release 3e
-------------------------------------------------
-
-https://github.com/ucb-bar/berkeley-softfloat-3
-https://github.com/ucb-bar/berkeley-softfloat-3/blob/master/COPYING.txt
-
-License for Berkeley SoftFloat Release 3e
-
-John R. Hauser
-2018 January 20
-
-The following applies to the whole of SoftFloat Release 3e as well as to
-each source file individually.
-
-Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
-University of California. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions, and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions, and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for xoshiro RNGs
---------------------------------
-
-Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
-
-To the extent possible under law, the author has dedicated all copyright
-and related and neighboring rights to this software to the public domain
-worldwide. This software is distributed without any warranty.
-
-See .
-
-License for fastmod (https://github.com/lemire/fastmod) and ibm-fpgen (https://github.com/nigeltao/parse-number-fxx-test-data)
---------------------------------------
-
- Copyright 2018 Daniel Lemire
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-License notice for The C++ REST SDK
------------------------------------
-
-C++ REST SDK
-
-The MIT License (MIT)
-
-Copyright (c) Microsoft Corporation
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for MessagePack-CSharp
--------------------------------------
-
-MessagePack for C#
-
-MIT License
-
-Copyright (c) 2017 Yoshifumi Kawai
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for lz4net
--------------------------------------
-
-lz4net
-
-Copyright (c) 2013-2017, Milosz Krajewski
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-License notice for Nerdbank.Streams
------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) Andrew Arnott
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for RapidJSON
-----------------------------
-
-Tencent is pleased to support the open source community by making RapidJSON available.
-
-Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
-
-Licensed under the MIT License (the "License"); you may not use this file except
-in compliance with the License. You may obtain a copy of the License at
-
-http://opensource.org/licenses/MIT
-
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
-
-License notice for DirectX Math Library
----------------------------------------
-
-https://github.com/microsoft/DirectXMath/blob/master/LICENSE
-
- The MIT License (MIT)
-
-Copyright (c) 2011-2020 Microsoft Corp
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this
-software and associated documentation files (the "Software"), to deal in the Software
-without restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be included in all copies
-or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
-CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
-OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for ldap4net
----------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2018 Alexander Chermyanin
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License notice for vectorized sorting code
-------------------------------------------
-
-MIT License
-
-Copyright (c) 2020 Dan Shechter
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-License notice for musl
------------------------
-
-musl as a whole is licensed under the following standard MIT license:
-
-Copyright © 2005-2020 Rich Felker, et al.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-License notice for "Faster Unsigned Division by Constants"
-------------------------------
-
-Reference implementations of computing and using the "magic number" approach to dividing
-by constants, including codegen instructions. The unsigned division incorporates the
-"round down" optimization per ridiculous_fish.
-
-This is free and unencumbered software. Any copyright is dedicated to the Public Domain.
-
-
-License notice for mimalloc
------------------------------------
-
-MIT License
-
-Copyright (c) 2019 Microsoft Corporation, Daan Leijen
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+.NET Runtime uses third-party libraries or other resources that may be
+distributed under licenses different than the .NET Runtime software.
+
+In the event that we accidentally failed to list a required notice, please
+bring it to our attention. Post an issue or email us:
+
+ dotnet@microsoft.com
+
+The attached notices are provided for information only.
+
+License notice for ASP.NET
+-------------------------------
+
+Copyright (c) .NET Foundation. All rights reserved.
+Licensed under the Apache License, Version 2.0.
+
+Available at
+https://github.com/dotnet/aspnetcore/blob/main/LICENSE.txt
+
+License notice for Slicing-by-8
+-------------------------------
+
+http://sourceforge.net/projects/slicing-by-8/
+
+Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
+
+
+This software program is licensed subject to the BSD License, available at
+http://www.opensource.org/licenses/bsd-license.html.
+
+
+License notice for Unicode data
+-------------------------------
+
+https://www.unicode.org/license.html
+
+Copyright © 1991-2020 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+
+License notice for Zlib
+-----------------------
+
+https://github.com/madler/zlib
+http://zlib.net/zlib_license.html
+
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.11, January 15th, 2017
+
+ Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+*/
+
+License notice for Mono
+-------------------------------
+
+http://www.mono-project.com/docs/about-mono/
+
+Copyright (c) .NET Foundation Contributors
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the Software), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for International Organization for Standardization
+-----------------------------------------------------------------
+
+Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+
+License notice for Intel
+------------------------
+
+"Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Xamarin and Novell
+-------------------------------------
+
+Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Copyright (c) 2011 Novell, Inc (http://www.novell.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Third party notice for W3C
+--------------------------
+
+"W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE
+Status: This license takes effect 13 May, 2015.
+This work is being provided by the copyright holders under the following license.
+License
+By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
+Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
+The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
+Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
+Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)."
+Disclaimers
+THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
+The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders."
+
+License notice for Bit Twiddling Hacks
+--------------------------------------
+
+Bit Twiddling Hacks
+
+By Sean Eron Anderson
+seander@cs.stanford.edu
+
+Individually, the code snippets here are in the public domain (unless otherwise
+noted) — feel free to use them however you please. The aggregate collection and
+descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are
+distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and
+without even the implied warranty of merchantability or fitness for a particular
+purpose.
+
+License notice for Brotli
+--------------------------------------
+
+Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+compress_fragment.c:
+Copyright (c) 2011, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+decode_fuzzer.c:
+Copyright (c) 2015 The Chromium Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+
+License notice for Json.NET
+-------------------------------
+
+https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md
+
+The MIT License (MIT)
+
+Copyright (c) 2007 James Newton-King
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for vectorized base64 encoding / decoding
+--------------------------------------------------------
+
+Copyright (c) 2005-2007, Nick Galbreath
+Copyright (c) 2013-2017, Alfred Klomp
+Copyright (c) 2015-2017, Wojciech Mula
+Copyright (c) 2016-2017, Matthieu Darbois
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+- Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for RFC 3492
+---------------------------
+
+The punycode implementation is based on the sample code in RFC 3492
+
+Copyright (C) The Internet Society (2003). All Rights Reserved.
+
+This document and translations of it may be copied and furnished to
+others, and derivative works that comment on or otherwise explain it
+or assist in its implementation may be prepared, copied, published
+and distributed, in whole or in part, without restriction of any
+kind, provided that the above copyright notice and this paragraph are
+included on all such copies and derivative works. However, this
+document itself may not be modified in any way, such as by removing
+the copyright notice or references to the Internet Society or other
+Internet organizations, except as needed for the purpose of
+developing Internet standards in which case the procedures for
+copyrights defined in the Internet Standards process must be
+followed, or as required to translate it into languages other than
+English.
+
+The limited permissions granted above are perpetual and will not be
+revoked by the Internet Society or its successors or assigns.
+
+This document and the information contained herein is provided on an
+"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+License notice for Algorithm from Internet Draft document "UUIDs and GUIDs"
+---------------------------------------------------------------------------
+
+Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
+Digital Equipment Corporation, Maynard, Mass.
+To anyone who acknowledges that this file is provided "AS IS"
+without any express or implied warranty: permission to use, copy,
+modify, and distribute this file for any purpose is hereby
+granted without fee, provided that the above copyright notices and
+this notice appears in all source code copies, and that none of
+the names of Open Software Foundation, Inc., Hewlett-Packard
+Company, or Digital Equipment Corporation be used in advertising
+or publicity pertaining to distribution of the software without
+specific, written prior permission. Neither Open Software
+Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment
+Corporation makes any representations about the suitability of
+this software for any purpose.
+
+Copyright(C) The Internet Society 1997. All Rights Reserved.
+
+This document and translations of it may be copied and furnished to others,
+and derivative works that comment on or otherwise explain it or assist in
+its implementation may be prepared, copied, published and distributed, in
+whole or in part, without restriction of any kind, provided that the above
+copyright notice and this paragraph are included on all such copies and
+derivative works.However, this document itself may not be modified in any
+way, such as by removing the copyright notice or references to the Internet
+Society or other Internet organizations, except as needed for the purpose of
+developing Internet standards in which case the procedures for copyrights
+defined in the Internet Standards process must be followed, or as required
+to translate it into languages other than English.
+
+The limited permissions granted above are perpetual and will not be revoked
+by the Internet Society or its successors or assigns.
+
+This document and the information contained herein is provided on an "AS IS"
+basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
+DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
+RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
+PARTICULAR PURPOSE.
+
+License notice for Algorithm from RFC 4122 -
+A Universally Unique IDentifier (UUID) URN Namespace
+----------------------------------------------------
+
+Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
+Digital Equipment Corporation, Maynard, Mass.
+Copyright (c) 1998 Microsoft.
+To anyone who acknowledges that this file is provided "AS IS"
+without any express or implied warranty: permission to use, copy,
+modify, and distribute this file for any purpose is hereby
+granted without fee, provided that the above copyright notices and
+this notice appears in all source code copies, and that none of
+the names of Open Software Foundation, Inc., Hewlett-Packard
+Company, Microsoft, or Digital Equipment Corporation be used in
+advertising or publicity pertaining to distribution of the software
+without specific, written prior permission. Neither Open Software
+Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
+Equipment Corporation makes any representations about the
+suitability of this software for any purpose."
+
+License notice for The LLVM Compiler Infrastructure
+---------------------------------------------------
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+License notice for Bob Jenkins
+------------------------------
+
+By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
+code any way you wish, private, educational, or commercial. It's free.
+
+License notice for Greg Parker
+------------------------------
+
+Greg Parker gparker@cs.stanford.edu December 2000
+This code is in the public domain and may be copied or modified without
+permission.
+
+License notice for libunwind based code
+----------------------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for Printing Floating-Point Numbers (Dragon4)
+------------------------------------------------------------
+
+/******************************************************************************
+ Copyright (c) 2014 Ryan Juckett
+ http://www.ryanjuckett.com/
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+******************************************************************************/
+
+License notice for Printing Floating-point Numbers (Grisu3)
+-----------------------------------------------------------
+
+Copyright 2012 the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for xxHash
+-------------------------
+
+xxHash Library
+Copyright (c) 2012-2014, Yann Collet
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice, this
+ list of conditions and the following disclaimer in the documentation and/or
+ other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Berkeley SoftFloat Release 3e
+------------------------------------------------
+
+https://github.com/ucb-bar/berkeley-softfloat-3
+https://github.com/ucb-bar/berkeley-softfloat-3/blob/master/COPYING.txt
+
+License for Berkeley SoftFloat Release 3e
+
+John R. Hauser
+2018 January 20
+
+The following applies to the whole of SoftFloat Release 3e as well as to
+each source file individually.
+
+Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
+University of California. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions, and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for xoshiro RNGs
+--------------------------------
+
+Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
+
+To the extent possible under law, the author has dedicated all copyright
+and related and neighboring rights to this software to the public domain
+worldwide. This software is distributed without any warranty.
+
+See .
+
+License for fastmod (https://github.com/lemire/fastmod) and ibm-fpgen (https://github.com/nigeltao/parse-number-fxx-test-data)
+--------------------------------------
+
+ Copyright 2018 Daniel Lemire
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+License notice for The C++ REST SDK
+-----------------------------------
+
+C++ REST SDK
+
+The MIT License (MIT)
+
+Copyright (c) Microsoft Corporation
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for MessagePack-CSharp
+-------------------------------------
+
+MessagePack for C#
+
+MIT License
+
+Copyright (c) 2017 Yoshifumi Kawai
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for lz4net
+-------------------------------------
+
+lz4net
+
+Copyright (c) 2013-2017, Milosz Krajewski
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License notice for Nerdbank.Streams
+-----------------------------------
+
+The MIT License (MIT)
+
+Copyright (c) Andrew Arnott
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for RapidJSON
+----------------------------
+
+Tencent is pleased to support the open source community by making RapidJSON available.
+
+Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
+
+Licensed under the MIT License (the "License"); you may not use this file except
+in compliance with the License. You may obtain a copy of the License at
+
+http://opensource.org/licenses/MIT
+
+Unless required by applicable law or agreed to in writing, software distributed
+under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied. See the License for the
+specific language governing permissions and limitations under the License.
+
+License notice for DirectX Math Library
+---------------------------------------
+
+https://github.com/microsoft/DirectXMath/blob/master/LICENSE
+
+ The MIT License (MIT)
+
+Copyright (c) 2011-2020 Microsoft Corp
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be included in all copies
+or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for ldap4net
+---------------------------
+
+The MIT License (MIT)
+
+Copyright (c) 2018 Alexander Chermyanin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License notice for vectorized sorting code
+------------------------------------------
+
+MIT License
+
+Copyright (c) 2020 Dan Shechter
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+License notice for musl
+-----------------------
+
+musl as a whole is licensed under the following standard MIT license:
+
+Copyright © 2005-2020 Rich Felker, et al.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+License notice for "Faster Unsigned Division by Constants"
+------------------------------
+
+Reference implementations of computing and using the "magic number" approach to dividing
+by constants, including codegen instructions. The unsigned division incorporates the
+"round down" optimization per ridiculous_fish.
+
+This is free and unencumbered software. Any copyright is dedicated to the Public Domain.
+
+
+License notice for mimalloc
+-----------------------------------
+
+MIT License
+
+Copyright (c) 2019 Microsoft Corporation, Daan Leijen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/buildTransitive/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.targets b/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/buildTransitive/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.targets
index 3a582df..98eb1d3 100644
--- a/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/buildTransitive/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.targets
+++ b/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/buildTransitive/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.targets
@@ -1,6 +1,6 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml b/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml
index de129b8..9d79492 100644
--- a/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml
+++ b/unity/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml
@@ -1,291 +1,291 @@
-
-
-
- System.Runtime.CompilerServices.Unsafe
-
-
-
- Contains generic, low-level functionality for manipulating pointers.
-
-
- Adds an element offset to the given reference.
- The reference to add the offset to.
- The offset to add.
- The type of reference.
- A new reference that reflects the addition of offset to pointer.
-
-
- Adds an element offset to the given reference.
- The reference to add the offset to.
- The offset to add.
- The type of reference.
- A new reference that reflects the addition of offset to pointer.
-
-
- Adds an element offset to the given reference.
- The reference to add the offset to.
- The offset to add.
- The type of reference.
- A new reference that reflects the addition of offset to pointer.
-
-
- Adds an element offset to the given void pointer.
- The void pointer to add the offset to.
- The offset to add.
- The type of void pointer.
- A new void pointer that reflects the addition of offset to the specified pointer.
-
-
- Adds a byte offset to the given reference.
- The reference to add the offset to.
- The offset to add.
- The type of reference.
- A new reference that reflects the addition of byte offset to pointer.
-
-
- Adds a byte offset to the given reference.
- The reference to add the offset to.
- The offset to add.
- The type of reference.
- A new reference that reflects the addition of byte offset to pointer.
-
-
- Determines whether the specified references point to the same location.
- The first reference to compare.
- The second reference to compare.
- The type of reference.
-
- if and point to the same location; otherwise, .
-
-
- Casts the given object to the specified type.
- The object to cast.
- The type which the object will be cast to.
- The original object, casted to the given type.
-
-
- Reinterprets the given reference as a reference to a value of type .
- The reference to reinterpret.
- The type of reference to reinterpret.
- The desired type of the reference.
- A reference to a value of type .
-
-
- Returns a pointer to the given by-ref parameter.
- The object whose pointer is obtained.
- The type of object.
- A pointer to the given value.
-
-
- Reinterprets the given read-only reference as a reference.
- The read-only reference to reinterpret.
- The type of reference.
- A reference to a value of type .
-
-
- Reinterprets the given location as a reference to a value of type .
- The location of the value to reference.
- The type of the interpreted location.
- A reference to a value of type .
-
-
- Determines the byte offset from origin to target from the given references.
- The reference to origin.
- The reference to target.
- The type of reference.
- Byte offset from origin to target i.e. - .
-
-
- Copies a value of type to the given location.
- The location to copy to.
- A pointer to the value to copy.
- The type of value to copy.
-
-
- Copies a value of type to the given location.
- The location to copy to.
- A reference to the value to copy.
- The type of value to copy.
-
-
- Copies bytes from the source address to the destination address.
- The destination address to copy to.
- The source address to copy from.
- The number of bytes to copy.
-
-
- Copies bytes from the source address to the destination address.
- The destination address to copy to.
- The source address to copy from.
- The number of bytes to copy.
-
-
- Copies bytes from the source address to the destination address without assuming architecture dependent alignment of the addresses.
- The destination address to copy to.
- The source address to copy from.
- The number of bytes to copy.
-
-
- Copies bytes from the source address to the destination address without assuming architecture dependent alignment of the addresses.
- The destination address to copy to.
- The source address to copy from.
- The number of bytes to copy.
-
-
- Initializes a block of memory at the given location with a given initial value.
- The address of the start of the memory block to initialize.
- The value to initialize the block to.
- The number of bytes to initialize.
-
-
- Initializes a block of memory at the given location with a given initial value.
- The address of the start of the memory block to initialize.
- The value to initialize the block to.
- The number of bytes to initialize.
-
-
- Initializes a block of memory at the given location with a given initial value without assuming architecture dependent alignment of the address.
- The address of the start of the memory block to initialize.
- The value to initialize the block to.
- The number of bytes to initialize.
-
-
- Initializes a block of memory at the given location with a given initial value without assuming architecture dependent alignment of the address.
- The address of the start of the memory block to initialize.
- The value to initialize the block to.
- The number of bytes to initialize.
-
-
- Returns a value that indicates whether a specified reference is greater than another specified reference.
- The first value to compare.
- The second value to compare.
- The type of the reference.
-
- if is greater than ; otherwise, .
-
-
- Returns a value that indicates whether a specified reference is less than another specified reference.
- The first value to compare.
- The second value to compare.
- The type of the reference.
-
- if is less than ; otherwise, .
-
-
- Determines if a given reference to a value of type is a null reference.
- The reference to check.
- The type of the reference.
-
- if is a null reference; otherwise, .
-
-
- Returns a reference to a value of type that is a null reference.
- The type of the reference.
- A reference to a value of type that is a null reference.
-
-
- Reads a value of type from the given location.
- The location to read from.
- The type to read.
- An object of type read from the given location.
-
-
- Reads a value of type from the given location without assuming architecture dependent alignment of the addresses.
- The location to read from.
- The type to read.
- An object of type read from the given location.
-
-
- Reads a value of type from the given location without assuming architecture dependent alignment of the addresses.
- The location to read from.
- The type to read.
- An object of type read from the given location.
-
-
- Returns the size of an object of the given type parameter.
- The type of object whose size is retrieved.
- The size of an object of type .
-
-
- Bypasses definite assignment rules for a given value.
- The uninitialized object.
- The type of the uninitialized object.
-
-
- Subtracts an element offset from the given reference.
- The reference to subtract the offset from.
- The offset to subtract.
- The type of reference.
- A new reference that reflects the subtraction of offset from pointer.
-
-
- Subtracts an element offset from the given reference.
- The reference to subtract the offset from.
- The offset to subtract.
- The type of reference.
- A new reference that reflects the subtraction of offset from pointer.
-
-
- Subtracts an element offset from the given reference.
- The reference to subtract the offset from.
- The offset to subtract.
- The type of reference.
- A new reference that reflects the subraction of offset from pointer.
-
-
- Subtracts an element offset from the given void pointer.
- The void pointer to subtract the offset from.
- The offset to subtract.
- The type of the void pointer.
- A new void pointer that reflects the subtraction of offset from the specified pointer.
-
-
- Subtracts a byte offset from the given reference.
- The reference to subtract the offset from.
- The offset to subtract.
- The type of reference.
- A new reference that reflects the subtraction of byte offset from pointer.
-
-
- Subtracts a byte offset from the given reference.
- The reference to subtract the offset from.
- The offset to subtract.
- The type of reference.
- A new reference that reflects the subraction of byte offset from pointer.
-
-
- Returns a to a boxed value.
- The value to unbox.
- The type to be unboxed.
-
- is , and is a non-nullable value type.
-
- is not a boxed value type.
-
--or-
-
- is not a boxed .
-
- cannot be found.
- A to the boxed value .
-
-
- Writes a value of type to the given location.
- The location to write to.
- The value to write.
- The type of value to write.
-
-
- Writes a value of type to the given location without assuming architecture dependent alignment of the addresses.
- The location to write to.
- The value to write.
- The type of value to write.
-
-
- Writes a value of type to the given location without assuming architecture dependent alignment of the addresses.
- The location to write to.
- The value to write.
- The type of value to write.
-
-
+
+
+
+ System.Runtime.CompilerServices.Unsafe
+
+
+
+ Contains generic, low-level functionality for manipulating pointers.
+
+
+ Adds an element offset to the given reference.
+ The reference to add the offset to.
+ The offset to add.
+ The type of reference.
+ A new reference that reflects the addition of offset to pointer.
+
+
+ Adds an element offset to the given reference.
+ The reference to add the offset to.
+ The offset to add.
+ The type of reference.
+ A new reference that reflects the addition of offset to pointer.
+
+
+ Adds an element offset to the given reference.
+ The reference to add the offset to.
+ The offset to add.
+ The type of reference.
+ A new reference that reflects the addition of offset to pointer.
+
+
+ Adds an element offset to the given void pointer.
+ The void pointer to add the offset to.
+ The offset to add.
+ The type of void pointer.
+ A new void pointer that reflects the addition of offset to the specified pointer.
+
+
+ Adds a byte offset to the given reference.
+ The reference to add the offset to.
+ The offset to add.
+ The type of reference.
+ A new reference that reflects the addition of byte offset to pointer.
+
+
+ Adds a byte offset to the given reference.
+ The reference to add the offset to.
+ The offset to add.
+ The type of reference.
+ A new reference that reflects the addition of byte offset to pointer.
+
+
+ Determines whether the specified references point to the same location.
+ The first reference to compare.
+ The second reference to compare.
+ The type of reference.
+
+ if and point to the same location; otherwise, .
+
+
+ Casts the given object to the specified type.
+ The object to cast.
+ The type which the object will be cast to.
+ The original object, casted to the given type.
+
+
+ Reinterprets the given reference as a reference to a value of type .
+ The reference to reinterpret.
+ The type of reference to reinterpret.
+ The desired type of the reference.
+ A reference to a value of type .
+
+
+ Returns a pointer to the given by-ref parameter.
+ The object whose pointer is obtained.
+ The type of object.
+ A pointer to the given value.
+
+
+ Reinterprets the given read-only reference as a reference.
+ The read-only reference to reinterpret.
+ The type of reference.
+ A reference to a value of type .
+
+
+ Reinterprets the given location as a reference to a value of type .
+ The location of the value to reference.
+ The type of the interpreted location.
+ A reference to a value of type .
+
+
+ Determines the byte offset from origin to target from the given references.
+ The reference to origin.
+ The reference to target.
+ The type of reference.
+ Byte offset from origin to target i.e. - .
+
+
+ Copies a value of type to the given location.
+ The location to copy to.
+ A pointer to the value to copy.
+ The type of value to copy.
+
+
+ Copies a value of type to the given location.
+ The location to copy to.
+ A reference to the value to copy.
+ The type of value to copy.
+
+
+ Copies bytes from the source address to the destination address.
+ The destination address to copy to.
+ The source address to copy from.
+ The number of bytes to copy.
+
+
+ Copies bytes from the source address to the destination address.
+ The destination address to copy to.
+ The source address to copy from.
+ The number of bytes to copy.
+
+
+ Copies bytes from the source address to the destination address without assuming architecture dependent alignment of the addresses.
+ The destination address to copy to.
+ The source address to copy from.
+ The number of bytes to copy.
+
+
+ Copies bytes from the source address to the destination address without assuming architecture dependent alignment of the addresses.
+ The destination address to copy to.
+ The source address to copy from.
+ The number of bytes to copy.
+
+
+ Initializes a block of memory at the given location with a given initial value.
+ The address of the start of the memory block to initialize.
+ The value to initialize the block to.
+ The number of bytes to initialize.
+
+
+ Initializes a block of memory at the given location with a given initial value.
+ The address of the start of the memory block to initialize.
+ The value to initialize the block to.
+ The number of bytes to initialize.
+
+
+ Initializes a block of memory at the given location with a given initial value without assuming architecture dependent alignment of the address.
+ The address of the start of the memory block to initialize.
+ The value to initialize the block to.
+ The number of bytes to initialize.
+
+
+ Initializes a block of memory at the given location with a given initial value without assuming architecture dependent alignment of the address.
+ The address of the start of the memory block to initialize.
+ The value to initialize the block to.
+ The number of bytes to initialize.
+
+
+ Returns a value that indicates whether a specified reference is greater than another specified reference.
+ The first value to compare.
+ The second value to compare.
+ The type of the reference.
+
+ if is greater than ; otherwise, .
+
+
+ Returns a value that indicates whether a specified reference is less than another specified reference.
+ The first value to compare.
+ The second value to compare.
+ The type of the reference.
+
+ if is less than ; otherwise, .
+
+
+ Determines if a given reference to a value of type is a null reference.
+ The reference to check.
+ The type of the reference.
+
+ if is a null reference; otherwise, .
+
+
+ Returns a reference to a value of type that is a null reference.
+ The type of the reference.
+ A reference to a value of type that is a null reference.
+
+
+ Reads a value of type from the given location.
+ The location to read from.
+ The type to read.
+ An object of type read from the given location.
+
+
+ Reads a value of type from the given location without assuming architecture dependent alignment of the addresses.
+ The location to read from.
+ The type to read.
+ An object of type read from the given location.
+
+
+ Reads a value of type from the given location without assuming architecture dependent alignment of the addresses.
+ The location to read from.
+ The type to read.
+ An object of type read from the given location.
+
+
+ Returns the size of an object of the given type parameter.
+ The type of object whose size is retrieved.
+ The size of an object of type .
+
+
+ Bypasses definite assignment rules for a given value.
+ The uninitialized object.
+ The type of the uninitialized object.
+
+
+ Subtracts an element offset from the given reference.
+ The reference to subtract the offset from.
+ The offset to subtract.
+ The type of reference.
+ A new reference that reflects the subtraction of offset from pointer.
+
+
+ Subtracts an element offset from the given reference.
+ The reference to subtract the offset from.
+ The offset to subtract.
+ The type of reference.
+ A new reference that reflects the subtraction of offset from pointer.
+
+
+ Subtracts an element offset from the given reference.
+ The reference to subtract the offset from.
+ The offset to subtract.
+ The type of reference.
+ A new reference that reflects the subraction of offset from pointer.
+
+
+ Subtracts an element offset from the given void pointer.
+ The void pointer to subtract the offset from.
+ The offset to subtract.
+ The type of the void pointer.
+ A new void pointer that reflects the subtraction of offset from the specified pointer.
+
+
+ Subtracts a byte offset from the given reference.
+ The reference to subtract the offset from.
+ The offset to subtract.
+ The type of reference.
+ A new reference that reflects the subtraction of byte offset from pointer.
+
+
+ Subtracts a byte offset from the given reference.
+ The reference to subtract the offset from.
+ The offset to subtract.
+ The type of reference.
+ A new reference that reflects the subraction of byte offset from pointer.
+
+
+ Returns a to a boxed value.
+ The value to unbox.
+ The type to be unboxed.
+
+ is , and is a non-nullable value type.
+
+ is not a boxed value type.
+
+-or-
+
+ is not a boxed .
+
+ cannot be found.
+ A to the boxed value .
+
+
+ Writes a value of type to the given location.
+ The location to write to.
+ The value to write.
+ The type of value to write.
+
+
+ Writes a value of type to the given location without assuming architecture dependent alignment of the addresses.
+ The location to write to.
+ The value to write.
+ The type of value to write.
+
+
+ Writes a value of type to the given location without assuming architecture dependent alignment of the addresses.
+ The location to write to.
+ The value to write.
+ The type of value to write.
+
+
\ No newline at end of file
diff --git a/unity/Assets/Packages/UnityVoiceProcessor.meta b/unity/Assets/Packages/UnityVoiceProcessor.meta
new file mode 100644
index 0000000..6612d82
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0622701827067a849a579853b86ae847
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/Demo.meta b/unity/Assets/Packages/UnityVoiceProcessor/Demo.meta
new file mode 100644
index 0000000..9e65d34
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/Demo.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 71bf916d382a2e24ea8365582186c390
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/Demo/README.md b/unity/Assets/Packages/UnityVoiceProcessor/Demo/README.md
new file mode 100644
index 0000000..cce31cb
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/Demo/README.md
@@ -0,0 +1,22 @@
+# Unity Voice Processor Demo
+
+This is an demo app that demonstrates how to ask for user permissions and capture output from `Unity Voice Processor`.
+
+## Compatibility
+
+- Android 5.0+ (API 21+) (ARM only)
+- iOS 11.0+
+- Windows (x86_64)
+- macOS (x86_64, arm64)
+- Linux (x86_64)
+
+## Requirements
+
+- Unity 2017.4+
+- Unity Build Support modules for desired platforms
+
+## Usage
+
+The easiest way to run the demo is to simply import the [Unity Voice Processor Package](../../../unity-voice-processor-1.0.0.unitypackage) into your project, open the `VoiceProcessorDemo` scene and hit play. To run on other platforms or in the player, go to _File > Build Settings_, choose your platform and hit the `Build and Run` button.
+
+Once the demo launches, press `Space` to start capturing audio. Press the number key between 0 and 3 to select a different device.
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/Demo/README.md.meta b/unity/Assets/Packages/UnityVoiceProcessor/Demo/README.md.meta
new file mode 100644
index 0000000..eda323c
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/Demo/README.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d35426ca9483b2e43ae0e9b1b9280949
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.cs b/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.cs
new file mode 100644
index 0000000..e31d658
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.cs
@@ -0,0 +1,99 @@
+//
+// Copyright 2021-2023 Picovoice Inc.
+//
+// You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE"
+// file accompanying this source.
+//
+// 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.
+//
+
+using System.Collections.Generic;
+using UnityEngine;
+
+using Pv.Unity;
+
+public class VoiceProcessorDemo : MonoBehaviour
+{
+ readonly int FrameLength = 512;
+ readonly int SampleRate = 16000;
+
+ private bool _dumpAudio = false;
+ private List _audioData = new List();
+
+ void Start()
+ {
+ Debug.Log("Available Devices: " + string.Join(",", VoiceProcessor.Instance.Devices.ToArray()));
+
+ VoiceProcessor.Instance.AddFrameListener(_onFrameCaptured);
+ }
+
+ void Update()
+ {
+ if (Input.GetKeyDown(KeyCode.Space))
+ {
+ if (VoiceProcessor.Instance.IsRecording)
+ {
+ if (_dumpAudio)
+ {
+ var wavFileWriter = new WavFileWriter();
+ wavFileWriter.Save("unity_voice_processor.wav", _audioData);
+ }
+ VoiceProcessor.Instance.StopRecording();
+ }
+ else
+ {
+ if (_dumpAudio)
+ {
+ _audioData.Clear();
+ }
+ VoiceProcessor.Instance.StartRecording(FrameLength, SampleRate);
+ }
+ }
+
+ if (Input.GetKeyDown(KeyCode.Alpha0))
+ {
+ VoiceProcessor.Instance.ChangeDevice(0);
+ }
+ else if (Input.GetKeyDown(KeyCode.Alpha1))
+ {
+ VoiceProcessor.Instance.ChangeDevice(1);
+ }
+ else if (Input.GetKeyDown(KeyCode.Alpha2))
+ {
+ VoiceProcessor.Instance.ChangeDevice(2);
+ }
+ else if (Input.GetKeyDown(KeyCode.Alpha3))
+ {
+ VoiceProcessor.Instance.ChangeDevice(3);
+ }
+ }
+
+ private void _onFrameCaptured(float[] frame)
+ {
+ //if (_dumpAudio)
+ //{
+ // _audioData.Add(frame);
+ //}
+
+ //float rmsSum = 0;
+ //for (int i = 0; i < frame.Length; i++)
+ //{
+ // rmsSum += Mathf.Pow(frame[i], 2);
+ //}
+ //float rms = Mathf.Sqrt(rmsSum / frame.Length);
+
+ //float dBFS = 20 * Mathf.Log10(rms);
+ //if (float.IsInfinity(dBFS) || float.IsNaN(dBFS))
+ //{
+ // return;
+ //}
+ //float scale = (dBFS - 30) / 5;
+ //if (scale < 0)
+ //{
+ // return;
+ //}
+ //gameObject.transform.localScale = new Vector3(1, scale, 1);
+ }
+}
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.cs.meta b/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.cs.meta
new file mode 100644
index 0000000..c210209
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ea58e8594467a8f48b5248e94013c76a
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.unity b/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.unity
new file mode 100644
index 0000000..448fb87
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.unity
@@ -0,0 +1,581 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.44657826, g: 0.49641263, b: 0.57481676, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 512
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 2
+ m_PVRDenoiserTypeDirect: 0
+ m_PVRDenoiserTypeIndirect: 0
+ m_PVRDenoiserTypeAO: 0
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 0
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_UseShadowmask: 1
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &127734837
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 127734840}
+ - component: {fileID: 127734839}
+ - component: {fileID: 127734838}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &127734838
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 127734837}
+ m_Enabled: 1
+--- !u!20 &127734839
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 127734837}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_FocalLength: 50
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &127734840
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 127734837}
+ m_LocalRotation: {x: -0, y: -0.23058863, z: -0, w: 0.97305137}
+ m_LocalPosition: {x: 3.78, y: 1, z: -10.76}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: -26.663002, z: 0}
+--- !u!1 &208008528
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 208008532}
+ - component: {fileID: 208008531}
+ - component: {fileID: 208008530}
+ - component: {fileID: 208008529}
+ - component: {fileID: 208008533}
+ m_Layer: 0
+ m_Name: AudioReactiveCube
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &208008529
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 208008528}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &208008530
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 208008528}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &208008531
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 208008528}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &208008532
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 208008528}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0.09, y: 0.32377338, z: -3.4413538}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &208008533
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 208008528}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: ea58e8594467a8f48b5248e94013c76a, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1 &410629937
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 410629941}
+ - component: {fileID: 410629940}
+ - component: {fileID: 410629939}
+ - component: {fileID: 410629938}
+ m_Layer: 5
+ m_Name: Canvas
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &410629938
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 410629937}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &410629939
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 410629937}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 0
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 800, y: 600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!223 &410629940
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 410629937}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &410629941
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 410629937}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 646652244}
+ m_Father: {fileID: 0}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!1 &508208893
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 508208895}
+ - component: {fileID: 508208894}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &508208894
+Light:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 508208893}
+ m_Enabled: 1
+ serializedVersion: 10
+ m_Type: 1
+ m_Shape: 0
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_InnerSpotAngle: 21.80208
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_CullingMatrixOverride:
+ e00: 1
+ e01: 0
+ e02: 0
+ e03: 0
+ e10: 0
+ e11: 1
+ e12: 0
+ e13: 0
+ e20: 0
+ e21: 0
+ e22: 1
+ e23: 0
+ e30: 0
+ e31: 0
+ e32: 0
+ e33: 1
+ m_UseCullingMatrixOverride: 0
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingLayerMask: 1
+ m_Lightmapping: 4
+ m_LightShadowCasterMode: 0
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_UseBoundingSphereOverride: 0
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &508208895
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 508208893}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!1 &646652243
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 646652244}
+ - component: {fileID: 646652246}
+ - component: {fileID: 646652245}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &646652244
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 646652243}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 178.9}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 410629941}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: -220.2, y: 156}
+ m_SizeDelta: {x: 200, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &646652245
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 646652243}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 20
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 2
+ m_MaxSize: 40
+ m_Alignment: 1
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Press Space to Toggle Audio Capture
+--- !u!222 &646652246
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 646652243}
+ m_CullTransparentMesh: 0
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.unity.meta b/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.unity.meta
new file mode 100644
index 0000000..bc6332b
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/Demo/VoiceProcessorDemo.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d364675f057970546810c3924beb9cd0
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/Demo/WavFileWriter.cs b/unity/Assets/Packages/UnityVoiceProcessor/Demo/WavFileWriter.cs
new file mode 100644
index 0000000..868fcfe
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/Demo/WavFileWriter.cs
@@ -0,0 +1,97 @@
+//
+// Copyright 2023 Picovoice Inc.
+//
+// You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE"
+// file accompanying this source.
+//
+// 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.
+//
+
+using System;
+using System.IO;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Pv.Unity
+{
+ class WavFileWriter
+ {
+ public void Save(string fileName, List audioData)
+ {
+ if (audioData.Count == 0)
+ {
+ return;
+ }
+
+ short[] samples = new short[audioData.Count * audioData[0].Length];
+ for (var i = 0; i < audioData.Count; i++)
+ {
+ audioData[i].CopyTo(samples, i * audioData[0].Length);
+ }
+
+ var filePath = Path.Combine(Application.persistentDataPath + "/", fileName);
+ Debug.Log(filePath);
+
+ Directory.CreateDirectory(Path.GetDirectoryName(filePath));
+ using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
+ {
+ _writeWavHeader(fileStream, samples);
+
+ byte[] byteData = new byte[samples.Length * 2];
+ Buffer.BlockCopy(samples, 0, byteData, 0, samples.Length * 2);
+
+ fileStream.Write(byteData, 0, byteData.Length);
+ }
+ }
+
+ private void _writeWavHeader(FileStream fileStream, short[] samples)
+ {
+ var sampleRate = 16000;
+ var channels = 1;
+
+ fileStream.Seek(0, SeekOrigin.Begin);
+
+ Byte[] riff = System.Text.Encoding.UTF8.GetBytes("RIFF");
+ fileStream.Write(riff, 0, 4);
+
+ Byte[] chunkSize = BitConverter.GetBytes(fileStream.Length - 8);
+ fileStream.Write(chunkSize, 0, 4);
+
+ Byte[] wave = System.Text.Encoding.UTF8.GetBytes("WAVE");
+ fileStream.Write(wave, 0, 4);
+
+ Byte[] fmt = System.Text.Encoding.UTF8.GetBytes("fmt ");
+ fileStream.Write(fmt, 0, 4);
+
+ Byte[] subChunk1 = BitConverter.GetBytes(16);
+ fileStream.Write(subChunk1, 0, 4);
+
+ Byte[] audioFormat = BitConverter.GetBytes(1);
+ fileStream.Write(audioFormat, 0, 2);
+
+ Byte[] numChannels = BitConverter.GetBytes(channels);
+ fileStream.Write(numChannels, 0, 2);
+
+ Byte[] sampleRateBytes = BitConverter.GetBytes(sampleRate);
+ fileStream.Write(sampleRateBytes, 0, 4);
+
+ Byte[] byteRate = BitConverter.GetBytes(sampleRate * channels * 2);
+ fileStream.Write(byteRate, 0, 4);
+
+ UInt16 blockAlign = (ushort)(channels * 2);
+ fileStream.Write(BitConverter.GetBytes(blockAlign), 0, 2);
+
+ UInt16 bps = 16;
+ Byte[] bitsPerSample = BitConverter.GetBytes(bps);
+ fileStream.Write(bitsPerSample, 0, 2);
+
+ Byte[] dataString = System.Text.Encoding.UTF8.GetBytes("data");
+ fileStream.Write(dataString, 0, 4);
+
+ Byte[] subChunk2 = BitConverter.GetBytes(samples.Length * channels * 2);
+ fileStream.Write(subChunk2, 0, 4);
+ }
+ }
+}
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/Demo/WavFileWriter.cs.meta b/unity/Assets/Packages/UnityVoiceProcessor/Demo/WavFileWriter.cs.meta
new file mode 100644
index 0000000..62173c5
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/Demo/WavFileWriter.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b62434160e67441b293e1e733ae289c2
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/LICENSE b/unity/Assets/Packages/UnityVoiceProcessor/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/LICENSE.meta b/unity/Assets/Packages/UnityVoiceProcessor/LICENSE.meta
new file mode 100644
index 0000000..5bc29df
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/LICENSE.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: fb28db56de946b247a0fbaf414808aef
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/MutePlaybackMixer.mixer b/unity/Assets/Packages/UnityVoiceProcessor/MutePlaybackMixer.mixer
new file mode 100644
index 0000000..61fddb4
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/MutePlaybackMixer.mixer
@@ -0,0 +1,69 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!241 &24100000
+AudioMixerController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: MutePlaybackMixer
+ m_OutputGroup: {fileID: 0}
+ m_MasterGroup: {fileID: 24300002}
+ m_Snapshots:
+ - {fileID: 24500006}
+ m_StartSnapshot: {fileID: 24500006}
+ m_SuspendThreshold: -80
+ m_EnableSuspend: 1
+ m_UpdateMode: 0
+ m_ExposedParameters: []
+ m_AudioMixerGroupViews:
+ - guids:
+ - 47b36b1fd5270d64e848709e771cb3b2
+ name: View
+ m_CurrentViewIndex: 0
+ m_TargetSnapshot: {fileID: 24500006}
+--- !u!243 &24300002
+AudioMixerGroupController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Master
+ m_AudioMixer: {fileID: 24100000}
+ m_GroupID: 47b36b1fd5270d64e848709e771cb3b2
+ m_Children: []
+ m_Volume: 7fbf53887df77d048850abcf7e148a38
+ m_Pitch: 87e550a1ca76d7b4180dccc98c9e942b
+ m_Send: 00000000000000000000000000000000
+ m_Effects:
+ - {fileID: 24400004}
+ m_UserColorIndex: 0
+ m_Mute: 0
+ m_Solo: 0
+ m_BypassEffects: 0
+--- !u!244 &24400004
+AudioMixerEffectController:
+ m_ObjectHideFlags: 3
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_EffectID: b19f9c4a20abfeb4ea1735063657e72d
+ m_EffectName: Attenuation
+ m_MixLevel: 4d90efd0617fbab4d9068a01fb2e344c
+ m_Parameters: []
+ m_SendTarget: {fileID: 0}
+ m_EnableWetMix: 0
+ m_Bypass: 0
+--- !u!245 &24500006
+AudioMixerSnapshotController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Snapshot
+ m_AudioMixer: {fileID: 24100000}
+ m_SnapshotID: 79614838aee912d49bd4c3e279fc015b
+ m_FloatValues:
+ 7fbf53887df77d048850abcf7e148a38: -80
+ m_TransitionOverrides: {}
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/MutePlaybackMixer.mixer.meta b/unity/Assets/Packages/UnityVoiceProcessor/MutePlaybackMixer.mixer.meta
new file mode 100644
index 0000000..0b5256b
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/MutePlaybackMixer.mixer.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 24cef648ab228134486fc42b6ffaaf68
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/UnityVoiceProcessor.asmdef b/unity/Assets/Packages/UnityVoiceProcessor/UnityVoiceProcessor.asmdef
new file mode 100644
index 0000000..eaf1fb9
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/UnityVoiceProcessor.asmdef
@@ -0,0 +1,3 @@
+{
+ "name": "UnityVoiceProcessor"
+}
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/UnityVoiceProcessor.asmdef.meta b/unity/Assets/Packages/UnityVoiceProcessor/UnityVoiceProcessor.asmdef.meta
new file mode 100644
index 0000000..79ebda7
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/UnityVoiceProcessor.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1504f36c4fe570349afad1ff2291fbd0
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessor.cs b/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessor.cs
new file mode 100644
index 0000000..42c4c6d
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessor.cs
@@ -0,0 +1,342 @@
+//
+// Copyright 2021-2023 Picovoice Inc.
+//
+// You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE"
+// file accompanying this source.
+//
+// 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.
+//
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Audio;
+
+namespace Pv.Unity
+{
+ ///
+ /// Listener type that can be added to VoiceProcessor with `.addFrameListener()`. Captures audio
+ /// frames that are generated by the recording thread.
+ ///
+ public delegate void VoiceProcessorFrameListener(float[] frame);
+
+ ///
+ /// Class that records audio and delivers frames for real-time audio processing
+ ///
+ public class VoiceProcessor : MonoBehaviour
+ {
+
+ private AudioSource _audioSource;
+ private event Action _onRestartRecording;
+ private event VoiceProcessorFrameListener _onFrame;
+
+ /// Available audio recording devices.
+ ///
+ public List Devices { get; private set; }
+
+ ///
+ /// Index of selected audio recording device.
+ ///
+ public int CurrentDeviceIndex { get; private set; }
+
+ ///
+ /// Name of selected audio recording device.
+ ///
+ public string CurrentDeviceName
+ {
+ get
+ {
+ if (CurrentDeviceIndex < 0 || CurrentDeviceIndex >= Microphone.devices.Length)
+ return string.Empty;
+ return Devices[CurrentDeviceIndex];
+ }
+ }
+
+ ///
+ /// Sample rate of recorded audio
+ ///
+ public int SampleRate { get; private set; }
+
+ ///
+ /// Size of audio frames that are delivered
+ ///
+ public int FrameLength { get; private set; }
+
+ ///
+ /// The number of registered `VoiceProcessorFrameListeners`.
+ ///
+ public int NumFrameListeners
+ {
+ get
+ {
+ if (_onFrame == null)
+ {
+ return 0;
+ }
+ return _onFrame.GetInvocationList().Length;
+ }
+ }
+
+ ///
+ /// Mixer to manage microphone audio.
+ ///
+ private AudioMixerGroup _voiceProcessorMixer;
+
+ ///
+ /// Indicates whether microphone is capturing or not.
+ ///
+ public bool IsRecording
+ {
+ get
+ {
+ return _audioSource.clip != null && Microphone.IsRecording(CurrentDeviceName);
+ }
+ }
+
+ ///
+ /// Singleton instance of the VoiceProcessor.
+ ///
+ static VoiceProcessor _instance;
+
+ public static VoiceProcessor Instance
+ {
+ get
+ {
+ if (_instance == null) FindObjectOfType();
+ if (_instance == null)
+ {
+ _instance = new GameObject("Pv.Unity.VoiceProcessor").AddComponent();
+ DontDestroyOnLoad(_instance.gameObject);
+ }
+ return _instance;
+ }
+ }
+
+ ///
+ /// Add a frame listener that will receive audio frames generated by the VoiceProcessor.
+ ///
+ /// `VoiceProcessorFrameListener` for processing frames of audio.
+ public void AddFrameListener(VoiceProcessorFrameListener listener)
+ {
+ _onFrame += listener;
+ }
+
+ ///
+ /// Add multiple frame listeners that will receive audio frames generated by the VoiceProcessor.
+ ///
+ /// `VoiceProcessorFrameListeners` for processing frames of audio.
+ public void AddFrameListeners(VoiceProcessorFrameListener[] listeners)
+ {
+ foreach (var listener in listeners)
+ {
+ _onFrame += listener;
+ }
+ }
+
+ ///
+ /// Remove a frame listener from the VoiceProcessor. It will no longer receive audio frames.
+ ///
+ /// `VoiceProcessorFrameListener` that you would like to remove.
+ public void RemoveFrameListener(VoiceProcessorFrameListener listener)
+ {
+ _onFrame -= listener;
+ }
+
+ ///
+ /// Remove frame listeners from the VoiceProcessor. They will no longer receive audio frames.
+ ///
+ /// `VoiceProcessorFrameListeners` that you would like to remove.
+ public void RemoveFrameListeners(VoiceProcessorFrameListener[] listeners)
+ {
+ foreach (var listener in listeners)
+ {
+ _onFrame -= listener;
+ }
+ }
+
+ ///
+ /// Clears all currently registered frame listeners.
+ ///
+ public void ClearFrameListeners()
+ {
+ _onFrame = null;
+ }
+
+ ///
+ /// Starts audio recording with the specified audio properties.
+ ///
+ /// The length of each audio frame, in number of samples.
+ /// The sample rate to record audio at, in Hz.
+ public void StartRecording(int frameLength, int sampleRate)
+ {
+ if (IsRecording)
+ {
+ // if sample rate or frame size have changed, restart recording
+ if (sampleRate != SampleRate || frameLength != FrameLength)
+ {
+ throw new VoiceProcessorArgumentException(
+ String.Format(
+ "VoiceProcessor StartRecording() was called with frame length " +
+ "%d and sample rate %d while already recording with " +
+ "frame length %d and sample rate %d",
+ frameLength,
+ sampleRate,
+ FrameLength,
+ SampleRate));
+ }
+ return;
+ }
+
+ SampleRate = sampleRate;
+ FrameLength = frameLength;
+
+ _audioSource.clip = Microphone.Start(CurrentDeviceName, true, 1, sampleRate);
+ _audioSource.outputAudioMixerGroup = _voiceProcessorMixer;
+
+ StartCoroutine(RecordData());
+ }
+
+ ///
+ /// Stops audio recording and releases audio resources.
+ ///
+ public void StopRecording()
+ {
+ if (!IsRecording)
+ return;
+
+ Microphone.End(CurrentDeviceName);
+ Destroy(_audioSource.clip);
+ _audioSource.clip = null;
+
+ StopCoroutine(RecordData());
+ }
+
+ ///
+ /// Basic Voice Processor setup on init.
+ ///
+ public void Awake()
+ {
+ if (_audioSource == null) GetComponent();
+ if (_audioSource == null)
+ {
+ _audioSource = gameObject.AddComponent();
+ }
+
+ UpdateDevices();
+ }
+
+ ///
+ /// Updates list of available audio devices.
+ ///
+ public void UpdateDevices()
+ {
+ Devices = new List();
+ foreach (var device in Microphone.devices)
+ {
+ Devices.Add(device);
+ }
+
+ if (Devices == null || Devices.Count == 0)
+ {
+ CurrentDeviceIndex = -1;
+ throw new VoiceProcessorStateException(
+ "There is no valid recording device connected");
+ }
+
+ CurrentDeviceIndex = 0;
+ }
+
+ ///
+ /// Change audio recording device.
+ /// Unlike the original package code, WE ARE REMODIFYING THE EVENT HANDLER TO RECEIVE FLOAT.
+ ///
+ /// Index of the new audio capture device.
+ public void ChangeDevice(int deviceIndex)
+ {
+ if (deviceIndex < 0 || deviceIndex >= Devices.Count)
+ {
+ throw new VoiceProcessorArgumentException(
+ string.Format("Specified device index {0} is not a valid recording device", deviceIndex));
+ }
+
+ if (IsRecording)
+ {
+ // one time event to restart recording with the new device
+ // the moment the last session has completed
+ _onRestartRecording += () =>
+ {
+ CurrentDeviceIndex = deviceIndex;
+ StartRecording(FrameLength, SampleRate);
+ _onRestartRecording = null;
+ };
+ StopRecording();
+ }
+ else
+ {
+ CurrentDeviceIndex = deviceIndex;
+ }
+ }
+
+ ///
+ /// Loop for buffering incoming audio data and delivering frames.
+ ///
+ private IEnumerator RecordData()
+ {
+ float[] sampleFrame = new float[FrameLength];
+ int startReadPos = 0;
+
+ while (IsRecording)
+ {
+ int curClipPos = Microphone.GetPosition(CurrentDeviceName);
+ if (curClipPos < startReadPos)
+ curClipPos += _audioSource.clip.samples;
+
+ int samplesAvailable = curClipPos - startReadPos;
+ if (samplesAvailable < FrameLength)
+ {
+ yield return null;
+ continue;
+ }
+
+ int endReadPos = startReadPos + FrameLength;
+ if (endReadPos > _audioSource.clip.samples)
+ {
+ // fragmented read (wraps around to beginning of clip)
+ // read bit at end of clip
+ int numSamplesClipEnd = _audioSource.clip.samples - startReadPos;
+ float[] endClipSamples = new float[numSamplesClipEnd];
+ _audioSource.clip.GetData(endClipSamples, startReadPos);
+
+ // read bit at start of clip
+ int numSamplesClipStart = endReadPos - _audioSource.clip.samples;
+ float[] startClipSamples = new float[numSamplesClipStart];
+ _audioSource.clip.GetData(startClipSamples, 0);
+
+ // combine to form full frame
+ Buffer.BlockCopy(endClipSamples, 0, sampleFrame, 0, numSamplesClipEnd);
+ Buffer.BlockCopy(startClipSamples, 0, sampleFrame, numSamplesClipEnd, numSamplesClipStart);
+ }
+ else
+ {
+ _audioSource.clip.GetData(sampleFrame, startReadPos);
+ }
+
+ startReadPos = endReadPos % _audioSource.clip.samples;
+
+ // converts to 16-bit int samples
+ //short[] frame = new short[sampleFrame.Length];
+ //for (int i = 0; i < FrameLength; i++)
+ //{
+ // frame[i] = (short)Math.Floor(sampleFrame[i] * short.MaxValue);
+ //}
+
+ _onFrame?.Invoke(sampleFrame);
+ }
+
+ _onRestartRecording?.Invoke();
+ }
+ }
+}
\ No newline at end of file
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessor.cs.meta b/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessor.cs.meta
new file mode 100644
index 0000000..5e5e71c
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessor.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 97db58b9403c0964c91782c4e42f3595
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences:
+ - unityVoiceProcessorMixer: {fileID: 24300002, guid: 80f14401e61be2348b045082a2eec30d,
+ type: 2}
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessorException.cs b/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessorException.cs
new file mode 100644
index 0000000..cbcb868
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessorException.cs
@@ -0,0 +1,36 @@
+//
+// Copyright 2023 Picovoice Inc.
+//
+// You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE"
+// file accompanying this source.
+//
+// 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.
+//
+
+using System;
+
+namespace Pv.Unity
+{
+ public class VoiceProcessorException : Exception
+ {
+ public VoiceProcessorException() { }
+
+ public VoiceProcessorException(string message) : base(message) { }
+ }
+
+ public class VoiceProcessorArgumentException : VoiceProcessorException
+ {
+ public VoiceProcessorArgumentException() { }
+
+ public VoiceProcessorArgumentException(string message) : base(message) { }
+ }
+
+ public class VoiceProcessorStateException : VoiceProcessorException
+ {
+ public VoiceProcessorStateException() { }
+
+ public VoiceProcessorStateException(string message) : base(message) { }
+ }
+}
diff --git a/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessorException.cs.meta b/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessorException.cs.meta
new file mode 100644
index 0000000..c7f26b1
--- /dev/null
+++ b/unity/Assets/Packages/UnityVoiceProcessor/VoiceProcessorException.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d23746414ef5f3149b7c7e2c31c249fa
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Packages/com.atteneder.draco@4.1.0.meta b/unity/Assets/Packages/com.atteneder.draco@4.1.0.meta
new file mode 100644
index 0000000..5b7b6ac
--- /dev/null
+++ b/unity/Assets/Packages/com.atteneder.draco@4.1.0.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9866ad1b06c0ab4408e5389833fa6bf8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Prefabs/MeshingFilter.prefab b/unity/Assets/Prefabs/MeshingFilter.prefab
new file mode 100644
index 0000000..05016a0
--- /dev/null
+++ b/unity/Assets/Prefabs/MeshingFilter.prefab
@@ -0,0 +1,85 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &5942540483248570804
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 22743340383085936}
+ - component: {fileID: 525208640849571397}
+ - component: {fileID: 6988629162430333432}
+ m_Layer: 0
+ m_Name: MeshingFilter
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &22743340383085936
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5942540483248570804}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 1, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &525208640849571397
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5942540483248570804}
+ m_Enabled: 0
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &6988629162430333432
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5942540483248570804}
+ m_Mesh: {fileID: 0}
diff --git a/unity/Assets/Prefabs/MeshingFilter.prefab.meta b/unity/Assets/Prefabs/MeshingFilter.prefab.meta
new file mode 100644
index 0000000..0514398
--- /dev/null
+++ b/unity/Assets/Prefabs/MeshingFilter.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 07e0d316a36aa344eb8201a100604a46
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Prefabs/PlanePlaceholder.prefab b/unity/Assets/Prefabs/PlanePlaceholder.prefab
new file mode 100644
index 0000000..eeb3c00
--- /dev/null
+++ b/unity/Assets/Prefabs/PlanePlaceholder.prefab
@@ -0,0 +1,33 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &6975488193990435630
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4152666526439577523}
+ m_Layer: 0
+ m_Name: PlanePlaceholder
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4152666526439577523
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6975488193990435630}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 1, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
diff --git a/unity/Assets/Prefabs/PlanePlaceholder.prefab.meta b/unity/Assets/Prefabs/PlanePlaceholder.prefab.meta
new file mode 100644
index 0000000..7ad3b8b
--- /dev/null
+++ b/unity/Assets/Prefabs/PlanePlaceholder.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5fd90b9f89d89b24f8637ccf70adcec6
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/DeviceData.unity b/unity/Assets/Scenes/DeviceData.unity
index f748a1c..0ac6094 100644
--- a/unity/Assets/Scenes/DeviceData.unity
+++ b/unity/Assets/Scenes/DeviceData.unity
@@ -157,9 +157,9 @@ RectTransform:
m_Father: {fileID: 1256638250}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 1, y: 1}
+ m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
- m_SizeDelta: {x: -17, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!114 &75113313
MonoBehaviour:
@@ -344,6 +344,7 @@ RectTransform:
m_Children:
- {fileID: 729170777}
- {fileID: 390914749}
+ - {fileID: 2089348016}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -518,9 +519,9 @@ RectTransform:
- {fileID: 1405679187}
m_Father: {fileID: 6234637625898487407}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 1}
- m_AnchorMax: {x: 0, y: 1}
- m_AnchoredPosition: {x: 79, y: -419.5}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 110, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &340462157
@@ -906,7 +907,7 @@ RectTransform:
m_Father: {fileID: 1032315230}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 1, y: 0.9417185}
+ m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
@@ -1194,7 +1195,7 @@ Transform:
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalScale: {x: 10, y: 10, z: 10}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 355611894}
@@ -6602,9 +6603,9 @@ RectTransform:
- {fileID: 1994881638}
m_Father: {fileID: 6234637625898487407}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 1}
- m_AnchorMax: {x: 0, y: 1}
- m_AnchoredPosition: {x: 79, y: -359.8}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 110, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1082191733
@@ -6926,6 +6927,7 @@ Transform:
m_Children:
- {fileID: 355611894}
- {fileID: 882687010}
+ - {fileID: 1572649767}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1385474980
@@ -6935,12 +6937,12 @@ MonoBehaviour:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1385474977}
- m_Enabled: 0
+ m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e1760703bbd54c04488a8d10600262ab, type: 3}
m_Name:
m_EditorClassIdentifier:
- m_PlanePrefab: {fileID: 0}
+ m_PlanePrefab: {fileID: 6975488193990435630, guid: 5fd90b9f89d89b24f8637ccf70adcec6, type: 3}
m_DetectionMode: -1
--- !u!1 &1405679186
GameObject:
@@ -7193,11 +7195,63 @@ MonoBehaviour:
cameraManager: {fileID: 853469696}
occlusionManager: {fileID: 853469699}
planeManager: {fileID: 1385474980}
+ meshManager: {fileID: 1572649768}
connectButton: {fileID: 729170778}
startPauseButton: {fileID: 390914750}
ipField: {fileID: 1994881639}
portField: {fileID: 1405679188}
OptionsContainer: {fileID: 6234637625898487392}
+--- !u!1 &1572649766
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1572649767}
+ - component: {fileID: 1572649768}
+ m_Layer: 0
+ m_Name: ARMesh
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1572649767
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1572649766}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 10, y: 10, z: 10}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1385474979}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1572649768
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1572649766}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 968053edfd89749c48f4ea5d444abf64, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_MeshPrefab: {fileID: 6988629162430333432, guid: 07e0d316a36aa344eb8201a100604a46, type: 3}
+ m_Density: 0.5
+ m_Normals: 1
+ m_Tangents: 1
+ m_TextureCoordinates: 1
+ m_Colors: 1
+ m_ConcurrentQueueSize: 4
--- !u!1 &1574944571
GameObject:
m_ObjectHideFlags: 0
@@ -7280,8 +7334,8 @@ MonoBehaviour:
m_TargetGraphic: {fileID: 518653703}
m_HandleRect: {fileID: 518653702}
m_Direction: 2
- m_Value: 0
- m_Size: 0.9417185
+ m_Value: -0.000003912511
+ m_Size: 0.9417186
m_NumberOfSteps: 0
m_OnValueChanged:
m_PersistentCalls:
@@ -7788,6 +7842,140 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1994881637}
m_CullTransparentMesh: 1
+--- !u!1 &2089348015
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2089348016}
+ - component: {fileID: 2089348018}
+ - component: {fileID: 2089348017}
+ m_Layer: 5
+ m_Name: ConnectionText
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!224 &2089348016
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2089348015}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 111421832}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 495.6, y: 17.4}
+ m_SizeDelta: {x: 298.7, y: 50}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2089348017
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2089348015}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: Connected to 127.0.0.1
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+ m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 34.32
+ m_fontSizeBase: 34.32
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 1
+ m_VerticalAlignment: 256
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_enableWordWrapping: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 1
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!222 &2089348018
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2089348015}
+ m_CullTransparentMesh: 1
--- !u!224 &35470384481140150
RectTransform:
m_ObjectHideFlags: 0
@@ -8104,7 +8292,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
- m_IsActive: 0
+ m_IsActive: 1
--- !u!114 &688855919331919916
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -8140,9 +8328,9 @@ RectTransform:
- {fileID: 1256638250}
m_Father: {fileID: 6234637625131820672}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0.5, y: 0.5}
- m_AnchorMax: {x: 0.5, y: 0.5}
- m_AnchoredPosition: {x: 13, y: -187.4}
+ m_AnchorMin: {x: 0, y: 0.5}
+ m_AnchorMax: {x: 0, y: 0.5}
+ m_AnchoredPosition: {x: 467, y: -187.4}
m_SizeDelta: {x: 325, y: 372.4}
m_Pivot: {x: 1, y: 0}
--- !u!223 &688855919331919918
@@ -11171,7 +11359,7 @@ RectTransform:
m_Father: {fileID: 6234637624925927714}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 23, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
@@ -11208,9 +11396,9 @@ RectTransform:
- {fileID: 6234637624659801887}
m_Father: {fileID: 6234637625898487407}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 1}
- m_AnchorMax: {x: 0, y: 1}
- m_AnchoredPosition: {x: 74, y: -180.7}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 100, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &6234637624243383697
@@ -11362,7 +11550,7 @@ RectTransform:
m_Father: {fileID: 6234637625440737842}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 23, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
@@ -11437,7 +11625,7 @@ RectTransform:
m_Father: {fileID: 6234637625175567706}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
@@ -11591,9 +11779,9 @@ RectTransform:
- {fileID: 6234637625785913074}
m_Father: {fileID: 6234637625898487407}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 1}
- m_AnchorMax: {x: 0, y: 1}
- m_AnchoredPosition: {x: 89, y: -121}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 130, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &6234637624739775879
@@ -11746,7 +11934,7 @@ RectTransform:
m_Father: {fileID: 6234637625752397943}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 23, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
@@ -11822,7 +12010,7 @@ RectTransform:
m_Father: {fileID: 6234637626049169604}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 23, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
@@ -12770,9 +12958,9 @@ RectTransform:
- {fileID: 6234637624814386976}
m_Father: {fileID: 6234637625898487407}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 1}
- m_AnchorMax: {x: 0, y: 1}
- m_AnchoredPosition: {x: 79, y: -300.09998}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 110, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &6234637625509776840
@@ -12850,9 +13038,9 @@ RectTransform:
- {fileID: 6234637625328346461}
m_Father: {fileID: 6234637625898487407}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 1}
- m_AnchorMax: {x: 0, y: 1}
- m_AnchoredPosition: {x: 74, y: -240.4}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 100, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &6234637625510719996
@@ -12962,7 +13150,7 @@ RectTransform:
m_Father: {fileID: 6234637624309369374}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
@@ -13294,8 +13482,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
- m_AnchoredPosition: {x: -0.000076293945, y: -177.3509}
- m_SizeDelta: {x: -4.7499847, y: 401.5}
+ m_AnchoredPosition: {x: -0.000076293945, y: -177.35083}
+ m_SizeDelta: {x: -4.7499847, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6234637625898487408
MonoBehaviour:
@@ -13501,8 +13689,8 @@ RectTransform:
m_Father: {fileID: 6234637624460987858}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 0, y: 1}
- m_AnchoredPosition: {x: 155.85, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &6234637626152401311
@@ -13651,7 +13839,7 @@ RectTransform:
m_Father: {fileID: 6234637625519142443}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
diff --git a/unity/Assets/Scenes/MockData.unity b/unity/Assets/Scenes/MockData.unity
index 23f87fe..bc9cc7f 100644
--- a/unity/Assets/Scenes/MockData.unity
+++ b/unity/Assets/Scenes/MockData.unity
@@ -978,6 +978,7 @@ MonoBehaviour:
addressInput: {fileID: 1270866979}
connectButton: {fileID: 1214793587}
sendButton: {fileID: 1408228369}
+ testBunny: {fileID: 1604160832}
--- !u!1 &1214793585
GameObject:
m_ObjectHideFlags: 0
@@ -1395,6 +1396,68 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1408228367}
m_CullTransparentMesh: 1
+--- !u!1001 &1595986975
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: -8679921383154817045, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 919132149155446097, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ propertyPath: m_Name
+ value: stanford-bunny-for-testing
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+--- !u!1 &1604160832 stripped
+GameObject:
+ m_CorrespondingSourceObject: {fileID: 8164078558771037576, guid: 8f8e96fa5f453460fa1d6acc0d072483, type: 3}
+ m_PrefabInstance: {fileID: 1595986975}
+ m_PrefabAsset: {fileID: 0}
--- !u!1 &1933430752
GameObject:
m_ObjectHideFlags: 0
@@ -1692,3 +1755,4 @@ SceneRoots:
- {fileID: 705507995}
- {fileID: 236938469}
- {fileID: 274001180}
+ - {fileID: 1595986975}
diff --git a/unity/Assets/Scripts/ARFlow/ARFlowClientManager.cs b/unity/Assets/Scripts/ARFlow/ARFlowClientManager.cs
deleted file mode 100644
index ad6d58c..0000000
--- a/unity/Assets/Scripts/ARFlow/ARFlowClientManager.cs
+++ /dev/null
@@ -1,326 +0,0 @@
-using System;
-using System.Net;
-using System.Runtime.CompilerServices;
-using System.Threading.Tasks;
-using Cysharp.Net.Http;
-using Google.Protobuf;
-using Grpc.Net.Client;
-using Unity.VisualScripting.FullSerializer;
-using UnityEngine;
-using UnityEngine.XR.ARFoundation;
-using System.Collections.Generic;
-using static ARFlow.RegisterRequest.Types;
-using UnityEngine.InputSystem;
-
-namespace ARFlow
-{
- ///
- /// This class represent the implementation for the client manager
- /// The client manager is an abstraction layer (for hopefully cleaner code) that collects and send data to the client.
- /// The Unity Scene only needs to input AR managers and modalities options.
- ///
- public class ARFlowClientManager
- {
- private ARFlowClient _client;
- private ARCameraManager _cameraManager;
- private AROcclusionManager _occlusionManager;
- private Vector2Int _sampleSize;
- private Dictionary _activatedDataModalities;
-
- private readonly Dictionary DEFAULT_MODALITIES = new Dictionary
- {
- ["CameraColor"] = false,
- ["CameraDepth"] = false,
- ["CameraTransform"] = false,
- ["CameraPointCloud"] = false,
- ["PlaneDetection"] = false,
- ["Gyroscope"] = false,
- ["Audio"] = false,
- ["Meshing"] = false
- };
-
- public static readonly List MODALITIES = new List
- { "CameraColor", "CameraDepth", "CameraTransform", "CameraPointCloud", "PlaneDetection", "Gyroscope", "Audio", "Meshing"};
-
- ///
- /// Initialize the client manager
- ///
- public ARFlowClientManager(
- ARCameraManager cameraManager = null,
- AROcclusionManager occlusionManager = null,
- ARPlaneManager planeManader = null
- )
- {
- if (UnityEngine.InputSystem.Gyroscope.current != null)
- {
- InputSystem.EnableDevice(UnityEngine.InputSystem.Gyroscope.current);
- }
- if (AttitudeSensor.current != null)
- {
- InputSystem.EnableDevice(AttitudeSensor.current);
- }
- if (Accelerometer.current != null)
- {
- InputSystem.EnableDevice(Accelerometer.current);
- }
- if (GravitySensor.current != null)
- {
- InputSystem.EnableDevice(GravitySensor.current);
- }
- _cameraManager = cameraManager;
- _occlusionManager = occlusionManager;
- }
-
-
-
- ///
- /// Connect to the server at an address, and with data modalities activated or not.
- ///
- /// Server address
- /// Dictionary of all data modalities, either activated or not
- public void Connect(
- string address,
- Dictionary activatedDataModalities = null
- )
- {
- _client = new ARFlowClient(address);
- _activatedDataModalities = activatedDataModalities;
- if (activatedDataModalities == null)
- _activatedDataModalities = DEFAULT_MODALITIES;
-
- try
- {
- _cameraManager.TryGetIntrinsics(out var k);
- _cameraManager.TryAcquireLatestCpuImage(out var colorImage);
- _occlusionManager.TryAcquireEnvironmentDepthCpuImage(out var depthImage);
-
- _sampleSize = depthImage.dimensions;
-
- var requestData = new RegisterRequest()
- {
- DeviceName = SystemInfo.deviceName,
- CameraIntrinsics = new RegisterRequest.Types.CameraIntrinsics()
- {
- FocalLengthX = k.focalLength.x,
- FocalLengthY = k.focalLength.y,
- ResolutionX = k.resolution.x,
- ResolutionY = k.resolution.y,
- PrincipalPointX = k.principalPoint.x,
- PrincipalPointY = k.principalPoint.y,
- }
-
- };
- if (_activatedDataModalities["CameraColor"])
- {
- var CameraColor = new RegisterRequest.Types.CameraColor()
- {
- Enabled = true,
- DataType = "YCbCr420",
- ResizeFactorX = depthImage.dimensions.x / (float)colorImage.dimensions.x,
- ResizeFactorY = depthImage.dimensions.y / (float)colorImage.dimensions.y,
- };
- requestData.CameraColor = CameraColor;
- }
- if (_activatedDataModalities["CameraDepth"])
- {
- var CameraDepth = new RegisterRequest.Types.CameraDepth()
- {
- Enabled = true,
-#if UNITY_ANDROID
- DataType = "u16", // f32 for iOS, u16 for Android
-#endif
-#if UNITY_IOS
- DataType = "f32",
-#endif
- ConfidenceFilteringLevel = 0,
- ResolutionX = depthImage.dimensions.x,
- ResolutionY = depthImage.dimensions.y
- };
- requestData.CameraDepth = CameraDepth;
- }
-
- if (_activatedDataModalities["CameraTransform"])
- {
- var CameraTransform = new RegisterRequest.Types.CameraTransform()
- {
- Enabled = true
- };
- requestData.CameraTransform = CameraTransform;
- }
-
- if (_activatedDataModalities["CameraPointCloud"])
- {
- var CameraPointCloud = new RegisterRequest.Types.CameraPointCloud()
- {
- Enabled = true,
- DepthUpscaleFactor = 1.0f,
- };
- requestData.CameraPointCloud = CameraPointCloud;
- };
-
- if (_activatedDataModalities["PlaneDetection"])
- {
- var CameraPlaneDetection = new RegisterRequest.Types.CameraPlaneDetection()
- {
- Enabled = true
- };
- requestData.CameraPlaneDetection = CameraPlaneDetection;
- }
-
- if (_activatedDataModalities["Gyroscope"])
- {
- var Gyroscope = new RegisterRequest.Types.Gyroscope()
- {
- Enabled = true
- };
- requestData.Gyroscope = Gyroscope;
- }
-
- if (_activatedDataModalities["Audio"])
- {
- var Audio = new RegisterRequest.Types.Audio()
- {
- Enabled = true
- };
- requestData.Audio = Audio;
- }
-
- if (_activatedDataModalities["Meshing"])
- {
- var Meshing = new RegisterRequest.Types.Meshing()
- {
- Enabled = true
- };
- requestData.Meshing = Meshing;
- }
-
- colorImage.Dispose();
- depthImage.Dispose();
-
- _client.Connect(requestData);
-
- }
- catch (Exception e)
- {
- Debug.LogError(e);
- }
- }
-
- ///
- /// Helper function to convert from unity data types to custom proto types
- ///
- ///
- ///
- DataFrameRequest.Types.Vector3 unityVector3ToProto(Vector3 a)
- {
- return new DataFrameRequest.Types.Vector3 ()
- {
- X = a.x,
- Y = a.y,
- Z = a.z
- };
- }
-
- DataFrameRequest.Types.Quaternion unityQuaternionToProto(Quaternion a)
- {
- Debug.Log("hai");
- return new DataFrameRequest.Types.Quaternion ()
- {
- X = a.x,
- Y = a.y,
- Z = a.z,
- W = a.w
- };
- }
-
-
-
- ///
- /// Send a data of a frame to the server.
- ///
- /// Data of the frame. The typing of this is generated by Protobuf.
- public string GetAndSendFrame()
- {
- var dataFrameRequest = new DataFrameRequest();
-
- if (_activatedDataModalities["CameraColor"])
- {
- var colorImage = new XRYCbCrColorImage(_cameraManager, _sampleSize);
- dataFrameRequest.Color = ByteString.CopyFrom(colorImage.Encode());
-
- colorImage.Dispose();
- }
- if (_activatedDataModalities["CameraDepth"])
- {
- var depthImage = new XRConfidenceFilteredDepthImage(_occlusionManager, 0);
- dataFrameRequest.Depth = ByteString.CopyFrom(depthImage.Encode());
-
- depthImage.Dispose();
- }
-
- if (_activatedDataModalities["CameraTransform"])
- {
- const int transformLength = 3 * 4 * sizeof(float);
- var m = Camera.main!.transform.localToWorldMatrix;
- var cameraTransformBytes = new byte[transformLength];
-
- Buffer.BlockCopy(new[]
- {
- m.m00, m.m01, m.m02, m.m03,
- m.m10, m.m11, m.m12, m.m13,
- m.m20, m.m21, m.m22, m.m23
- }, 0, cameraTransformBytes, 0, transformLength);
-
- dataFrameRequest.Transform = ByteString.CopyFrom(cameraTransformBytes);
- }
-
- //if (_activatedDataModalities["CameraPlaneDetection"])
- //{
- // var CameraPlaneDetection = new RegisterRequest.Types.CameraPlaneDetection()
- // {
- // Enabled = true
- // };
- // requestData.CameraPlaneDetection = CameraPlaneDetection;
- //}
-
- if (_activatedDataModalities["Gyroscope"])
- {
- dataFrameRequest.Gyroscope = new DataFrameRequest.Types.gyroscope_data();
- Quaternion attitude = AttitudeSensor.current.attitude.ReadValue();
- Vector3 rotation_rate = UnityEngine.InputSystem.Gyroscope.current.angularVelocity.ReadValue();
- Vector3 gravity = GravitySensor.current.gravity.ReadValue();
- Vector3 acceleration = Accelerometer.current.acceleration.ReadValue();
-
- dataFrameRequest.Gyroscope.Attitude = unityQuaternionToProto(attitude);
- dataFrameRequest.Gyroscope.RotationRate = unityVector3ToProto(rotation_rate);
- dataFrameRequest.Gyroscope.Gravity = unityVector3ToProto(gravity);
- dataFrameRequest.Gyroscope.Acceleration = unityVector3ToProto(acceleration);
- }
-
- //if (_activatedDataModalities["Audio"])
- //{
- // var Audio = new RegisterRequest.Types.Audio()
- // {
- // Enabled = true
- // };
- // requestData.Audio = Audio;
- //}
-
- //if (_activatedDataModalities["Meshing"])
- //{
- // var Meshing = new RegisterRequest.Types.Meshing()
- // {
- // Enabled = true
- // };
- // requestData.Meshing = Meshing;
- //}
-
-
-
- string serverMessage = _client.SendFrame(dataFrameRequest);
- return serverMessage;
- }
- }
-}
-
-
diff --git a/unity/Assets/Scripts/ARFlowDeviceSample.cs b/unity/Assets/Scripts/ARFlowDeviceSample.cs
index 94bec25..32dbcc5 100644
--- a/unity/Assets/Scripts/ARFlowDeviceSample.cs
+++ b/unity/Assets/Scripts/ARFlowDeviceSample.cs
@@ -10,6 +10,13 @@
using System.Collections.Generic;
using System.Collections;
+using EasyUI.Toast;
+using System.Threading.Tasks;
+using System.Net;
+using System.Security.Cryptography;
+
+using static ARFlow.OtherUtils;
+
public class ARFlowDeviceSample : MonoBehaviour
{
///
@@ -26,6 +33,11 @@ public class ARFlowDeviceSample : MonoBehaviour
///
public ARPlaneManager planeManager;
+ ///
+ /// Plane detection
+ ///
+ public ARMeshManager meshManager;
+
public Button connectButton;
public Button startPauseButton;
@@ -38,18 +50,28 @@ public class ARFlowDeviceSample : MonoBehaviour
public GameObject OptionsContainer;
- private Dictionary _optionObjects = new Dictionary();
+ private readonly Dictionary _optionObjects = new();
+
+ private readonly string _defaultConnection = "http://192.168.1.219:8500";
- private string _defaultConnection = "http://192.168.1.219:8500";
+ private bool _isConnected = false;
+ private Task connectTask = null;
// Start is called before the first frame update
void Start()
{
connectButton.onClick.AddListener(OnConnectButtonClick);
startPauseButton.onClick.AddListener(OnStartPauseButtonClick);
- _clientManager = new ARFlowClientManager(cameraManager, occlusionManager);
- addModalityOptionsToConfig();
+ _clientManager = new ARFlowClientManager(
+ cameraManager: cameraManager,
+ occlusionManager: occlusionManager,
+ planeManager: planeManager,
+ meshManager: meshManager
+ );
+
+ AddModalityOptionsToConfig();
+
// OnConnectButtonClick();
@@ -58,7 +80,7 @@ void Start()
// Application.targetFrameRate = 30;
}
- void addModalityOptionsToConfig()
+ void AddModalityOptionsToConfig()
{
// Get first child, WITH THE ASSUMPTION that it's a checkbox
GameObject firstChild = OptionsContainer.transform.GetChild(0).gameObject;
@@ -69,20 +91,20 @@ void addModalityOptionsToConfig()
firstChild,
parent: OptionsContainer.transform
);
- newOption.GetComponent().text = splitByCapital(modality);
+ newOption.GetComponent().text = SplitByCapital(modality);
_optionObjects.Add( modality, newOption );
}
}
- string splitByCapital(string s)
+ string SplitByCapital(string s)
{
return Regex.Replace(s, "([a-z])([A-Z])", "$1 $2");
}
- Dictionary modalityOptions()
+ Dictionary GetModalityOptions()
{
- Dictionary res = new Dictionary();
+ Dictionary res = new();
foreach (var option in _optionObjects)
{
var optionName = option.Key;
@@ -99,12 +121,12 @@ Dictionary modalityOptions()
return res;
}
- bool validIP (string ipField)
+ bool IsIpValid (string ipField)
{
return Regex.IsMatch(ipField, @"(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}");
}
- bool validPort(string portField)
+ bool IsPortValid(string portField)
{
return Regex.IsMatch(portField, @"(\d){1,5}");
}
@@ -115,19 +137,46 @@ bool validPort(string portField)
///
private void OnConnectButtonClick()
{
+
var serverURL = _defaultConnection;
- if (validIP(ipField.text) && validPort(portField.text))
+ if (IsIpValid(ipField.text) && IsPortValid(portField.text))
{
serverURL = "http://" + ipField.text + ":" + portField.text;
}
- var modalities = modalityOptions();
- prettyPrintDictionary(modalities);
+ // To update status of task to user
+ Toast.Show($"Connecting to {serverURL}", 3f, ToastColor.Yellow);
+
+ // Since toast can only be called from main thread (we cannot use the hook to display toast)
+ // these flags are updated and signals connection result to display to user.
+ connectTask = _clientManager.ConnectTask(
+ serverURL,
+ GetModalityOptions(),
+ t =>
+ {
+ });
+ _isConnected = false;
+ }
- _clientManager.Connect(serverURL, modalityOptions());
+ private void UpdateConnectionStatus()
+ {
+ if (connectTask is not null && connectTask.IsCompleted)
+ {
+ if (connectTask.IsFaulted)
+ {
+ PrintDebug(connectTask.Exception);
+ connectTask = null;
+ Toast.Show("Connection failed.", ToastColor.Red);
+ }
+ else if (connectTask.IsCompletedSuccessfully)
+ {
+ _isConnected = true;
+ Toast.Show("Connected successfully.", ToastColor.Green);
+ }
+ }
}
- public static void prettyPrintDictionary(Dictionary dict)
+ public static void PrettyPrintDictionary(Dictionary dict)
{
string log = "";
foreach (var kvp in dict)
@@ -135,7 +184,7 @@ public static void prettyPrintDictionary(Dictionary dict)
//textBox3.Text += ("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
log += string.Format("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
}
- Debug.Log(log);
+ PrintDebug(log);
}
///
@@ -144,26 +193,36 @@ public static void prettyPrintDictionary(Dictionary dict)
///
private void OnStartPauseButtonClick()
{
- Debug.Log($"Current framerate: {Application.targetFrameRate}");
+ PrintDebug($"Current framerate: {Application.targetFrameRate}");
+ if (enabled)
+ {
+ if (!_isConnected)
+ {
+ Toast.Show("Connnection not established. Cannot send dataframe.");
+ _enabled = false;
+ return;
+ }
+
+ _clientManager.StartDataStreaming();
+ }
+ else
+ {
+ _clientManager.StopDataStreaming();
+ }
_enabled = !_enabled;
startPauseButton.GetComponentInChildren().text = _enabled ? "Pause" : "Start";
}
// Update is called once per frame
- void Update()
+ void FixedUpdate()
{
+ if (!_isConnected)
+ {
+ UpdateConnectionStatus();
+ }
if (!_enabled) return;
- UploadFrame();
- }
-
- ///
- /// Get color image and depth information, and copy camera's transform from float to bytes.
- /// This data is sent over the server.
- ///
- private void UploadFrame()
- {
- _clientManager.GetAndSendFrame();
+ _clientManager.GetAndSendFrameTask();
}
}
diff --git a/unity/Assets/Scripts/ARFlowMockDataSample.cs b/unity/Assets/Scripts/ARFlowMockDataSample.cs
index 3168e91..9d85e24 100644
--- a/unity/Assets/Scripts/ARFlowMockDataSample.cs
+++ b/unity/Assets/Scripts/ARFlowMockDataSample.cs
@@ -3,6 +3,11 @@
using Google.Protobuf;
using UnityEngine.UI;
using TMPro;
+using System.Collections.Generic;
+using Unity.Collections;
+using static ARFlow.ProcessFrameRequest.Types.Mesh;
+
+using static ARFlow.OtherUtils;
///
/// Class for sending mock data to the server.
@@ -14,6 +19,8 @@ public class ARFlowMockDataSample : MonoBehaviour
public Button connectButton;
public Button sendButton;
+ public GameObject testBunny;
+
private ARFlowClient _client;
///
/// Size of mock data generated to send to server, in width (x) and length (y).
@@ -39,10 +46,10 @@ private void OnConnectButtonClick()
_sampleSize = new Vector2Int(256, 192);
- _client.Connect(new RegisterRequest()
+ _client.Connect(new RegisterClientRequest()
{
DeviceName = "MockDataTestbed",
- CameraIntrinsics = new RegisterRequest.Types.CameraIntrinsics()
+ CameraIntrinsics = new RegisterClientRequest.Types.CameraIntrinsics()
{
FocalLengthX = 128,
FocalLengthY = 96,
@@ -51,22 +58,30 @@ private void OnConnectButtonClick()
PrincipalPointX = 128,
PrincipalPointY = 96
},
- CameraColor = new RegisterRequest.Types.CameraColor()
+ CameraColor = new RegisterClientRequest.Types.CameraColor()
{
Enabled = true,
DataType = "YCbCr420",
ResizeFactorX = 1.0f,
ResizeFactorY = 1.0f,
},
- CameraDepth = new RegisterRequest.Types.CameraDepth()
+ CameraDepth = new RegisterClientRequest.Types.CameraDepth()
{
Enabled = false,
},
- CameraTransform = new RegisterRequest.Types.CameraTransform()
+ CameraTransform = new RegisterClientRequest.Types.CameraTransform()
{
Enabled = false
},
- Gyroscope = new RegisterRequest.Types.Gyroscope()
+ Gyroscope = new RegisterClientRequest.Types.Gyroscope()
+ {
+ Enabled = true,
+ },
+ Meshing = new RegisterClientRequest.Types.Meshing()
+ {
+ Enabled = true,
+ },
+ CameraPlaneDetection = new RegisterClientRequest.Types.CameraPlaneDetection()
{
Enabled = true,
}
@@ -84,32 +99,58 @@ private void OnSendButtonClick()
var colorBytes = new byte[size];
_rnd.NextBytes(colorBytes);
- var dataFrameRequest = new DataFrameRequest()
+ var dataFrame = new ProcessFrameRequest()
{
Color = ByteString.CopyFrom(colorBytes)
};
- dataFrameRequest.Gyroscope = new DataFrameRequest.Types.gyroscope_data();
+ dataFrame.Gyroscope = new ProcessFrameRequest.Types.GyroscopeData();
Quaternion attitude = Input.gyro.attitude;
Vector3 rotation_rate = Input.gyro.rotationRateUnbiased;
Vector3 gravity = Input.gyro.gravity;
Vector3 acceleration = Input.gyro.userAcceleration;
- dataFrameRequest.Gyroscope.Attitude = unityQuaternionToProto(attitude);
- dataFrameRequest.Gyroscope.RotationRate = unityVector3ToProto(rotation_rate);
- dataFrameRequest.Gyroscope.Gravity = unityVector3ToProto(gravity);
- dataFrameRequest.Gyroscope.Acceleration = unityVector3ToProto(acceleration);
+ dataFrame.Gyroscope.Attitude = unityQuaternionToProto(attitude);
+ dataFrame.Gyroscope.RotationRate = unityVector3ToProto(rotation_rate);
+ dataFrame.Gyroscope.Gravity = unityVector3ToProto(gravity);
+ dataFrame.Gyroscope.Acceleration = unityVector3ToProto(acceleration);
- _client.SendFrame(new DataFrameRequest()
+ // Test meshing data encode + test server handling
+ Mesh meshdata = testBunny.GetComponent().sharedMesh;
+
+ var meshEncoder = new MeshEncoder();
+ List> encodedMesh = meshEncoder.EncodeMesh(meshdata);
+ for (int i = 0; i < 20; i++)
{
- Color = ByteString.CopyFrom(colorBytes)
+ foreach (var meshElement in encodedMesh)
+ {
+ var meshProto = new ProcessFrameRequest.Types.Mesh();
+ meshProto.Data = ByteString.CopyFrom(meshElement);
- });
+ dataFrame.Meshes.Add(meshProto);
+ }
+ }
+
+ // Test plane
+ var plane = new ProcessFrameRequest.Types.Plane();
+ plane.Center = unityVector3ToProto(new Vector3(1, 2, 3));
+ plane.Normal = unityVector3ToProto(new Vector3(0, 2, 5));
+ plane.Size = unityVector2ToProto(new Vector2(5, 5));
+ plane.BoundaryPoints.Add(new[]
+ { unityVector2ToProto(new Vector2(0, 2)),
+ unityVector2ToProto(new Vector2(1, 3)),
+ unityVector2ToProto(new Vector2(2, 4)),
+ unityVector2ToProto(new Vector2(1, 5)),
+ unityVector2ToProto(new Vector2(2, 1)) }
+ );
+ dataFrame.PlaneDetection.Add(plane);
+
+ _client.SendFrame(dataFrame);
}
- DataFrameRequest.Types.Vector3 unityVector3ToProto(Vector3 a)
+ ProcessFrameRequest.Types.Vector3 unityVector3ToProto(Vector3 a)
{
- return new DataFrameRequest.Types.Vector3()
+ return new ProcessFrameRequest.Types.Vector3()
{
X = a.x,
Y = a.y,
@@ -117,9 +158,9 @@ DataFrameRequest.Types.Vector3 unityVector3ToProto(Vector3 a)
};
}
- DataFrameRequest.Types.Quaternion unityQuaternionToProto(Quaternion a)
+ ProcessFrameRequest.Types.Quaternion unityQuaternionToProto(Quaternion a)
{
- return new DataFrameRequest.Types.Quaternion()
+ return new ProcessFrameRequest.Types.Quaternion()
{
X = a.x,
Y = a.y,
@@ -128,6 +169,15 @@ DataFrameRequest.Types.Quaternion unityQuaternionToProto(Quaternion a)
};
}
+ ProcessFrameRequest.Types.Vector2 unityVector2ToProto(Vector2 a)
+ {
+ return new ProcessFrameRequest.Types.Vector2()
+ {
+ X = a.x,
+ Y = a.y,
+ };
+ }
+
// Update is called once per frame
void Update()
{
diff --git a/unity/Assets/Scripts/ARFlowUnityDataSample.cs b/unity/Assets/Scripts/ARFlowUnityDataSample.cs
index cd19ce8..fc59b96 100644
--- a/unity/Assets/Scripts/ARFlowUnityDataSample.cs
+++ b/unity/Assets/Scripts/ARFlowUnityDataSample.cs
@@ -7,6 +7,8 @@
using TMPro;
using Unity.Profiling;
+using static ARFlow.OtherUtils;
+
public class ARFlowUnityDataSample : MonoBehaviour
{
private bool _enabled;
@@ -86,10 +88,10 @@ private void OnConnectButtonClick()
// _sampleSize = new Vector2Int(screenWidth, screenHeight);
- _client.Connect(new RegisterRequest()
+ _client.Connect(new RegisterClientRequest()
{
DeviceName = "UnityDataTestbed",
- CameraIntrinsics = new RegisterRequest.Types.CameraIntrinsics()
+ CameraIntrinsics = new RegisterClientRequest.Types.CameraIntrinsics()
{
FocalLengthX = focalLengthX,
FocalLengthY = focalLengthY,
@@ -98,21 +100,21 @@ private void OnConnectButtonClick()
PrincipalPointX = principalPointX,
PrincipalPointY = principalPointY
},
- CameraColor = new RegisterRequest.Types.CameraColor()
+ CameraColor = new RegisterClientRequest.Types.CameraColor()
{
Enabled = true,
DataType = "RGB24",
ResizeFactorX = 1.0f,
ResizeFactorY = 1.0f,
},
- CameraDepth = new RegisterRequest.Types.CameraDepth()
+ CameraDepth = new RegisterClientRequest.Types.CameraDepth()
{
Enabled = true,
DataType = "f32",
ResolutionX = screenWidth,
ResolutionY = screenHeight
},
- CameraTransform = new RegisterRequest.Types.CameraTransform()
+ CameraTransform = new RegisterClientRequest.Types.CameraTransform()
{
Enabled = false
}
@@ -152,8 +154,8 @@ private void UploadFrame()
_depthTexture.Apply();
var depthBytes = _depthTexture.GetRawTextureData();
- Debug.Log($"pixelBytes length: {pixelBytes.Length}, depthBytes length: {depthBytes.Length}");
- _client.SendFrame(new DataFrameRequest()
+ PrintDebug($"pixelBytes length: {pixelBytes.Length}, depthBytes length: {depthBytes.Length}");
+ _client.SendFrame(new ProcessFrameRequest()
{
Color = ByteString.CopyFrom(pixelBytes),
Depth = ByteString.CopyFrom(depthBytes)
diff --git a/unity/Assets/Scripts/ARFlowXiheDemo.cs b/unity/Assets/Scripts/ARFlowXiheDemo.cs
index 2437c33..52a4831 100644
--- a/unity/Assets/Scripts/ARFlowXiheDemo.cs
+++ b/unity/Assets/Scripts/ARFlowXiheDemo.cs
@@ -9,6 +9,8 @@
using UnityEngine.XR.ARSubsystems;
using UnityEngine.Rendering;
+using static ARFlow.OtherUtils;
+
public class ARFlowXiheDemo : MonoBehaviour
{
public TMP_InputField addressInput;
@@ -105,7 +107,7 @@ private void OnConnectButtonClick()
private void OnStartPauseButtonClick()
{
- Debug.Log($"Current framerate: {Application.targetFrameRate}");
+ PrintDebug($"Current framerate: {Application.targetFrameRate}");
_enabled = !_enabled;
startPauseButton.GetComponentInChildren().text = _enabled ? "Pause" : "Start";
diff --git a/unity/Assets/Scripts/Utils.meta b/unity/Assets/Scripts/Utils.meta
new file mode 100644
index 0000000..9338de1
--- /dev/null
+++ b/unity/Assets/Scripts/Utils.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5b3e9f289a9ce734f85d333613c170b4
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/TextMesh Pro.meta b/unity/Assets/TextMesh Pro.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Documentation.meta b/unity/Assets/TextMesh Pro/Documentation.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf b/unity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta b/unity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Fonts.meta b/unity/Assets/TextMesh Pro/Fonts.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt b/unity/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta b/unity/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf b/unity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta b/unity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources.meta b/unity/Assets/TextMesh Pro/Resources.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials.meta b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt b/unity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta b/unity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt b/unity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta b/unity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Sprite Assets.meta b/unity/Assets/TextMesh Pro/Resources/Sprite Assets.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset b/unity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta b/unity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Style Sheets.meta b/unity/Assets/TextMesh Pro/Resources/Style Sheets.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset b/unity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta b/unity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/TMP Settings.asset b/unity/Assets/TextMesh Pro/Resources/TMP Settings.asset
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta b/unity/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders.meta b/unity/Assets/TextMesh Pro/Shaders.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader b/unity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta b/unity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMPro.cginc b/unity/Assets/TextMesh Pro/Shaders/TMPro.cginc
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta b/unity/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc b/unity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta b/unity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc b/unity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta b/unity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc b/unity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta b/unity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Sprites.meta b/unity/Assets/TextMesh Pro/Sprites.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt b/unity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt
old mode 100755
new mode 100644
index 10c4be3..384180a
--- a/unity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt
+++ b/unity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt
@@ -1,3 +1,3 @@
-This sample of beautiful emojis are provided by EmojiOne https://www.emojione.com/
-
+This sample of beautiful emojis are provided by EmojiOne https://www.emojione.com/
+
Please visit their website to view the complete set of their emojis and review their licensing terms.
\ No newline at end of file
diff --git a/unity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta b/unity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Sprites/EmojiOne.json b/unity/Assets/TextMesh Pro/Sprites/EmojiOne.json
old mode 100755
new mode 100644
index 16c800d..6c4e50b
--- a/unity/Assets/TextMesh Pro/Sprites/EmojiOne.json
+++ b/unity/Assets/TextMesh Pro/Sprites/EmojiOne.json
@@ -1,156 +1,156 @@
-{"frames": [
-
-{
- "filename": "1f60a.png",
- "frame": {"x":0,"y":0,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f60b.png",
- "frame": {"x":128,"y":0,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f60d.png",
- "frame": {"x":256,"y":0,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f60e.png",
- "frame": {"x":384,"y":0,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f600.png",
- "frame": {"x":0,"y":128,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f601.png",
- "frame": {"x":128,"y":128,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f602.png",
- "frame": {"x":256,"y":128,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f603.png",
- "frame": {"x":384,"y":128,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f604.png",
- "frame": {"x":0,"y":256,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f605.png",
- "frame": {"x":128,"y":256,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f606.png",
- "frame": {"x":256,"y":256,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f609.png",
- "frame": {"x":384,"y":256,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f618.png",
- "frame": {"x":0,"y":384,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "1f923.png",
- "frame": {"x":128,"y":384,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "263a.png",
- "frame": {"x":256,"y":384,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-},
-{
- "filename": "2639.png",
- "frame": {"x":384,"y":384,"w":128,"h":128},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
- "sourceSize": {"w":128,"h":128},
- "pivot": {"x":0.5,"y":0.5}
-}],
-"meta": {
- "app": "http://www.codeandweb.com/texturepacker",
- "version": "1.0",
- "image": "EmojiOne.png",
- "format": "RGBA8888",
- "size": {"w":512,"h":512},
- "scale": "1",
- "smartupdate": "$TexturePacker:SmartUpdate:196a26a2e149d875b91ffc8fa3581e76:fc928c7e275404b7e0649307410475cb:424723c3774975ddb2053fd5c4b85f6e$"
-}
-}
+{"frames": [
+
+{
+ "filename": "1f60a.png",
+ "frame": {"x":0,"y":0,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f60b.png",
+ "frame": {"x":128,"y":0,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f60d.png",
+ "frame": {"x":256,"y":0,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f60e.png",
+ "frame": {"x":384,"y":0,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f600.png",
+ "frame": {"x":0,"y":128,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f601.png",
+ "frame": {"x":128,"y":128,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f602.png",
+ "frame": {"x":256,"y":128,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f603.png",
+ "frame": {"x":384,"y":128,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f604.png",
+ "frame": {"x":0,"y":256,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f605.png",
+ "frame": {"x":128,"y":256,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f606.png",
+ "frame": {"x":256,"y":256,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f609.png",
+ "frame": {"x":384,"y":256,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f618.png",
+ "frame": {"x":0,"y":384,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "1f923.png",
+ "frame": {"x":128,"y":384,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "263a.png",
+ "frame": {"x":256,"y":384,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+},
+{
+ "filename": "2639.png",
+ "frame": {"x":384,"y":384,"w":128,"h":128},
+ "rotated": false,
+ "trimmed": false,
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
+ "sourceSize": {"w":128,"h":128},
+ "pivot": {"x":0.5,"y":0.5}
+}],
+"meta": {
+ "app": "http://www.codeandweb.com/texturepacker",
+ "version": "1.0",
+ "image": "EmojiOne.png",
+ "format": "RGBA8888",
+ "size": {"w":512,"h":512},
+ "scale": "1",
+ "smartupdate": "$TexturePacker:SmartUpdate:196a26a2e149d875b91ffc8fa3581e76:fc928c7e275404b7e0649307410475cb:424723c3774975ddb2053fd5c4b85f6e$"
+}
+}
diff --git a/unity/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta b/unity/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Sprites/EmojiOne.png b/unity/Assets/TextMesh Pro/Sprites/EmojiOne.png
old mode 100755
new mode 100644
diff --git a/unity/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta b/unity/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta
old mode 100755
new mode 100644
diff --git a/unity/Assets/Toast UI.meta b/unity/Assets/Toast UI.meta
new file mode 100644
index 0000000..fa505c0
--- /dev/null
+++ b/unity/Assets/Toast UI.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 843996f0f5bce764bb6803a04e1102b6
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Toast UI/Resources.meta b/unity/Assets/Toast UI/Resources.meta
new file mode 100644
index 0000000..99e6e25
--- /dev/null
+++ b/unity/Assets/Toast UI/Resources.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: e101ec0bdde418143857f3bf5df01632
+folderAsset: yes
+timeCreated: 1608726934
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Toast UI/Resources/ToastUI.prefab b/unity/Assets/Toast UI/Resources/ToastUI.prefab
new file mode 100644
index 0000000..b31ad6a
--- /dev/null
+++ b/unity/Assets/Toast UI/Resources/ToastUI.prefab
@@ -0,0 +1,431 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1119175726458820
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224187762307540902}
+ - component: {fileID: 222656141654398366}
+ - component: {fileID: 114027073042206576}
+ m_Layer: 0
+ m_Name: Container
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224187762307540902
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1119175726458820}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 224597220361603002}
+ m_Father: {fileID: 224664132396536646}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222656141654398366
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1119175726458820}
+ m_CullTransparentMesh: 1
+--- !u!114 &114027073042206576
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1119175726458820}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Padding:
+ m_Left: 20
+ m_Right: 20
+ m_Top: 20
+ m_Bottom: 20
+ m_ChildAlignment: 7
+ m_Spacing: 20
+ m_ChildForceExpandWidth: 0
+ m_ChildForceExpandHeight: 0
+ m_ChildControlWidth: 0
+ m_ChildControlHeight: 0
+ m_ChildScaleWidth: 0
+ m_ChildScaleHeight: 0
+ m_ReverseArrangement: 0
+--- !u!1 &1172958986161510
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224195315142845230}
+ - component: {fileID: 222511039075034948}
+ - component: {fileID: 114009775724315652}
+ m_Layer: 0
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224195315142845230
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1172958986161510}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 224597220361603002}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 358, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222511039075034948
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1172958986161510}
+ m_CullTransparentMesh: 1
+--- !u!114 &114009775724315652
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1172958986161510}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 0
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 30
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 180
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1.3
+ m_Text: Hello GameDevs , Unity is an amazing game
+ engine.
+--- !u!1 &1262329948662846
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4649504104831760}
+ - component: {fileID: 114939976373272096}
+ m_Layer: 0
+ m_Name: ToastUI
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4649504104831760
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1262329948662846}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 224664132396536646}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &114939976373272096
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1262329948662846}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9849e4280a058e148bdec13b05ce3a43, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ uiCanvasGroup: {fileID: 225432418422502172}
+ uiRectTransform: {fileID: 224597220361603002}
+ uiContentVerticalLayoutGroup: {fileID: 114027073042206576}
+ uiImage: {fileID: 114659833635478522}
+ uiText: {fileID: 114009775724315652}
+ colors:
+ - {r: 0.09558821, g: 0.09558821, b: 0.09558821, a: 1}
+ - {r: 0.9264706, g: 0.06812285, b: 0.263471, a: 1}
+ - {r: 0.83823526, g: 0.09861591, b: 0.75662273, a: 1}
+ - {r: 0.5484829, g: 0.12121541, b: 0.86764705, a: 1}
+ - {r: 0.08223397, g: 0.6027296, b: 0.8602941, a: 1}
+ - {r: 0.08969508, g: 0.5808823, b: 0.29633242, a: 1}
+ - {r: 0.6802499, g: 0.71323526, b: 0.11537627, a: 1}
+ - {r: 0.9264706, g: 0.4801487, b: 0.07493514, a: 1}
+ fadeDuration: 0.15
+--- !u!1 &1379282666370740
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224664132396536646}
+ - component: {fileID: 223334170058356020}
+ - component: {fileID: 114620511354508300}
+ - component: {fileID: 225432418422502172}
+ m_Layer: 0
+ m_Name: Canvas
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224664132396536646
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1379282666370740}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 224187762307540902}
+ m_Father: {fileID: 4649504104831760}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!223 &223334170058356020
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1379282666370740}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 32000
+ m_TargetDisplay: 0
+--- !u!114 &114620511354508300
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1379282666370740}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 640, y: 960}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0.5
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 0
+--- !u!225 &225432418422502172
+CanvasGroup:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1379282666370740}
+ m_Enabled: 1
+ m_Alpha: 1
+ m_Interactable: 0
+ m_BlocksRaycasts: 0
+ m_IgnoreParentGroups: 0
+--- !u!1 &1635921763246106
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224597220361603002}
+ - component: {fileID: 222180899360473682}
+ - component: {fileID: 114659833635478522}
+ - component: {fileID: 114990127041106248}
+ - component: {fileID: 114314708490085082}
+ m_Layer: 0
+ m_Name: Toast
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224597220361603002
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1635921763246106}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 224195315142845230}
+ m_Father: {fileID: 224187762307540902}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 297.35678, y: 0}
+ m_SizeDelta: {x: 397, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222180899360473682
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1635921763246106}
+ m_CullTransparentMesh: 1
+--- !u!114 &114659833635478522
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1635921763246106}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.066176474, g: 0.066176474, b: 0.066176474, a: 1}
+ m_RaycastTarget: 0
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 28b08fa84201bf74f815e602f1963808, type: 3}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!114 &114990127041106248
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1635921763246106}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Padding:
+ m_Left: 20
+ m_Right: 20
+ m_Top: 20
+ m_Bottom: 20
+ m_ChildAlignment: 4
+ m_Spacing: 10
+ m_ChildForceExpandWidth: 1
+ m_ChildForceExpandHeight: 1
+ m_ChildControlWidth: 0
+ m_ChildControlHeight: 1
+ m_ChildScaleWidth: 0
+ m_ChildScaleHeight: 0
+ m_ReverseArrangement: 0
+--- !u!114 &114314708490085082
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1635921763246106}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_HorizontalFit: 0
+ m_VerticalFit: 2
diff --git a/unity/Assets/Toast UI/Resources/ToastUI.prefab.meta b/unity/Assets/Toast UI/Resources/ToastUI.prefab.meta
new file mode 100644
index 0000000..1a7127f
--- /dev/null
+++ b/unity/Assets/Toast UI/Resources/ToastUI.prefab.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: c310b787f758e3a4db55284145e55bc8
+timeCreated: 1608726922
+licenseType: Pro
+NativeFormatImporter:
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Toast UI/Scripts.meta b/unity/Assets/Toast UI/Scripts.meta
new file mode 100644
index 0000000..9ddc9eb
--- /dev/null
+++ b/unity/Assets/Toast UI/Scripts.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 71b8ccabcd0218f4e80edf4930aac815
+folderAsset: yes
+timeCreated: 1609002110
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Toast UI/Scripts/Toast.cs b/unity/Assets/Toast UI/Scripts/Toast.cs
new file mode 100644
index 0000000..ceb8122
--- /dev/null
+++ b/unity/Assets/Toast UI/Scripts/Toast.cs
@@ -0,0 +1,119 @@
+using UnityEngine ;
+using EasyUI.Helpers ;
+
+/* -------------------------------
+ Created by : Hamza Herbou
+ hamza95herbou@gmail.com
+---------------------------------- */
+
+namespace EasyUI.Toast {
+
+ public enum ToastColor {
+ Black,
+ Red,
+ Purple,
+ Magenta,
+ Blue,
+ Green,
+ Yellow,
+ Orange
+ }
+
+ public enum ToastPosition {
+ TopLeft,
+ TopCenter,
+ TopRight,
+ MiddleLeft,
+ MiddleCenter,
+ MiddleRight,
+ BottomLeft,
+ BottomCenter,
+ BottomRight
+ }
+
+ public static class Toast {
+ public static bool isLoaded = false ;
+
+ private static ToastUI toastUI ;
+
+ private static void Prepare () {
+ if (!isLoaded) {
+ GameObject instance = MonoBehaviour.Instantiate (Resources.Load ("ToastUI")) ;
+ instance.name = "[ TOAST UI ]" ;
+ toastUI = instance.GetComponent () ;
+ isLoaded = true ;
+ }
+ }
+
+
+
+ public static void Show (string text) {
+ Prepare () ;
+ toastUI.Init (text, 2F, ToastColor.Black, ToastPosition.BottomCenter) ;
+ }
+
+
+ public static void Show (string text, float duration) {
+ Prepare () ;
+ toastUI.Init (text, duration, ToastColor.Black, ToastPosition.BottomCenter) ;
+ }
+
+ public static void Show (string text, float duration, ToastPosition position) {
+ Prepare () ;
+ toastUI.Init (text, duration, ToastColor.Black, position) ;
+ }
+
+
+ public static void Show (string text, ToastColor color) {
+ Prepare () ;
+ toastUI.Init (text, 2F, color, ToastPosition.BottomCenter) ;
+ }
+
+ public static void Show (string text, ToastColor color, ToastPosition position) {
+ Prepare () ;
+ toastUI.Init (text, 2F, color, position) ;
+ }
+
+
+ public static void Show (string text, Color color) {
+ Prepare () ;
+ toastUI.Init (text, 2F, color, ToastPosition.BottomCenter) ;
+ }
+
+ public static void Show (string text, Color color, ToastPosition position) {
+ Prepare () ;
+ toastUI.Init (text, 2F, color, position) ;
+ }
+
+
+ public static void Show (string text, float duration, ToastColor color) {
+ Prepare () ;
+ toastUI.Init (text, duration, color, ToastPosition.BottomCenter) ;
+ }
+
+ public static void Show (string text, float duration, ToastColor color, ToastPosition position) {
+ Prepare () ;
+ toastUI.Init (text, duration, color, position) ;
+ }
+
+
+ public static void Show (string text, float duration, Color color) {
+ Prepare () ;
+ toastUI.Init (text, duration, color, ToastPosition.BottomCenter) ;
+ }
+
+ public static void Show (string text, float duration, Color color, ToastPosition position) {
+ Prepare () ;
+ toastUI.Init (text, duration, color, position) ;
+ }
+
+
+
+ public static void Dismiss () {
+ if (isLoaded)
+ toastUI.Dismiss () ;
+ }
+
+ }
+
+}
diff --git a/unity/Assets/Toast UI/Scripts/Toast.cs.meta b/unity/Assets/Toast UI/Scripts/Toast.cs.meta
new file mode 100644
index 0000000..ff22e1f
--- /dev/null
+++ b/unity/Assets/Toast UI/Scripts/Toast.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 4289cb162818a214b923de0a2b451a9b
+timeCreated: 1609008056
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Toast UI/Scripts/ToastUI.cs b/unity/Assets/Toast UI/Scripts/ToastUI.cs
new file mode 100644
index 0000000..0827874
--- /dev/null
+++ b/unity/Assets/Toast UI/Scripts/ToastUI.cs
@@ -0,0 +1,98 @@
+using UnityEngine ;
+using System.Collections ;
+using UnityEngine.UI ;
+using EasyUI.Toast ;
+
+/* -------------------------------
+ Created by : Hamza Herbou
+ hamza95herbou@gmail.com
+---------------------------------- */
+
+namespace EasyUI.Helpers {
+
+ public class ToastUI : MonoBehaviour {
+ [Header ("UI References :")]
+ [SerializeField] private CanvasGroup uiCanvasGroup ;
+ [SerializeField] private RectTransform uiRectTransform ;
+ [SerializeField] private VerticalLayoutGroup uiContentVerticalLayoutGroup ;
+ [SerializeField] private Image uiImage ;
+ [SerializeField] private Text uiText ;
+
+ [Header ("Toast Colors :")]
+ [SerializeField] private Color[] colors ;
+
+ [Header ("Toast Fade In/Out Duration :")]
+ [Range (.1f, .8f)]
+ [SerializeField] private float fadeDuration = .3f ;
+
+
+ private int maxTextLength = 300 ;
+
+
+ void Awake () {
+ uiCanvasGroup.alpha = 0f ;
+ }
+
+ public void Init (string text, float duration, ToastColor color, ToastPosition position) {
+ Show (text, duration, colors [ (int)color ], position) ;
+ }
+
+ public void Init (string text, float duration, Color color, ToastPosition position) {
+ Show (text, duration, color, position) ;
+ }
+
+
+
+ private void Show (string text, float duration, Color color, ToastPosition position) {
+ uiText.text = (text.Length > maxTextLength) ? text.Substring (0, maxTextLength) + "..." : text ;
+ uiImage.color = color ;
+
+ uiContentVerticalLayoutGroup.childAlignment = (TextAnchor)((int)position) ;
+
+
+ Dismiss () ;
+ StartCoroutine (FadeInOut (duration, fadeDuration)) ;
+ }
+
+ private IEnumerator FadeInOut (float toastDuration, float fadeDuration) {
+ yield return null ;
+ uiContentVerticalLayoutGroup.CalculateLayoutInputHorizontal () ;
+ uiContentVerticalLayoutGroup.CalculateLayoutInputVertical () ;
+ uiContentVerticalLayoutGroup.SetLayoutHorizontal () ;
+ uiContentVerticalLayoutGroup.SetLayoutVertical () ;
+ yield return null ;
+ // Anim start
+ yield return Fade (uiCanvasGroup, 0f, 1f, fadeDuration) ;
+ yield return new WaitForSeconds (toastDuration) ;
+ yield return Fade (uiCanvasGroup, 1f, 0f, fadeDuration) ;
+ // Anim end
+ }
+
+ private IEnumerator Fade (CanvasGroup cGroup, float startAlpha, float endAlpha, float fadeDuration) {
+ float startTime = Time.time ;
+ float alpha = startAlpha ;
+
+ if (fadeDuration > 0f) {
+ //Anim start
+ while (alpha != endAlpha) {
+ alpha = Mathf.Lerp (startAlpha, endAlpha, (Time.time - startTime) / fadeDuration) ;
+ cGroup.alpha = alpha ;
+
+ yield return null ;
+ }
+ }
+
+ cGroup.alpha = endAlpha ;
+ }
+
+ public void Dismiss () {
+ StopAllCoroutines () ;
+ uiCanvasGroup.alpha = 0f ;
+ }
+
+ private void OnDestroy () {
+ EasyUI.Toast.Toast.isLoaded = false ;
+ }
+ }
+
+}
diff --git a/unity/Assets/Toast UI/Scripts/ToastUI.cs.meta b/unity/Assets/Toast UI/Scripts/ToastUI.cs.meta
new file mode 100644
index 0000000..8257d21
--- /dev/null
+++ b/unity/Assets/Toast UI/Scripts/ToastUI.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9849e4280a058e148bdec13b05ce3a43
+timeCreated: 1608726990
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Toast UI/Sprites.meta b/unity/Assets/Toast UI/Sprites.meta
new file mode 100644
index 0000000..a92bd73
--- /dev/null
+++ b/unity/Assets/Toast UI/Sprites.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 89c2e77622af86641bf81361d1a2d7b1
+folderAsset: yes
+timeCreated: 1609002326
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Toast UI/Sprites/square_r.png b/unity/Assets/Toast UI/Sprites/square_r.png
new file mode 100644
index 0000000..bc97443
--- /dev/null
+++ b/unity/Assets/Toast UI/Sprites/square_r.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1856a53b59f4948c06cf10e1173af9a60ca75c0d6ab07a4caadd13097af698ba
+size 1300
diff --git a/unity/Assets/Toast UI/Sprites/square_r.png.meta b/unity/Assets/Toast UI/Sprites/square_r.png.meta
new file mode 100644
index 0000000..177ee09
--- /dev/null
+++ b/unity/Assets/Toast UI/Sprites/square_r.png.meta
@@ -0,0 +1,135 @@
+fileFormatVersion: 2
+guid: 28b08fa84201bf74f815e602f1963808
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMasterTextureLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 0
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 160
+ spriteBorder: {x: 45, y: 45, z: 45, w: 45}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 1
+ cookieLightType: 1
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 1
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 1
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 1
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 1
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UnityVoiceProcessor.meta b/unity/Assets/UnityVoiceProcessor.meta
new file mode 100644
index 0000000..d433740
--- /dev/null
+++ b/unity/Assets/UnityVoiceProcessor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0979be8284022dd40b41436688588942
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UnityXRContent.meta b/unity/Assets/UnityXRContent.meta
new file mode 100644
index 0000000..38e1f39
--- /dev/null
+++ b/unity/Assets/UnityXRContent.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 81fbb07bfae2206489da2bdf0c57cc51
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/XR/.gitignore b/unity/Assets/XR/.gitignore
new file mode 100644
index 0000000..421cd20
--- /dev/null
+++ b/unity/Assets/XR/.gitignore
@@ -0,0 +1 @@
+**/MockHMD*
\ No newline at end of file
diff --git a/unity/Assets/XR/Resources/XRSimulationRuntimeSettings.asset b/unity/Assets/XR/Resources/XRSimulationRuntimeSettings.asset
index c6d555b..0a73675 100644
--- a/unity/Assets/XR/Resources/XRSimulationRuntimeSettings.asset
+++ b/unity/Assets/XR/Resources/XRSimulationRuntimeSettings.asset
@@ -12,7 +12,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: e2b12afd4d27418a9cfb2823fe2b9ff3, type: 3}
m_Name: XRSimulationRuntimeSettings
m_EditorClassIdentifier:
- m_EnvironmentLayer: 30
+ m_EnvironmentLayer: 1
m_EnvironmentScanParams:
m_MinimumRescanTime: 0.1
m_DeltaCameraDistanceToRescan: 0.025
diff --git a/unity/Assets/XR/UserSimulationSettings/Resources/XRSimulationPreferences.asset b/unity/Assets/XR/UserSimulationSettings/Resources/XRSimulationPreferences.asset
index bffc7c7..d586ec8 100644
--- a/unity/Assets/XR/UserSimulationSettings/Resources/XRSimulationPreferences.asset
+++ b/unity/Assets/XR/UserSimulationSettings/Resources/XRSimulationPreferences.asset
@@ -12,6 +12,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: b2f528b98f844ed8b6b2d5fdf90b40e6, type: 3}
m_Name: XRSimulationPreferences
m_EditorClassIdentifier:
- m_EnvironmentPrefab: {fileID: 0}
+ m_EnvironmentPrefab: {fileID: 4033279824830409645, guid: f1fbb93a309712c40992b49e13b0e872, type: 3}
m_FallbackEnvironmentPrefab: {fileID: 7576867131100388943, guid: c7b92c392902f4043a03a64032c02fe1, type: 3}
m_EnableNavigation: 1
diff --git a/unity/Assets/XR/UserSimulationSettings/SimulationEnvironmentAssetsManager.asset b/unity/Assets/XR/UserSimulationSettings/SimulationEnvironmentAssetsManager.asset
index 117c021..3fa89ea 100644
--- a/unity/Assets/XR/UserSimulationSettings/SimulationEnvironmentAssetsManager.asset
+++ b/unity/Assets/XR/UserSimulationSettings/SimulationEnvironmentAssetsManager.asset
@@ -12,5 +12,26 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 378fb4eec0f59ac4c95c0d5b227aa85e, type: 3}
m_Name: SimulationEnvironmentAssetsManager
m_EditorClassIdentifier:
- m_EnvironmentPrefabPaths: []
- m_FallbackAtEndOfList: 0
+ m_EnvironmentPrefabPaths:
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Backyard/Backyard_45ftx40ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Backyard/Backyard_55ftx40ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Bedroom/Bedroom_12ftx12ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Bedroom/Bedroom_20ftx14ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Bedroom/Bedroom_20ftx17ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Billboard/Billboard_City.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/DiningRoom/DiningRoom_15ftx12.5ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/DiningRoom/DiningRoom_18ftx16ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Factory/Factory_180ftx101ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Kitchen/Kitchen_13ftx9ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Kitchen/Kitchen_17ftx16ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Kitchen/Kitchen_25ftx16ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/LivingRoom/LivingRoom_17.5ftx16.5ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/LivingRoom/LivingRoom_18ftx13ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/LivingRoom/LivingRoom_20ftx18.5ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Museum/Museum_69ftx48ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Office/Office_12ftx12ft.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Office/Office_36ftx16.5ft_001.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Office/Office_36ftx16.5ft_002.prefab
+ - Assets/UnityXRContent/ARFoundation/SimulationEnvironments/Park/Park_322ftx300ft.prefab
+ - Packages/com.unity.xr.arfoundation/Assets/Prefabs/DefaultSimulationEnvironment.prefab
+ m_FallbackAtEndOfList: 1
diff --git a/unity/Assets/XR/XRGeneralSettingsPerBuildTarget.asset b/unity/Assets/XR/XRGeneralSettingsPerBuildTarget.asset
index 8ff5e90..a6603ab 100644
--- a/unity/Assets/XR/XRGeneralSettingsPerBuildTarget.asset
+++ b/unity/Assets/XR/XRGeneralSettingsPerBuildTarget.asset
@@ -1,5 +1,21 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-9103902354846192695
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4c3631f5e58749a59194e0cf6baf6d5, type: 3}
+ m_Name: Standalone Providers
+ m_EditorClassIdentifier:
+ m_RequiresSettingsUpdate: 0
+ m_AutomaticLoading: 0
+ m_AutomaticRunning: 0
+ m_Loaders: []
--- !u!114 &-9054060240666304766
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -57,10 +73,11 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d2dc886499c26824283350fa532d087d, type: 3}
m_Name: XRGeneralSettingsPerBuildTarget
m_EditorClassIdentifier:
- Keys: 0400000007000000
+ Keys: 040000000700000001000000
Values:
- {fileID: -9054060240666304766}
- {fileID: -4019099003003015272}
+ - {fileID: 6700612043900912164}
--- !u!114 &5537603414789288036
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -78,3 +95,17 @@ MonoBehaviour:
m_AutomaticRunning: 0
m_Loaders:
- {fileID: 11400000, guid: a69a83de527d749caa73d26427c2baff, type: 2}
+--- !u!114 &6700612043900912164
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d236b7d11115f2143951f1e14045df39, type: 3}
+ m_Name: Standalone Settings
+ m_EditorClassIdentifier:
+ m_LoaderManagerInstance: {fileID: -9103902354846192695}
+ m_InitManagerOnStart: 1
diff --git a/unity/Documentation/.gitignore b/unity/Documentation/.gitignore
deleted file mode 100644
index 5f076af..0000000
--- a/unity/Documentation/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-# ignore files moved by build script and generated by Docfx
-index.md
-/api
-
-# Client docs directory inside documentation is for local environment.
-# When running github workflows the files will be moved into the website/docs directory (in root)
-/clientHTMLOutput
\ No newline at end of file
diff --git a/unity/Packages/manifest.json b/unity/Packages/manifest.json
index 291a14f..b4a2a50 100644
--- a/unity/Packages/manifest.json
+++ b/unity/Packages/manifest.json
@@ -1,17 +1,21 @@
{
"dependencies": {
+ "com.atteneder.draco": "4.1.0",
"com.cysharp.yetanotherhttphandler": "https://github.com/Cysharp/YetAnotherHttpHandler.git?path=src/YetAnotherHttpHandler#v1.0.0",
"com.github-glitchenzo.nugetforunity": "https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity",
"com.unity.collab-proxy": "2.4.4",
"com.unity.feature.development": "1.0.1",
+ "com.unity.mobile.android-logcat": "1.4.3",
"com.unity.textmeshpro": "3.0.8",
"com.unity.timeline": "1.7.6",
"com.unity.toolchain.linux-x86_64": "2.0.6",
"com.unity.ugui": "1.0.0",
"com.unity.visualscripting": "1.9.4",
+ "com.unity.xr-content.xr-sim-environments": "file:../ContentPackages\\com.unity.xr-content.xr-sim-environments-1.0.0.tgz",
"com.unity.xr.arcore": "5.1.5",
"com.unity.xr.arfoundation": "5.1.5",
"com.unity.xr.arkit": "5.1.5",
+ "com.unity.xr.mock-hmd": "1.4.0-preview.2",
"com.unity.modules.ai": "1.0.0",
"com.unity.modules.androidjni": "1.0.0",
"com.unity.modules.animation": "1.0.0",
@@ -43,5 +47,14 @@
"com.unity.modules.vr": "1.0.0",
"com.unity.modules.wind": "1.0.0",
"com.unity.modules.xr": "1.0.0"
- }
+ },
+ "scopedRegistries": [
+ {
+ "name": "OpenUPM",
+ "url": "https://package.openupm.com",
+ "scopes": [
+ "com.atteneder"
+ ]
+ }
+ ]
}
diff --git a/unity/Packages/packages-lock.json b/unity/Packages/packages-lock.json
index 0a6a982..a819c45 100644
--- a/unity/Packages/packages-lock.json
+++ b/unity/Packages/packages-lock.json
@@ -1,5 +1,14 @@
{
"dependencies": {
+ "com.atteneder.draco": {
+ "version": "4.1.0",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.burst": "1.4.11"
+ },
+ "url": "https://package.openupm.com"
+ },
"com.cysharp.yetanotherhttphandler": {
"version": "https://github.com/Cysharp/YetAnotherHttpHandler.git?path=src/YetAnotherHttpHandler#v1.0.0",
"depth": 0,
@@ -14,6 +23,16 @@
"dependencies": {},
"hash": "75f68222d0a4bd2b468dbf3e6a17a191d28041ab"
},
+ "com.unity.burst": {
+ "version": "1.8.17",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.mathematics": "1.2.1",
+ "com.unity.modules.jsonserialize": "1.0.0"
+ },
+ "url": "https://packages.unity.com"
+ },
"com.unity.collab-proxy": {
"version": "2.4.4",
"depth": 0,
@@ -90,6 +109,13 @@
"dependencies": {},
"url": "https://packages.unity.com"
},
+ "com.unity.mobile.android-logcat": {
+ "version": "1.4.3",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
"com.unity.performance.profile-analyzer": {
"version": "1.2.2",
"depth": 1,
@@ -191,6 +217,14 @@
},
"url": "https://packages.unity.com"
},
+ "com.unity.xr-content.xr-sim-environments": {
+ "version": "file:../ContentPackages\\com.unity.xr-content.xr-sim-environments-1.0.0.tgz",
+ "depth": 0,
+ "source": "local-tarball",
+ "dependencies": {
+ "com.unity.xr.arfoundation": "5.0.0"
+ }
+ },
"com.unity.xr.arcore": {
"version": "5.1.5",
"depth": 0,
@@ -265,6 +299,15 @@
},
"url": "https://packages.unity.com"
},
+ "com.unity.xr.mock-hmd": {
+ "version": "1.4.0-preview.2",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.xr.management": "4.0.1"
+ },
+ "url": "https://packages.unity.com"
+ },
"com.unity.modules.ai": {
"version": "1.0.0",
"depth": 0,
diff --git a/unity/ProjectSettings/EditorBuildSettings.asset b/unity/ProjectSettings/EditorBuildSettings.asset
index 263b7b4..ff00d1c 100644
--- a/unity/ProjectSettings/EditorBuildSettings.asset
+++ b/unity/ProjectSettings/EditorBuildSettings.asset
@@ -18,3 +18,4 @@ EditorBuildSettings:
com.unity.xr.arfoundation.simulation_settings: {fileID: 11400000, guid: 8d33ccf7e1a574b7a8329f7d9563a589, type: 2}
com.unity.xr.management.loader_settings: {fileID: 11400000, guid: 20526f0dba1114536b1e928dbe0eca0a, type: 2}
com.unity.xr.openxr.settings4: {fileID: 11400000, guid: fc3d0292db9f649d29cdd25eb39ffe7c, type: 2}
+ xr.sdk.mock-hmd.settings: {fileID: 11400000, guid: 6ba7822580889c04dac4128b1ad2d3de, type: 2}
diff --git a/unity/ProjectSettings/PackageManagerSettings.asset b/unity/ProjectSettings/PackageManagerSettings.asset
index fb3b38c..52e0a0d 100644
--- a/unity/ProjectSettings/PackageManagerSettings.asset
+++ b/unity/ProjectSettings/PackageManagerSettings.asset
@@ -26,11 +26,19 @@ MonoBehaviour:
m_IsDefault: 1
m_Capabilities: 7
m_ConfigSource: 0
- m_UserSelectedRegistryName:
+ - m_Id: scoped:project:OpenUPM
+ m_Name: OpenUPM
+ m_Url: https://package.openupm.com
+ m_Scopes:
+ - com.atteneder
+ m_IsDefault: 0
+ m_Capabilities: 0
+ m_ConfigSource: 4
+ m_UserSelectedRegistryName: OpenUPM
m_UserAddingNewScopedRegistry: 0
m_RegistryInfoDraft:
m_Modified: 0
m_ErrorMessage:
- m_UserModificationsInstanceId: -840
- m_OriginalInstanceId: -842
+ m_UserModificationsInstanceId: -834
+ m_OriginalInstanceId: -836
m_LoadAssets: 0
diff --git a/unity/ProjectSettings/ProjectSettings.asset b/unity/ProjectSettings/ProjectSettings.asset
index 44e39cc..665bc30 100644
--- a/unity/ProjectSettings/ProjectSettings.asset
+++ b/unity/ProjectSettings/ProjectSettings.asset
@@ -140,7 +140,12 @@ PlayerSettings:
visionOSBundleVersion: 1.0
tvOSBundleVersion: 1.0
bundleVersion: 0.1
- preloadedAssets: []
+ preloadedAssets:
+ - {fileID: -4019099003003015272, guid: 20526f0dba1114536b1e928dbe0eca0a, type: 2}
+ - {fileID: 11400000, guid: 8d33ccf7e1a574b7a8329f7d9563a589, type: 2}
+ - {fileID: 11400000, guid: 6ba7822580889c04dac4128b1ad2d3de, type: 2}
+ - {fileID: 4800000, guid: c9f956787b1d945e7b36e0516201fc76, type: 3}
+ - {fileID: 4800000, guid: 0945859e5a1034c2cb6dce53cb4fb899, type: 3}
metroInputSource: 0
wsaTransparentSwapchain: 0
m_HolographicPauseOnTrackingLoss: 1
diff --git a/unity/ProjectSettings/TimeManager.asset b/unity/ProjectSettings/TimeManager.asset
index 558a017..baa38d2 100644
--- a/unity/ProjectSettings/TimeManager.asset
+++ b/unity/ProjectSettings/TimeManager.asset
@@ -3,7 +3,7 @@
--- !u!5 &1
TimeManager:
m_ObjectHideFlags: 0
- Fixed Timestep: 0.02
- Maximum Allowed Timestep: 0.33333334
+ Fixed Timestep: 0.1
+ Maximum Allowed Timestep: 0.5
m_TimeScale: 1
- Maximum Particle Timestep: 0.03
+ Maximum Particle Timestep: 0.5
diff --git a/unity/README.md b/unity/README.md
index df01f66..bd1f104 100644
--- a/unity/README.md
+++ b/unity/README.md
@@ -1,7 +1,30 @@
# ARFlow Client
+[]()
+[](https://www.gnu.org/licenses/gpl-3.0.html)
The ARFlow client is responsible for on-device AR data collection and high-performance AR data streaming. We implement the ARFlow client as a Unity application that can be easily ported to different platforms and devices.
+## Installation
+This package can be installed with Unity Package Manager's Install from Git feature. This package has some dependencies that must be installed seperately.
+
+1. Install these dependency packages by specifying the following URL in `Add package from git URL...`
+```
+https://github.com/Cysharp/YetAnotherHttpHandler.git?path=src/YetAnotherHttpHandler#{1.0.0}
+```
+```
+https://github.com/atteneder/DracoUnity.git
+```
+2. Install the Unity Voice Processor package by importing the following `.unitypackage` into your Unity Project (dragging and dropping)
+```
+https://github.com/Picovoice/unity-voice-processor/blob/main/unity-voice-processor-1.0.0.unitypackage
+```
+
+3. To install the latest package version, specify the following URL in `Add package from git URL...` of Package Manager on Unity
+```
+https://github.com/cake-lab/ARFlow.git?path=unity/Assets/ARFlowPackage/ARFlow
+```
+## Implementation details
+
The core functions are implemented in `unity/Assets/Scripts/ARFlow`. We show three example ARFlow integration of three different data sources:
- Mock data: inside ./Assets/Scripts/ARFlowMockDataSample.cs
diff --git a/website/static/images/favicon.svg b/website/static/images/favicon.svg
index 98d2546..ec23dce 100644
--- a/website/static/images/favicon.svg
+++ b/website/static/images/favicon.svg
@@ -1,37 +1,37 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+