From 374dd59e9c704bc3591d2db072afd0bd648a0ebf Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 05 二月 2026 18:42:50 +0800
Subject: [PATCH] NATIVEWEBSOCKET

---
 Assets/Plugins/NativeWebSocket/ProjectSettings/AudioManager.asset.meta                           |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/QualitySettings.asset.meta                        |    8 
 Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/WebSocketExampleScene.unity      |  326 +++++
 Assets/Plugins/NativeWebSocket/ProjectSettings/InputManager.asset.meta                           |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/XRSettings.asset                                  |   10 
 Assets/Plugins/NativeWebSocket/ProjectSettings/InputManager.asset                                |  295 ++++
 Assets/Plugins/NativeWebSocket/ProjectSettings/EditorSettings.asset.meta                         |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/DynamicsManager.asset                             |   34 
 Assets/Plugins/NativeWebSocket/Assets/WebSocket/endel.nativewebsocket.asmdef                     |    3 
 Assets/Plugins/NativeWebSocket/ProjectSettings/EditorBuildSettings.asset.meta                    |    8 
 Assets/Plugins/NativeWebSocket/Assets/WebSocketExample.meta                                      |    8 
 Assets/Plugins/NativeWebSocket.meta                                                              |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/Physics2DSettings.asset.meta                      |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/VFXManager.asset.meta                             |    8 
 Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.cs                                     |  871 ++++++++++++++
 Assets/Plugins/NativeWebSocket/Assets/package.json.meta                                          |    7 
 Assets/Plugins/NativeWebSocket/ProjectSettings/UnityConnectSettings.asset                        |   34 
 Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.cs.meta                                |   11 
 Assets/Plugins/NativeWebSocket/ProjectSettings/UnityConnectSettings.asset.meta                   |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/XRSettings.asset.meta                             |    8 
 Assets/Plugins/NativeWebSocket/Packages/manifest.json                                            |   44 
 Assets/Plugins/NativeWebSocket/ProjectSettings/EditorBuildSettings.asset                         |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectSettings.asset.meta                        |    8 
 Assets/Plugins/NativeWebSocket/Assets/WebSocket.meta                                             |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/GraphicsSettings.asset                            |   64 +
 Assets/Plugins/NativeWebSocket/ProjectSettings/NavMeshAreas.asset.meta                           |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/QualitySettings.asset                             |  231 +++
 Assets/Plugins/NativeWebSocket/ProjectSettings/TimeManager.asset                                 |    9 
 Assets/Plugins/NativeWebSocket/ProjectSettings/EditorSettings.asset                              |   39 
 Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.jslib                                  |  333 +++++
 Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectSettings.asset                             |  650 ++++++++++
 Assets/Plugins/NativeWebSocket/Packages/manifest.json.meta                                       |    7 
 Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectVersion.txt.meta                           |    7 
 Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/Connection.cs                    |   69 +
 Assets/Plugins/NativeWebSocket/ProjectSettings/DynamicsManager.asset.meta                        |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/ClusterInputManager.asset.meta                    |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/AudioManager.asset                                |   19 
 Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/WebSocketExampleScene.unity.meta |    7 
 Assets/Plugins/NativeWebSocket/ProjectSettings/Physics2DSettings.asset                           |   56 
 Assets/Plugins/NativeWebSocket/ProjectSettings/PresetManager.asset                               |    7 
 Assets/Plugins/NativeWebSocket/ProjectSettings/TimeManager.asset.meta                            |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/TagManager.asset                                  |   43 
 Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/Connection.cs.meta               |   11 
 Assets/Plugins/NativeWebSocket/Assets.meta                                                       |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/ClusterInputManager.asset                         |    6 
 Assets/Plugins/NativeWebSocket/Assets/WebSocket/endel.nativewebsocket.asmdef.meta                |    7 
 Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectVersion.txt                                |    2 
 Assets/Plugins/NativeWebSocket/Assets/package.json                                               |   30 
 Assets/Plugins/NativeWebSocket/ProjectSettings/PresetManager.asset.meta                          |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/VFXManager.asset                                  |   14 
 Assets/Plugins/NativeWebSocket/ProjectSettings/NavMeshAreas.asset                                |   93 +
 Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.jslib.meta                             |   32 
 Assets/Plugins/NativeWebSocket/ProjectSettings.meta                                              |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/GraphicsSettings.asset.meta                       |    8 
 Assets/Plugins/NativeWebSocket/Packages.meta                                                     |    8 
 Assets/Plugins/NativeWebSocket/ProjectSettings/TagManager.asset.meta                             |    8 
 56 files changed, 3,563 insertions(+), 0 deletions(-)

diff --git a/Assets/Plugins/NativeWebSocket.meta b/Assets/Plugins/NativeWebSocket.meta
new file mode 100644
index 0000000..7bbb016
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3c2e7c19cc229974bbada1904c14be65
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Assets.meta b/Assets/Plugins/NativeWebSocket/Assets.meta
new file mode 100644
index 0000000..7f40c80
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5626c76d5ed6b8e419bab08bf324336a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/Connection.cs b/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/Connection.cs
new file mode 100644
index 0000000..32acbd8
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/Connection.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+using NativeWebSocket;
+
+public class Connection : MonoBehaviour
+{
+  WebSocket websocket;
+
+  // Start is called before the first frame update
+  async void Start()
+  {
+    // websocket = new WebSocket("ws://echo.websocket.org");
+    websocket = new WebSocket("ws://localhost:3000");
+
+    websocket.OnOpen += () =>
+    {
+      Debug.Log("Connection open!");
+    };
+
+    websocket.OnError += (e) =>
+    {
+      Debug.Log("Error! " + e);
+    };
+
+    websocket.OnClose += (e) =>
+    {
+      Debug.Log("Connection closed!");
+    };
+
+    websocket.OnMessage += (bytes) =>
+    {
+      // Reading a plain text message
+      var message = System.Text.Encoding.UTF8.GetString(bytes);
+      Debug.Log("Received OnMessage! (" + bytes.Length + " bytes) " + message);
+    };
+
+    // Keep sending messages at every 0.3s
+    InvokeRepeating("SendWebSocketMessage", 0.0f, 0.3f);
+
+    await websocket.Connect();
+  }
+
+  void Update()
+  {
+    #if !UNITY_WEBGL || UNITY_EDITOR
+      websocket.DispatchMessageQueue();
+    #endif
+  }
+
+  async void SendWebSocketMessage()
+  {
+    if (websocket.State == WebSocketState.Open)
+    {
+      // Sending bytes
+      await websocket.Send(new byte[] { 10, 20, 30 });
+
+      // Sending plain text
+      await websocket.SendText("plain text message");
+    }
+  }
+
+  private async void OnApplicationQuit()
+  {
+    await websocket.Close();
+  }
+}
diff --git a/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/Connection.cs.meta b/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/Connection.cs.meta
new file mode 100644
index 0000000..6ad36a6
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/Connection.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0f451fab1e6d94aea8fb73803e281bb3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/WebSocketExampleScene.unity b/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/WebSocketExampleScene.unity
new file mode 100644
index 0000000..c47fb7f
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/WebSocketExampleScene.unity
@@ -0,0 +1,326 @@
+%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: 705507994}
+  m_IndirectSpecularColor: {r: 0.44657868, g: 0.49641263, b: 0.57481706, a: 1}
+  m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 11
+  m_GIWorkflowMode: 0
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 1
+    m_EnableRealtimeLightmaps: 1
+  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: 500
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 500
+    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_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 &705507993
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 705507995}
+  - component: {fileID: 705507994}
+  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 &705507994
+Light:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 705507993}
+  m_Enabled: 1
+  serializedVersion: 9
+  m_Type: 1
+  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+  m_Intensity: 1
+  m_Range: 10
+  m_SpotAngle: 30
+  m_InnerSpotAngle: 21.802082
+  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: 1
+  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 &705507995
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 705507993}
+  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 &963194225
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 963194228}
+  - component: {fileID: 963194227}
+  - component: {fileID: 963194226}
+  - component: {fileID: 963194230}
+  - component: {fileID: 963194229}
+  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 &963194226
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 963194225}
+  m_Enabled: 1
+--- !u!20 &963194227
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 963194225}
+  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 &963194228
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 963194225}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &963194229
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 963194225}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0f451fab1e6d94aea8fb73803e281bb3, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!54 &963194230
+Rigidbody:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 963194225}
+  serializedVersion: 2
+  m_Mass: 1
+  m_Drag: 0
+  m_AngularDrag: 0.05
+  m_UseGravity: 1
+  m_IsKinematic: 0
+  m_Interpolate: 0
+  m_Constraints: 0
+  m_CollisionDetection: 0
diff --git a/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/WebSocketExampleScene.unity.meta b/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/WebSocketExampleScene.unity.meta
new file mode 100644
index 0000000..952bd1e
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/Samples~/WebSocketExample/WebSocketExampleScene.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9fc0d4010bbf28b4594072e72b8655ab
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Assets/WebSocket.meta b/Assets/Plugins/NativeWebSocket/Assets/WebSocket.meta
new file mode 100644
index 0000000..5b5dd00
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/WebSocket.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1b0aac75ea12c4d6d8aaf04e069a69a7
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.cs b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.cs
new file mode 100644
index 0000000..dbd3fcd
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.cs
@@ -0,0 +1,871 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net.WebSockets;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+using AOT;
+using System.Runtime.InteropServices;
+using UnityEngine;
+using System.Collections;
+
+public class MainThreadUtil : MonoBehaviour
+{
+    public static MainThreadUtil Instance { get; private set; }
+    public static SynchronizationContext synchronizationContext { get; private set; }
+
+    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
+    public static void Setup()
+    {
+        Instance = new GameObject("MainThreadUtil")
+            .AddComponent<MainThreadUtil>();
+        synchronizationContext = SynchronizationContext.Current;
+    }
+
+    public static void Run(IEnumerator waitForUpdate)
+    {
+        synchronizationContext.Post(_ => Instance.StartCoroutine(
+                    waitForUpdate), null);
+    }
+
+    void Awake()
+    {
+        gameObject.hideFlags = HideFlags.HideAndDontSave;
+        DontDestroyOnLoad(gameObject);
+    }
+}
+
+public class WaitForUpdate : CustomYieldInstruction
+{
+    public override bool keepWaiting
+    {
+        get { return false; }
+    }
+
+    public MainThreadAwaiter GetAwaiter()
+    {
+        var awaiter = new MainThreadAwaiter();
+        MainThreadUtil.Run(CoroutineWrapper(this, awaiter));
+        return awaiter;
+    }
+
+    public class MainThreadAwaiter : INotifyCompletion
+    {
+        Action continuation;
+
+        public bool IsCompleted { get; set; }
+
+        public void GetResult() { }
+
+        public void Complete()
+        {
+            IsCompleted = true;
+            continuation?.Invoke();
+        }
+
+        void INotifyCompletion.OnCompleted(Action continuation)
+        {
+            this.continuation = continuation;
+        }
+    }
+
+    public static IEnumerator CoroutineWrapper(IEnumerator theWorker, MainThreadAwaiter awaiter)
+    {
+        yield return theWorker;
+        awaiter.Complete();
+    }
+}
+
+namespace NativeWebSocket
+{
+    public delegate void WebSocketOpenEventHandler();
+    public delegate void WebSocketMessageEventHandler(byte[] data);
+    public delegate void WebSocketErrorEventHandler(string errorMsg);
+    public delegate void WebSocketCloseEventHandler(WebSocketCloseCode closeCode);
+
+    public enum WebSocketCloseCode
+    {
+        /* Do NOT use NotSet - it's only purpose is to indicate that the close code cannot be parsed. */
+        NotSet = 0,
+        Normal = 1000,
+        Away = 1001,
+        ProtocolError = 1002,
+        UnsupportedData = 1003,
+        Undefined = 1004,
+        NoStatus = 1005,
+        Abnormal = 1006,
+        InvalidData = 1007,
+        PolicyViolation = 1008,
+        TooBig = 1009,
+        MandatoryExtension = 1010,
+        ServerError = 1011,
+        TlsHandshakeFailure = 1015
+    }
+
+    public enum WebSocketState
+    {
+        Connecting,
+        Open,
+        Closing,
+        Closed
+    }
+
+    public interface IWebSocket
+    {
+        event WebSocketOpenEventHandler OnOpen;
+        event WebSocketMessageEventHandler OnMessage;
+        event WebSocketErrorEventHandler OnError;
+        event WebSocketCloseEventHandler OnClose;
+
+        WebSocketState State { get; }
+    }
+
+    public static class WebSocketHelpers
+    {
+        public static WebSocketCloseCode ParseCloseCodeEnum(int closeCode)
+        {
+
+            if (WebSocketCloseCode.IsDefined(typeof(WebSocketCloseCode), closeCode))
+            {
+                return (WebSocketCloseCode)closeCode;
+            }
+            else
+            {
+                return WebSocketCloseCode.Undefined;
+            }
+
+        }
+
+        public static WebSocketException GetErrorMessageFromCode(int errorCode, Exception inner)
+        {
+            switch (errorCode)
+            {
+                case -1:
+                    return new WebSocketUnexpectedException("WebSocket instance not found.", inner);
+                case -2:
+                    return new WebSocketInvalidStateException("WebSocket is already connected or in connecting state.", inner);
+                case -3:
+                    return new WebSocketInvalidStateException("WebSocket is not connected.", inner);
+                case -4:
+                    return new WebSocketInvalidStateException("WebSocket is already closing.", inner);
+                case -5:
+                    return new WebSocketInvalidStateException("WebSocket is already closed.", inner);
+                case -6:
+                    return new WebSocketInvalidStateException("WebSocket is not in open state.", inner);
+                case -7:
+                    return new WebSocketInvalidArgumentException("Cannot close WebSocket. An invalid code was specified or reason is too long.", inner);
+                default:
+                    return new WebSocketUnexpectedException("Unknown error.", inner);
+            }
+        }
+    }
+
+    public class WebSocketException : Exception
+    {
+        public WebSocketException() { }
+        public WebSocketException(string message) : base(message) { }
+        public WebSocketException(string message, Exception inner) : base(message, inner) { }
+    }
+
+    public class WebSocketUnexpectedException : WebSocketException
+    {
+        public WebSocketUnexpectedException() { }
+        public WebSocketUnexpectedException(string message) : base(message) { }
+        public WebSocketUnexpectedException(string message, Exception inner) : base(message, inner) { }
+    }
+
+    public class WebSocketInvalidArgumentException : WebSocketException
+    {
+        public WebSocketInvalidArgumentException() { }
+        public WebSocketInvalidArgumentException(string message) : base(message) { }
+        public WebSocketInvalidArgumentException(string message, Exception inner) : base(message, inner) { }
+    }
+
+    public class WebSocketInvalidStateException : WebSocketException
+    {
+        public WebSocketInvalidStateException() { }
+        public WebSocketInvalidStateException(string message) : base(message) { }
+        public WebSocketInvalidStateException(string message, Exception inner) : base(message, inner) { }
+    }
+
+    public class WaitForBackgroundThread
+    {
+        public ConfiguredTaskAwaitable.ConfiguredTaskAwaiter GetAwaiter()
+        {
+            return Task.Run(() => { }).ConfigureAwait(false).GetAwaiter();
+        }
+    }
+
+#if UNITY_WEBGL && !UNITY_EDITOR
+
+  /// <summary>
+  /// WebSocket class bound to JSLIB.
+  /// </summary>
+  public class WebSocket : IWebSocket {
+
+    /* WebSocket JSLIB functions */
+    [DllImport ("__Internal")]
+    public static extern int WebSocketConnect (int instanceId);
+
+    [DllImport ("__Internal")]
+    public static extern int WebSocketClose (int instanceId, int code, string reason);
+
+    [DllImport ("__Internal")]
+    public static extern int WebSocketSend (int instanceId, byte[] dataPtr, int dataLength);
+
+    [DllImport ("__Internal")]
+    public static extern int WebSocketSendText (int instanceId, string message);
+
+    [DllImport ("__Internal")]
+    public static extern int WebSocketGetState (int instanceId);
+
+    protected int instanceId;
+
+    public event WebSocketOpenEventHandler OnOpen;
+    public event WebSocketMessageEventHandler OnMessage;
+    public event WebSocketErrorEventHandler OnError;
+    public event WebSocketCloseEventHandler OnClose;
+
+    public WebSocket (string url, Dictionary<string, string> headers = null) {
+      if (!WebSocketFactory.isInitialized) {
+        WebSocketFactory.Initialize ();
+      }
+
+      int instanceId = WebSocketFactory.WebSocketAllocate (url);
+      WebSocketFactory.instances.Add (instanceId, this);
+
+      this.instanceId = instanceId;
+    }
+
+    public WebSocket (string url, string subprotocol, Dictionary<string, string> headers = null) {
+      if (!WebSocketFactory.isInitialized) {
+        WebSocketFactory.Initialize ();
+      }
+
+      int instanceId = WebSocketFactory.WebSocketAllocate (url);
+      WebSocketFactory.instances.Add (instanceId, this);
+
+      WebSocketFactory.WebSocketAddSubProtocol(instanceId, subprotocol);
+
+      this.instanceId = instanceId;
+    }
+
+    public WebSocket (string url, List<string> subprotocols, Dictionary<string, string> headers = null) {
+      if (!WebSocketFactory.isInitialized) {
+        WebSocketFactory.Initialize ();
+      }
+
+      int instanceId = WebSocketFactory.WebSocketAllocate (url);
+      WebSocketFactory.instances.Add (instanceId, this);
+
+      foreach (string subprotocol in subprotocols) {
+        WebSocketFactory.WebSocketAddSubProtocol(instanceId, subprotocol);
+      }
+
+      this.instanceId = instanceId;
+    }
+
+    ~WebSocket () {
+      WebSocketFactory.HandleInstanceDestroy (this.instanceId);
+    }
+
+    public int GetInstanceId () {
+      return this.instanceId;
+    }
+
+    public Task Connect () {
+      int ret = WebSocketConnect (this.instanceId);
+
+      if (ret < 0)
+        throw WebSocketHelpers.GetErrorMessageFromCode (ret, null);
+
+      return Task.CompletedTask;
+    }
+
+	public void CancelConnection () {
+		if (State == WebSocketState.Open)
+			Close (WebSocketCloseCode.Abnormal);
+	}
+
+    public Task Close (WebSocketCloseCode code = WebSocketCloseCode.Normal, string reason = null) {
+      int ret = WebSocketClose (this.instanceId, (int) code, reason);
+
+      if (ret < 0)
+        throw WebSocketHelpers.GetErrorMessageFromCode (ret, null);
+
+      return Task.CompletedTask;
+    }
+
+    public Task Send (byte[] data) {
+      int ret = WebSocketSend (this.instanceId, data, data.Length);
+
+      if (ret < 0)
+        throw WebSocketHelpers.GetErrorMessageFromCode (ret, null);
+
+      return Task.CompletedTask;
+    }
+
+    public Task SendText (string message) {
+      int ret = WebSocketSendText (this.instanceId, message);
+
+      if (ret < 0)
+        throw WebSocketHelpers.GetErrorMessageFromCode (ret, null);
+
+      return Task.CompletedTask;
+    }
+
+    public WebSocketState State {
+      get {
+        int state = WebSocketGetState (this.instanceId);
+
+        if (state < 0)
+          throw WebSocketHelpers.GetErrorMessageFromCode (state, null);
+
+        switch (state) {
+          case 0:
+            return WebSocketState.Connecting;
+
+          case 1:
+            return WebSocketState.Open;
+
+          case 2:
+            return WebSocketState.Closing;
+
+          case 3:
+            return WebSocketState.Closed;
+
+          default:
+            return WebSocketState.Closed;
+        }
+      }
+    }
+
+    public void DelegateOnOpenEvent () {
+      this.OnOpen?.Invoke ();
+    }
+
+    public void DelegateOnMessageEvent (byte[] data) {
+      this.OnMessage?.Invoke (data);
+    }
+
+    public void DelegateOnErrorEvent (string errorMsg) {
+      this.OnError?.Invoke (errorMsg);
+    }
+
+    public void DelegateOnCloseEvent (int closeCode) {
+      this.OnClose?.Invoke (WebSocketHelpers.ParseCloseCodeEnum (closeCode));
+    }
+
+  }
+
+#else
+
+    public class WebSocket : IWebSocket
+    {
+        public event WebSocketOpenEventHandler OnOpen;
+        public event WebSocketMessageEventHandler OnMessage;
+        public event WebSocketErrorEventHandler OnError;
+        public event WebSocketCloseEventHandler OnClose;
+
+        private Uri uri;
+        private Dictionary<string, string> headers;
+        private List<string> subprotocols;
+        private ClientWebSocket m_Socket = new ClientWebSocket();
+
+        private CancellationTokenSource m_TokenSource;
+        private CancellationToken m_CancellationToken;
+
+        private readonly object OutgoingMessageLock = new object();
+        private readonly object IncomingMessageLock = new object();
+
+        private bool isSending = false;
+        private List<ArraySegment<byte>> sendBytesQueue = new List<ArraySegment<byte>>();
+        private List<ArraySegment<byte>> sendTextQueue = new List<ArraySegment<byte>>();
+
+        public WebSocket(string url, Dictionary<string, string> headers = null)
+        {
+            uri = new Uri(url);
+
+            if (headers == null)
+            {
+                this.headers = new Dictionary<string, string>();
+            }
+            else
+            {
+                this.headers = headers;
+            }
+
+            subprotocols = new List<string>();
+
+            string protocol = uri.Scheme;
+            if (!protocol.Equals("ws") && !protocol.Equals("wss"))
+                throw new ArgumentException("Unsupported protocol: " + protocol);
+        }
+
+        public WebSocket(string url, string subprotocol, Dictionary<string, string> headers = null)
+        {
+            uri = new Uri(url);
+
+            if (headers == null)
+            {
+                this.headers = new Dictionary<string, string>();
+            }
+            else
+            {
+                this.headers = headers;
+            }
+
+            subprotocols = new List<string> {subprotocol};
+
+            string protocol = uri.Scheme;
+            if (!protocol.Equals("ws") && !protocol.Equals("wss"))
+                throw new ArgumentException("Unsupported protocol: " + protocol);
+        }
+
+        public WebSocket(string url, List<string> subprotocols, Dictionary<string, string> headers = null)
+        {
+            uri = new Uri(url);
+
+            if (headers == null)
+            {
+                this.headers = new Dictionary<string, string>();
+            }
+            else
+            {
+                this.headers = headers;
+            }
+
+            this.subprotocols = subprotocols;
+
+            string protocol = uri.Scheme;
+            if (!protocol.Equals("ws") && !protocol.Equals("wss"))
+                throw new ArgumentException("Unsupported protocol: " + protocol);
+        }
+
+        public void CancelConnection()
+        {
+            m_TokenSource?.Cancel();
+        }
+
+        public async Task Connect()
+        {
+            try
+            {
+                m_TokenSource = new CancellationTokenSource();
+                m_CancellationToken = m_TokenSource.Token;
+
+                m_Socket = new ClientWebSocket();
+
+                foreach (var header in headers)
+                {
+                    m_Socket.Options.SetRequestHeader(header.Key, header.Value);
+                }
+
+                foreach (string subprotocol in subprotocols) {
+                    m_Socket.Options.AddSubProtocol(subprotocol);
+                }
+
+                await m_Socket.ConnectAsync(uri, m_CancellationToken);
+                Debug.Log($"[NativeWebSocket] ConnectAsync 瀹屾垚, Socket.State = {m_Socket.State}");
+                OnOpen?.Invoke();
+
+                Debug.Log("[NativeWebSocket] 寮�濮嬭繘鍏� Receive 寰幆...");
+                await Receive();
+                Debug.Log("[NativeWebSocket] Receive 寰幆宸茶繑鍥�");
+            }
+            catch (Exception ex)
+            {
+                Debug.LogError($"[NativeWebSocket] Connect/Receive 寮傚父: {ex.GetType().Name}: {ex.Message}");
+                OnError?.Invoke(ex.Message);
+                OnClose?.Invoke(WebSocketCloseCode.Abnormal);
+            }
+            finally
+            {
+                if (m_Socket != null)
+                {
+                    m_TokenSource.Cancel();
+                    m_Socket.Dispose();
+                }
+            }
+        }
+
+        public WebSocketState State
+        {
+            get
+            {
+                switch (m_Socket.State)
+                {
+                    case System.Net.WebSockets.WebSocketState.Connecting:
+                        return WebSocketState.Connecting;
+
+                    case System.Net.WebSockets.WebSocketState.Open:
+                        return WebSocketState.Open;
+
+                    case System.Net.WebSockets.WebSocketState.CloseSent:
+                    case System.Net.WebSockets.WebSocketState.CloseReceived:
+                        return WebSocketState.Closing;
+
+                    case System.Net.WebSockets.WebSocketState.Closed:
+                        return WebSocketState.Closed;
+
+                    default:
+                        return WebSocketState.Closed;
+                }
+            }
+        }
+
+        public Task Send(byte[] bytes)
+        {
+            // return m_Socket.SendAsync(buffer, WebSocketMessageType.Binary, true, CancellationToken.None);
+            return SendMessage(sendBytesQueue, WebSocketMessageType.Binary, new ArraySegment<byte>(bytes));
+        }
+
+        public Task SendText(string message)
+        {
+            var encoded = Encoding.UTF8.GetBytes(message);
+
+            // m_Socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
+            return SendMessage(sendTextQueue, WebSocketMessageType.Text, new ArraySegment<byte>(encoded, 0, encoded.Length));
+        }
+
+        private async Task SendMessage(List<ArraySegment<byte>> queue, WebSocketMessageType messageType, ArraySegment<byte> buffer)
+        {
+            // Return control to the calling method immediately.
+            // await Task.Yield ();
+
+            // Make sure we have data.
+            if (buffer.Count == 0)
+            {
+                return;
+            }
+
+            // The state of the connection is contained in the context Items dictionary.
+            bool sending;
+
+            lock (OutgoingMessageLock)
+            {
+                sending = isSending;
+
+                // If not, we are now.
+                if (!isSending)
+                {
+                    isSending = true;
+                }
+            }
+
+            if (!sending)
+            {
+                // Lock with a timeout, just in case.
+                if (!Monitor.TryEnter(m_Socket, 1000))
+                {
+                    // If we couldn't obtain exclusive access to the socket in one second, something is wrong.
+                    await m_Socket.CloseAsync(WebSocketCloseStatus.InternalServerError, string.Empty, m_CancellationToken);
+                    return;
+                }
+
+                try
+                {
+                    // Send the message synchronously.
+                    var t = m_Socket.SendAsync(buffer, messageType, true, m_CancellationToken);
+                    t.Wait(m_CancellationToken);
+                }
+                finally
+                {
+                    Monitor.Exit(m_Socket);
+
+                    // Note that we've finished sending.
+                    lock (OutgoingMessageLock)
+                    {
+                      isSending = false;
+                    }
+                }
+
+                // Handle any queued messages.
+                await HandleQueue(queue, messageType);
+            }
+            else
+            {
+                // Add the message to the queue.
+                lock (OutgoingMessageLock)
+                {
+                    queue.Add(buffer);
+                }
+            }
+        }
+
+        private async Task HandleQueue(List<ArraySegment<byte>> queue, WebSocketMessageType messageType)
+        {
+            var buffer = new ArraySegment<byte>();
+            lock (OutgoingMessageLock)
+            {
+                // Check for an item in the queue.
+                if (queue.Count > 0)
+                {
+                    // Pull it off the top.
+                    buffer = queue[0];
+                    queue.RemoveAt(0);
+                }
+            }
+
+            // Send that message.
+            if (buffer.Count > 0)
+            {
+                await SendMessage(queue, messageType, buffer);
+            }
+        }
+
+        private List<byte[]> m_MessageList = new List<byte[]>();
+
+        // simple dispatcher for queued messages.
+        public void DispatchMessageQueue()
+        {
+            if (m_MessageList.Count == 0)
+            {
+                return;
+            }
+
+            List<byte[]> messageListCopy;
+
+            lock (IncomingMessageLock)
+            {
+                messageListCopy = new List<byte[]>(m_MessageList);
+                m_MessageList.Clear();
+            }
+
+            var len = messageListCopy.Count;
+            for (int i = 0; i < len; i++)
+            {
+                OnMessage?.Invoke(messageListCopy[i]);
+            }
+        }
+
+        public async Task Receive()
+        {
+            WebSocketCloseCode closeCode = WebSocketCloseCode.Abnormal;
+            await new WaitForBackgroundThread();
+
+            Debug.Log($"[NativeWebSocket] Receive 寰幆寮�濮�, Socket.State = {m_Socket.State}");
+            int messageCount = 0;
+
+            ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[8192]);
+            try
+            {
+                while (m_Socket.State == System.Net.WebSockets.WebSocketState.Open)
+                {
+                    WebSocketReceiveResult result = null;
+
+                    using (var ms = new MemoryStream())
+                    {
+                        do
+                        {
+                            result = await m_Socket.ReceiveAsync(buffer, m_CancellationToken);
+                            ms.Write(buffer.Array, buffer.Offset, result.Count);
+                        }
+                        while (!result.EndOfMessage);
+
+                        ms.Seek(0, SeekOrigin.Begin);
+
+                        if (result.MessageType == WebSocketMessageType.Text)
+                        {
+                            messageCount++;
+                            Debug.Log($"[NativeWebSocket] 馃摡 鏀跺埌鏂囨湰娑堟伅 #{messageCount}, 澶у皬: {ms.Length} bytes");
+                            lock (IncomingMessageLock)
+                            {
+                              m_MessageList.Add(ms.ToArray());
+                            }
+
+                            //using (var reader = new StreamReader(ms, Encoding.UTF8))
+                            //{
+                            //	string message = reader.ReadToEnd();
+                            //	OnMessage?.Invoke(this, new MessageEventArgs(message));
+                            //}
+                        }
+                        else if (result.MessageType == WebSocketMessageType.Binary)
+                        {
+                            messageCount++;
+                            Debug.Log($"[NativeWebSocket] 馃摡 鏀跺埌浜岃繘鍒舵秷鎭� #{messageCount}, 澶у皬: {ms.Length} bytes");
+                            lock (IncomingMessageLock)
+                            {
+                              m_MessageList.Add(ms.ToArray());
+                            }
+                        }
+                        else if (result.MessageType == WebSocketMessageType.Close)
+                        {
+                            Debug.LogWarning($"[NativeWebSocket] 馃摡 鏀跺埌 Close 娑堟伅! (鎬诲叡鎺ユ敹浜� {messageCount} 鏉℃秷鎭�)");
+                            Debug.LogWarning($"[NativeWebSocket] CloseStatus={result.CloseStatus}, CloseStatusDescription={result.CloseStatusDescription}");
+                            await Close();
+                            closeCode = WebSocketHelpers.ParseCloseCodeEnum((int)result.CloseStatus);
+                            Debug.LogWarning($"[NativeWebSocket] 瑙f瀽鍏抽棴浠g爜: {closeCode}");
+                            break;
+                        }
+                    }
+                }
+                
+                // 濡傛灉寰幆姝e父閫�鍑猴紙鑰岄潪 break锛夛紝璇存槑 socket 鐘舵�佹敼鍙樹簡
+                if (m_Socket.State != System.Net.WebSockets.WebSocketState.Open)
+                {
+                    Debug.LogWarning($"[NativeWebSocket] while 寰幆閫�鍑�: Socket.State 鍙樹负 {m_Socket.State} (鎬诲叡鎺ユ敹浜� {messageCount} 鏉℃秷鎭�)");
+                }
+            }
+            catch (Exception ex)
+            {
+                Debug.LogError($"[NativeWebSocket] Receive 寰幆寮傚父: {ex.GetType().Name}: {ex.Message}");
+                Debug.LogError($"[NativeWebSocket] 寮傚父鍫嗘爤:\n{ex.StackTrace}");
+                m_TokenSource.Cancel();
+            }
+            finally
+            {
+                Debug.LogWarning($"[NativeWebSocket] Receive 寰幆缁撴潫, Socket.State = {m_Socket.State}, 鍑嗗瑙﹀彂 OnClose({closeCode})");
+                await new WaitForUpdate();
+                OnClose?.Invoke(closeCode);
+            }
+        }
+
+        public async Task Close()
+        {
+            if (State == WebSocketState.Open)
+            {
+                await m_Socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, m_CancellationToken);
+            }
+        }
+    }
+#endif
+
+    ///
+    /// Factory
+    ///
+
+    /// <summary>
+    /// Class providing static access methods to work with JSLIB WebSocket or WebSocketSharp interface
+    /// </summary>
+    public static class WebSocketFactory
+    {
+
+#if UNITY_WEBGL && !UNITY_EDITOR
+    /* Map of websocket instances */
+    public static Dictionary<Int32, WebSocket> instances = new Dictionary<Int32, WebSocket> ();
+
+    /* Delegates */
+    public delegate void OnOpenCallback (int instanceId);
+    public delegate void OnMessageCallback (int instanceId, System.IntPtr msgPtr, int msgSize);
+    public delegate void OnErrorCallback (int instanceId, System.IntPtr errorPtr);
+    public delegate void OnCloseCallback (int instanceId, int closeCode);
+
+    /* WebSocket JSLIB callback setters and other functions */
+    [DllImport ("__Internal")]
+    public static extern int WebSocketAllocate (string url);
+
+    [DllImport ("__Internal")]
+    public static extern int WebSocketAddSubProtocol (int instanceId, string subprotocol);
+
+    [DllImport ("__Internal")]
+    public static extern void WebSocketFree (int instanceId);
+
+    [DllImport ("__Internal")]
+    public static extern void WebSocketSetOnOpen (OnOpenCallback callback);
+
+    [DllImport ("__Internal")]
+    public static extern void WebSocketSetOnMessage (OnMessageCallback callback);
+
+    [DllImport ("__Internal")]
+    public static extern void WebSocketSetOnError (OnErrorCallback callback);
+
+    [DllImport ("__Internal")]
+    public static extern void WebSocketSetOnClose (OnCloseCallback callback);
+
+    /* If callbacks was initialized and set */
+    public static bool isInitialized = false;
+
+    /*
+     * Initialize WebSocket callbacks to JSLIB
+     */
+    public static void Initialize () {
+
+      WebSocketSetOnOpen (DelegateOnOpenEvent);
+      WebSocketSetOnMessage (DelegateOnMessageEvent);
+      WebSocketSetOnError (DelegateOnErrorEvent);
+      WebSocketSetOnClose (DelegateOnCloseEvent);
+
+      isInitialized = true;
+
+    }
+
+    /// <summary>
+    /// Called when instance is destroyed (by destructor)
+    /// Method removes instance from map and free it in JSLIB implementation
+    /// </summary>
+    /// <param name="instanceId">Instance identifier.</param>
+    public static void HandleInstanceDestroy (int instanceId) {
+
+      instances.Remove (instanceId);
+      WebSocketFree (instanceId);
+
+    }
+
+    [MonoPInvokeCallback (typeof (OnOpenCallback))]
+    public static void DelegateOnOpenEvent (int instanceId) {
+
+      WebSocket instanceRef;
+
+      if (instances.TryGetValue (instanceId, out instanceRef)) {
+        instanceRef.DelegateOnOpenEvent ();
+      }
+
+    }
+
+    [MonoPInvokeCallback (typeof (OnMessageCallback))]
+    public static void DelegateOnMessageEvent (int instanceId, System.IntPtr msgPtr, int msgSize) {
+
+      WebSocket instanceRef;
+
+      if (instances.TryGetValue (instanceId, out instanceRef)) {
+        byte[] msg = new byte[msgSize];
+        Marshal.Copy (msgPtr, msg, 0, msgSize);
+
+        instanceRef.DelegateOnMessageEvent (msg);
+      }
+
+    }
+
+    [MonoPInvokeCallback (typeof (OnErrorCallback))]
+    public static void DelegateOnErrorEvent (int instanceId, System.IntPtr errorPtr) {
+
+      WebSocket instanceRef;
+
+      if (instances.TryGetValue (instanceId, out instanceRef)) {
+
+        string errorMsg = Marshal.PtrToStringAuto (errorPtr);
+        instanceRef.DelegateOnErrorEvent (errorMsg);
+
+      }
+
+    }
+
+    [MonoPInvokeCallback (typeof (OnCloseCallback))]
+    public static void DelegateOnCloseEvent (int instanceId, int closeCode) {
+
+      WebSocket instanceRef;
+
+      if (instances.TryGetValue (instanceId, out instanceRef)) {
+        instanceRef.DelegateOnCloseEvent (closeCode);
+      }
+
+    }
+#endif
+
+        /// <summary>
+        /// Create WebSocket client instance
+        /// </summary>
+        /// <returns>The WebSocket instance.</returns>
+        /// <param name="url">WebSocket valid URL.</param>
+        public static WebSocket CreateInstance(string url)
+        {
+            return new WebSocket(url);
+        }
+
+    }
+
+}
diff --git a/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.cs.meta b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.cs.meta
new file mode 100644
index 0000000..708e6f1
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: df0e653fbf9005342904aa0f14d46088
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.jslib b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.jslib
new file mode 100644
index 0000000..9d8e42f
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.jslib
@@ -0,0 +1,333 @@
+
+var LibraryWebSocket = {
+	$webSocketState: {
+		/*
+		 * Map of instances
+		 *
+		 * Instance structure:
+		 * {
+		 * 	url: string,
+		 * 	ws: WebSocket
+		 * }
+		 */
+		instances: {},
+
+		/* Last instance ID */
+		lastId: 0,
+
+		/* Event listeners */
+		onOpen: null,
+		onMessage: null,
+		onError: null,
+		onClose: null,
+
+		/* Debug mode */
+		debug: false
+	},
+
+	/**
+	 * Set onOpen callback
+	 *
+	 * @param callback Reference to C# static function
+	 */
+	WebSocketSetOnOpen: function(callback) {
+
+		webSocketState.onOpen = callback;
+
+	},
+
+	/**
+	 * Set onMessage callback
+	 *
+	 * @param callback Reference to C# static function
+	 */
+	WebSocketSetOnMessage: function(callback) {
+
+		webSocketState.onMessage = callback;
+
+	},
+
+	/**
+	 * Set onError callback
+	 *
+	 * @param callback Reference to C# static function
+	 */
+	WebSocketSetOnError: function(callback) {
+
+		webSocketState.onError = callback;
+
+	},
+
+	/**
+	 * Set onClose callback
+	 *
+	 * @param callback Reference to C# static function
+	 */
+	WebSocketSetOnClose: function(callback) {
+
+		webSocketState.onClose = callback;
+
+	},
+
+	/**
+	 * Allocate new WebSocket instance struct
+	 *
+	 * @param url Server URL
+	 */
+	WebSocketAllocate: function(url) {
+
+		var urlStr = UTF8ToString(url);
+		var id = webSocketState.lastId++;
+
+		webSocketState.instances[id] = {
+		  subprotocols: [],
+			url: urlStr,
+			ws: null
+		};
+
+		return id;
+
+	},
+
+  /**
+   * Add subprotocol to instance
+   *
+   * @param instanceId Instance ID
+   * @param subprotocol Subprotocol name to add to instance
+   */
+  WebSocketAddSubProtocol: function(instanceId, subprotocol) {
+
+    var subprotocolStr = UTF8ToString(subprotocol);
+    webSocketState.instances[instanceId].subprotocols.push(subprotocolStr);
+
+  },
+
+	/**
+	 * Remove reference to WebSocket instance
+	 *
+	 * If socket is not closed function will close it but onClose event will not be emitted because
+	 * this function should be invoked by C# WebSocket destructor.
+	 *
+	 * @param instanceId Instance ID
+	 */
+	WebSocketFree: function(instanceId) {
+
+		var instance = webSocketState.instances[instanceId];
+
+		if (!instance) return 0;
+
+		// Close if not closed
+		if (instance.ws && instance.ws.readyState < 2)
+			instance.ws.close();
+
+		// Remove reference
+		delete webSocketState.instances[instanceId];
+
+		return 0;
+
+	},
+
+	/**
+	 * Connect WebSocket to the server
+	 *
+	 * @param instanceId Instance ID
+	 */
+	WebSocketConnect: function(instanceId) {
+
+		var instance = webSocketState.instances[instanceId];
+		if (!instance) return -1;
+
+		if (instance.ws !== null)
+			return -2;
+
+		instance.ws = new WebSocket(instance.url, instance.subprotocols);
+
+		instance.ws.binaryType = 'arraybuffer';
+
+		instance.ws.onopen = function() {
+
+			if (webSocketState.debug)
+				console.log("[JSLIB WebSocket] Connected.");
+
+			if (webSocketState.onOpen)
+				Module.dynCall_vi(webSocketState.onOpen, instanceId);
+
+		};
+
+		instance.ws.onmessage = function(ev) {
+
+			if (webSocketState.debug)
+				console.log("[JSLIB WebSocket] Received message:", ev.data);
+
+			if (webSocketState.onMessage === null)
+				return;
+
+			if (ev.data instanceof ArrayBuffer) {
+
+				var dataBuffer = new Uint8Array(ev.data);
+
+				var buffer = _malloc(dataBuffer.length);
+				HEAPU8.set(dataBuffer, buffer);
+
+				try {
+					Module.dynCall_viii(webSocketState.onMessage, instanceId, buffer, dataBuffer.length);
+				} finally {
+					_free(buffer);
+				}
+
+      } else {
+				var dataBuffer = (new TextEncoder()).encode(ev.data);
+
+				var buffer = _malloc(dataBuffer.length);
+				HEAPU8.set(dataBuffer, buffer);
+
+				try {
+					Module.dynCall_viii(webSocketState.onMessage, instanceId, buffer, dataBuffer.length);
+				} finally {
+					_free(buffer);
+				}
+
+      }
+
+		};
+
+		instance.ws.onerror = function(ev) {
+
+			if (webSocketState.debug)
+				console.log("[JSLIB WebSocket] Error occured.");
+
+			if (webSocketState.onError) {
+
+				var msg = "WebSocket error.";
+				var length = lengthBytesUTF8(msg) + 1;
+				var buffer = _malloc(length);
+				stringToUTF8(msg, buffer, length);
+
+				try {
+					Module.dynCall_vii(webSocketState.onError, instanceId, buffer);
+				} finally {
+					_free(buffer);
+				}
+
+			}
+
+		};
+
+		instance.ws.onclose = function(ev) {
+
+			if (webSocketState.debug)
+				console.log("[JSLIB WebSocket] Closed.");
+
+			if (webSocketState.onClose)
+				Module.dynCall_vii(webSocketState.onClose, instanceId, ev.code);
+
+			delete instance.ws;
+
+		};
+
+		return 0;
+
+	},
+
+	/**
+	 * Close WebSocket connection
+	 *
+	 * @param instanceId Instance ID
+	 * @param code Close status code
+	 * @param reasonPtr Pointer to reason string
+	 */
+	WebSocketClose: function(instanceId, code, reasonPtr) {
+
+		var instance = webSocketState.instances[instanceId];
+		if (!instance) return -1;
+
+		if (!instance.ws)
+			return -3;
+
+		if (instance.ws.readyState === 2)
+			return -4;
+
+		if (instance.ws.readyState === 3)
+			return -5;
+
+		var reason = ( reasonPtr ? UTF8ToString(reasonPtr) : undefined );
+
+		try {
+			instance.ws.close(code, reason);
+		} catch(err) {
+			return -7;
+		}
+
+		return 0;
+
+	},
+
+	/**
+	 * Send message over WebSocket
+	 *
+	 * @param instanceId Instance ID
+	 * @param bufferPtr Pointer to the message buffer
+	 * @param length Length of the message in the buffer
+	 */
+	WebSocketSend: function(instanceId, bufferPtr, length) {
+
+		var instance = webSocketState.instances[instanceId];
+		if (!instance) return -1;
+
+		if (!instance.ws)
+			return -3;
+
+		if (instance.ws.readyState !== 1)
+			return -6;
+
+		instance.ws.send(HEAPU8.buffer.slice(bufferPtr, bufferPtr + length));
+
+		return 0;
+
+	},
+
+	/**
+	 * Send text message over WebSocket
+	 *
+	 * @param instanceId Instance ID
+	 * @param bufferPtr Pointer to the message buffer
+	 * @param length Length of the message in the buffer
+	 */
+	WebSocketSendText: function(instanceId, message) {
+
+		var instance = webSocketState.instances[instanceId];
+		if (!instance) return -1;
+
+		if (!instance.ws)
+			return -3;
+
+		if (instance.ws.readyState !== 1)
+			return -6;
+
+		instance.ws.send(UTF8ToString(message));
+
+		return 0;
+
+	},
+
+	/**
+	 * Return WebSocket readyState
+	 *
+	 * @param instanceId Instance ID
+	 */
+	WebSocketGetState: function(instanceId) {
+
+		var instance = webSocketState.instances[instanceId];
+		if (!instance) return -1;
+
+		if (instance.ws)
+			return instance.ws.readyState;
+		else
+			return 3;
+
+	}
+
+};
+
+autoAddDeps(LibraryWebSocket, '$webSocketState');
+mergeInto(LibraryManager.library, LibraryWebSocket);
diff --git a/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.jslib.meta b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.jslib.meta
new file mode 100644
index 0000000..a4f0052
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/WebSocket.jslib.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: 3b767cc116f846f4b813fe00142b8736
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        DefaultValueInitialized: true
+  - first:
+      WebGL: WebGL
+    second:
+      enabled: 1
+      settings: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Assets/WebSocket/endel.nativewebsocket.asmdef b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/endel.nativewebsocket.asmdef
new file mode 100644
index 0000000..871f704
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/endel.nativewebsocket.asmdef
@@ -0,0 +1,3 @@
+锘縶
+	"name": "endel.nativewebsocket"
+}
diff --git a/Assets/Plugins/NativeWebSocket/Assets/WebSocket/endel.nativewebsocket.asmdef.meta b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/endel.nativewebsocket.asmdef.meta
new file mode 100644
index 0000000..01d2d89
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/WebSocket/endel.nativewebsocket.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 04376767bc1f3b428aefa3d20743e819
+AssemblyDefinitionImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Assets/WebSocketExample.meta b/Assets/Plugins/NativeWebSocket/Assets/WebSocketExample.meta
new file mode 100644
index 0000000..fecdc8e
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/WebSocketExample.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e7a91621cd77941248ad2d795977b3c7
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Assets/package.json b/Assets/Plugins/NativeWebSocket/Assets/package.json
new file mode 100644
index 0000000..e22fe68
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/package.json
@@ -0,0 +1,30 @@
+{
+  "name": "com.endel.nativewebsocket",
+  "version": "1.1.5",
+  "description": "WebSocket client for Unity - with no external dependencies (WebGL, Native, Android, iOS, UWP).",
+  "license": "Apache 2.0",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/endel/NativeWebSocket.git"
+  },
+  "author": {
+    "name": "Endel Dreyer",
+    "email": "endel.dreyer@gmail.com",
+    "url": "https://github.com/endel/NativeWebSocket"
+  },
+  "keywords": [
+    "websocket",
+    "websockets",
+    "native websocket",
+    "native websockets"
+  ],
+  "displayName": "Native WebSockets",
+  "unity": "2019.1",
+  "dependencies": {},
+  "samples": [
+  {
+      "displayName": "Example",
+      "description": "WebSocket Example",
+      "path": "Samples~/WebSocketExample"
+  } ]
+}
diff --git a/Assets/Plugins/NativeWebSocket/Assets/package.json.meta b/Assets/Plugins/NativeWebSocket/Assets/package.json.meta
new file mode 100644
index 0000000..401838d
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Assets/package.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a9f6363663f95e3499b2616618078182
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Packages.meta b/Assets/Plugins/NativeWebSocket/Packages.meta
new file mode 100644
index 0000000..c15b1cf
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Packages.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8bbc55076af30414ca675b35a87b65b1
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/Packages/manifest.json b/Assets/Plugins/NativeWebSocket/Packages/manifest.json
new file mode 100644
index 0000000..e3a5edd
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Packages/manifest.json
@@ -0,0 +1,44 @@
+{
+  "dependencies": {
+    "com.unity.collab-proxy": "1.15.7",
+    "com.unity.ext.nunit": "1.0.6",
+    "com.unity.ide.rider": "3.0.9",
+    "com.unity.ide.visualstudio": "2.0.14",
+    "com.unity.ide.vscode": "1.2.4",
+    "com.unity.test-framework": "1.1.29",
+    "com.unity.textmeshpro": "3.0.6",
+    "com.unity.timeline": "1.6.3",
+    "com.unity.ugui": "1.0.0",
+    "com.unity.modules.ai": "1.0.0",
+    "com.unity.modules.androidjni": "1.0.0",
+    "com.unity.modules.animation": "1.0.0",
+    "com.unity.modules.assetbundle": "1.0.0",
+    "com.unity.modules.audio": "1.0.0",
+    "com.unity.modules.cloth": "1.0.0",
+    "com.unity.modules.director": "1.0.0",
+    "com.unity.modules.imageconversion": "1.0.0",
+    "com.unity.modules.imgui": "1.0.0",
+    "com.unity.modules.jsonserialize": "1.0.0",
+    "com.unity.modules.particlesystem": "1.0.0",
+    "com.unity.modules.physics": "1.0.0",
+    "com.unity.modules.physics2d": "1.0.0",
+    "com.unity.modules.screencapture": "1.0.0",
+    "com.unity.modules.terrain": "1.0.0",
+    "com.unity.modules.terrainphysics": "1.0.0",
+    "com.unity.modules.tilemap": "1.0.0",
+    "com.unity.modules.ui": "1.0.0",
+    "com.unity.modules.uielements": "1.0.0",
+    "com.unity.modules.umbra": "1.0.0",
+    "com.unity.modules.unityanalytics": "1.0.0",
+    "com.unity.modules.unitywebrequest": "1.0.0",
+    "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
+    "com.unity.modules.unitywebrequestaudio": "1.0.0",
+    "com.unity.modules.unitywebrequesttexture": "1.0.0",
+    "com.unity.modules.unitywebrequestwww": "1.0.0",
+    "com.unity.modules.vehicles": "1.0.0",
+    "com.unity.modules.video": "1.0.0",
+    "com.unity.modules.vr": "1.0.0",
+    "com.unity.modules.wind": "1.0.0",
+    "com.unity.modules.xr": "1.0.0"
+  }
+}
diff --git a/Assets/Plugins/NativeWebSocket/Packages/manifest.json.meta b/Assets/Plugins/NativeWebSocket/Packages/manifest.json.meta
new file mode 100644
index 0000000..f21371f
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/Packages/manifest.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5b24aa2b7a69d74408d58938eff2e11f
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings.meta
new file mode 100644
index 0000000..df11da7
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6e40619030428ac4f991e5091c1c0a15
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/AudioManager.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/AudioManager.asset
new file mode 100644
index 0000000..07ebfb0
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/AudioManager.asset
@@ -0,0 +1,19 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!11 &1
+AudioManager:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Volume: 1
+  Rolloff Scale: 1
+  Doppler Factor: 1
+  Default Speaker Mode: 2
+  m_SampleRate: 0
+  m_DSPBufferSize: 1024
+  m_VirtualVoiceCount: 512
+  m_RealVoiceCount: 32
+  m_SpatializerPlugin: 
+  m_AmbisonicDecoderPlugin: 
+  m_DisableAudio: 0
+  m_VirtualizeEffects: 1
+  m_RequestedDSPBufferSize: 1024
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/AudioManager.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/AudioManager.asset.meta
new file mode 100644
index 0000000..9cc128c
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/AudioManager.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 184d050d48821ad4e96803db836be878
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/ClusterInputManager.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/ClusterInputManager.asset
new file mode 100644
index 0000000..e7886b2
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/ClusterInputManager.asset
@@ -0,0 +1,6 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!236 &1
+ClusterInputManager:
+  m_ObjectHideFlags: 0
+  m_Inputs: []
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/ClusterInputManager.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/ClusterInputManager.asset.meta
new file mode 100644
index 0000000..dfa2e25
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/ClusterInputManager.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6d7e0816e1f6f954f980a63fcec873a3
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/DynamicsManager.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/DynamicsManager.asset
new file mode 100644
index 0000000..cdc1f3e
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/DynamicsManager.asset
@@ -0,0 +1,34 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!55 &1
+PhysicsManager:
+  m_ObjectHideFlags: 0
+  serializedVersion: 11
+  m_Gravity: {x: 0, y: -9.81, z: 0}
+  m_DefaultMaterial: {fileID: 0}
+  m_BounceThreshold: 2
+  m_SleepThreshold: 0.005
+  m_DefaultContactOffset: 0.01
+  m_DefaultSolverIterations: 6
+  m_DefaultSolverVelocityIterations: 1
+  m_QueriesHitBackfaces: 0
+  m_QueriesHitTriggers: 1
+  m_EnableAdaptiveForce: 0
+  m_ClothInterCollisionDistance: 0
+  m_ClothInterCollisionStiffness: 0
+  m_ContactsGeneration: 1
+  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+  m_AutoSimulation: 1
+  m_AutoSyncTransforms: 0
+  m_ReuseCollisionCallbacks: 1
+  m_ClothInterCollisionSettingsToggle: 0
+  m_ContactPairsMode: 0
+  m_BroadphaseType: 0
+  m_WorldBounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 250, y: 250, z: 250}
+  m_WorldSubdivisions: 8
+  m_FrictionType: 0
+  m_EnableEnhancedDeterminism: 0
+  m_EnableUnifiedHeightmaps: 1
+  m_DefaultMaxAngluarSpeed: 7
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/DynamicsManager.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/DynamicsManager.asset.meta
new file mode 100644
index 0000000..976296f
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/DynamicsManager.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4b0aa778b779eed47beaf00949f3c6e0
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorBuildSettings.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorBuildSettings.asset
new file mode 100644
index 0000000..0147887
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorBuildSettings.asset
@@ -0,0 +1,8 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1045 &1
+EditorBuildSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Scenes: []
+  m_configObjects: {}
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorBuildSettings.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorBuildSettings.asset.meta
new file mode 100644
index 0000000..6284600
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorBuildSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5811c637782239240a969e11a0bb0ad4
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorSettings.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorSettings.asset
new file mode 100644
index 0000000..e4a3012
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorSettings.asset
@@ -0,0 +1,39 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!159 &1
+EditorSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 11
+  m_SerializationMode: 2
+  m_LineEndingsForNewScripts: 2
+  m_DefaultBehaviorMode: 0
+  m_PrefabRegularEnvironment: {fileID: 0}
+  m_PrefabUIEnvironment: {fileID: 0}
+  m_SpritePackerMode: 0
+  m_SpritePackerPaddingPower: 1
+  m_EtcTextureCompressorBehavior: 1
+  m_EtcTextureFastCompressor: 1
+  m_EtcTextureNormalCompressor: 2
+  m_EtcTextureBestCompressor: 4
+  m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref
+  m_ProjectGenerationRootNamespace: 
+  m_EnableTextureStreamingInEditMode: 1
+  m_EnableTextureStreamingInPlayMode: 1
+  m_AsyncShaderCompilation: 1
+  m_CachingShaderPreprocessor: 0
+  m_EnterPlayModeOptionsEnabled: 0
+  m_EnterPlayModeOptions: 3
+  m_GameObjectNamingDigits: 1
+  m_GameObjectNamingScheme: 0
+  m_AssetNamingUsesSpace: 1
+  m_UseLegacyProbeSampleCount: 1
+  m_SerializeInlineMappingsOnOneLine: 0
+  m_DisableCookiesInLightmapper: 1
+  m_AssetPipelineMode: 1
+  m_CacheServerMode: 0
+  m_CacheServerEndpoint: 
+  m_CacheServerNamespacePrefix: default
+  m_CacheServerEnableDownload: 1
+  m_CacheServerEnableUpload: 1
+  m_CacheServerEnableAuth: 0
+  m_CacheServerEnableTls: 0
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorSettings.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorSettings.asset.meta
new file mode 100644
index 0000000..816a211
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/EditorSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3096faf0a519a3345875c12aadc8f077
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/GraphicsSettings.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/GraphicsSettings.asset
new file mode 100644
index 0000000..f3874f6
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/GraphicsSettings.asset
@@ -0,0 +1,64 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!30 &1
+GraphicsSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 12
+  m_Deferred:
+    m_Mode: 1
+    m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0}
+  m_DeferredReflections:
+    m_Mode: 1
+    m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0}
+  m_ScreenSpaceShadows:
+    m_Mode: 1
+    m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0}
+  m_LegacyDeferred:
+    m_Mode: 1
+    m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0}
+  m_DepthNormals:
+    m_Mode: 1
+    m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0}
+  m_MotionVectors:
+    m_Mode: 1
+    m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0}
+  m_LightHalo:
+    m_Mode: 1
+    m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0}
+  m_LensFlare:
+    m_Mode: 1
+    m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0}
+  m_AlwaysIncludedShaders:
+  - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0}
+  m_PreloadedShaders: []
+  m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000,
+    type: 0}
+  m_CustomRenderPipeline: {fileID: 0}
+  m_TransparencySortMode: 0
+  m_TransparencySortAxis: {x: 0, y: 0, z: 1}
+  m_DefaultRenderingPath: 1
+  m_DefaultMobileRenderingPath: 1
+  m_TierSettings: []
+  m_LightmapStripping: 0
+  m_FogStripping: 0
+  m_InstancingStripping: 0
+  m_LightmapKeepPlain: 1
+  m_LightmapKeepDirCombined: 1
+  m_LightmapKeepDynamicPlain: 1
+  m_LightmapKeepDynamicDirCombined: 1
+  m_LightmapKeepShadowMask: 1
+  m_LightmapKeepSubtractive: 1
+  m_FogKeepLinear: 1
+  m_FogKeepExp: 1
+  m_FogKeepExp2: 1
+  m_AlbedoSwatchInfos: []
+  m_LightsUseLinearIntensity: 0
+  m_LightsUseColorTemperature: 0
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/GraphicsSettings.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/GraphicsSettings.asset.meta
new file mode 100644
index 0000000..3c30a66
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/GraphicsSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9bb94c68e4b895944bc9fe8428e8d1a1
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/InputManager.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/InputManager.asset
new file mode 100644
index 0000000..17c8f53
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/InputManager.asset
@@ -0,0 +1,295 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!13 &1
+InputManager:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Axes:
+  - serializedVersion: 3
+    m_Name: Horizontal
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: left
+    positiveButton: right
+    altNegativeButton: a
+    altPositiveButton: d
+    gravity: 3
+    dead: 0.001
+    sensitivity: 3
+    snap: 1
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Vertical
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: down
+    positiveButton: up
+    altNegativeButton: s
+    altPositiveButton: w
+    gravity: 3
+    dead: 0.001
+    sensitivity: 3
+    snap: 1
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire1
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: left ctrl
+    altNegativeButton: 
+    altPositiveButton: mouse 0
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire2
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: left alt
+    altNegativeButton: 
+    altPositiveButton: mouse 1
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire3
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: left shift
+    altNegativeButton: 
+    altPositiveButton: mouse 2
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Jump
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: space
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Mouse X
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: 0
+    sensitivity: 0.1
+    snap: 0
+    invert: 0
+    type: 1
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Mouse Y
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: 0
+    sensitivity: 0.1
+    snap: 0
+    invert: 0
+    type: 1
+    axis: 1
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Mouse ScrollWheel
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: 0
+    sensitivity: 0.1
+    snap: 0
+    invert: 0
+    type: 1
+    axis: 2
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Horizontal
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: 0.19
+    sensitivity: 1
+    snap: 0
+    invert: 0
+    type: 2
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Vertical
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: 0.19
+    sensitivity: 1
+    snap: 0
+    invert: 1
+    type: 2
+    axis: 1
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire1
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: joystick button 0
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire2
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: joystick button 1
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire3
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: joystick button 2
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Jump
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: joystick button 3
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Submit
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: return
+    altNegativeButton: 
+    altPositiveButton: joystick button 0
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Submit
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: enter
+    altNegativeButton: 
+    altPositiveButton: space
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Cancel
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: escape
+    altNegativeButton: 
+    altPositiveButton: joystick button 1
+    gravity: 1000
+    dead: 0.001
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/InputManager.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/InputManager.asset.meta
new file mode 100644
index 0000000..9e861e7
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/InputManager.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0ca235914a8dbb14b920c843bb371296
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/NavMeshAreas.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/NavMeshAreas.asset
new file mode 100644
index 0000000..ad2654e
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/NavMeshAreas.asset
@@ -0,0 +1,93 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!126 &1
+NavMeshProjectSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  areas:
+  - name: Walkable
+    cost: 1
+  - name: Not Walkable
+    cost: 1
+  - name: Jump
+    cost: 2
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  - name: 
+    cost: 1
+  m_LastAgentTypeID: -887442657
+  m_Settings:
+  - serializedVersion: 2
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.75
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666667
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+    maxJobWorkers: 0
+    preserveTilesOutsideBounds: 0
+    debug:
+      m_Flags: 0
+  m_SettingNames:
+  - Humanoid
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/NavMeshAreas.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/NavMeshAreas.asset.meta
new file mode 100644
index 0000000..263168b
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/NavMeshAreas.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f2a9df8bf6aa053489112541146ac1bf
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/Physics2DSettings.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/Physics2DSettings.asset
new file mode 100644
index 0000000..47880b1
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/Physics2DSettings.asset
@@ -0,0 +1,56 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!19 &1
+Physics2DSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 4
+  m_Gravity: {x: 0, y: -9.81}
+  m_DefaultMaterial: {fileID: 0}
+  m_VelocityIterations: 8
+  m_PositionIterations: 3
+  m_VelocityThreshold: 1
+  m_MaxLinearCorrection: 0.2
+  m_MaxAngularCorrection: 8
+  m_MaxTranslationSpeed: 100
+  m_MaxRotationSpeed: 360
+  m_BaumgarteScale: 0.2
+  m_BaumgarteTimeOfImpactScale: 0.75
+  m_TimeToSleep: 0.5
+  m_LinearSleepTolerance: 0.01
+  m_AngularSleepTolerance: 2
+  m_DefaultContactOffset: 0.01
+  m_JobOptions:
+    serializedVersion: 2
+    useMultithreading: 0
+    useConsistencySorting: 0
+    m_InterpolationPosesPerJob: 100
+    m_NewContactsPerJob: 30
+    m_CollideContactsPerJob: 100
+    m_ClearFlagsPerJob: 200
+    m_ClearBodyForcesPerJob: 200
+    m_SyncDiscreteFixturesPerJob: 50
+    m_SyncContinuousFixturesPerJob: 50
+    m_FindNearestContactsPerJob: 100
+    m_UpdateTriggerContactsPerJob: 100
+    m_IslandSolverCostThreshold: 100
+    m_IslandSolverBodyCostScale: 1
+    m_IslandSolverContactCostScale: 10
+    m_IslandSolverJointCostScale: 10
+    m_IslandSolverBodiesPerJob: 50
+    m_IslandSolverContactsPerJob: 50
+  m_AutoSimulation: 1
+  m_QueriesHitTriggers: 1
+  m_QueriesStartInColliders: 1
+  m_CallbacksOnDisable: 1
+  m_ReuseCollisionCallbacks: 1
+  m_AutoSyncTransforms: 0
+  m_AlwaysShowColliders: 0
+  m_ShowColliderSleep: 1
+  m_ShowColliderContacts: 0
+  m_ShowColliderAABB: 0
+  m_ContactArrowScale: 0.2
+  m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412}
+  m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}
+  m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
+  m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}
+  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/Physics2DSettings.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/Physics2DSettings.asset.meta
new file mode 100644
index 0000000..0b39547
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/Physics2DSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2933f84a479545d429e68f90428d316c
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/PresetManager.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/PresetManager.asset
new file mode 100644
index 0000000..67a94da
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/PresetManager.asset
@@ -0,0 +1,7 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1386491679 &1
+PresetManager:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_DefaultPresets: {}
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/PresetManager.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/PresetManager.asset.meta
new file mode 100644
index 0000000..7a28d87
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/PresetManager.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 587504546c55949429325bd519886328
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectSettings.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectSettings.asset
new file mode 100644
index 0000000..3f11c92
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectSettings.asset
@@ -0,0 +1,650 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!129 &1
+PlayerSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 18
+  productGUID: dc7225b1f8ee64a3abfd6eb883cd32ec
+  AndroidProfiler: 0
+  AndroidFilterTouchesWhenObscured: 0
+  AndroidEnableSustainedPerformanceMode: 0
+  defaultScreenOrientation: 4
+  targetDevice: 2
+  useOnDemandResources: 0
+  accelerometerFrequency: 60
+  companyName: gamestdio
+  productName: UnityWebSockets
+  defaultCursor: {fileID: 0}
+  cursorHotspot: {x: 0, y: 0}
+  m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}
+  m_ShowUnitySplashScreen: 1
+  m_ShowUnitySplashLogo: 1
+  m_SplashScreenOverlayOpacity: 1
+  m_SplashScreenAnimation: 1
+  m_SplashScreenLogoStyle: 1
+  m_SplashScreenDrawMode: 0
+  m_SplashScreenBackgroundAnimationZoom: 1
+  m_SplashScreenLogoAnimationZoom: 1
+  m_SplashScreenBackgroundLandscapeAspect: 1
+  m_SplashScreenBackgroundPortraitAspect: 1
+  m_SplashScreenBackgroundLandscapeUvs:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  m_SplashScreenBackgroundPortraitUvs:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  m_SplashScreenLogos: []
+  m_VirtualRealitySplashScreen: {fileID: 0}
+  m_HolographicTrackingLossScreen: {fileID: 0}
+  defaultScreenWidth: 1024
+  defaultScreenHeight: 768
+  defaultScreenWidthWeb: 960
+  defaultScreenHeightWeb: 600
+  m_StereoRenderingPath: 0
+  m_ActiveColorSpace: 0
+  m_MTRendering: 1
+  m_StackTraceTypes: 010000000100000001000000010000000100000001000000
+  iosShowActivityIndicatorOnLoading: -1
+  androidShowActivityIndicatorOnLoading: -1
+  displayResolutionDialog: 0
+  iosUseCustomAppBackgroundBehavior: 0
+  iosAllowHTTPDownload: 1
+  allowedAutorotateToPortrait: 1
+  allowedAutorotateToPortraitUpsideDown: 1
+  allowedAutorotateToLandscapeRight: 1
+  allowedAutorotateToLandscapeLeft: 1
+  useOSAutorotation: 1
+  use32BitDisplayBuffer: 1
+  preserveFramebufferAlpha: 0
+  disableDepthAndStencilBuffers: 0
+  androidStartInFullscreen: 1
+  androidRenderOutsideSafeArea: 1
+  androidUseSwappy: 0
+  androidBlitType: 0
+  defaultIsNativeResolution: 1
+  macRetinaSupport: 1
+  runInBackground: 1
+  captureSingleScreen: 0
+  muteOtherAudioSources: 0
+  Prepare IOS For Recording: 0
+  Force IOS Speakers When Recording: 0
+  deferSystemGesturesMode: 0
+  hideHomeButton: 0
+  submitAnalytics: 1
+  usePlayerLog: 1
+  bakeCollisionMeshes: 0
+  forceSingleInstance: 0
+  useFlipModelSwapchain: 1
+  resizableWindow: 0
+  useMacAppStoreValidation: 0
+  macAppStoreCategory: public.app-category.games
+  gpuSkinning: 1
+  graphicsJobs: 0
+  xboxPIXTextureCapture: 0
+  xboxEnableAvatar: 0
+  xboxEnableKinect: 0
+  xboxEnableKinectAutoTracking: 0
+  xboxEnableFitness: 0
+  visibleInBackground: 1
+  allowFullscreenSwitch: 1
+  graphicsJobMode: 0
+  fullscreenMode: 1
+  xboxSpeechDB: 0
+  xboxEnableHeadOrientation: 0
+  xboxEnableGuest: 0
+  xboxEnablePIXSampling: 0
+  metalFramebufferOnly: 0
+  xboxOneResolution: 0
+  xboxOneSResolution: 0
+  xboxOneXResolution: 3
+  xboxOneMonoLoggingLevel: 0
+  xboxOneLoggingLevel: 1
+  xboxOneDisableEsram: 0
+  xboxOnePresentImmediateThreshold: 0
+  switchQueueCommandMemory: 0
+  switchQueueControlMemory: 16384
+  switchQueueComputeMemory: 262144
+  switchNVNShaderPoolsGranularity: 33554432
+  switchNVNDefaultPoolsGranularity: 16777216
+  switchNVNOtherPoolsGranularity: 16777216
+  vulkanEnableSetSRGBWrite: 0
+  m_SupportedAspectRatios:
+    4:3: 1
+    5:4: 1
+    16:10: 1
+    16:9: 1
+    Others: 1
+  bundleVersion: 1.0
+  preloadedAssets: []
+  metroInputSource: 0
+  wsaTransparentSwapchain: 0
+  m_HolographicPauseOnTrackingLoss: 1
+  xboxOneDisableKinectGpuReservation: 1
+  xboxOneEnable7thCore: 1
+  vrSettings:
+    cardboard:
+      depthFormat: 0
+      enableTransitionView: 0
+    daydream:
+      depthFormat: 0
+      useSustainedPerformanceMode: 0
+      enableVideoLayer: 0
+      useProtectedVideoMemory: 0
+      minimumSupportedHeadTracking: 0
+      maximumSupportedHeadTracking: 1
+    hololens:
+      depthFormat: 1
+      depthBufferSharingEnabled: 1
+    lumin:
+      depthFormat: 0
+      frameTiming: 2
+      enableGLCache: 0
+      glCacheMaxBlobSize: 524288
+      glCacheMaxFileSize: 8388608
+    oculus:
+      sharedDepthBuffer: 1
+      dashSupport: 1
+      lowOverheadMode: 0
+    enable360StereoCapture: 0
+  isWsaHolographicRemotingEnabled: 0
+  protectGraphicsMemory: 0
+  enableFrameTimingStats: 0
+  useHDRDisplay: 0
+  m_ColorGamuts: 00000000
+  targetPixelDensity: 30
+  resolutionScalingMode: 0
+  androidSupportedAspectRatio: 1
+  androidMaxAspectRatio: 2.1
+  applicationIdentifier: {}
+  buildNumber: {}
+  AndroidBundleVersionCode: 1
+  AndroidMinSdkVersion: 16
+  AndroidTargetSdkVersion: 0
+  AndroidPreferredInstallLocation: 1
+  aotOptions: 
+  stripEngineCode: 1
+  iPhoneStrippingLevel: 0
+  iPhoneScriptCallOptimization: 0
+  ForceInternetPermission: 0
+  ForceSDCardPermission: 0
+  CreateWallpaper: 0
+  APKExpansionFiles: 0
+  keepLoadedShadersAlive: 0
+  StripUnusedMeshComponents: 1
+  VertexChannelCompressionMask: 4054
+  iPhoneSdkVersion: 988
+  iOSTargetOSVersionString: 9.0
+  tvOSSdkVersion: 0
+  tvOSRequireExtendedGameController: 0
+  tvOSTargetOSVersionString: 9.0
+  uIPrerenderedIcon: 0
+  uIRequiresPersistentWiFi: 0
+  uIRequiresFullScreen: 1
+  uIStatusBarHidden: 1
+  uIExitOnSuspend: 0
+  uIStatusBarStyle: 0
+  iPhoneSplashScreen: {fileID: 0}
+  iPhoneHighResSplashScreen: {fileID: 0}
+  iPhoneTallHighResSplashScreen: {fileID: 0}
+  iPhone47inSplashScreen: {fileID: 0}
+  iPhone55inPortraitSplashScreen: {fileID: 0}
+  iPhone55inLandscapeSplashScreen: {fileID: 0}
+  iPhone58inPortraitSplashScreen: {fileID: 0}
+  iPhone58inLandscapeSplashScreen: {fileID: 0}
+  iPadPortraitSplashScreen: {fileID: 0}
+  iPadHighResPortraitSplashScreen: {fileID: 0}
+  iPadLandscapeSplashScreen: {fileID: 0}
+  iPadHighResLandscapeSplashScreen: {fileID: 0}
+  iPhone65inPortraitSplashScreen: {fileID: 0}
+  iPhone65inLandscapeSplashScreen: {fileID: 0}
+  iPhone61inPortraitSplashScreen: {fileID: 0}
+  iPhone61inLandscapeSplashScreen: {fileID: 0}
+  appleTVSplashScreen: {fileID: 0}
+  appleTVSplashScreen2x: {fileID: 0}
+  tvOSSmallIconLayers: []
+  tvOSSmallIconLayers2x: []
+  tvOSLargeIconLayers: []
+  tvOSLargeIconLayers2x: []
+  tvOSTopShelfImageLayers: []
+  tvOSTopShelfImageLayers2x: []
+  tvOSTopShelfImageWideLayers: []
+  tvOSTopShelfImageWideLayers2x: []
+  iOSLaunchScreenType: 0
+  iOSLaunchScreenPortrait: {fileID: 0}
+  iOSLaunchScreenLandscape: {fileID: 0}
+  iOSLaunchScreenBackgroundColor:
+    serializedVersion: 2
+    rgba: 0
+  iOSLaunchScreenFillPct: 100
+  iOSLaunchScreenSize: 100
+  iOSLaunchScreenCustomXibPath: 
+  iOSLaunchScreeniPadType: 0
+  iOSLaunchScreeniPadImage: {fileID: 0}
+  iOSLaunchScreeniPadBackgroundColor:
+    serializedVersion: 2
+    rgba: 0
+  iOSLaunchScreeniPadFillPct: 100
+  iOSLaunchScreeniPadSize: 100
+  iOSLaunchScreeniPadCustomXibPath: 
+  iOSUseLaunchScreenStoryboard: 0
+  iOSLaunchScreenCustomStoryboardPath: 
+  iOSDeviceRequirements: []
+  iOSURLSchemes: []
+  iOSBackgroundModes: 0
+  iOSMetalForceHardShadows: 0
+  metalEditorSupport: 1
+  metalAPIValidation: 1
+  iOSRenderExtraFrameOnPause: 0
+  appleDeveloperTeamID: 
+  iOSManualSigningProvisioningProfileID: 
+  tvOSManualSigningProvisioningProfileID: 
+  iOSManualSigningProvisioningProfileType: 0
+  tvOSManualSigningProvisioningProfileType: 0
+  appleEnableAutomaticSigning: 0
+  iOSRequireARKit: 0
+  iOSAutomaticallyDetectAndAddCapabilities: 1
+  appleEnableProMotion: 0
+  clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea
+  templatePackageId: com.unity.template.3d@3.1.0
+  templateDefaultScene: Assets/Scenes/SampleScene.unity
+  AndroidTargetArchitectures: 1
+  AndroidSplashScreenScale: 0
+  androidSplashScreen: {fileID: 0}
+  AndroidKeystoreName: '{inproject}: '
+  AndroidKeyaliasName: 
+  AndroidBuildApkPerCpuArchitecture: 0
+  AndroidTVCompatibility: 0
+  AndroidIsGame: 1
+  AndroidEnableTango: 0
+  androidEnableBanner: 1
+  androidUseLowAccuracyLocation: 0
+  androidUseCustomKeystore: 0
+  m_AndroidBanners:
+  - width: 320
+    height: 180
+    banner: {fileID: 0}
+  androidGamepadSupportLevel: 0
+  AndroidValidateAppBundleSize: 1
+  AndroidAppBundleSizeToValidate: 150
+  resolutionDialogBanner: {fileID: 0}
+  m_BuildTargetIcons: []
+  m_BuildTargetPlatformIcons: []
+  m_BuildTargetBatching:
+  - m_BuildTarget: Standalone
+    m_StaticBatching: 1
+    m_DynamicBatching: 0
+  - m_BuildTarget: tvOS
+    m_StaticBatching: 1
+    m_DynamicBatching: 0
+  - m_BuildTarget: Android
+    m_StaticBatching: 1
+    m_DynamicBatching: 0
+  - m_BuildTarget: iPhone
+    m_StaticBatching: 1
+    m_DynamicBatching: 0
+  - m_BuildTarget: WebGL
+    m_StaticBatching: 0
+    m_DynamicBatching: 0
+  m_BuildTargetGraphicsAPIs:
+  - m_BuildTarget: AndroidPlayer
+    m_APIs: 150000000b000000
+    m_Automatic: 0
+  - m_BuildTarget: iOSSupport
+    m_APIs: 10000000
+    m_Automatic: 1
+  - m_BuildTarget: AppleTVSupport
+    m_APIs: 10000000
+    m_Automatic: 0
+  - m_BuildTarget: WebGLSupport
+    m_APIs: 0b000000
+    m_Automatic: 1
+  m_BuildTargetVRSettings:
+  - m_BuildTarget: Standalone
+    m_Enabled: 0
+    m_Devices:
+    - Oculus
+    - OpenVR
+  openGLRequireES31: 0
+  openGLRequireES31AEP: 0
+  openGLRequireES32: 0
+  vuforiaEnabled: 0
+  m_TemplateCustomTags: {}
+  mobileMTRendering:
+    Android: 1
+    iPhone: 1
+    tvOS: 1
+  m_BuildTargetGroupLightmapEncodingQuality: []
+  m_BuildTargetGroupLightmapSettings: []
+  playModeTestRunnerEnabled: 0
+  runPlayModeTestAsEditModeTest: 0
+  actionOnDotNetUnhandledException: 1
+  enableInternalProfiler: 0
+  logObjCUncaughtExceptions: 1
+  enableCrashReportAPI: 0
+  cameraUsageDescription: 
+  locationUsageDescription: 
+  microphoneUsageDescription: 
+  switchNetLibKey: 
+  switchSocketMemoryPoolSize: 6144
+  switchSocketAllocatorPoolSize: 128
+  switchSocketConcurrencyLimit: 14
+  switchScreenResolutionBehavior: 2
+  switchUseCPUProfiler: 0
+  switchApplicationID: 0x01004b9000490000
+  switchNSODependencies: 
+  switchTitleNames_0: 
+  switchTitleNames_1: 
+  switchTitleNames_2: 
+  switchTitleNames_3: 
+  switchTitleNames_4: 
+  switchTitleNames_5: 
+  switchTitleNames_6: 
+  switchTitleNames_7: 
+  switchTitleNames_8: 
+  switchTitleNames_9: 
+  switchTitleNames_10: 
+  switchTitleNames_11: 
+  switchTitleNames_12: 
+  switchTitleNames_13: 
+  switchTitleNames_14: 
+  switchPublisherNames_0: 
+  switchPublisherNames_1: 
+  switchPublisherNames_2: 
+  switchPublisherNames_3: 
+  switchPublisherNames_4: 
+  switchPublisherNames_5: 
+  switchPublisherNames_6: 
+  switchPublisherNames_7: 
+  switchPublisherNames_8: 
+  switchPublisherNames_9: 
+  switchPublisherNames_10: 
+  switchPublisherNames_11: 
+  switchPublisherNames_12: 
+  switchPublisherNames_13: 
+  switchPublisherNames_14: 
+  switchIcons_0: {fileID: 0}
+  switchIcons_1: {fileID: 0}
+  switchIcons_2: {fileID: 0}
+  switchIcons_3: {fileID: 0}
+  switchIcons_4: {fileID: 0}
+  switchIcons_5: {fileID: 0}
+  switchIcons_6: {fileID: 0}
+  switchIcons_7: {fileID: 0}
+  switchIcons_8: {fileID: 0}
+  switchIcons_9: {fileID: 0}
+  switchIcons_10: {fileID: 0}
+  switchIcons_11: {fileID: 0}
+  switchIcons_12: {fileID: 0}
+  switchIcons_13: {fileID: 0}
+  switchIcons_14: {fileID: 0}
+  switchSmallIcons_0: {fileID: 0}
+  switchSmallIcons_1: {fileID: 0}
+  switchSmallIcons_2: {fileID: 0}
+  switchSmallIcons_3: {fileID: 0}
+  switchSmallIcons_4: {fileID: 0}
+  switchSmallIcons_5: {fileID: 0}
+  switchSmallIcons_6: {fileID: 0}
+  switchSmallIcons_7: {fileID: 0}
+  switchSmallIcons_8: {fileID: 0}
+  switchSmallIcons_9: {fileID: 0}
+  switchSmallIcons_10: {fileID: 0}
+  switchSmallIcons_11: {fileID: 0}
+  switchSmallIcons_12: {fileID: 0}
+  switchSmallIcons_13: {fileID: 0}
+  switchSmallIcons_14: {fileID: 0}
+  switchManualHTML: 
+  switchAccessibleURLs: 
+  switchLegalInformation: 
+  switchMainThreadStackSize: 1048576
+  switchPresenceGroupId: 
+  switchLogoHandling: 0
+  switchReleaseVersion: 0
+  switchDisplayVersion: 1.0.0
+  switchStartupUserAccount: 0
+  switchTouchScreenUsage: 0
+  switchSupportedLanguagesMask: 0
+  switchLogoType: 0
+  switchApplicationErrorCodeCategory: 
+  switchUserAccountSaveDataSize: 0
+  switchUserAccountSaveDataJournalSize: 0
+  switchApplicationAttribute: 0
+  switchCardSpecSize: -1
+  switchCardSpecClock: -1
+  switchRatingsMask: 0
+  switchRatingsInt_0: 0
+  switchRatingsInt_1: 0
+  switchRatingsInt_2: 0
+  switchRatingsInt_3: 0
+  switchRatingsInt_4: 0
+  switchRatingsInt_5: 0
+  switchRatingsInt_6: 0
+  switchRatingsInt_7: 0
+  switchRatingsInt_8: 0
+  switchRatingsInt_9: 0
+  switchRatingsInt_10: 0
+  switchRatingsInt_11: 0
+  switchLocalCommunicationIds_0: 
+  switchLocalCommunicationIds_1: 
+  switchLocalCommunicationIds_2: 
+  switchLocalCommunicationIds_3: 
+  switchLocalCommunicationIds_4: 
+  switchLocalCommunicationIds_5: 
+  switchLocalCommunicationIds_6: 
+  switchLocalCommunicationIds_7: 
+  switchParentalControl: 0
+  switchAllowsScreenshot: 1
+  switchAllowsVideoCapturing: 1
+  switchAllowsRuntimeAddOnContentInstall: 0
+  switchDataLossConfirmation: 0
+  switchUserAccountLockEnabled: 0
+  switchSystemResourceMemory: 16777216
+  switchSupportedNpadStyles: 3
+  switchNativeFsCacheSize: 32
+  switchIsHoldTypeHorizontal: 0
+  switchSupportedNpadCount: 8
+  switchSocketConfigEnabled: 0
+  switchTcpInitialSendBufferSize: 32
+  switchTcpInitialReceiveBufferSize: 64
+  switchTcpAutoSendBufferSizeMax: 256
+  switchTcpAutoReceiveBufferSizeMax: 256
+  switchUdpSendBufferSize: 9
+  switchUdpReceiveBufferSize: 42
+  switchSocketBufferEfficiency: 4
+  switchSocketInitializeEnabled: 1
+  switchNetworkInterfaceManagerInitializeEnabled: 1
+  switchPlayerConnectionEnabled: 1
+  ps4NPAgeRating: 12
+  ps4NPTitleSecret: 
+  ps4NPTrophyPackPath: 
+  ps4ParentalLevel: 11
+  ps4ContentID: ED1633-NPXX51362_00-0000000000000000
+  ps4Category: 0
+  ps4MasterVersion: 01.00
+  ps4AppVersion: 01.00
+  ps4AppType: 0
+  ps4ParamSfxPath: 
+  ps4VideoOutPixelFormat: 0
+  ps4VideoOutInitialWidth: 1920
+  ps4VideoOutBaseModeInitialWidth: 1920
+  ps4VideoOutReprojectionRate: 60
+  ps4PronunciationXMLPath: 
+  ps4PronunciationSIGPath: 
+  ps4BackgroundImagePath: 
+  ps4StartupImagePath: 
+  ps4StartupImagesFolder: 
+  ps4IconImagesFolder: 
+  ps4SaveDataImagePath: 
+  ps4SdkOverride: 
+  ps4BGMPath: 
+  ps4ShareFilePath: 
+  ps4ShareOverlayImagePath: 
+  ps4PrivacyGuardImagePath: 
+  ps4NPtitleDatPath: 
+  ps4RemotePlayKeyAssignment: -1
+  ps4RemotePlayKeyMappingDir: 
+  ps4PlayTogetherPlayerCount: 0
+  ps4EnterButtonAssignment: 1
+  ps4ApplicationParam1: 0
+  ps4ApplicationParam2: 0
+  ps4ApplicationParam3: 0
+  ps4ApplicationParam4: 0
+  ps4DownloadDataSize: 0
+  ps4GarlicHeapSize: 2048
+  ps4ProGarlicHeapSize: 2560
+  playerPrefsMaxSize: 32768
+  ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ
+  ps4pnSessions: 1
+  ps4pnPresence: 1
+  ps4pnFriends: 1
+  ps4pnGameCustomData: 1
+  playerPrefsSupport: 0
+  enableApplicationExit: 0
+  resetTempFolder: 1
+  restrictedAudioUsageRights: 0
+  ps4UseResolutionFallback: 0
+  ps4ReprojectionSupport: 0
+  ps4UseAudio3dBackend: 0
+  ps4SocialScreenEnabled: 0
+  ps4ScriptOptimizationLevel: 0
+  ps4Audio3dVirtualSpeakerCount: 14
+  ps4attribCpuUsage: 0
+  ps4PatchPkgPath: 
+  ps4PatchLatestPkgPath: 
+  ps4PatchChangeinfoPath: 
+  ps4PatchDayOne: 0
+  ps4attribUserManagement: 0
+  ps4attribMoveSupport: 0
+  ps4attrib3DSupport: 0
+  ps4attribShareSupport: 0
+  ps4attribExclusiveVR: 0
+  ps4disableAutoHideSplash: 0
+  ps4videoRecordingFeaturesUsed: 0
+  ps4contentSearchFeaturesUsed: 0
+  ps4attribEyeToEyeDistanceSettingVR: 0
+  ps4IncludedModules: []
+  monoEnv: 
+  splashScreenBackgroundSourceLandscape: {fileID: 0}
+  splashScreenBackgroundSourcePortrait: {fileID: 0}
+  blurSplashScreenBackground: 1
+  spritePackerPolicy: 
+  webGLMemorySize: 16
+  webGLExceptionSupport: 1
+  webGLNameFilesAsHashes: 0
+  webGLDataCaching: 1
+  webGLDebugSymbols: 0
+  webGLEmscriptenArgs: 
+  webGLModulesDirectory: 
+  webGLTemplate: APPLICATION:Default
+  webGLAnalyzeBuildSize: 0
+  webGLUseEmbeddedResources: 0
+  webGLCompressionFormat: 1
+  webGLLinkerTarget: 1
+  webGLThreadsSupport: 0
+  webGLWasmStreaming: 0
+  scriptingDefineSymbols: {}
+  platformArchitecture: {}
+  scriptingBackend: {}
+  il2cppCompilerConfiguration: {}
+  managedStrippingLevel: {}
+  incrementalIl2cppBuild: {}
+  allowUnsafeCode: 0
+  additionalIl2CppArgs: 
+  scriptingRuntimeVersion: 1
+  gcIncremental: 0
+  gcWBarrierValidation: 0
+  apiCompatibilityLevelPerPlatform:
+    WebGL: 3
+  m_RenderingPath: 1
+  m_MobileRenderingPath: 1
+  metroPackageName: Template_3D
+  metroPackageVersion: 
+  metroCertificatePath: 
+  metroCertificatePassword: 
+  metroCertificateSubject: 
+  metroCertificateIssuer: 
+  metroCertificateNotAfter: 0000000000000000
+  metroApplicationDescription: Template_3D
+  wsaImages: {}
+  metroTileShortName: 
+  metroTileShowName: 0
+  metroMediumTileShowName: 0
+  metroLargeTileShowName: 0
+  metroWideTileShowName: 0
+  metroSupportStreamingInstall: 0
+  metroLastRequiredScene: 0
+  metroDefaultTileSize: 1
+  metroTileForegroundText: 2
+  metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0}
+  metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628,
+    a: 1}
+  metroSplashScreenUseBackgroundColor: 0
+  platformCapabilities: {}
+  metroTargetDeviceFamilies: {}
+  metroFTAName: 
+  metroFTAFileTypes: []
+  metroProtocolName: 
+  XboxOneProductId: 
+  XboxOneUpdateKey: 
+  XboxOneSandboxId: 
+  XboxOneContentId: 
+  XboxOneTitleId: 
+  XboxOneSCId: 
+  XboxOneGameOsOverridePath: 
+  XboxOnePackagingOverridePath: 
+  XboxOneAppManifestOverridePath: 
+  XboxOneVersion: 1.0.0.0
+  XboxOnePackageEncryption: 0
+  XboxOnePackageUpdateGranularity: 2
+  XboxOneDescription: 
+  XboxOneLanguage:
+  - enus
+  XboxOneCapability: []
+  XboxOneGameRating: {}
+  XboxOneIsContentPackage: 0
+  XboxOneEnableGPUVariability: 1
+  XboxOneSockets: {}
+  XboxOneSplashScreen: {fileID: 0}
+  XboxOneAllowedProductIds: []
+  XboxOnePersistentLocalStorageSize: 0
+  XboxOneXTitleMemory: 8
+  xboxOneScriptCompiler: 1
+  XboxOneOverrideIdentityName: 
+  vrEditorSettings:
+    daydream:
+      daydreamIconForeground: {fileID: 0}
+      daydreamIconBackground: {fileID: 0}
+  cloudServicesEnabled:
+    UNet: 1
+  luminIcon:
+    m_Name: 
+    m_ModelFolderPath: 
+    m_PortalFolderPath: 
+  luminCert:
+    m_CertPath: 
+    m_SignPackage: 1
+  luminIsChannelApp: 0
+  luminVersion:
+    m_VersionCode: 1
+    m_VersionName: 
+  facebookSdkVersion: 7.9.4
+  facebookAppId: 
+  facebookCookies: 1
+  facebookLogging: 1
+  facebookStatus: 1
+  facebookXfbml: 0
+  facebookFrictionlessRequests: 1
+  apiCompatibilityLevel: 6
+  cloudProjectId: 
+  framebufferDepthMemorylessMode: 0
+  projectName: 
+  organizationId: 
+  cloudEnabled: 0
+  enableNativePlatformBackendsForNewInputSystem: 0
+  disableOldInputManagerSupport: 0
+  legacyClampBlendShapeWeights: 1
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectSettings.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectSettings.asset.meta
new file mode 100644
index 0000000..7fbb2e6
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8bd50fb94969aa94c9a58c288c070435
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectVersion.txt b/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectVersion.txt
new file mode 100644
index 0000000..1f6fff2
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectVersion.txt
@@ -0,0 +1,2 @@
+m_EditorVersion: 2021.2.11f1
+m_EditorVersionWithRevision: 2021.2.11f1 (e50cafbb4399)
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectVersion.txt.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectVersion.txt.meta
new file mode 100644
index 0000000..e6d7dc4
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/ProjectVersion.txt.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f2a0576cb777bc1428b06cf00043d4ee
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/QualitySettings.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/QualitySettings.asset
new file mode 100644
index 0000000..ed26313
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/QualitySettings.asset
@@ -0,0 +1,231 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!47 &1
+QualitySettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 5
+  m_CurrentQuality: 5
+  m_QualitySettings:
+  - serializedVersion: 2
+    name: Very Low
+    pixelLightCount: 0
+    shadows: 0
+    shadowResolution: 0
+    shadowProjection: 1
+    shadowCascades: 1
+    shadowDistance: 15
+    shadowNearPlaneOffset: 3
+    shadowCascade2Split: 0.33333334
+    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+    shadowmaskMode: 0
+    blendWeights: 1
+    textureQuality: 1
+    anisotropicTextures: 0
+    antiAliasing: 0
+    softParticles: 0
+    softVegetation: 0
+    realtimeReflectionProbes: 0
+    billboardsFaceCameraPosition: 0
+    vSyncCount: 0
+    lodBias: 0.3
+    maximumLODLevel: 0
+    streamingMipmapsActive: 0
+    streamingMipmapsAddAllCameras: 1
+    streamingMipmapsMemoryBudget: 512
+    streamingMipmapsRenderersPerFrame: 512
+    streamingMipmapsMaxLevelReduction: 2
+    streamingMipmapsMaxFileIORequests: 1024
+    particleRaycastBudget: 4
+    asyncUploadTimeSlice: 2
+    asyncUploadBufferSize: 16
+    asyncUploadPersistentBuffer: 1
+    resolutionScalingFixedDPIFactor: 1
+    excludedTargetPlatforms: []
+  - serializedVersion: 2
+    name: Low
+    pixelLightCount: 0
+    shadows: 0
+    shadowResolution: 0
+    shadowProjection: 1
+    shadowCascades: 1
+    shadowDistance: 20
+    shadowNearPlaneOffset: 3
+    shadowCascade2Split: 0.33333334
+    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+    shadowmaskMode: 0
+    blendWeights: 2
+    textureQuality: 0
+    anisotropicTextures: 0
+    antiAliasing: 0
+    softParticles: 0
+    softVegetation: 0
+    realtimeReflectionProbes: 0
+    billboardsFaceCameraPosition: 0
+    vSyncCount: 0
+    lodBias: 0.4
+    maximumLODLevel: 0
+    streamingMipmapsActive: 0
+    streamingMipmapsAddAllCameras: 1
+    streamingMipmapsMemoryBudget: 512
+    streamingMipmapsRenderersPerFrame: 512
+    streamingMipmapsMaxLevelReduction: 2
+    streamingMipmapsMaxFileIORequests: 1024
+    particleRaycastBudget: 16
+    asyncUploadTimeSlice: 2
+    asyncUploadBufferSize: 16
+    asyncUploadPersistentBuffer: 1
+    resolutionScalingFixedDPIFactor: 1
+    excludedTargetPlatforms: []
+  - serializedVersion: 2
+    name: Medium
+    pixelLightCount: 1
+    shadows: 1
+    shadowResolution: 0
+    shadowProjection: 1
+    shadowCascades: 1
+    shadowDistance: 20
+    shadowNearPlaneOffset: 3
+    shadowCascade2Split: 0.33333334
+    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+    shadowmaskMode: 0
+    blendWeights: 2
+    textureQuality: 0
+    anisotropicTextures: 1
+    antiAliasing: 0
+    softParticles: 0
+    softVegetation: 0
+    realtimeReflectionProbes: 0
+    billboardsFaceCameraPosition: 0
+    vSyncCount: 1
+    lodBias: 0.7
+    maximumLODLevel: 0
+    streamingMipmapsActive: 0
+    streamingMipmapsAddAllCameras: 1
+    streamingMipmapsMemoryBudget: 512
+    streamingMipmapsRenderersPerFrame: 512
+    streamingMipmapsMaxLevelReduction: 2
+    streamingMipmapsMaxFileIORequests: 1024
+    particleRaycastBudget: 64
+    asyncUploadTimeSlice: 2
+    asyncUploadBufferSize: 16
+    asyncUploadPersistentBuffer: 1
+    resolutionScalingFixedDPIFactor: 1
+    excludedTargetPlatforms: []
+  - serializedVersion: 2
+    name: High
+    pixelLightCount: 2
+    shadows: 2
+    shadowResolution: 1
+    shadowProjection: 1
+    shadowCascades: 2
+    shadowDistance: 40
+    shadowNearPlaneOffset: 3
+    shadowCascade2Split: 0.33333334
+    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+    shadowmaskMode: 1
+    blendWeights: 2
+    textureQuality: 0
+    anisotropicTextures: 1
+    antiAliasing: 0
+    softParticles: 0
+    softVegetation: 1
+    realtimeReflectionProbes: 1
+    billboardsFaceCameraPosition: 1
+    vSyncCount: 1
+    lodBias: 1
+    maximumLODLevel: 0
+    streamingMipmapsActive: 0
+    streamingMipmapsAddAllCameras: 1
+    streamingMipmapsMemoryBudget: 512
+    streamingMipmapsRenderersPerFrame: 512
+    streamingMipmapsMaxLevelReduction: 2
+    streamingMipmapsMaxFileIORequests: 1024
+    particleRaycastBudget: 256
+    asyncUploadTimeSlice: 2
+    asyncUploadBufferSize: 16
+    asyncUploadPersistentBuffer: 1
+    resolutionScalingFixedDPIFactor: 1
+    excludedTargetPlatforms: []
+  - serializedVersion: 2
+    name: Very High
+    pixelLightCount: 3
+    shadows: 2
+    shadowResolution: 2
+    shadowProjection: 1
+    shadowCascades: 2
+    shadowDistance: 70
+    shadowNearPlaneOffset: 3
+    shadowCascade2Split: 0.33333334
+    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+    shadowmaskMode: 1
+    blendWeights: 4
+    textureQuality: 0
+    anisotropicTextures: 2
+    antiAliasing: 2
+    softParticles: 1
+    softVegetation: 1
+    realtimeReflectionProbes: 1
+    billboardsFaceCameraPosition: 1
+    vSyncCount: 1
+    lodBias: 1.5
+    maximumLODLevel: 0
+    streamingMipmapsActive: 0
+    streamingMipmapsAddAllCameras: 1
+    streamingMipmapsMemoryBudget: 512
+    streamingMipmapsRenderersPerFrame: 512
+    streamingMipmapsMaxLevelReduction: 2
+    streamingMipmapsMaxFileIORequests: 1024
+    particleRaycastBudget: 1024
+    asyncUploadTimeSlice: 2
+    asyncUploadBufferSize: 16
+    asyncUploadPersistentBuffer: 1
+    resolutionScalingFixedDPIFactor: 1
+    excludedTargetPlatforms: []
+  - serializedVersion: 2
+    name: Ultra
+    pixelLightCount: 4
+    shadows: 2
+    shadowResolution: 2
+    shadowProjection: 1
+    shadowCascades: 4
+    shadowDistance: 150
+    shadowNearPlaneOffset: 3
+    shadowCascade2Split: 0.33333334
+    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+    shadowmaskMode: 1
+    blendWeights: 4
+    textureQuality: 0
+    anisotropicTextures: 2
+    antiAliasing: 2
+    softParticles: 1
+    softVegetation: 1
+    realtimeReflectionProbes: 1
+    billboardsFaceCameraPosition: 1
+    vSyncCount: 1
+    lodBias: 2
+    maximumLODLevel: 0
+    streamingMipmapsActive: 0
+    streamingMipmapsAddAllCameras: 1
+    streamingMipmapsMemoryBudget: 512
+    streamingMipmapsRenderersPerFrame: 512
+    streamingMipmapsMaxLevelReduction: 2
+    streamingMipmapsMaxFileIORequests: 1024
+    particleRaycastBudget: 4096
+    asyncUploadTimeSlice: 2
+    asyncUploadBufferSize: 16
+    asyncUploadPersistentBuffer: 1
+    resolutionScalingFixedDPIFactor: 1
+    excludedTargetPlatforms: []
+  m_PerPlatformDefaultQuality:
+    Android: 2
+    Lumin: 5
+    Nintendo 3DS: 5
+    Nintendo Switch: 5
+    PS4: 5
+    PSP2: 2
+    Standalone: 5
+    WebGL: 3
+    Windows Store Apps: 5
+    XboxOne: 5
+    iPhone: 2
+    tvOS: 2
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/QualitySettings.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/QualitySettings.asset.meta
new file mode 100644
index 0000000..4693f12
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/QualitySettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 51bd3c4d5cea99845a4bf4f903dd4b53
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/TagManager.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/TagManager.asset
new file mode 100644
index 0000000..1c92a78
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/TagManager.asset
@@ -0,0 +1,43 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!78 &1
+TagManager:
+  serializedVersion: 2
+  tags: []
+  layers:
+  - Default
+  - TransparentFX
+  - Ignore Raycast
+  - 
+  - Water
+  - UI
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  - 
+  m_SortingLayers:
+  - name: Default
+    uniqueID: 0
+    locked: 0
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/TagManager.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/TagManager.asset.meta
new file mode 100644
index 0000000..e3a90bc
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/TagManager.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cd49a79746fbe5e47b55beb4f03300e0
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/TimeManager.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/TimeManager.asset
new file mode 100644
index 0000000..558a017
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/TimeManager.asset
@@ -0,0 +1,9 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!5 &1
+TimeManager:
+  m_ObjectHideFlags: 0
+  Fixed Timestep: 0.02
+  Maximum Allowed Timestep: 0.33333334
+  m_TimeScale: 1
+  Maximum Particle Timestep: 0.03
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/TimeManager.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/TimeManager.asset.meta
new file mode 100644
index 0000000..38654c4
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/TimeManager.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e950e432b22387a45b29489d09c5be59
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/UnityConnectSettings.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/UnityConnectSettings.asset
new file mode 100644
index 0000000..fa0b146
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/UnityConnectSettings.asset
@@ -0,0 +1,34 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!310 &1
+UnityConnectSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 1
+  m_Enabled: 0
+  m_TestMode: 0
+  m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events
+  m_EventUrl: https://cdp.cloud.unity3d.com/v1/events
+  m_ConfigUrl: https://config.uca.cloud.unity3d.com
+  m_TestInitMode: 0
+  CrashReportingSettings:
+    m_EventUrl: https://perf-events.cloud.unity3d.com
+    m_Enabled: 0
+    m_LogBufferSize: 10
+    m_CaptureEditorExceptions: 1
+  UnityPurchasingSettings:
+    m_Enabled: 0
+    m_TestMode: 0
+  UnityAnalyticsSettings:
+    m_Enabled: 0
+    m_TestMode: 0
+    m_InitializeOnStartup: 1
+  UnityAdsSettings:
+    m_Enabled: 0
+    m_InitializeOnStartup: 1
+    m_TestMode: 0
+    m_IosGameId: 
+    m_AndroidGameId: 
+    m_GameIds: {}
+    m_GameId: 
+  PerformanceReportingSettings:
+    m_Enabled: 0
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/UnityConnectSettings.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/UnityConnectSettings.asset.meta
new file mode 100644
index 0000000..4c8b3da
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/UnityConnectSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0193b4020a3545a45ab65e41135e1031
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/VFXManager.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/VFXManager.asset
new file mode 100644
index 0000000..46f38e1
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/VFXManager.asset
@@ -0,0 +1,14 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!937362698 &1
+VFXManager:
+  m_ObjectHideFlags: 0
+  m_IndirectShader: {fileID: 0}
+  m_CopyBufferShader: {fileID: 0}
+  m_SortShader: {fileID: 0}
+  m_StripUpdateShader: {fileID: 0}
+  m_RenderPipeSettingsPath: 
+  m_FixedTimeStep: 0.016666668
+  m_MaxDeltaTime: 0.05
+  m_CompiledVersion: 0
+  m_RuntimeVersion: 0
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/VFXManager.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/VFXManager.asset.meta
new file mode 100644
index 0000000..9097730
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/VFXManager.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6696b4558f9342f4681d9384b68f1c03
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/XRSettings.asset b/Assets/Plugins/NativeWebSocket/ProjectSettings/XRSettings.asset
new file mode 100644
index 0000000..482590c
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/XRSettings.asset
@@ -0,0 +1,10 @@
+{
+    "m_SettingKeys": [
+        "VR Device Disabled",
+        "VR Device User Alert"
+    ],
+    "m_SettingValues": [
+        "False",
+        "False"
+    ]
+}
\ No newline at end of file
diff --git a/Assets/Plugins/NativeWebSocket/ProjectSettings/XRSettings.asset.meta b/Assets/Plugins/NativeWebSocket/ProjectSettings/XRSettings.asset.meta
new file mode 100644
index 0000000..ed2b117
--- /dev/null
+++ b/Assets/Plugins/NativeWebSocket/ProjectSettings/XRSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f4eafe2cae4c1e74fb799af05dc18de4
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

--
Gitblit v1.8.0